在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小时没有问题(没有内存泄漏和东西),然后套接字关闭。
当发生这种情况时,我可以轻松地重新连接插座,但如果有人知道为什么会这样,我只是在徘徊。
答案 0 :(得分:3)
默认情况下,当套接字发送缓冲区中至少有一个字节的空间可用时,TCP套接字是可写的。要反过来 - 当“输出队列”中有足够的未确认数据时,套接字不可写。
也就是说,拉出wireshark或微软为数据包嗅探提供的任何内容,看看网络上发生了什么。你的心跳块是ACK
- ed?接收器窗口是否保持打开状态或是否为零?或者您只是从某个中间交换机获得明确的RST
或FIN
?
缓解临时阻塞管道的一种方法是增加发送缓冲区大小,这在Windows上是默认的 - 8192 iirc。请参阅setsockopt
(.NET可能有其版本)和SO_SNDBUF
选项。
答案 1 :(得分:1)
可能是正在关闭连接的服务器吗?你有控制权吗?