c#套接字无法重新连接

本文关键字:重新连接 套接字 | 更新日期: 2023-09-27 18:02:12

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

相关代码如下:

创建套接字:

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

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

我有点迷路了。请帮助!

c#套接字无法重新连接

我认为解决问题的方法如下:

当没有接收到字节而您已经设置了套接字时。ReceiveTimeout和Socket。SendTimeout根据Socker服务器/客户端要求设置为合适的值(可能是为了您正在使用的目的而检查手册,通常是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;
}