在Go / Golang中,一旦使用以下代码创建连接对象(Conn):
conn, err := net.Dial("tcp","33.33.33.33:444")
if err != nil {
// good connection
}
我想保留 conn 值,以便稍后验证连接是否处于活动状态。我不想不时重新连接来检查连接,因为它会导致操作系统上出现各种TIME_WAIT,所以整体上我的要求是:
有关如何实现这一目标的任何想法?有没有办法捕获连接中断而不发送或接收数据或重新连接?
答案 0 :(得分:4)
我认为没有执行操作就可以做到。如果不经常使用,当您尝试读取时,如果客户端(或某个代理)关闭连接,则可能会收到错误。如果发生这种情况,请重新连接并重试。
许多协议都会在心跳机制中加入,以促进此类事情的发生。然后你可以不断阅读(如果你愿意,可以使用SetDeadline),并在心跳帧中知道出了什么问题。
例如,我使用支持连接池的redis客户端。当我从池中检索idele连接时,我立即执行PING操作。如果成功,我知道连接已准备好使用。如果没有,我会得到另一个空闲的,或重新连接。