当PC从睡眠状态恢复时,我想从PC向相机发送UDP数据包。由于PC恢复后网络接口需要一些时间(未知)才能变为活动状态,因此我会不断地将数据包发送到摄像机。当摄像机接收到数据包时,它会向PC发送确认信号。 我的问题是"对于从摄像机接收UDP数据包(ack信号),我使用recvfrm()函数来阻止循环。如何取消阻止此功能,使其仅在收到来自摄像机的确认信号时退出循环。
答案 0 :(得分:3)
使用传递给MSG_DONTWAIT
函数的recvfrom
标志。它启用非阻塞模式。如果操作阻止此调用,则返回EAGAIN
或EWOULDBLOCK
错误代码。
答案 1 :(得分:2)
对maverik的答案(否则正确)的更便携式解决方案是fcntl
套接字O_NONBLOCK
。
MSG_DONTWAIT
,虽然在Linux和BSD下可用,但大多数Unices只在SUSv4中标准化发送(为什么,我不知道......但是M. Kerrisk这样说)。一个不支持它的着名平台是Winsock(至少它没有在MSDN中记录)。
或者,如果你不想篡改晦涩的标志和fcntl
,你可以select
描述符准备就绪(零超时,甚至是非零超时限制)你发送的数据包 - 不要泛滥网络堆栈可能是个好主意。继续发送,直到select
说出可以阅读的内容。
答案 2 :(得分:0)
最简单的方法(但不是最好的代码)是等待一段时间回复就是在调用recvfrom()之前使用select。