gpt4 book ai didi

c# - 套接字自动关闭

转载 作者:太空宇宙 更新时间:2023-11-03 22:18:27 24 4
gpt4 key购买 nike

Socket 在 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 小时一切正常,然后 Socket.Poll 突然返回 false,Socket 被关闭。

是否有控制它的设置,还是我做错了什么?

[编辑]

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

发生这种情况时,我可以轻松地重新连接套接字,但我只是在徘徊,如果有人知道为什么会是这个原因。

最佳答案

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

也就是说,拉出 wireshark或任何 Microsoft 提供的数据包嗅探功能,看看线路上发生了什么。您的心跳 block 是否得到了 ACK-ed?接收器窗口是保持打开状态还是变为零?或者您只是从某个中间开关获得显式 RSTFIN

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

关于c# - 套接字自动关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4144831/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com