套接字自动关闭

时间:2010-11-10 13:16:33

标签: c# .net sockets

在2小时后,Socket是否应该自行关闭?我每秒钟从这个套接字接收数据,并且每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小时,然后突然Socket.Poll返回false,并且Socket被关闭。

是否存在控制此问题的设置,或者我做错了什么?

[编辑]

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

当发生这种情况时,我可以轻松地重新连接插座,但如果有人知道为什么会这样,我只是在徘徊。

2 个答案:

答案 0 :(得分:3)

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

也就是说,拉出wireshark或微软为数据包嗅探提供的任何内容,看看网络上发生了什么。你的心跳块是ACK - ed?接收器窗口是否保持打开状态或是否为零?或者您只是从某个中间交换机获得明确的RSTFIN

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

答案 1 :(得分:1)

可能是正在关闭连接的服务器吗?你有控制权吗?