如何检测套接字连接何时丢失?

时间:2012-08-23 12:10:55

标签: perl sockets networking io

我有一个脚本(我目前没有这里的代码示例,但是我使用了IO :: Async),它连接到远程服务器上的socket并监听。客户通常只是收听新数据。

问题是客户端无法检测网络问题是否发生以及套接字连接是否消失。 我使用了IO :: Async,我也尝试使用IO :: Socket。初始连接建立后,句柄始终处于“连接”状态。

如果再次建立网络连接,套接字连接自然会丢失,因为脚本不知道它应该重新连接。

我正在考虑创建某种“keepAlive”,每隔X秒“ping”(syswrite)套接字(如果没有新的东西通过套接字)来检查连接是否仍然存在。

这是正确的方法,还是可能有另一种更有创意或更清洁的解决方案?

2 个答案:

答案 0 :(得分:4)

您可以设置SO_KEEPALIVE套接字选项,对于TCP,它会发送定期的keepalive消息,并可能有助于检测此情况。如果检测到这种情况,您将收到一个EOF条件(最有可能导致包含IO::Async::Stream的{​​{1}}}。

为了获得更好的解决方案,您可以考虑使用某种应用程序级别的keepalive消息,例如IRC的on_read_eof命令。

答案 1 :(得分:2)

简短的回答是没有默认的方法来自动检测perl中丢失的套接字。

你的ping方法可能会很好用;你可以在后台运行一个发送ping请求的连续线程,如果它没有收到响应,可以通知主线程并发出重新连接。

如果你想弄乱你可以使用select()来检测保持活跃的消息;但是,这可能需要一些操作系统配置,具体取决于您的平台。

有关详细信息,请参阅此主题:http://www.perlmonks.org/?node_id=566568