1

我有一段时间试图解决的问题,但仍然没有成功。我们有简单的服务器客户端应用程序,它通过同步交换消息来工作。

这是相关代码。

创建套接字:

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 个字节。它永远不会恢复。

所以我关闭了应用程序,重新启动它,但它无法连接,服务器日志说有很多打开的连接。问题是服务器没有看到客户端已断开连接......

我有点迷失在这里。请帮忙!

4

1 回答 1

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;
}
于 2013-03-05T12:41:39.297 回答