我有一个使用conn.SetDeadline()的Golang项目。如果由于读取超时而引发EOF错误,Go会自动关闭连接吗?
我有一个设置,我需要在网络连接上等待一段时间才能使输出到达,如果输出没有到达,则必须发送QUIT命令。我还没有设计网络应用程序,所以重新设计协议不是一个选项
理想情况下,当因为SetDeadline超时而抛出EOF时,我会想要唤醒goroutine,但不要关闭连接
提前感谢您的帮助!
答案 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
}