1

好吧,让我说清楚。我正在使用 TCP,这意味着除非关闭或由于网络问题,否则连接不应中断。

所以这是我的问题:

使用我的插座效果很好。

在 5 到 10 分钟不活动后,它们停止响应(连接仍然存在 [使用 netstat -n 检查])。

它告诉我数据已发送(但对方没有收到它,我确定它正在等待它。)

如果我继续发送,最终它会给我 WSA 错误 10038(无效的套接字句柄)。

再次尝试发送后进行编辑,它给了我错误 10058(已建立的连接被主机中的软件中止。)

我完全糊涂了。除了不活动之外,我没有关闭套接字也没有对它做任何事情。如果我不间断地使用它 10 - 20 分钟,它会完美运行。

4

2 回答 2

3

使用错误 10058,实际上可以确定网关(代理、防火墙或路由器,有或没有 NAT)正在超时其连接中继。

基本上,你与你的同伴没有直接联系。相反,网关介于两者之间,并在其与您的连接和与您的对等方的连接之间显式传输数据。由于套接字是一种有限的资源,网关有一个驱逐策略,它会关闭看起来不活动的连接。如果你看起来死了,砰,你死了。

您唯一的选择是保持活动状态,这通常意味着在您的应用程序协议中使用某种“心跳”。讨厌,但他们是休息时间。

除非你真的知道自己在做什么,否则不要玩弄 TCP 的 SO_KEEPALIVE。

于 2012-12-26T19:21:20.213 回答
1

NAT 防火墙可能会在不通知您的情况下占用您的连接。尝试启用TCP keepalive

于 2012-12-26T18:20:10.277 回答