【问题标题】:Cannot reconnect with a socket after certain type of disconnect, restart works某些类型的断开连接后无法重新连接套接字,重新启动工作
【发布时间】:2011-08-08 03:16:46
【问题描述】:

我正在通过套接字连接到 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 中重新连接,计数随着 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 和端口号。为什么某些类型的断开连接会阻止我在不重新启动的情况下重新连接,有什么想法吗?

【问题讨论】:

  • 每次连接尝试之间等待多长时间?
  • @jgauffin - 这取决于保存到数据库的频率(参数),目前每次迭代大约为 1 秒,所以如果我将其设置为尝试像上面那样每 20 次迭代重新连接一次,然后大约 20 秒。我是否需要使用 Socket.Close() 方法进行清理?

标签: c# sockets connection


【解决方案1】:

你有没有在客户端调用 Dispose() 来清理它?

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

client.Dispose();
client = null;

查看 MSDN 上的 Socket 文档后,Disconnect 方法似乎也可以解决您的问题。但是,我不确定它应该在您的代码中的哪个位置,因为问题显示了部分逻辑。

【讨论】:

  • 没有 dispose() 方法,close() 是否等效?它被描述为释放分配给实例的所有资源。我现在已经添加了,但是这个错误很难重现,所以我可能几个小时都不知道:P
  • 你在用这个Socket类吗? msdn.microsoft.com/en-us/library/system.net.sockets.socket.aspx 文档显示了一个 Dispose()... 这很奇怪。
  • 是的,就是这样,而且确实有一个 Dispose() 方法,你是对的。 Intellisense 对我隐藏了它:P 似乎它“由于其保护级别而无法访问”。这个问题表明 close 我认为应该足够了...stackoverflow.com/questions/3601521/… ...因为我在其他地方使用的方法中打开连接,而不仅仅是在单个块中 - 我不需要使用“使用”对吗?
  • 正确(对于使用语句问题)。您是否查看了断开连接链接?它有一些关于关闭套接字并确保数据传输干净地结束的文本。
  • 我做到了,这很有帮助,谢谢。如果我的连接中断了,它已经断开了,不是吗?是否需要调用disconnect()或shutdown()?
猜你喜欢
  • 2019-03-05
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 2021-04-12
  • 2012-08-07
  • 2019-02-22
相关资源
最近更新 更多