Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Socket occupée ?

16 réponses
Avatar
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.

10 réponses

1 2
Avatar
Bruno Tréguier
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
Avatar
Paul Gaborit
À (at) Mon, 18 Jan 2010 14:17:11 +0000 (UTC),
JKB écrivait (wrote):

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 - <http://perso.mines-albi.fr/~gaborit/>
Avatar
JKB
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 écrivait (wrote):

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.
Avatar
JKB
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.
Avatar
Bruno Tréguier
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
Avatar
JKB
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.
Avatar
Bruno Tréguier
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
Avatar
JKB
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.
Avatar
Paul Gaborit
À (at) Mon, 18 Jan 2010 18:07:11 +0000 (UTC),
JKB écrivait (wrote):

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 - <http://perso.mines-albi.fr/~gaborit/>
Avatar
JKB
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 écrivait (wrote):

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.
1 2