如何在C中清除UDP套接字的输入缓冲区(如果这样的东西存在的话)?
我正在嵌入式Linux环境下工作,使用C语言创建一些本地应用程序。网络上有几台这样的嵌入式设备,并且当其中一台设备发生事件(假设它是“吹哨人”)时,“吹哨人”应该向网络广播地址发送网络消息,以便网络上的所有机器(包括“吹哨人”)都知道该事件并根据其执行一些操作。顺便提一句,我正在使用UDP套接字...
以下是伪代码:
实际上,它的工作方式是:
我正在嵌入式Linux环境下工作,使用C语言创建一些本地应用程序。网络上有几台这样的嵌入式设备,并且当其中一台设备发生事件(假设它是“吹哨人”)时,“吹哨人”应该向网络广播地址发送网络消息,以便网络上的所有机器(包括“吹哨人”)都知道该事件并根据其执行一些操作。顺便提一句,我正在使用UDP套接字...
以下是伪代码:
main
{
startNetworkListenerThread( networkListenerFunction );
while( not received any SIGTERM or such )
{
localEventInfo = checkIfTheLocalEventOccured();
broadcastOnNetwork( localEventInfo );
}
}
networkListenerFunction
{
bindSocket;
while( not SIGTERM )
{
// THIS IS WHERE I WANT TO FLUSH THE RECV BUFFER...
recv_data = recvfrom( socket );
if( validate recv data )
{
startExecuteLocalAction;
sleep( 5 );
stopExecuteLocalAction;
}
}
}
我希望这段代码能够按照以下方式工作:
1. LOCAL_EVENT occured
2. Broadcasted LOCAL_EVENT_INFO on network
3. All machines received EVENT_INFO, including the original broadcaster
4. All machines started executing the local action, including the original broadcaster
5. All machines' network listener(thread)s are sleeping
6. Another LOCAL_EVENT2 occured
7. Since all machines' listener are sleeping, LOCAL_EVENT2 is ignored
8. All machines' network listener(thread)s are now active again
9. GO BACK TO 1 / RESTART CYCLE
RESULT = TOTAL 2 EVENTS, 1 IGNORED
实际上,它的工作方式是:
1. LOCAL_EVENT occured
2. Broadcasted LOCAL_EVENT_INFO on network
3. All machines received EVENT_INFO, including the original broadcaster
4. All machines started executing the local action, including the original broadcaster
5. All machines' network listener(thread)s are sleeping
6. Another LOCAL_EVENT2 occured
7. Eventhough all machines' listener are sleeping; LOCAL_EVENT2 is queued SOMEHOW
8. All machines' network listener(thread)s are now active again
9. All machines received EVENT_INFO2 and executed local actions again, slept and reactivated
10. GO BACK TO 1 / RESTART CYCLE
RESULT = TOTAL 2 EVENTS, 0 IGNORED
简述:已经绑定了socket的父线程正在休眠等待传递,发送到该socket的数据包/消息/UDP广播被以某种方式排队缓冲,并在下一次对该socket进行'recvfrom'调用时传递。
我希望忽略那些UDP广播,所以我想在调用recvfrom之前清空接收缓冲区(显然不是我作为参数提供给recvfrom方法的那个)。 我该如何做到这一点?或者我应该遵循哪条路径?
select
(http://linux.die.net/man/2/select) 的命令可用?如果是,您可以使用select
判断是否有任何输入可用,并在需要时调用阻塞读取函数。如果您有这样的函数可用,我建议使用select
和非阻塞 I/O(阻塞读取函数有时会内部实现为select
+ 非阻塞读取)。这比阻塞 I/O 提供更多的灵活性和控制。 - btarecvfrom
时,您将调用一个函数,该函数将从I/O循环中检索数据(例如将其保留在内部队列中)。 - bta