// 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 pipe
或connection reset by peer
。仅仅因为伯克利套接字 API,您通常不会看到它,直到您的第二次发送操作。这依赖于远程主机响应 RST 或发送 ICMP 信号的中介,因此,如果数据包延迟或丢失,您仍然可以继续发送而不会出错。
可靠地检测关闭连接的唯一方法是从连接读取,并获得 0 字节响应,该响应转换为 EOF。