我如何从套接字客户端程序中发现远程连接已关闭(例如,服务器已关闭)。当我执行 recv 并且服务器关闭时,如果我没有设置任何超时,它就会阻塞。但是,在我的情况下,我无法设置任何可靠的超时值来绕过它,否则即使服务器已启动,recv 也会超时,但响应确实需要比我设置的超时值更长的时间。
最佳答案
不幸的是,ZeroMQ 只是将其传递到下一层。因此,您在 ZeroMQ 之上实现的协议(protocol)必须处理这个问题。
Heartbeats are recommended.基本上,如果连接空闲,则只让一侧发送一条消息。另一方可以将缺少此类消息视为失败条件并关闭连接。
您可能希望修改更高级别的协议(protocol)以使其更加健壮。例如,你可以提交一个命令,查询它的状态,然后让对方忘记这个命令。这样,如果连接丢失,您可以重新连接并查询任何未完成的命令。任何它没有的,你知道没有通过并且可以重新提交。一旦你得到一个命令结果的回复,你就可以告诉对方它现在可以忘记这个回复了。
这允许您在执行长时间运行的命令时保持连接处于事件状态。每隔一段时间你就会问,“一切都好吗”。对方回答,"is"。您可以使用 long polling在命令执行过程中,另一方延迟响应一秒钟左右。这允许它立即返回结果,而不必为您的下一个查询等待一秒钟。
具体取决于您的确切要求,但您必须将其正确设计到您的协议(protocol)中。
关于linux - 识别套接字客户端中的远程断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19953239/