C#套接字无法重新连接

时间:2013-03-05 11:25:21

标签: c# windows sockets

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

以下是相关代码。

创建套接字:

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

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

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

1 个答案:

答案 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;
}