Bonjour à tous,
j'essaie de connecter/déconnecter une socket TCP. Mais bizarrement, si la première connexion fonctionne, je n'arrive pas à déconnecter cette même socket et la réutiliser ensuite pour me reconnecter.
La séquence connect, close, connect me donne l'erreur 111 - Connexion refusée
La séquence connect, shutdown (read/write), connect, me donne l'erreur 106 - Noeud final de transport déjà connecté (pourtant le serveur a quitté après le shutdown).
Une idée ? Merci pour vos réponses.
# quelle version de Python ?
Posté par palm123 (site web personnel) . Évalué à 2.
sur
http://www.amk.ca/python/howto/sockets/
j'ai trouvé
But if you plan to reuse your socket for further transfers, you need to realize that there is no "EOT" (End of Transfer) on a socket. I repeat: if a socket send or recv returns after handling 0 bytes, the connection has been broken. If the connection has not been broken, you may wait on a recv forever, because the socket will not tell you that there's nothing more to read (for now)
ウィズコロナ
[^] # Re: quelle version de Python ?
Posté par liberforce (site web personnel) . Évalué à 2.
Avec shutdown :
import socket
s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
s.connect (('', 4001))
s.shutdown (socket.SHUT_RDWR)
s.connect (('', 4001))
Traceback (most recent call last):
File "", line 1, in
File "", line 1, in connect
socket.error: [Errno 106] Transport endpoint is already connected
Avec close :
import socket
s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
s.connect (('', 4001))
s.close ()
s.connect (('', 4001))
Traceback (most recent call last):
File "", line 1, in
File "", line 1, in connect
File "/usr/lib/python2.6/socket.py", line 165, in _dummy
raise error(EBADF, 'Bad file descriptor')
socket.error: [Errno 106] Transport endpoint is already connected
[^] # Re: quelle version de Python ?
Posté par liberforce (site web personnel) . Évalué à 2.
socket.error: [Errno 9] Bad file descriptor
[^] # un lien intéressant
Posté par palm123 (site web personnel) . Évalué à 2.
extrait
By TCP rules, the only way for a server program to know if a client has disconnected,
is to try to read from the socket. Specifically, if select() says there is data, but
recv() returns 0 bytes of data, then this implies the client has disconnected
http://www.perlmonks.org/?node_id=760710
ウィズコロナ
[^] # Re: un lien intéressant
Posté par liberforce (site web personnel) . Évalué à 2.
En revanche, j'ai vu que mon client n'est pas averti quand le serveur disparaît, et là, ton lien me sera peut être utile...
[^] # Re: un lien intéressant
Posté par TortuXm . Évalué à 3.
Concrètement, en C ton objet socket est un file descriptor, qui est fermé par close. Si tu veux rouvrir une autre socket, tu doit rappeler la fonction socket, c'est-à-dire, vu le binding fait en Python, recréer un nouvel objet.
Cf des exemples sur les sockets : http://broux.developpez.com/articles/c/sockets
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.