如何从套接字客户端程序中发现远程连接已关闭(例如服务器已关闭).当我执行一次接收并且服务器关闭时,如果我没有设置任何超时,它将阻塞.但是,在我的情况下,我无法放置任何可靠的超时值来解决它,因为否则即使服务器启动,recv也会超时,但响应时间实际上比我设置的超时值长.
解决方法:
不幸的是,ZeroMQ只是将其传递给下一层.因此,您要在ZeroMQ之上实现的协议必须处理该问题.
Heartbeats are recommended.基本上,如果连接空闲,则仅让一侧发送消息.另一端可以将不存在此类消息视为失败情况,然后关闭连接.
您可能希望修改更高级别的协议以使其更健壮.例如,您可以提交命令,查询其状态,并允许另一方忘记该命令.这样,如果连接断开,您可以重新连接并查询任何未完成的命令.任何没有的东西,您都知道没有通过,可以重新提交.一旦收到命令结果的答复,您就可以告诉另一方它现在可以忘记响应了.
这使您可以在执行长时间运行的命令时保持连接处于活动状态.您经常问“一切都好”.对方回答“是”.您可以在命令执行过程中使用long polling,另一端延迟响应一秒钟左右.这样一来,它便可以立即返回结果,而不必等待下一秒钟的查询.
具体细节取决于您的确切要求,但是您必须在协议中正确设计.