SO_SNDBUF et SO_RCVBUF sur Linux sockets

Je suis de la programmation d'une application de serveur client. Simplement, le serveur peut utiliser UDP ou TCP pour chaque client.

Je veux à la fois le client TCP et UDP client pour imprimer la valeur par défaut pour
SO_SNDBUF et SO_RCVBUF, mais je suis surpris quand j'imprime la valeur par défaut pour sndbuf et rcvbuf avant l'établissement de la connexion, la valeur est 0.

Note: j'utilise Ubuntu 12.10

Voici mon code:

//assume all variables initialized correctly.

/* SO_RCVBUF options */

len = sizeof(rcvbuf);
getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, &len);
len = sizeof(mss);
getsockopt(sockfd, IPPROTO_TCP, TCP_MAXSEG, &mss, &len);
printf("defaults: SO_RCVBUF = %d, MSS = %d\n", rcvbuf, mss);

rcvbuf = 9973;      /* a prime number */
setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, sizeof(rcvbuf));
len = sizeof(rcvbuf);
getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, &len);
printf("SO_RCVBUF = %d (after setting it to 9973)\n\n\n\n", rcvbuf); 


/* SO_RCVBUF options */


/* SO_SNDBUF options */

len2 = sizeof(sndbuf);
getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sndbuf, &len2);
//len2 = sizeof(mss2);
getsockopt(sockfd, IPPROTO_TCP, TCP_MAXSEG, &mss2, &len2);
printf("defaults: SO_SNDBUF = %d, MSS = %d\n", sndbuf, mss2);

sndbuf = 9979;      /* a prime number */
setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sndbuf, sizeof(sndbuf));
len2 = sizeof(sndbuf);
getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sndbuf, &len2);
printf("SO_SNDBUF = %d (after setting it to 9979)\n", sndbuf);

/* SO_SNDBUF options */

Exemple de sortie:

par défaut: SO_RCVBUF = 0, MSS = 0

SO_RCVBUF = 9973 (après la mise à 9973)

par défaut: SO_SNDBUF = 0, MSS = 0

SO_SNDBUF = 9979 (après la mise à 9979)

tcp_time nes411_server

L'heure courante (TCP) le: Lun Avr 22 23:40:46 2013

Après la connexion:

SO_SNDBUF = 170840, MSS = 16384

InformationsquelleAutor zak | 2013-04-22