Recvfrom() 挂起——服务器关闭时如何处理

Ani*_*mar 4 c++ client-server visual-c++

我有客户端代码,它使用 UDP 和recvfrom(). 这在服务器开启时工作正常,但是一旦我停止服务器,我的客户端程序就会挂起;我怀疑 recvfrom() 正在等待来自服务器的响应。

如果服务器和客户端都安装在同一个系统上,recvfrom()当服务器关闭时我会收到错误,但是当服务器和客户端在不同的系统上时,客户端在 recvfrom() 处挂起,因为服务器没有响应因为它关闭。

请有人可以让我知道我该如何处理这种情况,也许定时器信号中断可以解决这个问题..任何人都可以对此有所了解吗?

我正在使用 Visual Studio 2005。

ham*_*ene 5

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

您需要使用非阻塞套接字。在非阻塞模式下,recvfrom没有数据时会返回错误,而不是等待。然后,您可以使用selectcall to sleep,直到发生超时或数据到达。