linux - 识别套接字客户端中的远程断开连接

标签 linux sockets zeromq

我如何从套接字客户端程序中发现远程连接已关闭(例如,服务器已关闭)。当我执行 recv 并且服务器关闭时,如果我没有设置任何超时,它就会阻塞。但是,在我的情况下,我无法设置任何可靠的超时值来绕过它,否则即使服务器已启动,recv 也会超时,但响应确实需要比我设置的超时值更长的时间。

最佳答案

不幸的是,ZeroMQ 只是将其传递到下一层。因此,您在 ZeroMQ 之上实现的协议(protocol)必须处理这个问题。

Heartbeats are recommended.基本上,如果连接空闲,则只让一侧发送一条消息。另一方可以将缺少此类消息视为失败条件并关闭连接。

您可能希望修改更高级别的协议(protocol)以使其更加健壮。例如,你可以提交一个命令,查询它的状态,然后让对方忘记这个命令。这样,如果连接丢失,您可以重新连接并查询任何未完成的命令。任何它没有的,你知道没有通过并且可以重新提交。一旦你得到一个命令结果的回复,你就可以告诉对方它现在可以忘记这个回复了。

这允许您在执行长时间运行的命令时保持连接处于事件状态。每隔一段时间你就会问,“一切都好吗”。对方回答,"is"。您可以使用 long polling在命令执行过程中,另一方延迟响应一秒钟左右。这允许它立即返回结果,而不必为您的下一个查询等待一秒钟。

具体取决于您的确切要求,但您必须将其正确设计到您的协议(protocol)中。

关于linux - 识别套接字客户端中的远程断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19953239/

相关文章:

zeromq - 如何在 zmq::setsockopt() 中设置 SO_REUSEADDR 选项——如果可能,或者任何解决方法?

linux - 读取文件的 Bash 脚本

c++ - 如何编译、设置和创建一个库 .so 在 linux 中共享

linux - Yum 在 'Loading mirror speeds' 或 'Setting package sacks' 卡住

sockets - TCP 套接字和已连接的 UDP 套接字之间的区别

javascript - socket.io - 发送到socketid(单个客户端)不工作

c# - 监听 8080 端口的 WebSocket Windows 服务

php - Ratchet 服务器实例化 : "Unsupported declare ' strict_types'"

c++ - 一段时间后 zmq 套接字不工作

linux - pxa255 中的 RS485 支持