Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在特定类型的断开连接后无法重新连接到套接字,重新启动有效_C#_Sockets_Connection - Fatal编程技术网

C# 在特定类型的断开连接后无法重新连接到套接字,重新启动有效

C# 在特定类型的断开连接后无法重新连接到套接字,重新启动有效,c#,sockets,connection,C#,Sockets,Connection,我通过一个套接字连接到C#中的远程服务器,并发送数据,断开连接后,我尝试通过创建一个新套接字并重新初始化来重新建立连接 当我拔出以太网电缆并在几分钟后重新连接它进行测试时,这对我来说是有效的,但偶尔(可能每隔几个小时)我会在连接时遇到两个异常之一,并且无法重新连接 System.Net.Sockets.SocketException:主机中的软件中止了已建立的连接 System.Net.Sockets.SocketException:远程主机强制关闭了现有连接 如果我重新启动应用程序,一切都会

我通过一个套接字连接到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上的文档之后,该方法似乎也可以解决您的问题。但是,我不确定代码应该放在哪里,因为问题显示了部分逻辑。

每次连接尝试之间要等待多长时间?@jgauffin-这取决于保存到数据库(参数)的频率,每次迭代大约是1秒,因此如果我将其设置为每20次迭代尝试重新连接,如上所述,然后大约20秒。我是否需要使用Socket.Close()方法进行清理?没有dispose()方法,Close()是否等效?其描述为释放分配给实例的所有资源。我现在已经添加了这一点,但是错误很难重现,所以我可能几个小时都不知道:您是否使用这个套接字类?文档显示了一个Dispose()。。。这很奇怪。是的,就是这个,确实有一个Dispose()方法,你是对的。Intellisense向我隐藏了它,但是:P似乎“由于其保护级别,无法访问”。这个问题表示接近应该足够了,我想。。。由于我在其他地方使用的方法中打开连接,而不仅仅是在单个区块中-我不需要使用“使用”对吗?正确(对于使用语句问题)。你看了断开连接了吗?它有一些关于关闭套接字和确保数据传输干净结束的文本。我做了,这很有帮助,谢谢。如果我的连接被中断,它已经断开了,不是吗?是否需要调用disconnect()或shutdown()?