【问题标题】:Why do my sockets stop transfering?为什么我的套接字停止传输?
【发布时间】:2012-12-26 18:16:10
【问题描述】:

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

这是我的问题:

使用我的套接字效果很好。

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

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

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

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

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

【问题讨论】:

  • 连接采用什么路径? VPN隧道? SSL 连接?防火墙?当事情正常时,这些是透明的,当事情失败时,这些都是线索。

标签: c++ sockets networking tcp connection


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢。我决定每 15 秒编写一个乒乓间隔来检查连接是否有效。经过几次测试,这似乎解决了我的问题。干杯!
【解决方案2】:

NAT 防火墙可能是eating your connection 而不会告诉你。尝试启用TCP keepalive

【讨论】:

  • 启用时要记住的重要事项,例如SO_KEEPALIVE 是默认超时时间通常是两个小时。
  • 我已经尝试启用 SO_KEEPALIVE 的套接字选项。问题依然存在。
  • TCP keepalive 是解决这个问题的最糟糕的方法之一。但你可能是对的,这是他的问题。
猜你喜欢
  • 2011-01-27
  • 2019-03-12
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 2015-01-17
相关资源
最近更新 更多