在这个项目中,协议是:
我在日志中注意到,有时在超时后我们会收到确认。由于插座在关闭后保持打开以进行清理和散步,我明白了原因。
但是有更好的方法来解决这个问题吗?在向线路运营商报告内容之前,我想确定连接确实已关闭。
现在超时是与外部计时器相关的任意值(2.5秒)。它不在.Net TCP堆栈中。
答案 0 :(得分:1)
除非套接字在你身边关闭,否则TCP连接不会真正关闭。 TCP确定连接断开需要几分钟,如果在发送数据后没有从网络收到任何响应,则关闭套接字。
答案 1 :(得分:0)
套接字抽象通过TCP通道分层双向流。当Write()(或等效)成功返回时,以及Read()返回非零数字符时,用户只能看到堆栈已接受片段。较低的水平是不透明的。为确保服务器已收到并确认您的数据,您需要确认Read()在您允许的时间段内返回预期的数据量。
由于您必须为每个请求连接一个新会话,因此您别无选择,只需拆除会话以便为下一个请求腾出空间。特别是,您不能离开会话,因为服务器可能不允许多个并发连接。
您声明超时为2.5秒。如果这比消息间隔小得多,如果超时扩展到接近间隔的某个位置,是否存在问题。这似乎更可靠,可以通过对同一数据的多个快速请求进行敲定。