在这个项目中,协议是:
- 打开套接字
- 发送数据
- 等待确认消息或超时
- 如果 ack 到达正确的窗口,一切都很好。关闭套接字
- 如果超时,关闭套接字并重新开始最多 N 次。
我在日志中注意到,有时在超时后我们仍然会收到确认。由于套接字在关闭后保持打开以进行清理和散乱,我明白为什么。
但是有没有更好的方法来处理这个问题?在向线路操作员报告某些事情之前,我想确保连接真的断开了。
现在的超时是一个与外部计时器相关的任意值(2.5 秒)。它不在 .Net TCP 堆栈中。
除非套接字在您身边关闭,否则 TCP 连接并没有真正关闭。如果在发送数据后没有收到来自网络的任何响应,TCP 需要几分钟来确定连接已关闭并关闭套接字。
套接字抽象层是 TCP 通道上的双向流。用户仅在 Write()(或等效)成功返回并且 Read() 返回非零字符数时才看到堆栈已接受片段。较低的级别是不透明的。为了确保服务器已接收并确认您的数据,您需要确认 Read() 在您允许的时间段内返回预期的数据量。
由于您必须为每个请求连接一个新会话,因此您别无选择,只能拆除会话以为下一个请求让路。特别是,您不能离开会话,因为服务器可能不允许多个并发连接。
您声明超时为 2.5 秒。如果这比消息间隔小得多,如果超时延长到接近该间隔的时间,是否会出现问题。这似乎比对同一数据进行多次快速请求更可靠。