我有一个从TCP连接读取的代码段,在最初的几个连接之后,服务器输出了断开的管道,但是我的go代码中没有发生错误。发送消息的服务器的核心是coda hale指标库,更具体地说是PickledGraphite类。
这是正在阅读的Go代码:
func handleConn(conn net.Conn, id int) {
fmt.Println("handleConn")
defer conn.Close()
buf := make([]byte, 0, 10240)
tmp := make([]byte, 256)
fmt.Printf("%v Reading...\n", id)
for {
n, err := conn.Read(tmp)
fmt.Printf("%v Read %v\n", id, n)
if err != nil {
fmt.Printf("%v Got err: %v\n", id, err)
if err != io.EOF {
fmt.Printf("%v read error: %v\n", id, err)
}
buf = append(buf, tmp[:n]...)
break
}
buf = append(buf, tmp[:n]...)
}
fmt.Printf("%v Done Reading\n", id)
// Do stuff with buf
}
func main() {
ln, err := net.Listen("tcp", ":5555")
if err != nil {
fmt.Println(err)
os.Exit(-1)
}
id := 1
for {
fmt.Println("getting connection\n")
conn, err := ln.Accept()
if err != nil {
fmt.Println(err)
break
}
conn.SetReadDeadline(time.Now().Add(20 * time.Second))
fmt.Println("Got connection")
go handleConn(conn, id)
id = id + 1
fmt.Println("sent handleConn\n")
}
}
我的代码仍在运行,我仍然可以执行nc
命令并看到我的代码收到它,所以我不确定我是如何丢失连接的。
如果我删除conn.SetReadDeadline()
行,那么我的代码在第一条消息后不再收到EOF。
提前致谢