如果连接超时,conn.SetDeadline()是否会关闭连接

时间:2014-08-01 01:55:25

标签: go

我有一个使用conn.SetDeadline()的Golang项目。如果由于读取超时而引发EOF错误,Go会自动关闭连接吗?

我有一个设置,我需要在网络连接上等待一段时间才能使输出到达,如果输出没有到达,则必须发送QUIT命令。我还没有设计网络应用程序,所以重新设计协议不是一个选项

理想情况下,当因为SetDeadline超时而抛出EOF时,我会想要唤醒goroutine,但不要关闭连接

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

显然它没有。我的解决方法(好吧,不是解决方法,但正确的方法)就像这样

timeout := make(chan error)
buf := make([]byte, 32)
go func() {
    _, err := conn.Read(buf)
    timeout <- err
}()
select {
case time.After(time.Now() + 1000 * 1000 * 1000 * 5): // Wait for 5 seconds
    // Timed out reading
    go func() {
        <-timeout // We have to read from the sem to prevent mem leaks
    }()
case err := <-timeout:
    // Successfully read
}