3

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

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

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

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

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

4

2 回答 2

4

您可以设置SO_KEEPALIVE用于 TCP 的套接字选项,该选项会定期发送 keepalive 消息,并且可能有助于检测这种情况。如果检测到这种情况,您将收到一个 EOF 条件(很可能导致容器IO::Async::Stream触发on_read_eof)。

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

于 2012-08-23T12:43:45.517 回答
2

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

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

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

有关更多详细信息,请参阅此线程:http ://www.perlmonks.org/?node_id=566568

于 2012-08-23T12:45:14.817 回答