C# 插座自动关闭

C# 插座自动关闭,c#,.net,sockets,C#,.net,Sockets,插座在2小时后自动关闭有什么原因吗?我每秒从这个套接字接收数据,每30秒写回一些微小的“保持活动”数据 在发送之前,我使用以下方法检查套接字是否仍然连接: public bool IsSocketReadyForWriting(Socket s) { try { if (!s.Connected) { Log.Info("Socket.Connected was false"); return false;

插座在2小时后自动关闭有什么原因吗?我每秒从这个套接字接收数据,每30秒写回一些微小的“保持活动”数据

在发送之前,我使用以下方法检查套接字是否仍然连接:

public bool IsSocketReadyForWriting(Socket s)
{
   try
   {
      if (!s.Connected)
      {
          Log.Info("Socket.Connected was false");
          return false;
      }

      // following line will throw if socket disconnected
      bool poll = s.Poll(2000, SelectMode.SelectWrite);
      if (!poll)
      {
         try
         {
            // if poll is false, socket is closed
            Log.Info("poll is false");
            this.Close();
         }
         catch { }
         return false;
      }
      Log.Debug("still connected");
      return true;
   }
   catch (Exception ex)
   {
      Log.Error("Error while checking if socket connected", ex);
      return false;
   }
}
一切正常运行约2小时,然后突然套接字。Poll返回false,套接字关闭

是否有一个设置可以控制这一点,或者我真的做错了什么

[编辑]

忘了提到:我控制链接的服务器端和客户端。这两个都是C#应用程序,其中一个创建监听套接字,另一个打开连接并发送数据。它们通信2小时没有问题(没有内存泄漏等),然后套接字关闭


发生这种情况时,我可以很容易地重新连接套接字,但我只是想知道为什么会发生这种情况。

可能是正在关闭连接的服务器?您可以控制它吗?

可能是正在关闭连接的服务器?您可以控制它吗?

默认情况下,当套接字发送缓冲区中至少有一个字节的可用空间时,TCP套接字是可写的。相反,当“输出队列”中有足够的未确认数据时,套接字是不可写的

也就是说,拿出微软提供的包嗅探功能,看看网络上发生了什么。您的心跳块是否得到确认?接收器窗口是保持打开还是归零?或者您只是从某个中间开关获得显式的
RST
FIN


缓解临时阻塞管道的一种方法是增加发送缓冲区的大小,在Windows-8192 iirc上默认情况下,发送缓冲区的大小有点小。请参阅(.NET可能有一个版本)和
SO_SNDBUF
选项。

默认情况下,如果套接字发送缓冲区中至少有一个字节的可用空间,则TCP套接字是可写的。相反,当“输出队列”中有足够的未确认数据时,套接字是不可写的

也就是说,拿出微软提供的包嗅探功能,看看网络上发生了什么。您的心跳块是否得到确认?接收器窗口是保持打开还是归零?或者您只是从某个中间开关获得显式的
RST
FIN


缓解临时阻塞管道的一种方法是增加发送缓冲区的大小,在Windows-8192 iirc上默认情况下,发送缓冲区的大小有点小。请参见(.NET可能有一个版本)和
SO\u SNDBUF
选项。

哦,忘了说,我同时控制服务器和客户端。它们都是C#apps.AFAIK,SOL#u KEEPALIVE选项发送证明后2小时是超时时间(请参阅)。这个选项是在一边启用的,而不是在另一边启用的吗?哦,忘了说,我同时控制服务器和客户端。它们都是C#apps.AFAIK,SOL#u KEEPALIVE选项发送证明后2小时是超时时间(请参阅)。是否该选项在一侧启用而在另一侧未启用?测量的超时是否正好为2h?还是就这样?另外,您是否控制这两个时间段内的所有网络设备?测量到的超时是否正好为2h?还是就这样?另外,您是否可以控制这两个设备之间的所有网络设备?谢谢,就是这样。我的虚拟客户端根本没有读取输入TCP流(几个ping/status字节),所以我的服务器输出缓冲区被填满了。谢谢,就是这样。我的虚拟客户端根本没有读取输入TCP流(几个ping/status字节),所以我的服务器输出缓冲区被填满了。