N'connect() bloc pour socket TCP?
Salut, je suis à la lecture de TLPI (Linux Interface de Programmation), j'ai une question à propos de connect().
Que je comprends, connect() va retourner immédiatement si la connexion en attente nombre de listen() n'atteint pas "arriéré".
Et il bloque le contraire. (selon la figure 56-2)
Mais pour socket TCP, il sera toujours bloquer jusqu'à accept() sur le côté serveur est appelé (selon la figure 61-5).
Suis-je la corriger?
Car j'ai vu que dans l'exemple de code (p.1265), il appelle listen() pour écouter sur un port spécifique et alors appel à connect() pour que le port AVANT l'appel à accept().
Se connecter() bloque toujours dans ce cas, n'est-ce pas?
Merci!!
OriginalL'auteur kai | 2011-11-24
Vous devez vous connecter pour publier un commentaire.
Il n'y a pratiquement aucun "immédiatement" à propos de la mise en réseau, des choses peut être perdu sur le chemin, et, une opération qui doit être effectuée immédiatement en théorie pourrait pas le faire dans la pratique, et en tout cas, il est la fin à la fin du temps de transmission.
Cependant
connect() sur une socket TCP est une opération de blocage, à moins que le descripteur de socket est mis en mode sans blocage.
Le système d'exploitation prend en charge la connexion TCP, lorsque la poignée de main est terminée, connect() retourne. (qui est,
connect() ne prend pas en bloc jusqu'à l'autre bout appels accept())
Succès de TCP handshake sera mis en file d'attente pour le serveur d'application, et peut être accept()'ed à tout moment plus tard.
connect
juste attendre que la poignée de main et pas pour le serveur d'appelaccept
, à cause de deux raisons: La première est qu'à partir de la clients côté, il est connecté après la poignée de main; Le second est parce que l'on peut passer un moment arbitraire entre la poignée de main, et avant que les serveurs d'appelsaccept
qui peut en effet être jamais.Même sans le reste de la réponse, "il n'y a guère à tout" tout de suite "" seuls les bons de souscription d'un +1. C'est tellement vrai pour beaucoup d'opérations, même en mode non bloquant. Dans l'immédiat peut être un surprise longtemps parfois, même pour des choses où vous auriez vraiment pas attendre.
Si
connect()
revient avant que le serveur d'appelsaccept()
, qu'advient-il si le client tente alors desend()
avant que le serveur a appeléaccept()
?Les données mises en mémoire tampon par le réseau de systèmes pile, jusqu'à ce que le tampon est plein, auquel cas le réseau de réception du stack de répondre avec une fenêtre vide qui provoque l'envoi de côté au retour de la
send
appel avec un message d'erreur.Comme mentionné, il n'y a pas "immédiatement". Il pourrait prendre de nombreux (plusieurs centaines) de milisecondes pour compléter le tremblement de la main sur un réseau. Il y a littéralement des millions de choses que vous pourriez faire en ce moment insted d'attente (blocage) de la poignée de main pour terminer.
OriginalL'auteur nos
se connecter
est un appel bloquant par défaut, mais vous pouvez le faire non bloquant en passant à socket laSOCK_NONBLOCK
drapeau.OriginalL'auteur Basile Starynkevitch
connect() bloque jusqu'à ce que la finition TCP 3-way handshake. Poignée de main sur l'écoute, côté est gérée par la pile TCP/IP dans le noyau et fini sans en avertir l'utilisateur processus. Seulement après la poignée de main est terminée (et initiateur de retour de connect() appel déjà), accept() dans le processus utilisateur peut choisir de nouvelles prise et de retour. Pas d'attente accept() nécessaires pour compléter poignée de main.
La raison en est simple: si vous avez mono-thread processus d'écoute pour les connexions et nécessitent d'attente accept() pour établir des connexions, vous ne pouvez pas répondre à TCP SYN lors du traitement d'une autre demande. Pile TCP sur initating côté, retransmettre, mais modérément chargé serveur chances sont élevées cette retransmis paquet encore arriverez alors qu'aucun accept() en attente et seront à nouveau baissé, entraînant dans laide des retards et des délais d'attente de connexion.
OriginalL'auteur blaze