第一次写是发生数据丢失的写操作,我想避免。如果我仅遇到错误,我知道我可以保留数据并稍后再试。我已经看过https://stackoverflow.com/a/15071574/2757887,这是一个非常相似的情况,并且说明似乎适用于此,但如果使用tcp协议,它仍然无法解释如何处理该问题。只需要实现单向通信即可。
我已经用Wireshark嗅探了流量,当我杀死netcat时,我可以看到它将FIN发送到go程序,go程序用ACK回复该程序。出于某种原因,go程序不会立即使用其自己的FIN进行响应-我很好奇为什么会这样,这可能有助于解决我的问题-但可能有充分的理由。
无论哪种方式,从“连接终止”部分@ http://en.wikipedia.org/wiki/Transmission_Control_Protocol,我都得出结论,套接字此时处于CLOSE_WAIT状态,我也用“ netstat -np”确认了这一点,该图显示杀死netstat后套接字从ESTABLISHED变为CLOSE_WAIT。
看一下wireshark,第一个conn.write生成一个包,其中设置了push和ack字段,当然还有我的有效负载。这是写成功的写法。
然后,曾经属于netstat的旧套接字将发送RST,以确保一旦我尝试写入go(第二次写入),它就会失败。
所以我的问题是:
A)为什么我在第一次写时就不会出错?如果套接字收到FIN并处于CLOSE_WAIT中,为什么Go让我写套接字并告诉我一切都很好?
B)有什么方法可以检查Go套接字是否在CLOSE_WAIT中?如果是这样,我可以为此目的将其视为已关闭而不进行写入。
谢谢,Dieter
从根本上说,成功write
仅告诉您数据已排队等待发送到另一端。如果即使连接关闭或发生错误,也需要确保另一端获取了该数据,则必须存储该数据的副本,直到另一端为您提供应用程序级别的确认为止。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句