为什么我的插座停止转移?

时间:2012-12-26 18:16:11

标签: c++ sockets networking tcp connection

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

所以这是我的问题:

使用我的套接字可以很好地工作。

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

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

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

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

我完全糊涂了。除了不活动之外,我还没有关闭套接字,也没有做任何事情。如果我使用它不间断10 - 20分钟,它可以很好地工作。

2 个答案:

答案 0 :(得分:3)

对于错误10058,几乎可以肯定的是,网关(代理,或防火墙,或带有或不带NAT的路由器)超时其连接的中继。

基本上,您与同伴没有直接联系。相反,网关介于其间,并在与您的连接及其与对等方的连接之间显式传输数据。由于套接字是有限的资源,因此网关具有逐出策略,其中它关闭看起来像非活动连接的东西。如果你看起来死了,繁荣,你已经死了。

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

除非你真的知道自己在做什么,否则使用TCP的SO_KEEPALIVE。

答案 1 :(得分:1)

NAT防火墙可能是eating your connection而没有告诉您。尝试启用TCP keepalive