Ich benutze libnetfilter_queue für mein Projekt. Von der C-App-Warteschlange kann über den "Warteschlangendatei-Deskriptor" zugegriffen werden. Ich habe 5 Warteschlangen und 5 Threads, um sie zu behandeln. Was ich erreichen möchte, ist Thread aufzuwachen, wenn genau zwei Pakete in der Warteschlange sind. Ich kam auf die Idee, eine Auswahlfunktion und ein Array von Ints zu verwenden, um anzuzeigen, wie viele Pakete in jeder Warteschlange eingereiht waren. Nach Auswahl von Exit mit> 0 Code überprüfe ich, welche Queue ein Paket erhalten hat und den Wert im Array inkrementiere, wenn es größer als 2 ist, wecke ich einen Thread auf. Alles wäre in Ordnung, aber Select gibt an, dass die Warteschlange Daten zu lesen hat, bis ich recv anrufe, und das kann ich nicht, weil ein separater Thread diese Pakete verarbeiten sollte. Hat jemand eine Idee, wie man dieses Problem lösen kann? Ich weiß, dass ich SO_RCVLOWAT einstellen kann, aber es löst mein Problem nicht, weil ich nicht weiß, welche Größe diese 2 Pakete sein werden.Wie wecken Sie einen Thread nach dem Empfang von 2 Paketen
Antwort
Wie von Tobu empfohlen, ist epoll eine bessere Wahl und es ist besser als Auswahl. Die meisten dieser Abruffunktionen geben jedoch an, dass ein Ereignis (Daten verfügbar) vorhanden ist, sofern nicht jemand liest. Verwenden Sie nach Möglichkeit das folgende Modell: Verwenden Sie epoll/select, um nach eingehenden Daten zu suchen und den Worker-Thread zu aktivieren. Lassen Sie den Arbeitsthread entscheiden, was mit den Daten zu tun ist (ein Paket, zwei oder mehr), bevor Sie die Arbeit tatsächlich erledigen.
ODER: Ein Reader-Thread-N Worker-Threads: Verwendet epoll, um alle eingehenden Daten zu warten und zu lesen und sie an die Warteschlange des entsprechenden Worker-Threads zu senden. Sobald die Paketanzahl den Schwellenwert erreicht, wecken Sie den Worker-Thread (mit einem Semaphor).
Sie suchen nach flankengesteuerten Ereignisbenachrichtigungen - Benachrichtigungen, die gesendet werden, wenn sich die Menge der verfügbaren Daten ändert. epoll funktioniert so, wenn Sie das EPOLLET-Flag verwenden, und standardmäßig wird die Benachrichtigung zurückgesetzt, damit Sie über neue Pakete benachrichtigt werden.
Bitte beachten Sie, dass Sie nur einmal benachrichtigt werden, wenn mehrere Pakete zwischen zwei epoll_wait-Anrufen ankommen.
Ich sehe deinen Standpunkt. Wenn ich zu viel Zeit zwischen epoll_wait call verbracht habe und in dieser Zeit mehr als 1 Paket empfangen wurde, kann ich nicht feststellen, wie viele empfangen wurden. Danke für diese Information – pejotr
Ist es wirklich _wenn die Menge der verfügbaren Daten sich ändert_ oder wenn es von leer zu nicht leer (für Empfangspuffer) geht? –
Ich bin mir ziemlich sicher, dass es Ersteres ist: Immer wenn ein Paket ankommt. Der Kernel-Code justs setzt ein Flag, wenn ep_poll_callback aufgerufen wird und verfolgt nicht, ob der Puffer zu diesem Zeitpunkt voll war oder nicht. – Tobu
- 1. ALAssetsLibrary - Absturz nach dem Empfang von ALAssentsLibraryChangedNotification
- 2. Verzögerung beim Empfang von UDP-Paketen in Python in Echtzeit
- 3. Echtzeit-Empfang von UDP-Paketen mit QNX RTOS
- 4. UIViewController Entfernen von Superview nach dem Empfang von nsnotification
- 5. Empfangen von RTP-Paketen nach RTSP-Setup
- 6. Löschen Sie std :: thread nach dem Aufruf von Join?
- 7. Quittungsvalidierung - Empfang nach dem Löschen der App erhalten?
- 8. Lösche SMS Android nach dem Empfang Ohne Verzögerung
- 9. Wie wird ein Python-Prozess nach dem Empfang von SIGTERM beim Warten auf einen Semaphor ordnungsgemäß beendet?
- 10. Wie überleben Daemon-Thread nach dem Beenden von JVM?
- 11. Android CGM starten Aktivität nach dem Empfang Push-Benachrichtigung
- 12. Java - benachrichtigen Sie einen äußeren Thread von einem inneren Thread
- 13. Wie stoppe ich einen Thread von einem anderen Thread
- 14. Nennen Sie Thread nach Name von ProcessThreadCollection
- 15. Empfang von UDP-Paketen, die an 127.0.0.1 gesendet werden, wenn SO_REUSEADDR verwendet wird
- 16. schreiben .wav leer nach dem Empfang von Daten aus der Abnutzung
- 17. Wie weckt man am besten einen schlafenden Python-Thread?
- 18. Erhalten Sie einen Thread von ID
- 19. Löschen Sie einen Punkt von Ihrer Figur nach dem Plotten
- 20. Java - Wie nach Ereignis zu UI-Thread oder rufen Sie eine Funktion von UI-Thread?
- 21. Von Haskell-Paketen lernen
- 22. Thread Scheduling-Wie Thread erwirbt die Sperre nach der Benachrichtigung mit dem Namen
- 23. Wie bekomme ich einen Thread-Status von einem anderen Thread?
- 24. Verbinden Sie 2 Tabellen nach dem ungefähren Zeitstempel
- 25. Apache Cordova App stürzt nach dem Empfang von Parse.com Push-Benachrichtigung
- 26. Rspec - kombinieren expect_any_instance_of und einen Empfang zählt
- 27. Wie auf benutzerdefinierte Header in Spring-Integration nach dem Empfang http-Fehler
- 28. Importieren von Paketen in go
- 29. Redirect auf neue Seite nach dem Empfang von Daten aus Javascript
- 30. posix sem_post kann sem_wait nicht wecken wo die sem init im thread ist.
warum würden Sie so etwas brauchen? – jalf