Verständnis von set/getsockopt SO_SNDBUF-Größe verdoppelt sich

Lesezeit: 3 Minuten

Benutzeravatar von mortenvp
mortenvp

Hallo, ich habe das folgende Programm, um die Sendepuffergröße für einen UDP-Socket zu überprüfen. Allerdings ist der Rückgabewert für mich etwas verwirrend. Ich verwende die folgende einfache App:

#include <sys/socket.h>
#include <stdio.h>

int main(int argc, char **argv)
{
 int sockfd, sendbuff;
 socklen_t optlen;

 sockfd = socket(AF_INET, SOCK_DGRAM, 0);
 if(sockfd == -1)
     printf("Error");

 int res = 0;

 // Get buffer size
 optlen = sizeof(sendbuff);
 res = getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuff, &optlen);

 if(res == -1)
     printf("Error getsockopt one");
 else
     printf("send buffer size = %d\n", sendbuff);

 // Set buffer size
 sendbuff = 98304;

 printf("sets the send buffer to %d\n", sendbuff);
 res = setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuff, sizeof(sendbuff));

 if(res == -1)
     printf("Error setsockopt");


 // Get buffer size
 optlen = sizeof(sendbuff);
 res = getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuff, &optlen);

 if(res == -1)
     printf("Error getsockopt two");
 else
     printf("send buffer size = %d\n", sendbuff);

 return 0;
}

Die Ausgabe auf meiner Maschine ist:

Sendepuffergröße = 129024

setzt den Sendepuffer auf 98304

neue Sendepuffergröße = 196608

Kann jemand klären, was ich hier falsch mache oder wie die Ausgabe zu interpretieren ist?

Du machst nichts falsch. Linux verdoppelt den Wert (innerhalb des Kernels), wenn Sie ihn festlegen, und gibt den verdoppelten Wert zurück, wenn Sie ihn abfragen. man 7 socket sagt:

[...]

    SO_SNDBUF
              Sets or gets the maximum socket send buffer in bytes.  The  ker-
              nel doubles this value (to allow space for bookkeeping overhead)
              when it is set using setsockopt(), and  this  doubled  value  is
              returned  by  getsockopt().   The  default  value  is set by the
              wmem_default sysctl and the maximum allowed value is set by  the
              wmem_max sysctl.  The minimum (doubled) value for this option is
              2048.
[...]

NOTES
       Linux assumes that half of the send/receive buffer is used for internal
       kernel structures; thus the sysctls are twice what can be  observed  on
       the wire.
[...]

  • Heiliger Networking-Batman! Da kommt das ganze Skbuf-Zeug hin 🙂

    – Nikolai Fetissov

    9. Januar 2010 um 2:40 Uhr

  • @csyangchen: Ich kann nur raten, aber ich würde annehmen, dass jemand die Idee hatte, dass der Puffer durch Setzen des Puffers auf die Größe n in der Lage sein sollte, n Bytes PAYLOAD aufzunehmen. Daher ist zusätzliche Puffergröße erforderlich, um die Nachrichtenheader aufzunehmen (zumindest im Fall eines verbindungslosen zugrunde liegenden Protokolls wie UDP).

    – Aconcagua

    1. Februar 2016 um 10:22 Uhr

  • @csyangchen Ich hätte auch gerne mehr Details als diese vage Erklärung. Ich würde vermuten, dass es möglicherweise damit zusammenhängt, wie TCP funktioniert. Wenn der Puffer beispielsweise XX Bytes beträgt, könnte auch dieselbe Größe von Bytes auf dem Weg zum Ziel sein. Bis diese von der Gegenstelle bestätigt wurden, müssen diese Bytes auf der Senderseite gehalten werden, im schlimmsten Fall könnte es das Doppelte dieses Puffers sein, wenn die Gegenstelle langsam antwortet und das TCP-Fenster größer als SNDBUF ist.

    – Paul P

    30. Juli 2017 um 3:21 Uhr


  • Kurz gesagt: Die Leute von 1983 hatten wenig bis gar keine Erfahrung mit dem Schreiben von APIs, daher ist es sinnvoll, dass Sie sich mit solchem ​​Unsinn auseinandersetzen müssen, wenn Sie diese Dinosaurier verwenden möchten. Leider basiert das ganze Internet auf diesem Zeug und deshalb muss man es am Ende abstrahieren (ganz zu schweigen davon, dass es aus den gleichen Gründen je nach Plattform subtile Unterschiede in der Verwendung gibt, die nicht gerechtfertigt sind, also nicht eine portable API, bis Sie sie mit geeigneten Schnittstellen umhüllen und diese unter der Decke handhaben).

    – Pablo Arielle

    9. November 2018 um 20:10 Uhr

  • @PabloAriel Linux wurde nicht 1983 geschrieben. Dieses Verdopplungsproblem ist ein Linux-spezifischer Quatsch. Andere Systeme verhalten sich nicht auf diese bizarre Weise.

    – jschultz410

    23. Oktober 2021 um 13:53 Uhr

1407820cookie-checkVerständnis von set/getsockopt SO_SNDBUF-Größe verdoppelt sich

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy