IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

Se connecte à tous les ports UDP, même fermés


Sujet :

Réseau/Web Python

  1. #1
    Membre averti Avatar de yetimothee
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 260
    Points : 364
    Points
    364
    Par défaut Se connecte à tous les ports UDP, même fermés
    Voilà,
    j'ai observé un problème gènant avec Python. Dès que je lui demande de se connecter à un port UDP (socket.SOCK_DGRAM) de mon PC (et d'autrres serveurs au pif), celui ci répond toujours par l'affirmatif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import socket
     
    s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
     
    try :
    	s.connect(("www.secteur-lambda.org", 32564))
    	print "Serveur en ligne !"
     
    except socket.error :
    	print "Impossible de se connecter au serveur"
     
    raw_input()
    Donc ma question est :
    Ais-je fait des erreurs dans ce boût de code ?
    Est-ce un comportement normal de Python ?

    Merci

  2. #2
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Salut,

    j'ai observé un problème gènant avec Python. Dès que je lui demande de se connecter à un port UDP (socket.SOCK_DGRAM) de mon PC (et d'autrres serveurs au pif), celui ci répond toujours par l'affirmatif :
    C'est normal, en UDP, tu n'etablis pas de connection avec le serveur distant, c'est un mode non connecté.
    Tu envoies ton datagramme, et c'est tout! Si ça arrive tant mieux, sinon,et bien tant pis!
    Ce n'est donc pas un problème propre à python.

    @+
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  3. #3
    Membre averti Avatar de yetimothee
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 260
    Points : 364
    Points
    364
    Par défaut
    Ok, merci

    Donc en fait, pour voir si mon port est ouvert, il faut que j'envoie un datagramme et voir si cela arrive ou échoue.

    Bien. Je ne trouve en revanche pas grand chose à ce sujet (en français), pourrais tu me renseigner sur la façon de procéder ? Merci

  4. #4
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    pour voir si mon port est ouvert, il faut que j'envoie un datagramme et voir si cela arrive ou échoue.
    non, UDP n'est pas fait pour etablir une connection avec le serveur, pour ça il faut utiliser TCP, qui permet de gérer une connection, la retransmission des paquets manquants, la congestion, le remise en ordre des paquets reçus, etc...

    Que veux-tu faire concretement?
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  5. #5
    Membre averti Avatar de yetimothee
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 260
    Points : 364
    Points
    364
    Par défaut
    Concrètement, je veux voir l'état de mes serveurs. J'héberge un site web, un ftp, un serv IRC et plusieurs serveurs de jeux, et je veux faire un programme qui me disent lesquels sont actifs.
    Pour le port 80, 6667 et 21, pas de problème, mais les choses se compliquent pour ce qui est du serveur de jeu (Un serveur pour Doom, port 10666).
    Dès que j'essaye de m'y connecter en CP, ça marche pas et en UDP, ben c'est mon problème (en fait, seulement l'udp du port 10666 est mappée, pas le TCP) :p

  6. #6
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    J'imagine que tu dois avoir le jeu qui ecoute sur ton pc des datagrammes de ton serveur (deux programmes serveurs).
    Faudrait voir sur quel port ton pc ecoute et lancer un serveur sur ce port pour capturer une reponse de ton serveur.

    Je ne sais pas si je me suis bien expliqué....
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  7. #7
    Membre averti Avatar de yetimothee
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 260
    Points : 364
    Points
    364
    Par défaut
    Alors, j'ai pas bien compris, mais j'ai cru comprendre une chose que j'ai interprété de deux façons :

    1) Je fais un prog qui écoute un port (10666 en l'occurence), et je lance le serveur sur ce port afin de voir ce qui se passe

    Ou

    2) je fais un programme qui "écoute" ce qui se passe sur un port x quand je lance le jeu ?

  8. #8
    Membre averti Avatar de yetimothee
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 260
    Points : 364
    Points
    364
    Par défaut
    Donc,
    J'ai fait un programme serveur comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import socket
     
    host = 'localhost'
    port = 10667
     
    serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    serv.bind((host, port))
     
    while 1 :
    	data, addr = serv.recvfrom(1024)
    	print data
    Ensuite, grâce au jeu, j'ai essayé de me connecter dessus, et voilà ce que ça donne :
    (chaque ligne correspond à une tentative :
    ú█♂ ³²■*☺ ▬÷═↨[SL]Yetimothee
    ú█♂ ³²■*☺ ëo╬↨[SL]Yetimothee
    ú█♂ ³²■*☺ ½p╬↨[SL]Yetimothee
    ú█♂ ³²■*☺ Ãq╬↨[SL]Yetimothee
    ú█♂ ³²■*☺ õr╬↨[SL]Yetimothee
    ú█♂ ³²■*☺ *s╬↨[SL]Yetimothee
    ú█♂ ³²■*☺ óà╬↨[SL]Yetimothee
    ú█♂ ³²■*☺ ░ÿ╬↨[SL]Yetimothee
    [SL]yetimothee, c'est mon pseudo.
    Donc voilà, je sais pas trop quoi faire ?

  9. #9
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Pour savoir si ton serveur est accessible, il faut que tu simules le jeu video sur ton pc, en envoyant une requete au serveur de jeu et en ecoutant sa reponse.
    Tu (le jeu) envoyes des datagrammes au serveur sur le port 10667 et lui doit te repondre en UDP sur un autre port, c'est celui-là qu'il faut que tu ecoutes sur ton PC.

    Actuellement, tu fais le contraire, tu simules le serveur et tu te connectes dessus avec ton jeu. (si j'ai bien suivi).
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  10. #10
    Membre averti Avatar de yetimothee
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 260
    Points : 364
    Points
    364
    Par défaut
    Le port 10667 ne sert que pour que le client puisse communiquer au serveur, et pas l'inverse ?

    Sinon, j'ai vu que dès que je me connecte au serveur avec le jeu (j'ai accès au log de ce serv), il me précise un numéro de port derrière l'ip :
    192.168.0.254:36120 connection (v. 108)
    Mais ce port varie aléatoirement au fur-et-à-mesure de mes connexions ?

    ca serait donc ce port qu'il faut que j'écoute ?

    EDIT : Je crois avoir compris, et j'ai fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import socket
     
    host = 'localhost'
    port = 10666
     
    serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
     
    while 1 :
    	request = raw_input('>> ')
    	serv.sendto(request +'\r\n', (host, port))
    Mais comment je fais pour écouter une éventuelle réponse ?

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import socket
     
    host = 'localhost'
    port = 10666
     
    serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
     
    while 1 :
    	request = raw_input('>> ')
    	serv.sendto(request +'\r\n', (host, port))
            data, addr = serv.recvfrom(1024)
            print "reponse", data
    je pense que ca ca suffit pour recuperer la reponse

Discussions similaires

  1. [Batch] Déplacer tous les fichiers au même niveau /supp. arbo.
    Par Rodrigue dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 04/09/2009, 10h05
  2. Réponses: 18
    Dernier message: 22/06/2006, 17h55
  3. Réponses: 3
    Dernier message: 23/03/2006, 17h59
  4. [C#] Comment utiliser tous les ports COM ?
    Par Seb.26 dans le forum C#
    Réponses: 2
    Dernier message: 10/01/2006, 16h34
  5. Récupérer tous les champs de même nom
    Par hlr dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/02/2005, 13h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo