que se passe-t-il lorsque j'écris des données sur un socket bloquant, plus vite que l'autre côté?
supposons que j'écris de données très rapide [j'ai toutes les données dans la mémoire] à un blocage de la douille.
en outre supposons que l'autre côté va lire des données très lent [comme le sommeil 1 seconde entre chaque lecture].
ce qui est le comportement attendu sur le côté de l'écriture dans ce cas?
serait l'opération d'écriture de bloc jusqu'à l'autre côté lit de suffisamment de données, ou l'écriture renvoie une erreur comme la réinitialisation de la connexion?
source d'informationauteur Aviad Rozenhek
Vous devez vous connecter pour publier un commentaire.
Pour un blocage de la douille, la
send()
appel se bloque jusqu'à ce que toutes les données ont été copiées dans la pile réseau du tampon pour que la connexion. Il n'a pas à être reçu par l'autre côté. La taille de ce tampon est dépendant de l'implémentation.Les données sont effacées de la mémoire tampon lorsque la distance reconnaît-il. C'est un système d'exploitation chose et ne dépend pas de la distance application en fait de la lecture des données. La taille de ce tampon est également dépendant de l'implémentation.
Lorsque la télécommande de la mémoire tampon est pleine, elle dit à votre pile locale pour arrêter l'envoi. Lorsque les données sont effacées à partir de la télécommande de la mémoire tampon (en cours de lecture par l'application à distance), alors le système à distance en informera le système local d'envoyer plus de données.
Dans les deux cas, les petits systèmes (comme les systèmes embarqués) peuvent avoir des tampons de quelques KO ou plus petit et moderne, les serveurs peuvent avoir des tampons de quelques MO ou plus.
Une fois l'espace disponible dans la mémoire tampon locale, de plus en plus de données à partir de votre
send()
appel sera copié. Une fois l'ensemble de ces données a été copié, votre appel sera de retour.Vous n'obtiendrez pas une "connexion réinitialisée" erreur (à partir de l'OS -- les bibliothèques peuvent faire n'importe quoi), sauf si la connexion ne fait réinitialisés.
Alors... Il n'a vraiment pas d'importance la façon dont rapidement la distance de l'application est de la lecture des données jusqu'à ce que vous avez envoyé autant de données à la fois locale & distance des tailles de tampon combiné. Après cela, vous ne serez en mesure de
send()
aussi rapidement que la distance côtérecv()
.De sortie (envoyer) buffer est rempli jusqu'à ce qu'il est plein et
send()
bloc jusqu'à ce que le tampon d'être libéré assez pour mettre en file d'attente le paquet.Que l'envoi de la page de manuel dit:
Lorsque le message ne rentre pas dans le tampon d'envoi de la socket,
send() bloque normalement, à moins que le socket a été placé en non-
blocage I/O mode.
Regardez ceci: http://manpages.ubuntu.com/manpages/lucid/man2/send.2.html