1

在这个项目中,协议是:

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

我在日志中注意到,有时在超时后我们仍然会收到确认。由于套接字在关闭后保持打开以进行清理和散乱,我明白为什么。

但是有没有更好的方法来处理这个问题?在向线路操作员报告某些事情之前,我想确保连接真的断开了。

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

4

2 回答 2

1

除非套接字在您身边关闭,否则 TCP 连接并没有真正关闭。如果在发送数据后没有收到来自网络的任何响应,TCP 需要几分钟来确定连接已关闭并关闭套接字。

于 2013-08-11T04:59:05.600 回答
0

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

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

您声明超时为 2.5 秒。如果这比消息间隔小得多,如果超时延长到接近该间隔的时间,是否会出现问题。这似乎比对同一数据进行多次快速请求更可靠。

于 2013-11-27T19:48:59.250 回答