在某种类型的断开连接后,无法重新连接套接字,重新启动工作

本文关键字:重新连接 套接字 工作 重新启动 种类 类型 连接 断开 | 更新日期: 2023-09-27 18:04:49

我通过套接字连接到c#中的远程服务器并发送数据,在断开连接时,我尝试通过创建新的套接字并重新初始化它来重新建立连接。

当我通过拔出以太网电缆并在几分钟后重新连接它进行测试时,这对我有效,但偶尔(也许每隔几个小时)我在连接时得到两个例外之一,无法重新连接…

System.Net.Sockets。SocketException:已建立的连接被主机上的软件终止

.......

System.Net.Sockets。SocketException:已存在的连接被远程主机强制关闭

如果我重新启动应用程序,一切工作正常,所以我很好奇为什么创建一个新的套接字不工作。我是不是漏掉了一个初始化?什么好主意吗?我每次都使用相同的方法进行连接:

public static bool OpenConnection(string siteName)
{
    bool success;
    IPEndPoint ip = new IPEndPoint(IPAddress.Parse(serverIp), Convert.ToInt16(serverRemotePort));
    try
    {
        client = null;
        client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        Console.WriteLine("Try to connect to the server ..." + ip.Address.ToString());
        client.Connect(ip);
        Console.WriteLine("Connection established");
        //Send the nameSite first
        string nameSite = EncryptString(siteName, pwd, initVector) + "*";
        byte[] dataSite = new byte[100];
        dataSite = Encoding.ASCII.GetBytes(nameSite);
        client.Send(dataSite, dataSite.Length, SocketFlags.None);
        Console.WriteLine("NameSite send");
        success = true;
    }
    catch (SocketException e)
    {
        success = false;
        Console.WriteLine("Unable to connect to the server : " + e.StackTrace);
    }
    return success;
}

我尝试重新连接,在catch中,count随着while循环的每次迭代而增加。

if (count % 20 == 0)
{
    try
    {
        if (OpenConnection(siteName))
            connected = true;
        EventLog.WriteEntry("Connection re-established.");
    }
    catch (SocketException socketEx)
    {
        Console.WriteLine("Reconnection failed. Storing data locally. 'n'n " + socketEx);
        EventLog.WriteEntry("Reconnection failed. Storing data locally. 'n'n " + socketEx);
    }
}

构造函数只是初始化IP和端口号。为什么某些类型的断开连接会阻止我在不重启的情况下重新连接,有什么想法吗?

在某种类型的断开连接后,无法重新连接套接字,重新启动工作

您是否曾经在客户端调用Dispose()来清理它?

尝试在您的OpenConnection方法中清空客户端之前添加Dispose()调用

client.Dispose();
client = null;

查看了MSDN上Socket的文档后,Disconnect方法似乎也可以解决您的问题。然而,我不确定在你的代码应该去哪里,因为问题显示了逻辑的一部分。