好的,让我说清楚。我正在使用TCP,这应该意味着除非关闭或由于网络问题,否则连接不应该中断。
所以这是我的问题:
使用我的套接字可以很好地工作。
在无活动5-10分钟后,他们停止响应(连接仍然存活[使用netstat -n检查]。)
它告诉我数据已发送(但另一方没有收到它,我确信它正在等待它。)
如果我继续发送,最终会给我WSA错误10038(套接字句柄无效)。
在多次尝试发送后编辑,它给了我10058错误(已建立的连接被主机中的软件中止。)
我完全糊涂了。除了不活动之外,我还没有关闭套接字,也没有做任何事情。如果我使用它不间断10 - 20分钟,它可以很好地工作。
答案 0 :(得分:3)
对于错误10058,几乎可以肯定的是,网关(代理,或防火墙,或带有或不带NAT的路由器)超时其连接的中继。
基本上,您与同伴没有直接联系。相反,网关介于其间,并在与您的连接及其与对等方的连接之间显式传输数据。由于套接字是有限的资源,因此网关具有逐出策略,其中它关闭看起来像非活动连接的东西。如果你看起来死了,繁荣,你已经死了。
您唯一的选择是保持活动状态,这通常意味着在您的应用程序协议中以某种“心跳”工作。讨厌,但他们是休息。
除非你真的知道自己在做什么,否则不使用TCP的SO_KEEPALIVE。
答案 1 :(得分:1)
NAT防火墙可能是eating your connection而没有告诉您。尝试启用TCP keepalive。