Partage
  • Partager sur Facebook
  • Partager sur Twitter

socket

je desepere...

    25 février 2013 à 16:35:18

    Bonjour !

    Voilâ, je me casse la tête depuis pas mal de temps à essayer de comprendre pourquoi ce message vient s'afficher desespéremment

    a chaque nouvelle tentative de ce code qui je trouve est parfait :D

    #!/usr/bin/python
    import socket 
    host = 'localhost' 
    port = '54800' 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(host, port)
    s.listen(1) 
    conn, addr = s.accept() 
    print 'Connected by', addr
    While True:
      data = conn.recv(1024)
      Print "recu", repr(data)
      reply = raw_input("Votre reponse: ")
      conn.sendall(reply)
      conn.close() 

    Je vais sur le terminal, je me met en mode route et paf le message suivant apparaît : Permission non accordée

    J'ai essayer de changer plusieurs fois le port pensant qu'il aurait pu être utilisé jusqu'a arrivé au 54 800 ième ports qui je pense lui ne doit pas être utilisé. :p

    Mais voila, toujours cette erreur, cela m'a fait perdre énormément de temps, voila je serais très reconnaissant à la personne qui trouvera mon problême !

    Merci !!

    • Partager sur Facebook
    • Partager sur Twitter
      25 février 2013 à 17:24:49

      Salut.

      Bon, déjà, erreur évidente, while ne s'écrit pas avec un W majuscule en Python (m'enfin ça doit être une erreur de copier/coller sinon tu aurais une syntax error).

      Est-ce que tu peux nous coller ici le message d'erreur au complet (avec le traceback) ?

      Sinon, essaye avec host = None.

      Et au passage, tu travailles sous quel OS ?

      -
      Edité par nohar 25 février 2013 à 17:26:49

      • Partager sur Facebook
      • Partager sur Twitter
      Zeste de Savoir, le site qui en a dans le citron !
        25 février 2013 à 18:07:08

        Voici donc ce que j'ai corrigé rapidement ( au moins il n'y a plus d'erreur :p ) :

        #!/usr/bin/python
        import socket
        host = 'localhost'
        port = 54800
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.bind((host, port))
        s.listen(1)
        conn, addr = s.accept()
        print 'Connected by', addr
        while True:
          data = conn.recv(1024)
          print "recu", repr(data)
          reply = raw_input("Votre reponse: ")
          conn.sendall(reply)
          conn.close()
        

        Donc s.bind() demande un tuple et port doit être un nombre ( et non une chaîne de caractère ). Puis comme l'a signalé nohar les majuscules sur while et print ( l. 12 ).

        • Partager sur Facebook
        • Partager sur Twitter
          25 février 2013 à 18:28:00

          Tout d'abord merci de m ' être venu en aide. ;)

          Pour de ce qui est du W majuscule, une erreur de copier coller :D

          Oups, par contre les guillemets autour du nombre, quel honte :lol:, erreur grossière de ma part.

          Je suis sous Linux Ubuntu. J'enregistre la plupart de mon temps mes fichier avec l'extension .py à l'aide du l' IDE Python ERIC.

          Je met toutes mes étapes au cas ou ... :

          Donc je chope le terminal, je met sudo su pour passer en mode root, une fois cela je rentre mon mot de passe,

          après je vais dans le dossier python qui comporte le fichier serveur.py en faisant cd python puis ./serveur.py et la toujours la même erreur avec le code corrigé : :(

          bash: ./serveur.py: Permission non accordée

          Je suis assez confus, peut être faut' il activer quelque chose sur linux pour activer les sockets mais toujours rien trouvé ...

          Merci !

          Edité :

          A force de chercher, j'ai trouver un moyen de forcer à executer le script:

          Donc revoici mon script serveur et mon script client :

          #!/usr/bin/python
          import socket
          host = 'localhost'
          port = 54800
          s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
          s.bind((host, port))
          s.listen(1)
          conn, addr = s.accept()
          print 'Connected by', addr
          while True:
            data = conn.recv(1024)
            print "recu", repr(data)
            reply = raw_input("Votre reponse: ")
            conn.sendall(reply)
            conn.close()

          et mon script client :

          #!/usr/bin/python
          import socket 
          host = 'localhost' 
          port = 54800
          s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
          s.bind((host, port))
          while True:
            message = raw_input("Your message: ")
            s.send(message) 
            print "OK" 
            reply = s.recv(1024)
            print "recu", repr(reply)
            s.close() 

          Donc pour forcer l exécution avant de lancer ./serveur.py, j'ai fait chmod u+rx serveur.py

          Le serveur n'affiche rien, la console se met en attente. Est ce bon signe ? Le serveur attent il le client ?

          Du côté client, l'erreur suivante apparaît :

          Traceback (most recent call last):
            File "./cl.py", line 6, in <module>
              s.bind((host, port))
            File "/usr/lib/python2.7/socket.py", line 224, in meth
              return getattr(self._sock,name)(*args)
          socket.error: [Errno 98] Address already in use

          Merci Encore !

          -
          Edité par electronic78 25 février 2013 à 18:45:09

          • Partager sur Facebook
          • Partager sur Twitter
            25 février 2013 à 21:30:55

            Ce n'est pas la méthode bind() qu'il faut utiliser dans ton code côté client mais plutôt connect(). Là, tu crées grosso-modo une seconde socket "serveur", et il t'envoie chier parce que tu as déjà un serveur qui tourne sur cette adresse (host, port).

            -
            Edité par nohar 25 février 2013 à 21:33:20

            • Partager sur Facebook
            • Partager sur Twitter
            Zeste de Savoir, le site qui en a dans le citron !
              25 février 2013 à 22:15:42

              Ok merci !!

              Je lance client.py, ça a l'air de fonction je peut commencer à rentrer le message :D

              Mais du côté serveur, j 'ai cette erreur, pourtant c'est bien bind du côté serveur puisqu'il attend le client ?

              Traceback (most recent call last):
                File "./serveur.py", line 6, in <module>
                  s.bind((host, port))
                File "/usr/lib/python2.7/socket.py", line 224, in meth
                  return getattr(self._sock,name)(*args)
              socket.error: [Errno 98] Address already in use

              Merci !

              • Partager sur Facebook
              • Partager sur Twitter
                25 février 2013 à 23:24:01

                Tu es sûr que tu n'as qu'un seul serveur qui tourne ? Change de port pour voir ?

                • Partager sur Facebook
                • Partager sur Twitter
                Zeste de Savoir, le site qui en a dans le citron !
                  25 février 2013 à 23:38:54

                  Très bizarre cela, je change de port et pouf cela fonctionne parfaitement.:p

                  Faudra que je vérifie mon firewall...

                  Sinon j'ai cette erreur, j'envois un message salut après bien reçu capitaine et la une erreur :

                  Traceback (most recent call last):
                    File "./serveur.py", line 11, in <module>
                      data = conn.recv(1024)
                    File "/usr/lib/python2.7/socket.py", line 170, in _dummy
                      raise error(EBADF, 'Bad file descriptor')
                  socket.error: [Errno 9] Bad file descriptor

                  C'est parce que "bien recu capitaine" est trop long ?

                  Merci ! =)

                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 février 2013 à 23:45:45

                    Non, pas du tout, c'est parce que ton serveur a fermé la connexion dès qu'il a reçu le premier message : c'est ce que tu lui as dit de faire.

                    Sinon, ton erreur "Address already in use" est probablement due au fait que le port n'a pas été fermé proprement quand une version antérieure de ton serveur a planté.

                    -
                    Edité par nohar 25 février 2013 à 23:46:19

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Zeste de Savoir, le site qui en a dans le citron !
                      25 février 2013 à 23:56:22

                      Merci pour tous ! ^^

                      Pour le serveur, je pensais a la même chose j'ai vérifier et cela venait bien du fait que j'avais mal arrêter le serveur pourtant j'avais bien fait forcer la fermeture du terminal xd

                      "Non, pas du tout, c'est parce que ton serveur a fermé la connexion dès qu'il a reçu le premier message : c'est ce que tu lui as dit de faire."

                      Dac =) mais j'ai fait cela avec l'attribut listen est t'il possible que quand on appuie sur la touche espace, cela ferme la connection

                      au lieu de définir à l'avance le nombre de connexion ?

                      Encore MERCI ! Je ne pensais pas y arriver aujourd'hui en tout cas. Je vais continuer à améliorer cela, si tu a des idées ! :p

                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 février 2013 à 23:57:40

                        Pourquoi ne pas fermer la connexion si le client envoie simplement le message "quit" ?

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Zeste de Savoir, le site qui en a dans le citron !
                          26 février 2013 à 0:17:38

                          Oui aussi mais comment faire ? :euh:
                          • Partager sur Facebook
                          • Partager sur Twitter
                            26 février 2013 à 0:33:09

                            Si le message que tu reçois du client est "quit", conn.close(). Et côté client, si le message envoyé est "quit", envoyer le message puis s.close().

                            -
                            Edité par nohar 26 février 2013 à 0:33:42

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Zeste de Savoir, le site qui en a dans le citron !
                            Anonyme
                              26 février 2013 à 0:37:26

                              Quelque chose du genre :

                              if repr(data) == 'quit':
                                  break

                              et tu mets ta fonction qui ferme la connection en dehors de la boucle while. Tu peux gérer plusieurs messages de fermeture avec une liste si tu veux, et en utilisant un lower ou upper pour généraliser tes données.

                              -
                              Edité par Anonyme 26 février 2013 à 0:39:32

                              • Partager sur Facebook
                              • Partager sur Twitter
                                26 février 2013 à 0:49:41

                                Avec repr() ça n'a aucune chance de fonctionner.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Zeste de Savoir, le site qui en a dans le citron !
                                Anonyme
                                  26 février 2013 à 1:21:27

                                  nohar a écrit:

                                  Avec repr() ça n'a aucune chance de fonctionner.

                                  if data.lower() == 'quit'


                                  Je me sens con d'avoir fait ce genre d'erreur. Pas le fait de pas savoir en plus, surement un gros moment d'étourdissement. :(
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    26 février 2013 à 21:03:23

                                    Merci ! Je vais essayer de faire comme cela mais avant je n'ai toujours pas compris d'ou venait mon erreur pour :

                                    Sinon j'ai cette erreur, j'envois un message salut après bien reçu capitaine et la une erreur :

                                    Traceback (most recent call last):
                                      File "./serveur.py", line 11, in <module>
                                        data = conn.recv(1024)
                                      File "/usr/lib/python2.7/socket.py", line 170, in _dummy
                                        raise error(EBADF, 'Bad file descriptor')
                                    socket.error: [Errno 9] Bad file descriptor



                                    Je tiens à rappeler que j'ai rafistoler un code pour obtenir ces deux pages de codes mais que je n'en comprend pas toutes les fonctionnalités et

                                    je ne trouve toujours pas comment envoyer plusieurs messages >_<

                                    Merci ! Cela m'aidera beaucoup pour la suite, on va peut être me dire d'aller fouiller dans la doc mais cela est deja fait et je ne trouve pas quel fonction 

                                    que j'ai pu définir n'envoit qu'un message et coupe la connection.

                                    Sinon quel est la différence entre recv(1024) et recv(4096) ?

                                    Merci BEAUCOUP ! ;)

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      26 février 2013 à 21:05:41

                                      Dans ce cas je te conseille vivement d'aller lire le tutoriel Python pour comprendre un minimum ce qui se passe.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Zeste de Savoir, le site qui en a dans le citron !
                                        26 février 2013 à 21:57:16

                                        Je comprend ^^, il y a juste dans ce cas ou je suis perdu. Pour recv, j'ai chercher dans la doc et j'ai compris ! :p

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          23 décembre 2016 à 14:07:14

                                          Bonjour.

                                          Le message est très ancien, mais juste pour information, la raison du problème est qu'une socket fermée ne peut plus être utilisée.

                                          L'appel de accept() devrait être fait dans la boucle infinie, et l'objet socket retourné pourrait alors être utilisé pour lire la requête et envoyer la réponse.

                                          Genre :

                                          #!/usr/bin/python
                                          import socket
                                          host = 'localhost'
                                          port = 54800
                                          s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                                          s.bind((host, port))
                                          s.listen(1)
                                          while True:
                                            conn, addr = s.accept()
                                              print 'Connection from ', addr
                                          data = conn.recv(1024)
                                          Print "recu : ", repr(data)
                                          reply = raw_input("Votre reponse : ")
                                          conn.sendall(reply)
                                          conn.close()

                                          Patrick

                                          -
                                          Edité par PatrickDuc1 23 décembre 2016 à 14:20:47

                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          socket

                                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                          • Editeur
                                          • Markdown