使用CLOSE_WAIT套接字写入时避免Go中的数据丢失

Dieter_be:
  1. 使用netcat -l开始监听客户端
  2. go程序用net.DialTCP打开一个连接到客户端。
  3. 杀死网猫
  4. 在go程序中,用[] byte做conn.Write()->运行正常,没有错误!
  5. 这需要另一个conn.Write来获取错误:管道破裂

第一次写是发生数据丢失的写操作,我想避免。如果我仅遇到错误,我知道我可以保留数据并稍后再试。我已经看过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

大卫·施瓦兹(David Schwartz):

从根本上说,成功write仅告诉您数据已排队等待发送到另一端。如果即使连接关闭或发生错误,也需要确保另一端获取了该数据,则必须存储该数据的副本,直到另一端为您提供应用程序级别的确认为止。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何避免服务器套接字使用TIME_WAIT?

如何删除CLOSE_WAIT套接字连接

Jersey Client中的CLOSE_WAIT中的套接字

Golang HTTP服务器应用程序有许多套接字(CLOSE_WAIT)

在Go中写入客户端UDP套接字

服务器套接字写入时,是否等待客户端套接字读取?

如果另一端未从套接字读取数据,如何避免冻结Indy中的“写入套接字”

使用python中的TCP套接字编程从服务器接收数据并将其写入.txt文件

避免在udp套接字中积累数据或从udp套接字读取最新数据

System.Net.WebSockets在断开连接后将套接字留在close_wait中

使用线程的套接字写入错误

通过java中的asynchronousFileChannel写入时丢失数据

从streambuf使用boost :: asio :: ip :: tcp将数据段写入TCP套接字

C:套接字连接和数据丢失

当套接字在Java中读取输入时,while循环失败

使用Jython时,套接字以CLOSE_WAIT结尾

我可以在套接字接收缓冲区中丢失数据报吗?使用UDP时如何发生?

套接字保持在CLOSE_WAIT状态

当tcp在close_wait中时,选择总是返回1

QT-JAVA套接字丢失数据

Python 2.7.8:套接字-TCP套接字中的客户端服务器数据丢失

使用Qdatastream从套接字读取数据并写入文件

套接字send()在CLOSE_WAIT状态下挂起

通过Java SSL套接字写入时,第一个字节丢失

有什么办法可以避免在 Python 套接字数据传输中丢失字节?

如何访问写入套接字中的数据而不读取它

使用python中已经打开的套接字发送数据

Boost:ASIO 接收器在数小时/天后将套接字堆栈为 CLOSE_WAIT 状态

避免在以 CSV 格式写入时重复先前的数据帧