Port mapping (forwarding) avec python

Fermé
Hr2944 Messages postés 720 Date d'inscription mardi 8 janvier 2019 Statut Membre Dernière intervention 22 janvier 2020 - 20 oct. 2019 à 21:40
Hr2944 Messages postés 720 Date d'inscription mardi 8 janvier 2019 Statut Membre Dernière intervention 22 janvier 2020 - 22 oct. 2019 à 11:03
Bonjour,

Je développe une petite application en réseau avec python en utilisant les socket. C'est un Monopoly et pour jouer en ligne, il faut créer (avec les thread) un "espace" où s'exécute la partie. Il faut aussi que cet "espace" envoye des données aux joueurs (et inversement). Seulement comme j'utilise mon pc, un message que l'on veut m'envoyer devra passer par la box internet (ici une Freebox) puis être redirigé vers mon réseau local (port forwarding).

C'est là que je bloque, il faudrait créer une redirection (de la box à mon pc) pour chaque "espace". J'ai une appli pour le faire manuellement, mais je ne peux pas utiliser ça, il faut que ce soit automatique.

J'espère que vous aurez compris, ça faut un sacré paragraphe :)
Des idées ?
A voir également:

1 réponse

yg_be Messages postés 23196 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 septembre 2024 Ambassadeur 1 534
21 oct. 2019 à 12:11
bonjour,
je suppose que tu veux programmer l'utilisation de l'appli qui configure ta freebox. ou trouver une méthode pour modifier la configuration de ta freebox par programme.
dans le premier cas, il serait utile que tu décrives cette application.
dans le second, examiner la documentation ou contacter le fournisseur de la freebox.

toutefois, je me demande si c'est une bonne idée d'utiliser ainsi un numéro de port différent pour chaque espace. ne serait-il pas plus simple d'utiliser un seul numéro de port?
0
Hr2944 Messages postés 720 Date d'inscription mardi 8 janvier 2019 Statut Membre Dernière intervention 22 janvier 2020 85
21 oct. 2019 à 12:51
Ce serait plus simple d'utiliser 1 seul port, oui, mais je ne vois pas comment faire tout en ayant plusieurs thread du jeu en parallèle. Il faut que le client envoyé des données à l'espace et inversement, donc qu'il y est une connexion. Mais pour cela il faut l'adresse IP. Je récupère l'adresse IP du client, ça c'est bon. Mais comment l'utiliser dans un réseau non-locale ? Actuellement j'ai l'erreur (sous windows 10) "l'adresse demandé n'est pas valide dans son contexte", ce qui signifie que l'on essaye de trouver l'IP dans le réseau local, mais le client ne s'y trouve pas (logique).
Pour mapper les ports, j'utilise ça github.com/kaklakariada/portmapper
0
yg_be Messages postés 23196 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 septembre 2024 1 534 > Hr2944 Messages postés 720 Date d'inscription mardi 8 janvier 2019 Statut Membre Dernière intervention 22 janvier 2020
21 oct. 2019 à 13:33
1) pour utiliser le port mapper à partir de python, le plus simple es peut-être de l'utiliser en mode ligne de commande.
2) fais-tu un lien entre l'utilisation de plusieurs numéros de port et tes difficultés avec l'adresse IP?
3) je ne partage pas ton analyse à propos du message d'erreur "adresse non valide dans son contexte". qu'essaies-tu de faire avec cette adresse?
4) quel est le lien entre les threads et la nécessité d'avoir plusieurs numéros de port?
0
Hr2944 Messages postés 720 Date d'inscription mardi 8 janvier 2019 Statut Membre Dernière intervention 22 janvier 2020 85
21 oct. 2019 à 13:47
1) Ah ben oui, c'est sûre que ça va être plus pratique...

2) Non, mon problème est de faire communiquer l'espace de chaque jeu avec ses clients, le port mapping étant juste une solution possible. Je n'en trouve pas d'autre et n'ai pas d'expérience, c'est la première fois que j'utilise les socket.

3) L'erreur s'affiche car j'ai une adresse IP du client qui n'est pas sûr mon réseau local, mais le socket essaye de se connecter, dans mon réseau local, à un appareil qui a cette adresse IP. Sauf qu'il n'y en a pas, que l'adresse IP que j'ai doit être utilisée dans le réseau "globale". D'où ce message d'erreur.

4) Chaques threads représente un espace d'exécution du jeu, il doivent donc être capable de communiquer avec chaques clients. Mais pour pouvoir affecter les nouvelles données à la bonne partie en cour (donc les threads), il faut les envoyer à une adresse différente (ici les ports).

Peut être (sûrement) y a t'il une solution beaucoup plus simple que ce que je fais, mais je n'arrive pas à me l'imaginer. Merci de m'aider !
0
yg_be Messages postés 23196 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 septembre 2024 1 534 > Hr2944 Messages postés 720 Date d'inscription mardi 8 janvier 2019 Statut Membre Dernière intervention 22 janvier 2020
21 oct. 2019 à 14:09
3) tu penses connaitre la raison pour laquelle l'erreur s'affiche. quelle est l'action dans ton code qui provoque cette erreur?

4) tu as donc un serveur qui gère plusieurs parties de Monopoly, et tu appelles "espace" une partie. comment les joueurs choisissent-ils leur partie? qui établit les connexions, le serveur ou les clients?

5) comment proposer une solution plus simple sans que tu expliques ce que tu fais? as-tu déjà écrit une partie de ton programme?
0
Hr2944 Messages postés 720 Date d'inscription mardi 8 janvier 2019 Statut Membre Dernière intervention 22 janvier 2020 85
21 oct. 2019 à 15:15
3) Chaques joueurs est un objet qui contient toutes ses infos (argent, maisons, etc...) et aussi le socket qui fait la connexion. Donc j'utilise pour initialiser la connexion les infos que j'ai reçu du client lors de sa connexion à mon code qui lui envoye la partie à laquelle il doit se connecter.

4) Le client se connecte à mon pc (mon serveur) grâce à un premier port. Un premier code lui envoye une partie_id (qui sert à mon second programme à savoir à quelle partie l'associer). Il se déconnecte de ce port pour se connecter à un autre port. Un autre code qui écoute sûr ce port là va le faire patienter jusqu'à ce que la partie qui lui est attribuée (qui est reconnue par partie_id) soit pleine (4 joueurs). Quand c'est fait, un tread va être créé et lancé. Pour communiquer, j'utilise le socket attribuée à chaque joueur (celui là même qui ne marche pas). Tout est en commande ligne au niveau de l'affichage. J'utilise deux bout de code et deux ports pour que se soit mieux organisé et ne pas m'embrouiller avec les différentes connexion. Il y a 1 code avec 1 port pour écouter les demandes de connexion à un jeu, et qui gère l'attribution des parties aux joueurs. 1 autre code avec 1 autre port gère le lancement des threads et de l'attente que la partie soit pleine.

5) Tout mon programme est écrit, comme c'est une adaptation de la version hors ligne, ce n'est pas très long. Si je pouvais utiliser comme je le veux ce socket, tout devrais marcher. Si tu as besoins d'autres infos, n'hésite pas.
0