gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:59:48 26 4
gpt4 key购买 nike

  1. 使用 netcat -l 开始监听客户端
  2. go 程序使用 net.DialTCP 向所述客户端打开一个连接。
  3. 杀死网猫
  4. 在 go 程序中,使用 []byte 执行 conn.Write() -> 它运行良好,没有错误!
  5. 需要另一个 conn.Write 才能得到错误:broken pipe

第一次写入是数据丢失发生的地方,我想避免。如果我只得到一个错误,我知道我可以保留数据并稍后再试。我看过https://stackoverflow.com/a/15071574/2757887这是一个非常相似的案例,解释似乎适用于此,但它仍然没有解释如何处理这个问题,如果我需要实现的 tcp 协议(protocol)只进行单向通信。

我用 wireshark 嗅探了流量,当我杀死 netcat 时,我可以看到它向 go 程序发送 FIN,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 字段集的数据包,当然还有我的有效负载。这是在 go 中成功的写入。

然后原来属于netstat的旧socket发送RST,这确保一旦我尝试写入 go(第二次写入)它就会失败。

所以我的问题是:

A) 为什么我在第一次写入时不会出错?如果套接字收到 FIN 并处于 CLOSE_WAIT,为什么 Go 让我写入套接字并告诉我一切都很好?
B) 有什么方法可以在 Go 中检查套接字是否处于 CLOSE_WAIT 状态?如果是这样,我可以为此考虑它已关闭而不进行写入。

谢谢,迪特尔

最佳答案

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

关于sockets - 使用 CLOSE_WAIT 套接字写入时避免 Go 中的数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26130010/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com