2

当 PC 从睡眠状态恢复时,我想从 PC 向相机发送一个 UDP 数据包。由于 PC 恢复后网络接口需要一些时间(未知)才能激活,所以我一直循环向相机发送数据包。当相机接收到数据包时,它会向 PC 发送一个确认信号。我的问题是“为了从摄像机接收 UDP 数据包(确认信号),我使用了阻止循环的 recvfrm() 函数。我如何解除阻止这个函数,以便它只有在接收到来自摄像机的确认信号时才退出循环。

4

3 回答 3

3

使用MSG_DONTWAIT传递给recvfrom函数的标志。它启用非阻塞模式。如果操作会阻塞此调用返回EAGAINEWOULDBLOCK错误代码。

于 2012-04-25T09:10:29.437 回答
2

对 maverik 的答案(否则是正确的)的更便携的解决方案是将fcntl套接字连接到O_NONBLOCK.

MSG_DONTWAIT,虽然在 Linux 和 BSD 下可用,并且大多数 Unices 仅在 SUSv4 中标准化用于发送(为什么,我不知道......但 M. Kerrisk 这么说)。一个不支持它的值得注意的平台是 Winsock(至少它没有在 MSDN 中记录)。

或者,如果您不想篡改晦涩的标志和fcntl,则可以select使用准备就绪描述符(使用零超时,甚至使用非零超时来限制您发送的数据包 - 最好不要淹没网络堆栈)。继续发送,直到select说可以读取某些内容。

于 2012-04-25T09:23:51.350 回答
0

最简单的方法(但不是最好的代码)是等待一段时间的回复是在调用 recvfrom() 之前使用select 。

于 2012-04-25T09:23:16.720 回答