Cih*_*ser 5 c sockets embedded udp
如何在 C 中刷新 UDP 套接字的输入缓冲区(如果存在这种情况)?
我正在嵌入式 Linux 环境中工作,并使用 C 来创建一些本机应用程序。在同一个网络上有几台这样的嵌入式机器,当其中一台发生事件时(我们称之为吹哨人),吹哨人应该向网络广播地址发送网络消息,以便所有机器在网络(包括 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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我期望并希望使用此代码的方式是:
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
Run Code Online (Sandbox Code Playgroud)
它的实际工作方式是:
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
Run Code Online (Sandbox Code Playgroud)
tl,dr:发送到已绑定套接字的数据包/消息/UDP 广播,其父线程在交付时刻处于休眠状态;以某种方式排队/缓冲并在所述套接字上的下一个“recvfrom”调用中传递。
我希望忽略那些 UDP 广播,所以我想刷新接收缓冲区(显然不是我作为参数提供给 recvfrom 方法的那个),如果它在调用 recvfrom 之前存在。我怎样才能做到这一点?或者我应该遵循什么路径?
请注意,“刷新”的概念仅适用于输出。刷新会清空缓冲区并确保其中的所有内容都已发送到目的地。对于输入缓冲区,数据已经到达目的地。输入缓冲区可以读取或清除,但不能“刷新”。
如果您只想确保已读取输入缓冲区中的所有内容,那么您需要的是非阻塞读取操作。如果您尝试但没有输入,它应该返回错误。