Как очистить входной буфер (если он вообще существует) UDP-сокета в C?
Я работаю над встроенной средой 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
tl,dr: пакеты/сообщения/рассылки UDP, отправленные в уже привязанный сокет, чей родительский поток находится в спящем режиме в момент доставки; каким-то образом ставятся в очередь/буферизуются и доставляются при следующем вызове recvfrom на указанном сокете.
Я хочу, чтобы эти UDP-трансляции игнорировались, поэтому я подумал об очистке буфера приема (очевидно, не того, который я задаю в качестве параметра методу recvfrom), если он существует, до вызова recvfrom. Как я могу это сделать? или какой путь я должен следовать?