Effet de SO_SNDBUF
Je suis incapable de permettre de comprendre comment et pourquoi le code suivant des segments de travail :
/* Now lets try to set the send buffer size to 5000 bytes */
size = 5000;
err = setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(int));
if (err != 0) {
printf("Unable to set send buffer size, continuing with default size\n");
}
Si nous vérifions la valeur de la mémoire tampon d'envoi, il est en effet correctement fixé à 5 000*2 = 10000.
Cependant, si nous essayons de nous envoyer de plus que la taille du tampon d'envoi, c'est tout. Par exemple:
n = send(sockfd, buf, 30000, 0);
/* Lets check how much us actually sent */
printf("No. of bytes sent is %d\n", n);
Ce imprime 30000.
Comment exactement fait ce travail? N'avais pas le fait que la taille du tampon d'envoi a été limitée à 10000 ont aucun effet? Si elle l'a fait, ce qui s'est exactement passé? Une sorte de fragmentation?
Mise à JOUR: Ce qui se passe si le socket est en mode sans blocage? J'ai essayé le suivant:
- Changement de taille de la mémoire tampon à 10000 (5000*2) les causes de 16384 octets à envoyer
- Changement de taille de la mémoire tampon à 20000 (10000*2) causes 30000 octets à envoyer
Encore une fois, pourquoi?
OriginalL'auteur Arun | 2011-11-13
Vous devez vous connecter pour publier un commentaire.
L'effet de la définition
SO_SNDBUF
option est différente pour TCP et UDP.Puisqu'il semble que vous parlez TCP, l'effet de l'observation s'explique par la prise en cours dans mode de blocage, donc
send(2)
des blocs jusqu'à ce noyau peut accepter l'ensemble de vos données, et/ou de la pile réseau asynchrone de la mise en queue des données et en le poussant vers la carte réseau, libérant ainsi de l'espace dans la mémoire tampon.Aussi, le protocole TCP est un protocole de flux, il ne permet pas de conserver un "message" de la structure. Un
send(2)
peut correspondre à plusieursrecv(2)
s de l'autre côté, et de l'autre manière autour. Le traiter comme octet-stream.c'est juste arrondi.. pourquoi cette question? vous ne devriez pas compter sur le fait que la mémoire tampon est exactement de n octets. le noyau peut allouer plus de.
Tout d'abord, le noyau ne prenez pas votre taille de la mémoire tampon comme est, comme @yi_H points. Ensuite, la pile de réseau fonctionne de manière asynchrone à l'égard de votre processus. Essayez ce qui suit - commencer à écrire pour le socket, mais ne pas lire sur l'autre taille. Finalement, vous aurez un court (noyau accepte de moins en moins d'octets puis vous le donner) ou d'échec de l'écriture.
Bien rien ne se passe pour moi en socket TCP. J'ai fait une application client-serveur où le serveur après avoir accepter la connexion dort pour une durée indéterminée, et le client continue l'envoi de messages. Tampon jamais oveflows ni mon appel envoyer des blocs comme le dit linux.die.net/man/2/send
Ensuite, vous faites quelque chose de mal.
OriginalL'auteur Nikolai Fetissov
SO_SNDBUF configure la mémoire tampon que le support de la mise en œuvre utilise en interne. Si votre prise est non-bloquante, vous pouvez envoyer uniquement jusqu'à la taille configurée, si votre prise est le blocage il n'y a pas de limitation pour votre appel.
OriginalL'auteur Werner Henze