我有一段时间试图解决的问题,但仍然没有成功。我们有简单的服务器客户端应用程序,它通过同步交换消息来工作。
这是相关代码。
创建套接字:
Socket sender;
IPAddress ipAddress = IPAddress.Parse(remoteHost);
IPEndPoint remoteEP = new IPEndPoint(ipAddress, remotePort);
sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sender.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
sender.ReceiveTimeout = 5000;
sender.Connect(remoteEP);
接收数据:
try {
if (!sender.Connected)
Reconnect();
int bytesRec = sender.Receive(readBuffer);
if (bytesRec == 0)
{
//warning 0 bytes received
}
return Encoding.ASCII.GetString(readBuffer, 0, bytesRec);
}
catch (SocketException se)
{
//print se.ErrorCode
throw;
}
发送数据:
try {
if (!sender.Connected)
Reconnect();
byte[] msg = Encoding.ASCII.GetBytes(sendMessage + "\0");
int bytesSent = sender.Send(msg);
return true;
}
catch (SocketException se)
{
//print se.ErrorCode
throw;
}
重新连接代码:
if (sender != null)
{
if (sender.Connected)
{
sender.Shutdown(SocketShutdown.Both);
sender.Disconnect(true);
}
sender.Close();
IPAddress ipAddress = IPAddress.Parse(RemoteHost);
IPEndPoint remoteEP = new IPEndPoint(ipAddress, RemotePort);
sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);
sender.ReceiveTimeout = 5000;
sender.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
sender.Connect(remoteEP);
}
这是正在发生的事情:
在接收数据时,我收到 10060 错误代码,这意味着它已超时。所以我尝试重新连接。然后它一直抛出相同的错误代码一段时间,并出现以下异常:连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败,因为连接的主机没有响应 nnnn:x
然后最终它设法“重新连接”但接收到 0 个字节。所以我尝试发送一些数据。它以 WSAECONNABORTED 10053 错误开始失败。我再次尝试重新连接。它继续出现 10053 错误并接收 0 个字节。它永远不会恢复。
所以我关闭了应用程序,重新启动它,但它无法连接,服务器日志说有很多打开的连接。问题是服务器没有看到客户端已断开连接......
我有点迷失在这里。请帮忙!