Golang破管

时间:2016-08-16 23:51:16

标签: go codahale-metrics

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

0 个答案:

没有答案