// 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
}
当我使用net.Conn(由net.Dial(" tcp")创建)调用WriteData函数时,它返回nil,但套接字的另一个端口无法接收发送的内容数据有时候。
似乎连接已断开,但w.Write仍然无错误地返回。
在我看来,当这个套接字的另一端没有接收到数据包时,写不应该没有错误,所以我错过了什么?
答案 0 :(得分:2)
这是TCP协议如何工作的函数。没有办法确定你是否已经预先发送到一个封闭的套接字(即使有,发送和关闭也会竞争)。
如果远程套接字关闭,您最终会收到错误broken pipe
或connection reset by peer
。仅仅因为berkley socket api,你经常在第二次发送操作之前就看不到这一点。这依赖于使用RST响应的远程主机,或者发送ICMP信号的中间设备,因此如果数据包延迟或丢失,仍然可能继续发送而没有错误。
可靠地检测关闭连接的唯一方法是从连接读取,并获得0字节响应,转换为EOF。