我正在使用套接字。这是我的代码(对问题的描述更进一步):
客户端:
public void ReadCallback(IAsyncResult ar)
{
int fileNameLen = 1;
String content = String.Empty;
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
int bytesRead = handler.EndReceive(ar);
if (bytesRead > 0)
{
if (flag == 0)
{
fileNameLen = BitConverter.ToInt32(state.buffer, 0);
string fileName = Encoding.UTF8.GetString(state.buffer, 4, fileNameLen);
receivedPath = mypath + @"XML\";
if (!Directory.Exists(receivedPath))
{
Directory.CreateDirectory(receivedPath);
}
receivedPath = receivedPath + fileName;
flag++;
}
if (flag >= 1)
{
BinaryWriter writer = new BinaryWriter(File.Open(receivedPath, FileMode.Append));
if (flag == 1)
{
writer.Write(state.buffer, 4 + fileNameLen, bytesRead - (4 + fileNameLen));
flag++;
}
else
writer.Write(state.buffer, 0, bytesRead);
writer.Close();
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReadCallback), state);
}
}
else
{
// Invoke(new MyDelegate(LabelWriter));
}
}
Run Code Online (Sandbox Code Playgroud)
我在这条线上出现错误: int bytesRead = handler.EndReceive(ar);
如何避免此错误?: An existing connection was forcibly closed by the remote host
服务器端:
public void ReadCallback(IAsyncResult ar)
{
try
{
int fileNameLen = 1;
String content = String.Empty;
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
string[] str = new string[2];
str = handler.RemoteEndPoint.ToString().Split(':');
IP = str[0].ToString();
int bytesRead = handler.EndReceive(ar);
if (bytesRead > 0)
{
if (flag == 0)
{
fileNameLen = BitConverter.ToInt32(state.buffer, 0);
string fileName = Encoding.UTF8.GetString(state.buffer, 4, fileNameLen);
string[] getIP = new string[3];
getIP = fileName.Split('_');
#region Send Files in HandHeld
#region GetLoginFile
if (getIP[1].ToString().Equals("GetLoginFile"))
{
string getDirectory = @"Send_Hand_Held_Files\" + DateTime.Today.ToString("dd-MM-yyyy") + "\\" + getIP[0].ToString() + "\\XML";
string strmyFile = getDirectory + "\\Login.xml";
char[] delimiter = splitter.ToCharArray();
split = strmyFile.Split(delimiter);
int limit = split.Length;
fName = split[limit - 1].ToString();
byte[] LoginfileName = Encoding.UTF8.GetBytes(fName); //file name
byte[] fileData = File.ReadAllBytes(strmyFile);
byte[] LoginfileNameLen = BitConverter.GetBytes(LoginfileName.Length); //lenght of file name
clientData = new byte[4 + LoginfileName.Length + fileData.Length];
LoginfileNameLen.CopyTo(clientData, 0);
LoginfileName.CopyTo(clientData, 4);
fileData.CopyTo(clientData, 4 + LoginfileName.Length);
handler.BeginSend(clientData, 0, clientData.Length, 0, new AsyncCallback(SendCallBack), handler);
//handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
//new AsyncCallback(ReadCallback), state);
return;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
//SendData(IP);
}
private static void SendCallBack(IAsyncResult ar)
{
try
{
// Retrieve the socket from the state object.
Socket client = (Socket)ar.AsyncState;
// Complete sending the data to the remote device.
// int bytesSent = client.EndSend(ar);
//Console.WriteLine("Sent {0} bytes to server.", bytesSent);
// Signal that all bytes have been sent.
allDone.Set();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
您正在从中获得例外handler.EndReceive()。可以肯定的是,目前尚不清楚为什么会收到提到的特定异常,但是在投入生产时,此代码将在每次出现网络通信问题(常见)时抛出异常。
因此,EndReceive()无论如何,您可能应该尝试/抓住该呼叫。考虑一下一旦连接失败或服务器死机或其他原因,您的代码将需要做什么。
然后,您可以开始诊断特定问题。您尚未指定的一件重要事情:您是仅偶尔收到此错误,还是始终可复制地收到此错误?如果是前者,则可能只是正常的Internet连接波动。您的软件必须能够处理这些问题。如果是后者,那么我认为这听起来像是服务器上的问题。当您调用时BeginReceive(),系统将开始等待服务器中的某些内容。如果该“某事”是它接收到的数据,EndReceive()则将成功,但是,如果该“某事”是服务器已关闭该连接,则您的回调仍将被调用,然后EndReceive()将引发相关的SocketException。这是设计使然,因为几乎没有其他方法可以与您的代码进行通信,表明服务器已关闭连接。
编辑:看起来您的服务器代码需要相同的错误处理:EndReceive()如果客户端关闭连接,则对它的调用同样容易引发异常。(我知道您可以尝试/抓住整个大问题,但是它会输出一个MessageBox ...在服务器上无法正常工作,除非您希望有人一直坐在那里单击所有OK按钮。 ..)
| 归档时间: |
|
| 查看次数: |
25937 次 |
| 最近记录: |