0

我有一个从 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。提前致谢

4

0 回答 0