【发布时间】:2014-12-10 17:14:24
【问题描述】:
我正在使用 Windows 和 MAC 上的套接字开发客户端服务器程序,目前面临的问题是,当服务器程序使用任务管理器崩溃/终止时,客户端调用 recv 会永远阻塞。我将一些数据发送到服务器并使用recv异步等待回复。此回复将在一段时间后来自服务器,无法确定。 当套接字的其他端死亡时,我期待 recv 出现错误。不知道如何处理这种情况。
建议?
谢谢,
【问题讨论】:
标签: sockets
我正在使用 Windows 和 MAC 上的套接字开发客户端服务器程序,目前面临的问题是,当服务器程序使用任务管理器崩溃/终止时,客户端调用 recv 会永远阻塞。我将一些数据发送到服务器并使用recv异步等待回复。此回复将在一段时间后来自服务器,无法确定。 当套接字的其他端死亡时,我期待 recv 出现错误。不知道如何处理这种情况。
建议?
谢谢,
【问题讨论】:
标签: sockets
使用setsockopt() 和SO_RCVTIMEO 选项设置读取超时,将其设置为一些合理的值。
【讨论】:
select()/poll()/epoll()来等待有超时的入站数据,并且只有在确实有东西等待被读取时才调用recv()(包括优雅的对等端的流结束关闭)。
如果您使用 TCP 并且对等套接字正确关闭并且两个系统之间的通信正常(没有损坏的电缆等),您的 recv 不应挂起(而是指示关闭的连接)。在 UNIX 中,即使进程崩溃或被杀死,内核也会正确关闭套接字,但我不知道在这种情况下 Windows 的行为。
如果您使用 UDP 进行通信,recv 仍然会挂起,因为没有明确的连接关闭。
【讨论】: