Golang写入网络连接而不返回错误,但套接字的另一端无法接收数据


// only Data
func (self *Packet) WriteData(w io.Writer) error {
    n := len(self.Data)
    data := self.Data[0:n]
    for n > 0 {
        wn, err := w.Write(data)
        data = data[wn:n]
        n -= wn
        if err != nil {
            return err
        }
    }
    return nil
}

当我用网络调用 WriteData 函数时。Conn(由net创建。拨号("tcp"((,它返回 nil,但套接字的另一个端口有时无法接收发送的数据。

似乎连接已断开,但 w.Write 仍然返回没有错误。

在我看来,当这个套接字的另一端没有收到数据包时,w.Write 不应该毫无错误地返回,那么我错过了什么吗?

这是 TCP 协议工作方式的功能。没有办法确定你是否事先发送到一个封闭的套接字(即使有,发送和关闭也会比赛(。

如果远程套接字关闭,您最终会收到错误、broken pipeconnection reset by peer。仅仅因为伯克利套接字 API,您通常不会看到它,直到您的第二次发送操作。这依赖于远程主机响应 RST 或发送 ICMP 信号的中介,因此,如果数据包延迟或丢失,您仍然可以继续发送而不会出错。

可靠地检测关闭连接的唯一方法是从连接读取,并获得 0 字节响应,该响应转换为 EOF。

最新更新