我有一个脚本(我目前没有这里的代码示例,但是我使用了IO :: Async),它连接到远程服务器上的socket并监听。客户通常只是收听新数据。
问题是客户端无法检测网络问题是否发生以及套接字连接是否消失。 我使用了IO :: Async,我也尝试使用IO :: Socket。初始连接建立后,句柄始终处于“连接”状态。
如果再次建立网络连接,套接字连接自然会丢失,因为脚本不知道它应该重新连接。
我正在考虑创建某种“keepAlive”,每隔X秒“ping”(syswrite)套接字(如果没有新的东西通过套接字)来检查连接是否仍然存在。
这是正确的方法,还是可能有另一种更有创意或更清洁的解决方案?
答案 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