2011-08-26 47 views
4

我有客户端代码,它使用UDP和recvfrom()从服务器获取响应。这在服务器开启时工作正常,但是一旦我停止服务器,我的客户端程序挂起;我怀疑recvfrom()正在等待来自服务器的响应。Recvfrom()挂起 - 服务器关闭时如何处理此问题

如果服务器和客户端都安装在同一个系统上,他们在服务器关闭时从recvfrom()得到错误,但是当服务器和客户端在不同的系统上时,客户端在recvfrom()处挂起,自OFF以来服务器没有响应。

请有人可以给我想法我怎么能处理这种情况,也许一个定时器信号interuption可以解决这个问题..任何人都可以抛出一些光?

我使用Visual Studio 2005

回答

4

您的来电阻塞,因为此套接字没有数据现在。当服务器打开时,发送数据的速度足够快,以便recvfrom呼叫获得并快速返回。当服务器关闭时,没有人发送数据和recvfrom永远等待。无论服务器是打开还是关闭都没关系,recvfrom在两种情况下都做同样的事情;你只是没有注意到第一种情况下的延迟。

您需要使用非阻塞插座。在非阻塞模式下,recvfrom将在没有数据时返回错误,而不是等待。然后您可以使用select呼叫进入休眠状态,直到发生超时或数据到达。

+0

谢谢,非阻塞模式为我工作 –

+0

供未来用户使用。有关如何制作套接字非阻塞的示例,请参阅以下ioctlsocket函数的MSDN文档:http://msdn.microsoft.com/en-us/library/windows/desktop/ms738573%28v=vs.85%29。 ASPX – Ian