Comment vider la mémoire Tampon d'Entrée de l'UDP Socket en C?

Comment vider la mémoire Tampon d'Entrée (si une telle chose existe) d'une Socket UDP en C ?

Je suis en train de travailler sur un Linux embarqué environnement et l'utilisation de C pour créer des applications natives. Il y a plusieurs de ces machines sur le même réseau, et lorsqu'un événement se produit sur l'un d'eux (appelons cela le dénonciateur), dénonciateur doit envoyer un message réseau à l'adresse de diffusion réseau, de sorte que toutes les machines sur le réseau (y compris la dénonciation) sait à propos de l'événement et exécute certaines actions en fonction de cela. Je suis en utilisant le socket UDP par le chemin...

Voici le pseudo-code:

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;
        }
    }
}

La façon dont je attendent et souhaitent de travail de ce code est:

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

La façon dont il fonctionne réellement est:

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: Les paquets/messages/Diffusions UDP envoyés à un déjà lié socket, whoose parent fil est de dormir à la livraison-moment; sont en quelque sorte mis en file d'attente/tampon et livré au cours de la prochaine "recvfrom' appel sur le dit support.

Je veux ces diffusions UDP être ignoré alors que je pensais de vider le tampon de réception (évidemment pas celui que je suis en donnant comme paramètre à la recvfrom méthode), s'il existe, avant d'appeler recvfrom. Comment puis-je le faire? ou quel chemin dois-je suivre?

InformationsquelleAutor Cihan Keser | 2010-02-19