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

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


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 meinem Rechner ist:


Puffergröße senden =129024


setzt den Sendepuffer auf 98304


neue Sendepuffergröße =196608


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


Antworten:


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.
[...]