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.
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.
Tu devrais faire des essais et relire la section 7.5 du Stevens.
Bruno Tréguier
JKB wrote:
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.
Bonjour,
L'option SO_REUSEADDR ne permet pas cela. Elle permet de réutiliser le port local à la seule condition que la connexion précédente qui l'utilisait soit en état TIME_WAIT (et en aucun cas ESTABLISHED), donc je pense que c'est une solution viable, pour ma part, si le shutdown() ne suffit pas.
Cordialement,
Bruno
JKB wrote:
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.
Bonjour,
L'option SO_REUSEADDR ne permet pas cela. Elle permet de réutiliser le
port local à la seule condition que la connexion précédente qui
l'utilisait soit en état TIME_WAIT (et en aucun cas ESTABLISHED), donc
je pense que c'est une solution viable, pour ma part, si le shutdown()
ne suffit pas.
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.
Bonjour,
L'option SO_REUSEADDR ne permet pas cela. Elle permet de réutiliser le port local à la seule condition que la connexion précédente qui l'utilisait soit en état TIME_WAIT (et en aucun cas ESTABLISHED), donc je pense que c'est une solution viable, pour ma part, si le shutdown() ne suffit pas.
Cordialement,
Bruno
JKB
Le 19-01-2010, ? propos de Re: Socket occupée ?, Bruno Tréguier ?crivait dans fr.comp.os.unix :
JKB wrote:
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.
Bonjour,
L'option SO_REUSEADDR ne permet pas cela. Elle permet de réutiliser le port local à la seule condition que la connexion précédente qui l'utilisait soit en état TIME_WAIT (et en aucun cas ESTABLISHED), donc je pense que c'est une solution viable, pour ma part, si le shutdown() ne suffit pas.
shutdown ne suffit pas à moins de bricoler avec SO_LINGER. Je vais refaire des tests avec SO_REUSEADDR. J'avais en tête que ça autorisait une reconnexion quel que soit l'état de la socket car il y avait au moins un des systèmes cibles qui me faisait lorsque j'avais utilisé SO_REUSEADDR un truc bizarre du style autoriser une reconnexion sur une socket établie. Je me demande si ce n'était pas Linux/sparc qui me faisait ça... Le comportement a peut-être été corrigé depuis.
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.
Le 19-01-2010, ? propos de
Re: Socket occupée ?,
Bruno Tréguier ?crivait dans fr.comp.os.unix :
JKB wrote:
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.
Bonjour,
L'option SO_REUSEADDR ne permet pas cela. Elle permet de réutiliser le
port local à la seule condition que la connexion précédente qui
l'utilisait soit en état TIME_WAIT (et en aucun cas ESTABLISHED), donc
je pense que c'est une solution viable, pour ma part, si le shutdown()
ne suffit pas.
shutdown ne suffit pas à moins de bricoler avec SO_LINGER. Je vais
refaire des tests avec SO_REUSEADDR. J'avais en tête que ça
autorisait une reconnexion quel que soit l'état de la socket
car il y avait au moins un des systèmes cibles qui me faisait lorsque
j'avais utilisé SO_REUSEADDR un truc bizarre du style autoriser une
reconnexion sur une socket établie. Je me demande si ce n'était pas
Linux/sparc qui me faisait ça... Le comportement a peut-être été
corrigé depuis.
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.
Le 19-01-2010, ? propos de Re: Socket occupée ?, Bruno Tréguier ?crivait dans fr.comp.os.unix :
JKB wrote:
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.
Bonjour,
L'option SO_REUSEADDR ne permet pas cela. Elle permet de réutiliser le port local à la seule condition que la connexion précédente qui l'utilisait soit en état TIME_WAIT (et en aucun cas ESTABLISHED), donc je pense que c'est une solution viable, pour ma part, si le shutdown() ne suffit pas.
shutdown ne suffit pas à moins de bricoler avec SO_LINGER. Je vais refaire des tests avec SO_REUSEADDR. J'avais en tête que ça autorisait une reconnexion quel que soit l'état de la socket car il y avait au moins un des systèmes cibles qui me faisait lorsque j'avais utilisé SO_REUSEADDR un truc bizarre du style autoriser une reconnexion sur une socket établie. Je me demande si ce n'était pas Linux/sparc qui me faisait ça... Le comportement a peut-être été corrigé depuis.
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.
JKB
Le 19-01-2010, ? propos de Re: Socket occupée ?, JKB ?crivait dans fr.comp.os.unix :
Le 19-01-2010, ? propos de Re: Socket occupée ?, Bruno Tréguier ?crivait dans fr.comp.os.unix :
JKB wrote:
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.
Bonjour,
L'option SO_REUSEADDR ne permet pas cela. Elle permet de réutiliser le port local à la seule condition que la connexion précédente qui l'utilisait soit en état TIME_WAIT (et en aucun cas ESTABLISHED), donc je pense que c'est une solution viable, pour ma part, si le shutdown() ne suffit pas.
shutdown ne suffit pas à moins de bricoler avec SO_LINGER. Je vais refaire des tests avec SO_REUSEADDR. J'avais en tête que ça autorisait une reconnexion quel que soit l'état de la socket car il y avait au moins un des systèmes cibles qui me faisait lorsque j'avais utilisé SO_REUSEADDR un truc bizarre du style autoriser une reconnexion sur une socket établie. Je me demande si ce n'était pas Linux/sparc qui me faisait ça... Le comportement a peut-être été corrigé depuis.
Il y a tout de même un truc qui m'échappe.
J'envoie une commande non traitée avec mon interface de commande. Ça provoque un plantage du serveur. La socket se retrouve en TIME_WAIT. Jusque là, je comprends.
Je relance le serveur. Celui-ci ouvre une nouvelle socket avec socket(). Pour utiliser SO_REUSEADDR, il faut déjà que la socket soit ouverte puisque le drapeau se positionne avec setsockopt(). Je ne vois pas trop comment contourner le problème à moins d'avoir raté un truc...
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.
Le 19-01-2010, ? propos de
Re: Socket occupée ?,
JKB ?crivait dans fr.comp.os.unix :
Le 19-01-2010, ? propos de
Re: Socket occupée ?,
Bruno Tréguier ?crivait dans fr.comp.os.unix :
JKB wrote:
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.
Bonjour,
L'option SO_REUSEADDR ne permet pas cela. Elle permet de réutiliser le
port local à la seule condition que la connexion précédente qui
l'utilisait soit en état TIME_WAIT (et en aucun cas ESTABLISHED), donc
je pense que c'est une solution viable, pour ma part, si le shutdown()
ne suffit pas.
shutdown ne suffit pas à moins de bricoler avec SO_LINGER. Je vais
refaire des tests avec SO_REUSEADDR. J'avais en tête que ça
autorisait une reconnexion quel que soit l'état de la socket
car il y avait au moins un des systèmes cibles qui me faisait lorsque
j'avais utilisé SO_REUSEADDR un truc bizarre du style autoriser une
reconnexion sur une socket établie. Je me demande si ce n'était pas
Linux/sparc qui me faisait ça... Le comportement a peut-être été
corrigé depuis.
Il y a tout de même un truc qui m'échappe.
J'envoie une commande non traitée avec mon interface de commande. Ça
provoque un plantage du serveur. La socket se retrouve en TIME_WAIT.
Jusque là, je comprends.
Je relance le serveur. Celui-ci ouvre une nouvelle socket avec
socket(). Pour utiliser SO_REUSEADDR, il faut déjà que la socket
soit ouverte puisque le drapeau se positionne avec setsockopt().
Je ne vois pas trop comment contourner le problème à moins d'avoir
raté un truc...
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.
Le 19-01-2010, ? propos de Re: Socket occupée ?, JKB ?crivait dans fr.comp.os.unix :
Le 19-01-2010, ? propos de Re: Socket occupée ?, Bruno Tréguier ?crivait dans fr.comp.os.unix :
JKB wrote:
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.
Bonjour,
L'option SO_REUSEADDR ne permet pas cela. Elle permet de réutiliser le port local à la seule condition que la connexion précédente qui l'utilisait soit en état TIME_WAIT (et en aucun cas ESTABLISHED), donc je pense que c'est une solution viable, pour ma part, si le shutdown() ne suffit pas.
shutdown ne suffit pas à moins de bricoler avec SO_LINGER. Je vais refaire des tests avec SO_REUSEADDR. J'avais en tête que ça autorisait une reconnexion quel que soit l'état de la socket car il y avait au moins un des systèmes cibles qui me faisait lorsque j'avais utilisé SO_REUSEADDR un truc bizarre du style autoriser une reconnexion sur une socket établie. Je me demande si ce n'était pas Linux/sparc qui me faisait ça... Le comportement a peut-être été corrigé depuis.
Il y a tout de même un truc qui m'échappe.
J'envoie une commande non traitée avec mon interface de commande. Ça provoque un plantage du serveur. La socket se retrouve en TIME_WAIT. Jusque là, je comprends.
Je relance le serveur. Celui-ci ouvre une nouvelle socket avec socket(). Pour utiliser SO_REUSEADDR, il faut déjà que la socket soit ouverte puisque le drapeau se positionne avec setsockopt(). Je ne vois pas trop comment contourner le problème à moins d'avoir raté un truc...
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.
Nicolas George
JKB wrote in message :
Je relance le serveur. Celui-ci ouvre une nouvelle socket avec socket().
On n'ouvre pas une socket, on la crée.
Pour utiliser SO_REUSEADDR, il faut déjà que la socket soit ouverte puisque le drapeau se positionne avec setsockopt().
Et l'erreur d'adresse déjà utilisée se situe au niveau du bind. Tu peux parfaitement faire le bind après le setsockopt.
JKB wrote in message <slrnhlba8q.lie.knatschke@rayleigh.systella.fr>:
Je relance le serveur. Celui-ci ouvre une nouvelle socket avec
socket().
On n'ouvre pas une socket, on la crée.
Pour utiliser SO_REUSEADDR, il faut déjà que la socket
soit ouverte puisque le drapeau se positionne avec setsockopt().
Et l'erreur d'adresse déjà utilisée se situe au niveau du bind. Tu peux
parfaitement faire le bind après le setsockopt.
Je relance le serveur. Celui-ci ouvre une nouvelle socket avec socket().
On n'ouvre pas une socket, on la crée.
Pour utiliser SO_REUSEADDR, il faut déjà que la socket soit ouverte puisque le drapeau se positionne avec setsockopt().
Et l'erreur d'adresse déjà utilisée se situe au niveau du bind. Tu peux parfaitement faire le bind après le setsockopt.
JKB
Le 19-01-2010, ? propos de Re: Socket occupée ?, Nicolas George ?crivait dans fr.comp.os.unix :
JKB wrote in message :
Je relance le serveur. Celui-ci ouvre une nouvelle socket avec socket().
On n'ouvre pas une socket, on la crée.
Pour utiliser SO_REUSEADDR, il faut déjà que la socket soit ouverte puisque le drapeau se positionne avec setsockopt().
Et l'erreur d'adresse déjà utilisée se situe au niveau du bind. Tu peux parfaitement faire le bind après le setsockopt.
Ou avais-je donc la tête ? Bon, ça fonctionne sur Linux. Reste à voir si le comportement est le même ailleurs.
Merci;
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.
Le 19-01-2010, ? propos de
Re: Socket occupée ?,
Nicolas George ?crivait dans fr.comp.os.unix :
JKB wrote in message <slrnhlba8q.lie.knatschke@rayleigh.systella.fr>:
Je relance le serveur. Celui-ci ouvre une nouvelle socket avec
socket().
On n'ouvre pas une socket, on la crée.
Pour utiliser SO_REUSEADDR, il faut déjà que la socket
soit ouverte puisque le drapeau se positionne avec setsockopt().
Et l'erreur d'adresse déjà utilisée se situe au niveau du bind. Tu peux
parfaitement faire le bind après le setsockopt.
Ou avais-je donc la tête ? Bon, ça fonctionne sur Linux. Reste à
voir si le comportement est le même ailleurs.
Merci;
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.
Le 19-01-2010, ? propos de Re: Socket occupée ?, Nicolas George ?crivait dans fr.comp.os.unix :
JKB wrote in message :
Je relance le serveur. Celui-ci ouvre une nouvelle socket avec socket().
On n'ouvre pas une socket, on la crée.
Pour utiliser SO_REUSEADDR, il faut déjà que la socket soit ouverte puisque le drapeau se positionne avec setsockopt().
Et l'erreur d'adresse déjà utilisée se situe au niveau du bind. Tu peux parfaitement faire le bind après le setsockopt.
Ou avais-je donc la tête ? Bon, ça fonctionne sur Linux. Reste à voir si le comportement est le même ailleurs.
Merci;
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.