web-dev-qa-db-fra.com

Comprendre set / getsockopt SO_SNDBUF

Salut, j'ai le programme suivant pour vérifier la taille du tampon d'envoi pour un socket UDP. Cependant, je la valeur de retour est un peu déroutant pour moi. J'utilise l'application simple suivante:

#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;
}

La sortie sur ma machine est:

taille du tampon d'envoi = 129024

définit le tampon d'envoi sur 98304

taille du tampon d'envoi = 196608

Quelqu'un peut-il clarifier ce que je fais mal ici ou comment interpréter la sortie?

40
mortenvp

Vous ne faites rien de mal. Linux double la valeur (dans le noyau) lorsque vous le définissez et renvoie la valeur doublée lorsque vous l'interrogez. man 7 socket dit:

 [...] 
 
 SO_SNDBUF 
 Définit ou obtient le tampon d'envoi de socket maximum en octets. Le ker - 
 Nel double cette valeur (pour laisser de l'espace pour la surcharge comptable) 
 Lorsqu'il est défini à l'aide de setsockopt (), et cette valeur doublée est 
 Renvoyée par getsockopt (). La valeur par défaut est définie par le 
 Wmem_default sysctl et la valeur maximale autorisée est définie par le 
 Wmem_max sysctl. La valeur minimale (doublée) pour cette option est 
 2048. 
 [...] 
 
 REMARQUES 
 Linux suppose que la moitié de l'envoi/le tampon de réception est utilisé pour les structures internes du noyau 
; ainsi les sysctls sont deux fois ce qui peut être observé sur 
 le fil. 
 [...] 
52
Matthew Slattery