J'essaie d'éviter Time_wait dans un client. Je connecte puis définissez O_NONBLOCK et SO_REUSEADDRDDRDDR. J'appelle lue jusqu'à ce qu'il renvoie 0. Lorsque Read Retourne 0, l'errno est également 0. J'ai interprété cela comme un signe que le serveur a fermé la connexion. Toutefois, si j'appelle Fermer, le socket est défini sur Time_Wait, comme confirmé par netstat. P>
Depuis que je fais un certain nombre de connexions sur le même hôte / port, je commence à voir les erreurs "adresse d'utilisation" (voir Devrais-je appeler fermer après avoir lu les retours 0? Si je ne le ferai pas le descripteur de fichier être publié? P>
3 Réponses :
Plus tard sur la même page, ils mentionnent SO_REUSEADDRDRDR. C'est ce dont vous avez besoin. Vous voulez certainement fermer le descripteur de fichier de lecture quand il retourne zéro. P>
Pardon. J'ai oublié d'ajouter que je mets So_reouseaddr. Voir dans l'article qu'il n'empêche pas l'adresse des erreurs d'utilisation lorsque vous vous connectez au même port / hôte.
Le côté qui est celui qui a initié la fermeture de la connexion est celui qui finit dans le À la fin de la journée, vous ne pouvez pas éviter un état Comme trois parties de ce tuple sont fixées dans votre scénario ( Essayez de faire plus de ports clients disponibles. Certains systèmes d'exploitation utilisent uniquement une petite gamme de ports disponibles pour "Les ports éphémères" par défaut (je ne suis pas sûr d'OSX à cet égard). Si tel est le cas, voir si vous pouvez modifier la plage avec une modification de la configuration dans le système d'exploitation ou si vous disposez également de la recherche de l'application pour un port de travail avec Développez le nombre d'hôtes code> VALEURS CODE> disponibles, à l'aide de plusieurs adresses IP de votre client. Vous devrez avoir l'application Développez le numéro d'hôte code> / Probablement la meilleure option, si elle est faisable: refacteur votre protocole afin que les connexions finies ne soient pas fermées, mais entrez dans un état "inactif" afin qu'ils puissent être réutilisés ultérieurement, au lieu d'ouvrir une nouvelle connexion (comme HTTP Keep-Alive). P> LI>
ul> Time_wait code> état. Lire () Code> Le retour 0 est censé indiquer que le serveur a d'abord fermé la prise, alors oui - cela devrait dire que le Time_wait code> finit sur le côté serveur et le client passe par last_ack code>. p>
TIME_WAIT CODE> Etat. Même si vous réussissez à le déplacer du client au côté du serveur, vous ne pouvez toujours pas réutiliser que (hôte serveur, port de serveur, hôte client, port client) code> tuple jusqu'à ce que le TIME_WAIT CODE> est terminé (quel que soit le côté, il est activé). P>
hôte serveur code>, port du serveur code>, hôte client code>), vous n'avez vraiment que Ces options: p>
Bind () code> / Connect () code> dans une boucle jusqu'à ce que la connexion fonctionne. p> li>
BIND () CODE> à l'une de ces adresses IP spécifiquement. P> li>
/ Valeurs disponibles, à l'aide de plusieurs ports et / ou d'adresses IP sur le serveur. Le client devra en choisir un pour se connecter (rond robin, aléatoire, etc.). P> li>
Désolé de commenter une vieille question, mais le premier paragraphe de cette réponse ne lit pas "le côté qui a initié la fermeture de la connexion est celui qui finit dans l'état Time_wait"? Je semble que je me souvienne d'avoir lu que dans certains livres, et aussi, ce qui semble ce qui est impliqué dans heo-www.harvard.edu/~fine/tech/addrinuse.html
Réglage SO_REUSEADDRDR du côté du client n'aide pas le serveur si elle est également définie SO_REUSEADDRDR P>
Sidenote: La valeur ERNO est indéfinie lorsque la lecture des retours 0 - errno n'est définie que après l'échec.