Socket occupée ?

Le
JKB
Bonjour à tous,

J'ai une question certainement de base sur l'utilisation des sockets
TCP. J'avoue que je ne comprends pas bien ce qui se passe.

J'ai écrit une interface de base pour un daemon distant qui cause
sur un port TCP. L'interface en question fonctionne parfaitement
bien.

Pour mes tests, j'utilise en local deux postes Linux. Mais j'ai
testé avec Solaris et le comportement est le même.

De temps en temps, le serveur peut planter (problèmes de commandes
passées que je suis en train de consolider). Côté serveur, même en
cas d'erreur, je ferme la socket avant de quitter le serveur. Un
lsof à la fin du programme ne montre aucune écoute sur le port en
question. Pourtant, il est impossible de relancer le programme avant
la fin d'un timeout, la création de la socket étant impossible car
celle-ci étant occupée.

Peut-il rester quelque chose dans le buffer qui bloque la création
de la nouvelle socket ? Y a-t-il un autre mécanisme pouvant bloquer
la socket alors qu'elle n'est pas à l'écoute ?

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Bruno Tréguier
Le #21000721
JKB wrote:

Peut-il rester quelque chose dans le buffer qui bloque la création
de la nouvelle socket ? Y a-t-il un autre mécanisme pouvant bloquer
la socket alors qu'elle n'est pas à l'écoute ?



Bonjour,

Que montre un netstat -a ? La connexion ouverte par votre socket sur le
serveur n'est-elle pas en état CLOSE_WAIT ou TIME_WAIT ?

Cordialement,

Bruno
Paul Gaborit
Le #21001131
À (at) Mon, 18 Jan 2010 14:17:11 +0000 (UTC),
JKB
De temps en temps, le serveur peut planter (problèmes de commandes
passées que je suis en train de consolider). Côté serveur, même en
cas d'erreur, je ferme la socket avant de quitter le serveur. Un
lsof à la fin du programme ne montre aucune écoute sur le port en
question. Pourtant, il est impossible de relancer le programme avant
la fin d'un timeout, la création de la socket étant impossible car
celle-ci étant occupée.



Il faut ajouter SO_REUSEADDR aux options du socket.

--
Paul Gaborit -
JKB
Le #21002091
Le 18-01-2010, ? propos de
Re: Socket occupée ?,
Paul Gaborit ?crivait dans fr.comp.os.unix :

À (at) Mon, 18 Jan 2010 14:17:11 +0000 (UTC),
JKB
De temps en temps, le serveur peut planter (problèmes de commandes
passées que je suis en train de consolider). Côté serveur, même en
cas d'erreur, je ferme la socket avant de quitter le serveur. Un
lsof à la fin du programme ne montre aucune écoute sur le port en
question. Pourtant, il est impossible de relancer le programme avant
la fin d'un timeout, la création de la socket étant impossible car
celle-ci étant occupée.



Il faut ajouter SO_REUSEADDR aux options du socket.



Ça, je veux absolument éviter.

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
JKB
Le #21002081
Le 18-01-2010, ? propos de
Re: Socket occupée ?,
Bruno Tréguier ?crivait dans fr.comp.os.unix :
JKB wrote:

Peut-il rester quelque chose dans le buffer qui bloque la création
de la nouvelle socket ? Y a-t-il un autre mécanisme pouvant bloquer
la socket alors qu'elle n'est pas à l'écoute ?



Bonjour,

Que montre un netstat -a ? La connexion ouverte par votre socket sur le
serveur n'est-elle pas en état CLOSE_WAIT ou TIME_WAIT ?



cauchy:[~] > netstat -a | grep 2436
tcp 0 0 cauchy.systella.fr:2436 cauchy.systella.f:54961 TIME_WAIT

Si effectivement, elle est en TIME_WAIT. Qu'est-il possible de faire
pour éviter ça ?

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Bruno Tréguier
Le #21002241
Le 18/01/2010 à 19:13, JKB a écrit :
cauchy:[~] > netstat -a | grep 2436
tcp 0 0 cauchy.systella.fr:2436 cauchy.systella.f:54961 TIME_WAIT

Si effectivement, elle est en TIME_WAIT. Qu'est-il possible de faire
pour éviter ça ?



Rebonjour,

Par quel moyen fermez-vous la socket quand votre serveur plante ?
L'idéal serait de le faire avec un shutdown(2), est-ce bien le cas ?

Cordialement,

Bruno
JKB
Le #21002481
Le 18-01-2010, ? propos de
Re: Socket occupée ?,
Bruno Tréguier ?crivait dans fr.comp.os.unix :
Le 18/01/2010 à 19:13, JKB a écrit :
cauchy:[~] > netstat -a | grep 2436
tcp 0 0 cauchy.systella.fr:2436 cauchy.systella.f:54961 TIME_WAIT

Si effectivement, elle est en TIME_WAIT. Qu'est-il possible de faire
pour éviter ça ?



Rebonjour,

Par quel moyen fermez-vous la socket quand votre serveur plante ?
L'idéal serait de le faire avec un shutdown(2), est-ce bien le cas ?



Je ferme avec un close, normalement... Êtes-vous en train de me dire
qu'il faudrait que je fasse un shutdown avant le close ?

Cordialement,



Idem,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Bruno Tréguier
Le #21002591
Le 18/01/2010 à 19:53, JKB a écrit :

Je ferme avec un close, normalement... Êtes-vous en train de me dire
qu'il faudrait que je fasse un shutdown avant le close ?



En toute rigueur, oui, il faudrait le faire. Cela dit, la majorité des
bibliothèques le font pour vous lors du close, mais sait-on jamais...
Tentez le coup et dites-moi si ça change quelque chose...

Cordialement,

Bruno
JKB
Le #21002581
Le 18-01-2010, ? propos de
Re: Socket occupée ?,
Bruno Tréguier ?crivait dans fr.comp.os.unix :
Le 18/01/2010 à 19:53, JKB a écrit :

Je ferme avec un close, normalement... Êtes-vous en train de me dire
qu'il faudrait que je fasse un shutdown avant le close ?



En toute rigueur, oui, il faudrait le faire. Cela dit, la majorité des
bibliothèques le font pour vous lors du close, mais sait-on jamais...
Tentez le coup et dites-moi si ça change quelque chose...



Je vais essayer ça demain. Là, je suis penché sur un autre problème
beaucoup plus grave dans les arcanes de NetBSD...

Je posterai la réponse par ici d'ici un jour ou deux.

Merci pour tout,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Paul Gaborit
Le #21004041
À (at) Mon, 18 Jan 2010 18:07:11 +0000 (UTC),
JKB
Le 18-01-2010, ? propos de
Re: Socket occupée ?,
Paul Gaborit ?crivait dans fr.comp.os.unix :
Il faut ajouter SO_REUSEADDR aux options du socket.



Ça, je veux absolument éviter.



C'est pourtant l'option qui permet de s'affranchir proprement du temps
d'attente TIME_WAIT.

--
Paul Gaborit -
JKB
Le #21004441
Le 19-01-2010, ? propos de
Re: Socket occupée ?,
Paul Gaborit ?crivait dans fr.comp.os.unix :

À (at) Mon, 18 Jan 2010 18:07:11 +0000 (UTC),
JKB
Le 18-01-2010, ? propos de
Re: Socket occupée ?,
Paul Gaborit ?crivait dans fr.comp.os.unix :
Il faut ajouter SO_REUSEADDR aux options du socket.



Ça, je veux absolument éviter.



C'est pourtant l'option qui permet de s'affranchir proprement du temps
d'attente TIME_WAIT.



Je veux absolument ne pas utiliser ce drapeau parce que je ne veux
pas que deux daemons tournent en même temps sur le port.

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Publicité
Poster une réponse
Anonyme