Partage
  • Partager sur Facebook
  • Partager sur Twitter

Les sockets

Sujet résolu
    6 septembre 2010 à 15:31:07

    Bonjour à tous,

    histoire de me dégourdir le cerveau, j'ai voulu m'initier aux sockets. J'ai recopié un code de Swinnen, présent sur développez.com.
    Le problème: Rien ne marche ! Lorsque je lance serveurSocket.py (mon fichier) via l'invite de commande (chemin absolu) j'obtiens mon socket.error:

    "La liaison du socket à l'adresse choisie a échoué".


    Mon fichier serveur.py

    Voir l'édit


    Une suggestion ?
    Je vous remercie d'avance.

    EDIT:
    Je suis sous Python3. J'ai recopié le code de swinnen du document PDF sur Python3. J'obtiens une erreur ERRNO 10022. Un argument non-valide à la ligne 24. Que mettre ?

    # Définition d'un serveur réseau rudimentaire
     # Ce serveur attend la connexion d'un client
    
    import socket, sys
    
    HOST = '192.168.1.168'
    PORT = 50000
    counter =0 # compteur de connexions actives
    
     # 1) création du socket :
    mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
     # 2) liaison du socket à une adresse précise :
    try:
        mySocket.bind((HOST, PORT))
    
    except socket.error:
        print("La liaison du socket à l'adresse choisie a échoué.")
        sys.exit
    
    while 1:
     # 3) Attente de la requête de connexion d'un client :
        print("Serveur prêt, en attente de requêtes ...")
        mySocket.listen(2)
    
     # 4) Etablissement de la connexion :
        connexion, adresse = mySocket.accept()
        counter +=1
        print("Client connecté, adresse IP %s, port %s" % (adresse[0], adresse[1]))
    
     # 5) Dialogue avec le client :
        msgServeur ="Vous êtes connecté au serveur Marcel. Envoyez vos messages."
        connexion.send(msgServeur.encode("Utf8"))
        msgClient = connexion.recv(1024).decode("Utf8")
    while 1:
        print("C>", msgClient)
        if msgClient.upper() == "FIN" or msgClient =="":
            break
        msgServeur = input("S> ")
        connexion.send(msgServeur.encode("Utf8"))
        msgClient = connexion.recv(1024).decode("Utf8")
    
     # 6) Fermeture de la connexion :
        connexion.send("fin".encode("Utf8"))
        print("Connexion interrompue.")
        connexion.close()
    
        ch = input("<R>ecommencer <T>erminer ? ")
        if ch.upper() =='T':
            break
    
    • Partager sur Facebook
    • Partager sur Twitter
      6 septembre 2010 à 17:29:02

      Bonjour,

      Ça viendrait pas de l'adresse IP que tu as mises dans ta variable HOST par hasard ? Parce que une IP locale qui a des centaines c'est pas commun :-°

      PS:

      Citation : http://www.bookmark-master.com/socket-error-10022.html


      Socket error (#10022): Invalid argument

      Analyse & Solutions:Some invalid argument was supplied (for example, specifying an invalid level to the setsockopt function). In some instances, it also refers to the current state of the socket.

      • Partager sur Facebook
      • Partager sur Twitter
        6 septembre 2010 à 17:29:06

        je crois que l'erreur est dans:
        try:
            mySocket.bind((HOST, PORT))
        

        correspondance entre host et port non?
        • Partager sur Facebook
        • Partager sur Twitter
          6 septembre 2010 à 18:40:58

          Mon IP n'était pas bonne, ainsi que certaines indentations dû au copier/coller.
          Une dernière chose, a chaque message envoyé du serveur au client il y a un 'b' qui s'affiche en début de phrase lors de la réception de celui-ci (dans clientSocket).

          Invite de commande côté serveur
          :

          En attente d'une requete...
          Client connecté, adresse IP xx.xx.xx, port xxxxx
          client> Hello
          Serveur> Ca marche !


          Invite de commande côté client

          Connexion établie avec le serveur
          Serveur>Vous êtes connecté au serveur de Marcel. Envoyez un msg 
          Client> Hello
          Serveur> b' Ca marche



          Que vient faire le b' dans la commande côté client ?

          CôtéServeur:
          # Définition d'un serveur réseau rudimentaire
          # Ce serveur attend la connexion d'un client
          
          import socket, sys
          
          HOST = 'xxx.xx.xx'
          PORT = xxxxx
          counter =0 # compteur de connexions actives
          
           # 1) création du socket :
          mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
          
           # 2) liaison du socket à une adresse précise :
          try:
              mySocket.bind((HOST, PORT))
          
          except socket.error:
              print("La liaison du socket à l'adresse choisie a échoué.")
              sys.exit
          
          while 1:
           # 3) Attente de la requête de connexion d'un client :
              print("Serveur prêt, en attente de requêtes ...")
              mySocket.listen(2)
          
           # 4) Etablissement de la connexion :
              connexion, adresse = mySocket.accept()
              counter +=1
              print("Client connecté, adresse IP {0}, port {1}".format(adresse[0], adresse[1]))
          
           # 5) Dialogue avec le client :
              msgServeur ="Vous êtes connecté au serveur Marcel. Envoyez vos messages."
              connexion.send(msgServeur.encode("Utf8"))
              msgClient = connexion.recv(1024).decode("Utf8")
              while 1:
                  print("C>", msgClient)
                  if msgClient.upper() == "FIN" or msgClient =="":
                      break
                  msgServeur = input("S> ")
                  connexion.send(msgServeur.encode("Utf8"))
                  msgClient = connexion.recv(1024).decode("Utf8")
          
           # 6) Fermeture de la connexion :
              connexion.send("fin".encode("Utf8"))
              print("Connexion interrompue.")
              connexion.close()
          
              ch = input("<R>ecommencer <T>erminer ? ")
              if ch.upper() =='T':
                  break
          



          CôtéClient:
          import socket, sys
          
          HOST = 'xxx;xx;xx'
          PORT = xxxxx
          
          mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
          
           # 2) envoi d'une requête de connexion au serveur :
          try:
              mySocket.connect((HOST, PORT))
          except socket.error:
              print("La connexion a échoué.")
              sys.exit()
          print("Connexion établie avec le serveur.")
          
           # 3) Dialogue avec le serveur :
          msgServeur = mySocket.recv(1024).decode("Utf8")
          
          while 1:
              if msgServeur.upper() == "FIN" or msgServeur =="":
                  break
              print("S>", msgServeur)
              msgClient = input("C> ")
              mySocket.send(msgClient.encode("Utf8"))
              msgServeur = mySocket.recv(1024)
          
           # 4) Fermeture de la connexion :
          print("Connexion interrompue.")
          mySocket.close()
          


          Une idée ? Merci d'avance. :)
          • Partager sur Facebook
          • Partager sur Twitter
            6 septembre 2010 à 18:52:25

            Tu as oublié de décodé le message serveur que reçoit ton client :
            msgServeur = mySocket.recv(1024) # pas bon
            msgServeur = mySocket.recv(1024).decode("utf8") # ok
            
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              6 septembre 2010 à 21:51:51

              Pour ton host, je suppose le nom de ton PC

              import socket
              host=socket.gethostname()
              


              ^^
              • Partager sur Facebook
              • Partager sur Twitter

              Les sockets

              × 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