golang写net conn没有返回错误,但socket的另一端无法接收数据

时间:2015-03-03 11:21:27

标签: sockets tcp go

// 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仍然无错误地返回。

在我看来,当这个套接字的另一端没有接收到数据包时,写不应该没有错误,所以我错过了什么?

1 个答案:

答案 0 :(得分:2)

这是TCP协议如何工作的函数。没有办法确定你是否已经预先发送到一个封闭的套接字(即使有,发送和关闭也会竞争)。

如果远程套接字关闭,您最终会收到错误broken pipeconnection reset by peer。仅仅因为berkley socket api,你经常在第二次发送操作之前就看不到这一点。这依赖于使用RST响应的远程主机,或者发送ICMP信号的中间设备,因此如果数据包延迟或丢失,仍然可能继续发送而没有错误。

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