C++ UDP sendto blocking

Squicky

Lt. Commander
Registriert
Sep. 2002
Beiträge
1.404
Hallo

Benutzt wird Linx Mint 17 und C++.

Ist es möglich einen UDP Socket zu einzustellen, dass die sendto Funktion blockierend ist?

Zur Zeit ist es möglich, dass eine Datenmengen schneller per sendto in einer for Schleife schneller gesendet werden wie die Netzwerkverbidnung des PC es physikalisch erlaubt. (z.B. 2 Mbyte werden im bruchteil einer Sekunde gesendet, obwohl nur eine UMTS Verbindung vorhanden ist)

Dies liegt wahrscheinlich daran, weil das Betriebssystem und der Netzwerk Stack Buffer hat.

Ist dieses zwischenspeichern abschaltbar?
Die sendto Funktion soll erst zurückkommen, wenn die Daten wirklich physikalisch gesendet wurden.
Welche Möglichkeiten gibt es da?

Danke
 
Ich würde jetzt mal vermuten, daß du den socket mit der ioctlsocket-Funktion parametrieren kannst (blockierend oder nicht-blockierend).
 
Nein, weil es das nicht in der Art und Umfang nicht gibt.

Es gibt ein Sendepuffer, der ist aber i.d.R so 100 kB groß.

UDP hat aber die Eigenschaft, dass wenn zu viele Pakete gesendet werden, irgendwelche Pakete verworfen werden. Das bedeutet, es ist dein Problem, zu prüfen, was du für ein Paket-Loss hast und du musst darauf reagieren.

Ich denke, die einfachste Lösung ist TCP.

Unter Linux sind alle Sockets erst Mal blockierend (also wenn du keine Parameter zusätzlich übergibst). Ich denke nicht, dass es da irgendwelche ioctrls gibt. (Was vielleicht geht, ist ein select für write).
 
Normalerweise ist der socket im blockierenden Modus. Non-blocking I/O muss explizit per SOCK_NONBLOCK/O_NONBLOCK gesetzt werden. Blockierend heißt aber nicht, dass der sendto() Aufruf für UDP solange blockiert, bis die Daten tatsächlich das Netzwerkinterface verlassen haben. Es wird lediglich solange blockiert, bis angegebene Datagramm in den Kernelpuffer passt. Das könnte praktisch "sofort" der Fall sein.
Die Größe der send/recv Buffer können per getsockopt() und setsockopt() inspiziert bzw. manipuliert werden. Details siehe hier.
 
Zuletzt bearbeitet:
Zurück
Oben