【发布时间】:2010-02-19 21:56:48
【问题描述】:
如何在 C 中刷新 UDP Socket 的输入缓冲区(如果存在的话)?
我正在开发嵌入式 Linux 环境并使用 C 创建一些本机应用程序。在同一个网络上有几台这样的嵌入式机器,当其中一台发生事件时(我们称之为 WHISTLE-BLOWER),WHISTLE-BLOWER 应该向网络广播地址发送网络消息,以便所有机器上网络(包括 WHISTLE-BLOWER)知道该事件并根据它执行一些操作。 顺便说一句,我正在使用 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
tl,dr:发送到已经绑定的套接字的数据包/消息/UDP广播,其父线程在交付时刻处于休眠状态;以某种方式排队/缓冲并在所述套接字上的下一次“recvfrom”调用中传递。
我希望忽略那些 UDP 广播,所以我想在调用 recvfrom 之前刷新接收缓冲区(显然不是我作为参数提供给 recvfrom 方法的那个)。我怎样才能做到这一点?或者我应该走哪条路?
【问题讨论】: