La comprensione delle dimensioni di set/getsockopt SO_SNDBUF raddoppia

La comprensione delle dimensioni di set/getsockopt SO_SNDBUF raddoppia


Ciao, ho il seguente programma per controllare la dimensione del buffer di invio per un socket UDP. Tuttavia, il valore restituito mi confonde un po'. Uso la seguente semplice 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;
}

L'output sulla mia macchina è:


dimensione del buffer di invio =129024


imposta il buffer di invio su 98304


nuova dimensione del buffer di invio =196608


Qualcuno può chiarire cosa sto sbagliando qui o come interpretare l'output?


Risposte:


Non stai facendo niente di male. Linux raddoppia il valore (all'interno del kernel) quando lo si imposta e restituisce il valore raddoppiato quando lo si interroga. man 7 socket dice:



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