Linux 在socket客户端中识别远程断开连接
如何从套接字客户端程序中发现远程连接已关闭(例如,服务器已关闭)。当我执行recv时,如果我没有设置任何超时,服务器将关闭。但是,在我的情况下,我无法设置任何可靠的超时值来绕过它,因为否则recv即使在服务器启动时也会超时,但响应时间确实比我设置的超时值要长。如果远程主机在没有向您发送tcpLinux 在socket客户端中识别远程断开连接,linux,sockets,zeromq,Linux,Sockets,Zeromq,如何从套接字客户端程序中发现远程连接已关闭(例如,服务器已关闭)。当我执行recv时,如果我没有设置任何超时,服务器将关闭。但是,在我的情况下,我无法设置任何可靠的超时值来绕过它,因为否则recv即使在服务器启动时也会超时,但响应时间确实比我设置的超时值要长。如果远程主机在没有向您发送tcpFIN包的情况下停机,那么您就没有机会检测到它。您可以通过在端口上建立连接后对端口进行防火墙来测试该行为。你的程序将永远“挂起” 但是,Linux内核支持一种称为的机制,用于在给定超时后关闭tcp连接。如果您
FIN
包的情况下停机,那么您就没有机会检测到它。您可以通过在端口上建立连接后对端口进行防火墙来测试该行为。你的程序将永远“挂起”
但是,Linux内核支持一种称为的机制,用于在给定超时后关闭tcp连接。如果您不能为应用程序指定超时,那么就没有可靠的机会使用它。最后一个机会可能是使用应用程序协议的功能(您能说出它的名字吗?),如果该协议不支持连接处理功能,您可以自己发明一些功能。不幸的是,ZeroMQ只是将其传递到下一层。因此,您在ZeroMQ之上实现的协议必须处理这个问题 基本上,如果连接处于空闲状态,只需让一方发送消息即可。另一方可以将没有此类消息视为故障条件并关闭连接 您可能希望修改更高级别的协议,使其更加健壮。例如,您可以提交命令,查询其状态,并允许另一方忘记该命令。这样,如果连接丢失,您可以重新连接并查询任何未完成的命令。没有的,你知道没有通过,可以重新提交。一旦你得到一个命令结果的回复,你可以告诉另一方,它现在可以忘记响应了 这允许您在长时间运行命令时保持连接处于活动状态。你经常会问,“一切都好吗?”。对方回答:“是的”。您可以在命令执行过程中另一端延迟响应一秒左右的情况下使用。这使得它可以立即返回结果,而不必等待下一次查询
具体细节取决于您的具体要求,但您必须将其正确设计到协议中。您在TCP之上使用的是什么协议?没有“一个正确的方法”可以做到这一点。这取决于您正在实施的特定协议。遵循协议的规则。我正在使用ZeroMQ。我也在他们的论坛上提出这个问题,看看是否有这样的规定。如果协议没有解决这个显而易见的、众所周知的和众所周知的问题,那么协议从根本上就被破坏了,应该被丢弃。我使用的是ZeroMQ。我也在他们的论坛上提出了这个问题,看看是否有这样的规定。这是他们的网站:这是他们关于API的文档参考:我试图探究他们的TCP保持活动选项,但到目前为止还没有弄清楚太多。@user33804他们以前的建议与我的建议完全相同-使用保持活动-但看起来他们在那之后实现了“心跳”功能。谢谢,这是一个非常有用的链接。