如何在不发送/接收数据的情况下检查Conn是否处于活动状态?

时间:2015-10-30 06:42:46

标签: go

在Go / Golang中,一旦使用以下代码创建连接对象(Conn):

conn, err := net.Dial("tcp","33.33.33.33:444")
if err != nil {
  // good connection
}

我想保留 conn 值,以便稍后验证连接是否处于活动状态。我不想不时重新连接来检查连接,因为它会导致操作系统上出现各种TIME_WAIT,所以整体上我的要求是:

  • 创建连接
  • 保留连接对象
  • 捕获连接因任何原因而丢失
  • 不发送或接收任何数据

有关如何实现这一目标的任何想法?有没有办法捕获连接中断而不发送或接收数据或重新连接?

1 个答案:

答案 0 :(得分:4)

我认为没有执行操作就可以做到。如果不经常使用,当您尝试读取时,如果客户端(或某个代理)关闭连接,则可能会收到错误。如果发生这种情况,请重新连接并重试。

许多协议都会在心跳机制中加入,以促进此类事情的发生。然后你可以不断阅读(如果你愿意,可以使用SetDeadline),并在心跳帧中知道出了什么问题。

例如,我使用支持连接池的redis客户端。当我从池中检索idele连接时,我立即执行PING操作。如果成功,我知道连接已准备好使用。如果没有,我会得到另一个空闲的,或重新连接。