在 TCP 连接的客户端,我尝试尽可能多地重用已建立的连接,以避免每次需要连接时拨号的开销。从根本上说,它是连接池,虽然从技术上讲,我的池大小恰好是一个。
我遇到了一个问题,如果连接空闲时间足够长,另一端会断开连接。我试过使用类似以下的东西来保持连接活跃:
err = conn.(*net.TCPConn).SetKeepAlive(true)
if err != nil {
fmt.Println(err)
return
}
err = conn.(*net.TCPConn).SetKeepAlivePeriod(30*time.Second)
if err != nil {
fmt.Println(err)
return
}
但这没有帮助。事实上,它导致我的连接更快关闭。我很确定这是因为(在 Mac 上)这意味着连接健康状况在 30 秒后开始被探测,然后以 30 秒的间隔被探测 8 次。 服务器端一定不支持 keepalive,所以在 4 分 30 秒后,客户端断开连接。
我可能无法使空闲连接无限期地保持活动状态,如果有某种方法至少可以检测到连接已关闭,以便我可以无缝地用新连接替换它,那绝对没问题。唉,即使在阅读了所有文档并搜索博客圈寻求帮助之后,我也找不到任何方法来查询 TCP 连接的状态。
一定有办法。有没有人对如何实现这一点有任何见解?非常感谢任何这样做的人!
编辑:
理想情况下,我想学习如何在不使用第三方库的情况下使用纯 go 来处理低级别的问题。当然,如果有一些图书馆这样做,我不介意指出它的方向,这样我就可以看到他们是如何做到的。
qq_遁去的一_1
慕哥9229398
相关分类