我有问题,我现在试图解决一段时间,仍然没有成功。 我们有简单的服务器客户端应用程序,它通过同步交换消息来工作。
以下是相关代码。
创建套接字:
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错误代码,这意味着它超时。所以我试着重新连接。 然后它持续抛出相同的错误代码一段时间,但有以下异常: 连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机无法响应n.n.n.n:x
然后最终它设法“重新连接”但收到0个字节。 所以我尝试发送一些数据。它因WSAECONNABORTED 10053错误而失败。 我再次尝试重新连接。 它继续10053错误并接收0字节。 它永远不会恢复。
所以我关闭应用程序,再次启动它,但它无法连接,服务器日志说有很多打开的连接。问题是服务器没有看到客户端已断开连接......
我有点迷失在这里。 请帮忙!
答案 0 :(得分:2)
我认为应该解决您的问题的方法如下:
当没有收到字节并且您已按照Socker服务器/客户端的要求将Socket.ReceiveTimeout和Socket.SendTimeout设置为良好值(可能会检查手册以了解您正在使用的内容,通常是1到5分钟),然后断开套接字并创建一个新连接。因为它表示为 RST - 从另一端复位或类似孤立连接(TCP协议术语),即告知重新连接。
try
{
if (!sender.Connected)
Reconnect();
int bytesRec = sender.Receive(readBuffer);
if (bytesRec == 0)
{
//warning 0 bytes received and some logging
// Reconnect code here or function calling to reconnect
Reconnect();
}
return Encoding.ASCII.GetString(readBuffer, 0, bytesRec);
}
catch (SocketException se)
{
//print se.ErrorCode
throw;
}