【发布时间】:2011-12-01 19:55:36
【问题描述】:
有没有办法配置套接字在确定连接失败之前期望接收已发送数据的 ACK 的超时时间?
我知道这也可以在应用程序级别完成,但由于我发送的每个数据包都是 ACK 的,我只想知道我的数据是否被接收,使用应用程序级别的附加数据完成同样的事情似乎很浪费。 (更不用说,我的特定应用程序使用按字节收费的蜂窝链接。)
注意:根据我之前的问题——
What conditions cause NetworkStream.Write to block? -- 你不能依靠 .Write 抛出异常来确定数据没有正确发送。
【问题讨论】:
-
您需要从 promise 开始工作,即 TCP 是一种可靠的协议,可确保您编写的内容确实在另一端结束。它周围的一切都是围绕这一保证而设计的。如果地震将加利福尼亚倾倒到太平洋中,那么当你关闭() 时你会发现它。
-
这是一个很好的观点 w.r.t.
Close()。然而,ACK 的目的是让系统自己决定连接是否死亡,如果它认为它还没有长到足以死亡,则重新传输。 -
就像汉斯说的,假设你的数据包确实成功了。如果发生异常,然后确定您停止的位置。没有做到这一点的数据是极端情况,应该总是导致异常。只要确保你有办法从你离开的地方继续。
-
哦,让我澄清一下。我不在乎“从上次停下的地方继续”。我只需要知道连接是否尽快失败,而不是在操作系统最终决定它死亡的 X 分钟内。因此,我想在 30 秒后将缺少 ACK 作为连接失败的标志来处理。
-
很好的低级问题。 :) 我可以建议每 3 秒来回发送一个小型 UDP 数据包,然后您可以假设 10 秒内没有响应 = 连接丢失(或高流量)? (将与您的主 TCP 连接并行发生,非常适合 LAN 或可配置的互联网。防火墙、代理、商业环境,算了)。
标签: c# sockets network-programming tcpclient