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
- udp par défaut "devrait" être comme 40K essayez ce code: gist.github.com/rdp/8198697
Vous devez vous connecter pour publier un commentaire.
Évidemment l'envoyer tampon et tampon de réception sont attribués lorsque vous appelez
connect(),
pas avant. Vous pourriez être sur le point d'utiliser la prise pour l'écoute, dans ce cas, deux tampons serait un gaspillage de l'espace. Ou pour rien, idem.NB Pourquoi êtes-vous à l'aide d'un nombre premier? Il est d'usage d'utiliser des puissances de deux pour les tailles de mémoire tampon.
vous pouvez vérifier à partir de ci-dessous de code par défaut du tampon de socket.
https://gist.github.com/rdp/8198697