Comprendre set / getsockopt SO_SNDBUF

Bonjour, 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  #include  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 le résultat?

Vous ne faites rien de mal. Linux double la valeur (dans le kernel) lorsque vous la 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 la place pour les frais généraux de la comptabilité)
               quand il est défini en utilisant setsockopt (), et cette valeur doublée est
               retourné 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é du tampon d’envoi / réception est utilisée pour des
        structures de kernel;  ainsi les sysctls sont deux fois ce que l'on peut observer sur
        le fil.
 [...]