Wie erhalten Sie die maximale Anzahl von Bytes, die an einen sendto(..)
Aufruf für einen Socket als UDP-Port übergeben werden können?Maximale Pufferlänge für sendto?
Antwort
Da UDP nicht verbindungsorientiert ist, gibt es keine Möglichkeit anzugeben, dass zwei Pakete zusammengehören. Daher sind Sie durch die maximale Größe eines einzelnen IP-Pakets (65535) beschränkt. Die Daten, die Sie senden können, sind etwas geringer als das, weil die IP-Paketgröße auch den IP-Header (normalerweise 20 Bytes) und den UDP-Header (8 Bytes) enthält.
Beachten Sie, dass dieses IP-Paket fragmentiert werden kann, um in kleinere Pakete zu passen (z. B. ~ 1500 Byte für Ethernet).
Ich bin mir nicht bewusst, dass irgendein Betriebssystem dies weiter einschränkt.
Verwenden Sie getsockopt(). This site hat eine gute Aufschlüsselung der Nutzung und Optionen, die Sie abrufen können.
In Windows können Sie tun:
int optlen = sizeof(int); int optval; getsockopt(socket, SOL_SOCKET, SO_MAX_MSG_SIZE, (int *)&optval, &optlen);
Für Linux, nach der UDP-man-Seite, wird der Kernel MTU Entdeckung verwenden (es wird überprüfen, was die maximale UDP-Paketgröße zwischen hier und dem Ziel ist , und wählen Sie diese aus, oder wenn die MTU-Erkennung deaktiviert ist, wird die maximale Größe für die MTU-Schnittstelle festgelegt und alles Größere fragmentiert. Wenn Sie über Ethernet senden, beträgt die typische MTU 1500 Byte.
Unter Mac OS X gibt es unterschiedliche Werte für Senden (SO_SNDBUF) und Empfangen (SO_RCVBUF). Diese ist die Größe des Sendepuffers (Mann getsockopt):
getsockopt (Socke, SOL_SOCKET, SO_SNDBUF, (int *) & optval, & optlen);
Der Versuch, eine größere Nachricht senden (auf Leopard 9216 Oktetts auf UDP über den lokalen Loopback gesendet) führt in „Nachricht zu lang/EMSGSIZE“.