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

socket.close socket.shutdown merdouille

23 réponses
Avatar
chris
Bonjour,

comment on ferme correctement une socket ?

je fais bien un socket.shutdown(1)
puis un socket.close()

le tout correctement
les thread se termine tout seul ...

et quand j'arrete le tout probleme avec bind tout de suite apres

j'ai essayé de tout lire sur google mais bon
ya un truc qui m'echappe

bon les clients c'est des telnet qui sont fermés coté serveur
le probleme viendrait t il de la ?

Merci pour vos remarque

A+
chris

10 réponses

1 2 3
Avatar
hg
chris wrote:

Bonjour,

comment on ferme correctement une socket ?

je fais bien un socket.shutdown(1)
puis un socket.close()

le tout correctement
les thread se termine tout seul ...

et quand j'arrete le tout probleme avec bind tout de suite apres

j'ai essayé de tout lire sur google mais bon
ya un truc qui m'echappe

bon les clients c'est des telnet qui sont fermés coté serveur
le probleme viendrait t il de la ?

Merci pour vos remarque

A+
chris


J'ai du mal à comprendre: ton code est côté client ou serveur ... ou les
deux ?

hg

Avatar
chris
chris wrote:

Bonjour,

comment on ferme correctement une socket ?

je fais bien un socket.shutdown(1)
puis un socket.close()

le tout correctement
les thread se termine tout seul ...

et quand j'arrete le tout probleme avec bind tout de suite apres

j'ai essayé de tout lire sur google mais bon
ya un truc qui m'echappe

bon les clients c'est des telnet qui sont fermés coté serveur
le probleme viendrait t il de la ?

Merci pour vos remarque

A+
chris


J'ai du mal à comprendre: ton code est côté client ou serveur ... ou les
deux ?

hg



Juste coté serveur pour l'instant , le coté client telnet va très bien
en gros
une classe Instance
Qui Lance une classe Serveur(issue de Thread)
Qui lance une classe client(issue de Thread) pour chaque connection

En gros en me connectant je tape shutdown et cela
- met a jour un flag Shutdown sur l'instance Serveur
- arrete le thread

Le Thread serveur stoppe sa boucle et
arrete les connexions des autres Thread connecté

puis il fait un socket.shutdown(1) puis un socket.close()
et c'est tout il rend la main a Instance qui doit s'arreter normalement

mais si je refais tout de suite après le même script python
bind me renvoie une erreur comme si tout ca ne s'était pas bien arrétée

Note : j'utilise des sockets non bloquantes

des remarques , une piste un retour d'expérience ?

Merci et a+


Avatar
maric
chris wrote:

...


des remarques , une piste un retour d'expérience ?

Merci et a+


Oui j'ai rencontrer le même problème, j'avais écrit un petit serveur
réseaux pendant une formation linux pour donner un exemple à mes
auditeurs, et tout se passait comme si les appels successif à shutdown
et close ne suffisait pas à libérer les ressource système, la socket
restait ouverte et il faut attendre que le kernel la nettoie tout seul
pour pouvoir l'ouvrir de nouveau.

Ceci dit je me souviens plus de la solution, tu pourrais préciser l'os
et la version de python, je ferais un essai dès que je remets la main
sur ce script.


Avatar
hg
chris wrote:

chris wrote:

Bonjour,

comment on ferme correctement une socket ?

je fais bien un socket.shutdown(1)
puis un socket.close()

le tout correctement
les thread se termine tout seul ...

et quand j'arrete le tout probleme avec bind tout de suite apres

j'ai essayé de tout lire sur google mais bon
ya un truc qui m'echappe

bon les clients c'est des telnet qui sont fermés coté serveur
le probleme viendrait t il de la ?

Merci pour vos remarque

A+
chris


J'ai du mal à comprendre: ton code est côté client ou serveur ... ou les
deux ?

hg



Juste coté serveur pour l'instant , le coté client telnet va très bien
en gros
une classe Instance
Qui Lance une classe Serveur(issue de Thread)
Qui lance une classe client(issue de Thread) pour chaque connection

En gros en me connectant je tape shutdown et cela
- met a jour un flag Shutdown sur l'instance Serveur
- arrete le thread

Le Thread serveur stoppe sa boucle et
arrete les connexions des autres Thread connecté

puis il fait un socket.shutdown(1) puis un socket.close()
et c'est tout il rend la main a Instance qui doit s'arreter normalement

mais si je refais tout de suite après le même script python
bind me renvoie une erreur comme si tout ca ne s'était pas bien arrétée

Note : j'utilise des sockets non bloquantes

des remarques , une piste un retour d'expérience ?

Merci et a+



Je n'utilise pas le shutdown côté serveur (peut-être une erreur).

1) fais-tu un join pour t'assurer que tous tes clients sont bien partis ?
2) fermes-tu ton socket "master" ensuite ?

Le fait que ton bind suivant plante montre que tu as encore des
connexions "en l'air"

hg



Avatar
chris
Ubuntu 7.04 a jour + Python 2.5.1

A+
chris
Avatar
Laurent Pointal
chris wrote:

Bonjour,

comment on ferme correctement une socket ?

je fais bien un socket.shutdown(1)
puis un socket.close()

le tout correctement
les thread se termine tout seul ...

et quand j'arrete le tout probleme avec bind tout de suite apres

j'ai essayé de tout lire sur google mais bon
ya un truc qui m'echappe

bon les clients c'est des telnet qui sont fermés coté serveur
le probleme viendrait t il de la ?

Merci pour vos remarque


Une piste... option SO_REUSEADDR

A+
chris


Avatar
Pierre Hanser
chris wrote:

Bonjour,

comment on ferme correctement une socket ?



Une piste... option SO_REUSEADDR



sans cette option, c'est la stack IP de l'os qui
fait respecter un délai pour eviter de risquer
de se melanger les pinceaux entre les paquets
de 2 sessions consecutives


Avatar
chris


Je n'utilise pas le shutdown côté serveur (peut-être une erreur).


J'ai essaye mais sans plus de resultat


1) fais-tu un join pour t'assurer que tous tes clients sont bien partis ?


non mais
for th in serveur.clients:
th.conn.close()

et en fait je vais verifier mais si cela se trouve j'oubli le join()

2) fermes-tu ton socket "master" ensuite ?



Oui

Le fait que ton bind suivant plante montre que tu as encore des
connexions "en l'air"

hg





Merci
A+

Avatar
Laurent Pointal
chris wrote:

Bonjour,

comment on ferme correctement une socket ?

Une piste... option SO_REUSEADDR




sans cette option, c'est la stack IP de l'os qui
fait respecter un délai pour eviter de risquer
de se melanger les pinceaux entre les paquets
de 2 sessions consecutives


Oui, mais si le délai est un peu long, ça pourrais expliquer le
"et quand j'arrete le tout probleme avec bind tout de suite apres"
de chris.



Avatar
hg
chris wrote:



Je n'utilise pas le shutdown côté serveur (peut-être une erreur).


J'ai essaye mais sans plus de resultat


1) fais-tu un join pour t'assurer que tous tes clients sont bien partis ?


non mais
for th in serveur.clients:
th.conn.close()

et en fait je vais verifier mais si cela se trouve j'oubli le join()

2) fermes-tu ton socket "master" ensuite ?



Oui

Le fait que ton bind suivant plante montre que tu as encore des
connexions "en l'air"

hg





Merci
A+



As-tu des try: except: dans tes threads clients ?

Puisque tu les plante depuis ta tache principale, ils risquent de ne pas
aimer.

... je te conseille d'utiliser join.

hg


1 2 3