Forum Programmation.python Reconnecter une socket

Posté par  (site web personnel) .
Étiquettes : aucune
0
11
août
2009
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  (site web personnel) . Évalué à 2.

    On peut voir ton code ?

    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  (site web personnel) . Évalué à 2.

      C'est python 2.6.1. Pour le code, il n'a pas grande importance, c'est le mécanisme en lui même qui compte. J'avais trouvé ce lien, mais il ne donne pas d'info utile. Il parle de send et recv alors que j'ai le problème sans même les appeler.

      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  (site web personnel) . Évalué à 2.

        Oups, erreur de copier/coller, pour l'exemple avec close, la dernière ligne est en fait:
        socket.error: [Errno 9] Bad file descriptor
        • [^] # un lien intéressant

          Posté par  (site web personnel) . Évalué à 2.

          c'est du code python, l'adresse laisse croire qu'il s'agit d'un autre langage

          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  (site web personnel) . Évalué à 2.

            Là c'est un client que j'essaie de déconnecter/reconnecter. Mon programme (le client) est à l'origine de la déconnexion, alors je ne vois pas bien le rapport avec ton lien... Pour contourner mon problème, j'ai été obligé de créer une nouvelle socket avant chaque connect... Je trouve ça un peu crade, mais c'est tout ce que j'ai trouvé pour me décoincer.

            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  . Évalué à 3.

              Il me semble que tout simplement, après un "close", la socket n'est plus valide en Python, comme avec les fonctions C de base.


              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.