Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Sockets] Serveur/Client Internet ?

    4 novembre 2011 à 14:51:55

    Bonjour !

    J'ai un petit soucis avec les sockets... Je ne sais absolument pas comment travailler au travers de la toile, je sais faire (plus ou moins bien...) en réseau local, mais sorti de là, nada. Je donne les codes simplissimes que vous pourriez aisément modifier pour me montrer quelles valeurs entrer ^^

    Serveur:
    from socket import *
    
    HOST = ""
    PORT = 5000
    
    Socket = socket(AF_INET, SOCK_STREAM)
    Socket.bind((HOST, PORT))
    Socket.listen(5)
    print "En attente d'un client..."
    Connexion, Adresse = Socket.accept()
    print "Ok.\n"
    MsgC = Connexion.recv(1024)
    
    while 1:
            print "C>", MsgC
            if not MsgC or MsgC == "fin":
                    break
            MsgC = Connexion.recv(1024)
    
    Connexion.close()
    
    raw_input("Fin")
    


    Client:
    from socket import *
    
    HOST = "Votre Super IP ici..."
    PORT = 5000
    
    Socket = socket(AF_INET, SOCK_STREAM)
    print "Recherche d'un serveur..."
    Socket.connect((HOST, PORT))
    print "Ok.\n"
    
    while 1:
            MsgToS = raw_input("C> ")
            Socket.send(MsgToS.encode()) # Le ".encode()" est useless ?
            if MsgToS == "fin":
                    break
    
    Socket.close()
    
    raw_input("Fin")
    


    Edit: Le ".encode()" de la ligne 13 du script du client est en effet Useless. J'ai fait des test localement, et si je fait péter cette methode, je peux envoyer des octets (0 <= caractère <= 255) contre des "moitiés d'octets" (je ne me souvient plus du nom exact... Mais ça donne: 0 <= caractère <= 127. Grosso modo les "ç" ne passent pas et font planter les deux scripts... Fabuleux cette méthode ".encode()" !)
    • Partager sur Facebook
    • Partager sur Twitter
      5 novembre 2011 à 0:08:07

      Salut,
      il n'y a rien à changer, en tout cas pas au niveau du code. Tu donnes à ton client l'ip du serveur (ou le nom de domaine, si tu en as un) et voilà. Ensuite si ton serveur est connecté derrière un routeur (ce qui est le cas si tu utilises une box notamment), il faut rediriger le port concerné vers ton serveur pour que ce soit ton pc qui reçoive les données quand le client se connectera par ce port là.
      • Partager sur Facebook
      • Partager sur Twitter
        5 novembre 2011 à 9:29:40

        Merci beaucoup !

        Ok, je suis effectivement derrière un routeur... Mais je ne sais absolument pas comment m'y prendre pour configurer le routeur et tout le tralala ^^' Je suppose qu'il faut aller sur la page de config de celui ci, mais après...
        Je vais chercher de mon coté en attendant une réponse.

        PS: Après quelques bidouillages (inutiles au final, puisque inefficaces...) voila ce que j'ai:

        Image utilisateur

        Et je ne sais pas quoi entrer dans la case HOST du client... (Je suis une bille en réseau...)
        • Partager sur Facebook
        • Partager sur Twitter
          5 novembre 2011 à 12:39:35

          C'est la bonne page de configuration, par contre tu demandes de rediriger toute une plage de ports (1024 à 6553) vers un seul port (5000), pourquoi ça ? Rediriger 5000 vers 5000 ou bien la plage 1024 à 6553 vers la plage 1024 à 6553 me semblerait plus logique.

          Bref, un petit schéma :
          client --> routeur --> serveur

          Le routeur est accessible depuis l'extérieur par n'importe quel appareil connecté à internet, on peut le contacter par le biais de son adresse IP. Le serveur, lui, est connecté derrière le routeur, il n'est pas accessible directement depuis le réseau internet. En revanche il est accessible au niveau local (c'est-à-dire par les PC du même réseau local) via une adresse IP locale (192.168.1.11).

          Le principe de la redirection de port, c'est de dire au routeur que quand quelqu'un se connecte via internet (et pas au niveau local) sur un certain port du routeur, il faut transmettre le tout à un certain PC du réseau local (ton serveur) sur un certain port (le même si tu veux faire simple).

          Dans la case HOST, tu dois donc mettre l'adresse IP de la connexion qui arrive au routeur, que tu peux trouver ici par exemple si tu charges la page depuis un pc connecté derrière le routeur.
          • Partager sur Facebook
          • Partager sur Twitter
            5 novembre 2011 à 13:17:05

            D'accord ! En fait, je savais comment fonctionnait (basiquement) un réseau local, mais pour internet, comme je l'ai déjà dit, j'en avais aucune idée. J'ai donc configuré le truc au feeling... Et forcement, comme je ne savais pas comment fonctionnait la redirection de port, j'avais peu de chance d'y arriver ! J'essaye et j'edit si ça marche !

            Edit 1: En fait l'image que vous voyez correspond a l'onglet "Pare Feu"... Ensuite, maintenant que je sais ça, je ne sais absolument pas a quoi sert les redirections, etc... sur cette page. M'enfin, comme c'est pas ce que je cherche et que je veux simplement indiquer un port vers mon PC, ce n'est pas un probleme...
            Maintenant je pense avoir trouvé le bon panneau: NAT/PAT.
            Je configure, et j'edit.

            Edit 2: Bien, j'ai quelque chose de tres interessant maintenant... J'ai mis le pare feu de la box a zero, celui de mon ordinateur a zero, mais le client me renvoie ça:
            "Recherche d'un serveur..."
            
            Traceback (most recent call last):
              File "C:\Users\Speedlight\Desktop\Scripts PYTHON\Client.py", line 8, in <module>
                Socket.connect((HOST, PORT))
              File "C:\Python27\lib\socket.py", line 224, in meth
                return getattr(self._sock,name)(*args)
            error: [Errno 10061] "Aucune connexion n'a pu être établie car l'ordinateur cible l'a expressément refusée"
            
            • Partager sur Facebook
            • Partager sur Twitter
              5 novembre 2011 à 13:48:58

              Le programme serveur était bien en train de tourner sur le serveur à ce moment-là ?
              • Partager sur Facebook
              • Partager sur Twitter
                5 novembre 2011 à 13:51:48

                Oui oui ! Je le relance, et je ré-essaye... (On sait jamais...)

                Edit: Toujours rien... Ça joue si on lance le serveur et le client sur le même ordinateur ? (Je pense pas mais... On Sait Jamais =)
                Edit 2: (Pour ceux qui voudraient essayer, même si ça ne marche pas..., vous pouvez lancer le script client avec pour IP celle-ci: "83.197.37.74", je laisse mon serveur tourner, et si ça marche vous pourrez m'envoyer des messages !)
                • Partager sur Facebook
                • Partager sur Twitter
                  5 novembre 2011 à 14:16:28

                  Si tu lances l'invité de commandes (cmd) sur le serveur, que le programme tourne, et que tu tapes netstat -an, tu as bien une ligne du type 0.0.0.0:5000 0.0.0.0:0 LISTENING ? Si oui ça ressemble à un problème de pare-feu ou de mauvaise redirection, tu as vérifié que l'adresse IP locale de ton serveur était bien celle que tu as indiquée au routeur dans les propriétés de ta connexion ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    5 novembre 2011 à 14:25:52

                    En effet, j'ai bien cette ligne... Donc, déjà:
                    Est-ce bien dans le panneau NAT/PAT ? (Commençons par le début ^^)

                    Ensuite je vous poste un screen de la "regle NAT/PAT"...

                    Image utilisateur

                    Je pense que le probleme vient bien de ma redirection...
                    1. Je ne peux pas entrer manuellement l'IP locale de mon Ordi... (Mais c'est pas un problème, la box n'est pas "conne", elle va pas mettre "12.256.-54.12^3" à la place de "192.168.1.11"... Du moins j’espère.)
                    2. Je ne sais pas exactement quoi mettre dans port interne/externe...

                    Edit: Et je ne pense pas que ça vienne du Pare Feu, ou alors c'est pas normal... J'ai coupé les deux ! (Box + Mon PC)

                    Edit 2: Mon serveur m'a affiché un drôle de truc, il a réagis comme si on lui envoyait un flot continue de message, mais vides... Ça me le fait quand le client renvoie une erreur... Mais la y'avait pas de client... Un petit malin qui s'amuse avec l'IP que j'ai donnée et le script ? :p [Même si ça signifierait que ça marche...] Ou alors le fait de tourner trop longtemps le fait planter...)

                    QUE CELUI QUI M'A ENVOYé LE POUET SE DENONCE ! IMMEDIATEMENT ! lol
                    Quelqu'un m'as envoyé trois message (Je savais que j'avais bien fais de poster mon IP et laisser tourner le serveur :p)

                    1. Pouet
                    2. !
                    3. fin

                    Dénonce-toi petit Malfrat !
                    • Partager sur Facebook
                    • Partager sur Twitter
                      5 novembre 2011 à 14:56:01

                      L'affichage en continu venait d'une erreur à la con chez moi en fait, qui avait fermé la connexion, ce que ton serveur ne prévoit pas. :-°

                      [dentuk@myhost tmp]$ python2 client.py
                      Recherche d'un serveur...
                      Ok.
                      
                      C> ben alors, ça marche !
                      Traceback (most recent call last):
                        File "client.py", line 13, in <module>
                          Socket.send(MsgToS.encode()) # Le ".encode()" est useless ?
                      UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 11: ordinal not in range(128)
                      [dentuk@myhost tmp]$ python2 client.py
                      Recherche d'un serveur...
                      Ok.
                      
                      C> coucou !
                      C> :p
                      C> (dentuk)
                      C> fin
                      Fin
                      [dentuk@myhost tmp]$ python2 client.py
                      Recherche d'un serveur...
                      Ok.
                      
                      C> pouet
                      C> !
                      C> fin
                      Fin

                      Enfin, en bref… Chez moi ça marche !

                      Avec client.py :

                      from socket import *
                      
                      HOST = "83.197.37.74"
                      PORT = 5000
                      
                      Socket = socket(AF_INET, SOCK_STREAM)
                      print "Recherche d'un serveur..."
                      Socket.connect((HOST, PORT))
                      print "Ok.\n"
                      
                      while 1:
                              MsgToS = raw_input("C> ")
                              Socket.send(MsgToS.encode()) # Le ".encode()" est useless ?
                              if MsgToS == "fin":
                                      break
                      
                      Socket.close()
                      
                      raw_input("Fin")
                      


                      Pour éviter "l'affichage en continu" :

                      while 1:
                          print "C>", MsgC
                          if not MsgC or MsgC == "fin":
                              break
                          MsgC = Connexion.recv(1024)
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 novembre 2011 à 14:58:29

                        Ok, donc il n'y a que moi qui ne peux meme pas communiquer avec mon propre serveur ? Interessant... Sinon je te remercie beaucoup de ton aide et du temps passé sur mon cas ! J'integre ta ligne dans mon code !

                        Edit: J'ai rajouté une boucle infinie sur mon serveur afin que ceux qui font planter le truc puisse laisser la main aux auters quand meme... Meme si ça ne sert a rien.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          5 novembre 2011 à 15:04:18

                          C'est assez étrange en effet, tu avais bien le même code que moi pour tester ? Et fait tourner les deux programmes en même temps ?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            5 novembre 2011 à 15:07:47

                            Oui, assurément ! Je lance le serveur, puis le client, mais ce dernier me dit que la cible a expressément refusé sa connexion... (Faut pas chercher, j'ai le chic !)

                            Edit 1: Bon, je vais laisser ça de coté, je reviens dans 1 heures ou deux... Je laisse le serveur pour ceux qui veulent ^^

                            Edit 2: En fait, même après plusieurs essais, rien, toujours la même erreur...
                            • Partager sur Facebook
                            • Partager sur Twitter

                            [Sockets] Serveur/Client Internet ?

                            × 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