UDP Server Socket Buffer Overflow

Ich schreibe eine C ++ - Anwendung unter Linux. Meine Anwendung verfügt über einen UDP-Server, der bei bestimmten Ereignissen Daten an Clients sendet. Der UDP-Server erhält auch eine Rückmeldung / Bestätigung von den Clients.

Um diese Anwendung zu implementieren, habe ich einen einzelnen UDP-Socket verwendet (z.int fdSocket), um Daten von allen Clients zu senden und zu empfangen. Ich habe diesen Sockel an Port 8080 gebunden und den Socket in den NON_BLOCKING-Modus versetzt.

Ich habe zwei Threads erstellt. In einem Thread warte ich auf das Eintreten eines Ereignisses. Wenn ein Ereignis eintritt, verwende ich den fdsocket, um Daten an alle Clients zu senden (in einer for-Schleife).

In dem anderen Thread verwende ich dasfdSocket um Daten von Kunden zu erhalten (recvfrom()). Dieser Thread soll alle 4 Sekunden ausgeführt werden (d. H. Alle 4 Sekunden, die er aufruft)recvfrom() um die Daten aus dem Socket-Puffer abzurufen. Da es sich im NON-BLOCKING-Modus befindetrecvfrom() Funktion kehrt sofort zurück, wenn keine UDP-Daten verfügbar sind, dann werde ich für 4 Sekunden schlafen gehen).

Das UDP Feedback / Acknowledge von allen Clients hat eine feste Nutzlast, deren Größe 20 Byte beträgt.

Jetzt habe ich zwei Fragen zu dieser Implementierung:

Ist es richtig, denselben Socket für das Senden / Empfangen von UDP-Daten mit mehreren Clients zu verwenden?Wie finde ich die maximale Anzahl von UDP-Feedback / Acknowledge-Paketen, die meine Anwendung ohne UDP-Socket-Buffer-Überlauf verarbeiten kann? finde ich die Rate in Paketen / Sek., die ich sicher verarbeiten kann?

Ich habe versucht, die Linux-Socket-Puffergröße für meinen Socket zu ermitteln (fdsocket) über den Funktionsaufrufgetsockopt(fdsocket,SOL_SOCKET,SO_RCVBUF,(void *)&n, &m);. Durch diese Funktion stelle ich fest, dass meine Socket-Puffergröße 110592 beträgt. Es ist jedoch nicht klar, welche Daten in diesem Socket-Puffer gespeichert werden: Speichert er nur die UDP-Nutzdaten oder das gesamte UDP-Paket oder wird das gesamte Ethernet-Paket gespeichert? Ich habe das erwähntVerknüpfung um eine Vorstellung zu bekommen, wurde aber verwirrt.

Momentan ist mein Code ein bisschen dreckig, ich werde ihn bereinigen und bald hier posten.

Im Folgenden sind die Links aufgeführt, auf die ich vor dem Posten dieser Frage verwiesen habe.

Linux-NetzwerkUDP SentTo und Recvfrom Max Buffer SizeUDP Socket Buffer Overflow DetectionUDP-Broadcast und Unicast über denselben Socket?Senden von demselben UDP-Socket in mehreren ThreadsWie lösche ich den Eingangspuffer eines UDP-Sockets in C?So finden Sie die Socket-Puffergröße von LinuxWie erhalte ich die Datenmenge in der Warteschlange für den UDP-Socket?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage