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