Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在socket客户端中识别远程断开连接_Linux_Sockets_Zeromq - Fatal编程技术网

Linux 在socket客户端中识别远程断开连接

Linux 在socket客户端中识别远程断开连接,linux,sockets,zeromq,Linux,Sockets,Zeromq,如何从套接字客户端程序中发现远程连接已关闭(例如,服务器已关闭)。当我执行recv时,如果我没有设置任何超时,服务器将关闭。但是,在我的情况下,我无法设置任何可靠的超时值来绕过它,因为否则recv即使在服务器启动时也会超时,但响应时间确实比我设置的超时值要长。如果远程主机在没有向您发送tcpFIN包的情况下停机,那么您就没有机会检测到它。您可以通过在端口上建立连接后对端口进行防火墙来测试该行为。你的程序将永远“挂起” 但是,Linux内核支持一种称为的机制,用于在给定超时后关闭tcp连接。如果您

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

如果远程主机在没有向您发送tcp
FIN
包的情况下停机,那么您就没有机会检测到它。您可以通过在端口上建立连接后对端口进行防火墙来测试该行为。你的程序将永远“挂起”


但是,Linux内核支持一种称为的机制,用于在给定超时后关闭tcp连接。如果您不能为应用程序指定超时,那么就没有可靠的机会使用它。最后一个机会可能是使用应用程序协议的功能(您能说出它的名字吗?),如果该协议不支持连接处理功能,您可以自己发明一些功能。

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

基本上,如果连接处于空闲状态,只需让一方发送消息即可。另一方可以将没有此类消息视为故障条件并关闭连接

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

这允许您在长时间运行命令时保持连接处于活动状态。你经常会问,“一切都好吗?”。对方回答:“是的”。您可以在命令执行过程中另一端延迟响应一秒左右的情况下使用。这使得它可以立即返回结果,而不必等待下一次查询


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

您在TCP之上使用的是什么协议?没有“一个正确的方法”可以做到这一点。这取决于您正在实施的特定协议。遵循协议的规则。我正在使用ZeroMQ。我也在他们的论坛上提出这个问题,看看是否有这样的规定。如果协议没有解决这个显而易见的、众所周知的和众所周知的问题,那么协议从根本上就被破坏了,应该被丢弃。我使用的是ZeroMQ。我也在他们的论坛上提出了这个问题,看看是否有这样的规定。这是他们的网站:这是他们关于API的文档参考:我试图探究他们的TCP保持活动选项,但到目前为止还没有弄清楚太多。@user33804他们以前的建议与我的建议完全相同-使用保持活动-但看起来他们在那之后实现了“心跳”功能。谢谢,这是一个非常有用的链接。