Как очистить входной буфер (если такая вообще существует) UDP-сокета в C?
Я работаю над встроенной средой 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.Как я могу это сделать?или по какому пути мне идти?