如何解锁linux C中的recv()或recvfrm()函数

时间:2012-04-25 09:06:13

标签: c++ c sockets networking

当PC从睡眠状态恢复时,我想从PC向相机发送UDP数据包。由于PC恢复后网络接口需要一些时间(未知)才能变为活动状态,因此我会不断地将数据包发送到摄像机。当摄像机接收到数据包时,它会向PC发送确认信号。 我的问题是"对于从摄像机接收UDP数据包(ack信号),我使用recvfrm()函数来阻止循环。如何取消阻止此功能,使其仅在收到来自摄像机的确认信号时退出循环。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

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

或者,如果你不想篡改晦涩的标志和fcntl,你可以select描述符准备就绪(零超时,甚至是非零超时限制)你发送的数据包 - 不要泛滥网络堆栈可能是个好主意。继续发送,直到select说出可以阅读的内容。

答案 2 :(得分:0)

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