如何安全地告诉另一端收到TCP / IP数据包?

时间:2013-08-11 03:29:47

标签: c# .net tcpclient

在这个项目中,协议是:

  • 打开套接字
  • 发送数据
  • 等待确认消息或超时
  • 如果ack到达适当的窗口,一切都很顺利。关闭套接字
  • 如果超时,请关闭套接字并重新开始N次。

我在日志中注意到,有时在超时后我们会收到确认。由于插座在关闭后保持打开以进行清理和散步,我明白了原因。

但是有更好的方法来解决这个问题吗?在向线路运营商报告内容之前,我想确定连接确实已关闭。

现在超时是与外部计时器相关的任意值(2.5秒)。它不在.Net TCP堆栈中。

2 个答案:

答案 0 :(得分:1)

除非套接字在你身边关闭,否则TCP连接不会真正关闭。 TCP确定连接断开需要几分钟,如果在发送数据后没有从网络收到任何响应,则关闭套接字。

答案 1 :(得分:0)

套接字抽象通过TCP通道分层双向流。当Write()(或等效)成功返回时,以及Read()返回非零数字符时,用户只能看到堆栈已接受片段。较低的水平是不透明的。为确保服务器已收到并确认您的数据,您需要确认Read()在您允许的时间段内返回预期的数据量。

由于您必须为每个请求连接一个新会话,因此您别无选择,只需拆除会话以便为下一个请求腾出空间。特别是,您不能离开会话,因为服务器可能不允许多个并发连接。

您声明超时为2.5秒。如果这比消息间隔小得多,如果超时扩展到接近间隔的某个位置,是否存在问题。这似乎更可靠,可以通过对同一数据的多个快速请求进行敲定。