Connexion entre 2 ordinateurs

Fermé
quent - Modifié par NHenry le 10/12/2016 à 18:51
 quent - 11 déc. 2016 à 17:54
Bonjour,
J'aimerais apprendre à créer un programme qui permet de faire communiquer 2 ordinateurs.
Pour tester j'ai utiliser le code sur ce site : https://openclassrooms.com/fr/courses/235344-apprenez-a-programmer-en-python/234698-gerez-les-reseaux
Ca marche très bien quand les 2 programmes (serveur et client) sont sur le même ordinateur mais quand j'essaye d'utiliser les même programmes mais sur des ordinateurs différents (sur le même réseau local), le client n'arrive pas à se connecter.
Voici mon code :
Serveur :
import socket
import select

hote=''
port=8100

connexion_principale=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
connexion_principale.bind((hote,port))
connexion_principale.listen(5)

serveur_lance=True
clients_connectes=[]
while serveur_lance or len(clients_connectes)!=0:
 connexions_demandees,wlist,xlist=select.select([connexion_principale],[],[],0.05)
 for connexion in connexions_demandees:
  connexionClient,infos=connexion.accept()
  clients_connectes.append(connexionClient)

 clients_a_lire=[]
 try:
  clients_a_lire,wlist,xlist=select.select(clients_connectes,[],[],0.05)
 except select.error:
  pass
 else:
  for client in clients_a_lire:
   msg=client.recv(1024).decode()
   print(msg)
   client.send(b"5/5")
   if msg=="fin":
    client.close()
    clients_connectes.remove(client)
    serveur_lance=False
for i in clients_connectes:
 client.close()

connexion_principale.close()

Client :
import socket

hote='192.168.1.17'
port=8100

connexionServeur=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
connexionServeur.connect((hote,port))

msgEnvoi=b""
while msgEnvoi!=b"fin":
 msgEnvoi=input("> ").encode()
 connexionServeur.send(msgEnvoi)
 msgRecep=connexionServeur.recv(1024)
 print(msgRecep.decode())

connexionServeur.close()


Normalement l'adresse '192.168.1.17' est celle de l'ordinateur ou je fais tourner le serveur. Je l'ai trouvé en faisant ipconfig /all dans l'invite de commande et aussi sur le site : http://www.mon-ip.com/adresse-ip-locale.php
Le serveur fonctionne bien mais sur le client j'ai cette erreur :
Traceback (most recent call last):
File "C:\Users\Quentin\Documents\reseau-client.py", line 7, in <module>
connexionServeur.connect((hote,port))
TimeoutError: [WinEror 10060] Une tentative de connexion a échoué car le parti connecté n\u2019a pas répondu convenablement au-delà d\u2019une certaine durée ou une connexion établie a échoué car l\u2019hôte de connexion n'a pas répondu

Je me suis dit que le problème venait peut-être du fait que je n'ai pas donné d'autorisation particulière pour utiliser le port 8100. Si c'est de là que vient le problème j'aimerais bien que l'on m'explique comment faire car je n'ai pas trouvé. Et sinon si vous savez où est le problème merci de me l'expliquer :)

Infos :
Je suis sous windows 10 et j'utilise python 3

EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
A voir également:

7 réponses

yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 Ambassadeur 1 550
Modifié par yg_be le 10/12/2016 à 20:37
Comment as-tu adapté ton code qui fonctionnait en local?
Quand ton serveur tourne, examine la réponse à "netstat -a" (dans l'invite de commande) : y trouves-tu une ligne avec 0.0.0.0:8100? Si oui, copie le contenu de la ligne dans le forum.
Sur le poste client, quelle est la réponse à la commande "ping 192.168.1.17"?
0
Merci de m'avoir répondu
Je n'ai rien changé dans mon code qui fonctionne en local à part avoir remplacé l'hote où il y avait localhost par l'adresse du serveur mais le code avec l'adresse du serveur fonctionne aussi en local.
En faisant le netstat -a j’obtiens cette ligne :

TCP 0.0.0.0:8100 0:0 LISTENING

et le ping me donne :

Envoi d’une requête 'Ping' 192.168.1.17 avec 32 octets de données :
Réponse de 192.168.1.17 : octets=32 temps=138 ms TTL=128
Réponse de 192.168.1.17 : octets=32 temps=3 ms TTL=128
Réponse de 192.168.1.17 : octets=32 temps=2 ms TTL=128
Réponse de 192.168.1.17 : octets=32 temps=3 ms TTL=128

Statistiques Ping pour 192.168.1.17:
Paquets : envoyés = 4, reçus = 4, perdus = 0 (perte 0%),
Durée approximative des boucles en millisecondes :
Minimum = 2ms, Maximum = 138ms, Moyenne = 36ms
0
_Ritchi_ Messages postés 21288 Date d'inscription samedi 17 mars 2007 Statut Contributeur Dernière intervention 11 novembre 2024 6 078
10 déc. 2016 à 20:26
Bonjour

Suggestion au hasard: utilise un port sans privilège comme par exemple 50007.

Ritchi
0
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 1 550
10 déc. 2016 à 20:42
Bonne idée, cela donne quoi, quent?
0
Ca ne change rien j'ai toujours la même erreur
mais quelle est la différence entre ces 2 ports exactement ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 Ambassadeur 1 550
10 déc. 2016 à 20:41
On dirait donc que c'est ton réseau, ou Windows sur ton serveur, qui bloque la connexion. Bizarre...
D'autres connexions fonctionnent-elles entre ton client et ton serveur?
Par exemple, "\\192.168.1.17" à partir de ton client?
0
Je n'ai pas bien compris ce que je devais essayer
Ou dois-je écrire cette ligne ?
Par contre j'ai essayé d'inverser le client et le serveur et quand je me suis rendu compte au bout de 30 min que j'avais oublié de changer l'adresse ip ^^', je me suis aperçu que ça marche très bien dans ce sens là. Je me demande pourquoi je n'ai pas pensé plus tôt à faire ce test...
Bon du coup je suis content que ça marche mais j'aimerais quand même comprendre pourquoi ça ne marche pas dans l'autre sens. C'est probablement un mauvais paramétrage du réseau ou quelque chose du genre
0
Je viens de m’apercevoir que sur le serveur (dans le sens ou la connexion fonctionne), si je fais tourner le client sur le même ordinateur, le client n'arrive pas à se connecter et il y a la même erreur que lorsque le serveur est sur l'autre ordinateur. Du coup j'en déduit que le problème vient du client sur le deuxième ordinateur non ? C'est vraiment bizarre tous ça...
0
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 1 550
11 déc. 2016 à 00:04
2 PC windows 10
client et serveur sur A ok
client sur A et serveur sur B ok
client et serveur sur B marche pas
client sur B et serveur sur A marche pas
?
0
quent > yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024
11 déc. 2016 à 10:54
En fait ça fonctionne avec le client et le serveur sur B
Et quand il y a le client sur A et le serveur sur B ça marche que de temps en temps mais par contre quand ça ne marche pas, je peux rentrer un message et après ça bloque à la ligne
msgRecep=connexionServeur.recv(1024)

donc il peut quand même se connecter.

donc serveur sur B et client sur A : ça bloque une fois sur 2 à la réception (mais quand ça marche une fois ça marche les autres fois, c'est si je redémarre le serveur et le client que ça peut ne plus marcher)
et serveur sur A et client sur B : il ne peut pas se connecter, c'est l'erreur que j'ai expliqué avant

Et le reste que tu as dis c'est bon.

Désolé d'avoir changer des trucs mais c'est parce que hier j'avais pas fais beaucoup de tests et en les refaisant ce matin j'ai vu que je m'était trompé.

En tout cas merci beaucoup pour ton aide
0
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 1 550
Modifié par yg_be le 11/12/2016 à 11:27
serveur sur A et client sur B :
quand le serveur est arrêté, la ligne avec 8100 disparaît bien du "netstat -a" (sur A)?
et elle revient quand le serveur tourne?
et A a toujours la même adresse IP?
et client et serveur sur A fonctionne toujours?
0
Oui la ligne apparait bien quand le serveur tourne et disparait quand j’arrête le serveur (même si je le crash)
Et j'ai vérifié mon adresse ip et c'est toujours la même
0
ryko1820 Messages postés 1677 Date d'inscription dimanche 28 avril 2013 Statut Membre Dernière intervention 15 août 2021 276
Modifié par ryko1820 le 11/12/2016 à 11:12
Hello,

ça peut valoir le coup d'aller voir dans resmon ce qui se passe ou de lancer netstat.

Sous Windows 10, j'ai remarqué que des services réseaux continuaient d'utiliser le port qui leur était attribué même quand le service était arrêté, surtout si il crashe et bloquant parfois le redémarrage du service qui constatait le port comme occupé.

J"ai pas essayé de diagnostiquer, je suis sur une version beta (insider), et ça m'est arrivé avec des serveurs tournant dans WSL (donc j'ajoute des API et de l'abstraction avec l'instabilité que ça sous-entends en cas de problèmes).
Avec la programmation de sockets (en C#) je n'ai jamais eu de problèmes, peu importe le langage.


- Make me a sandwich. 
- What? Make it yourself.
- Sudo make me a sandwich.
- Okay
0
J'ai essayer d'aller voir dans resmon comme tu m'as conseillé et la première chose que j'ai remarqué c'est que sur les 2 pc, lorsque que je fais tourner le serveur, il y a bien une ligne python.exe dans réseau/Ports d'écoute mais dans Statut du pare-feu du port, sur B il y a Autorisé, illimité alors que sur A il y a non autorisé, illimité. Ensuite, j'ai remarqué que dans Réseau/Connexions TCP, il y a 2 lignes python.exe quand le serveur se connecte à un client sur le même PC donc j'ai supposé qu'il y en a une pour le serveur et une pour le client mais quand je met le serveur sur B et le client sur A, Il y a une ligne python.exe sur B avec les bon ports et adresse ip mais sur A il n'y a rien, ni dans Ports d'écoute, ni dans Connexions TCP (et c'est comme ça peut importe si le programme fonctionne ou si il bloque). Et bien sur quand le serveur est sur A et le client sur B, il y a juste la ligne python.exe dans Port d'écoute sur A et rien du tout sur B.

Bon, ce ne sont que des constatations car je ne maitrise pas bien tout ça donc je ne sais pas si c'est normal ou pas. Mais peut-être que vous pourrez trouver le problème grâce à ça :)
Et si il y a des choses que je n'ai pas préciser n'hésiter pas à me le faire remarquer.
0
ryko1820 Messages postés 1677 Date d'inscription dimanche 28 avril 2013 Statut Membre Dernière intervention 15 août 2021 276
Modifié par ryko1820 le 11/12/2016 à 13:25
Je pensais que vous aviez déjà envisagé le FW, c'est la première chose qu'on vérifie ...
Normalement au premier essai d'utilisation d'un port par une application, Windows devrait poser la question si on autorise ou pas mais bien souvent il ne le fait pas. Quand on fait du développement client/serveur on se retrouve souvent à créer des règles pour autoriser le serveur. Il suffit d'en créer une là ou le serveur ne fonctionne pas (dans les fonctionnalités avancés) qui pointe sur python.exe. Éventuellement s'inspirer de la machine ou ça fonctionne et ou elle doit exister (dans les centaines de règles qui doivent figurer).
Il y a probablement une ligne de commande pour le faire et ça serait plus classe, à chaque fois je mets 2mn à trouver le menu ou ça se règle ...
La méthode sale, quand on a la flemme de chercher quelle appli fait quoi c'est d'ouvrir le port mais c'est ensuite ouvert à tous les vents, y compris quand l'appli. tourne pas (faille de sécurité potentielle) et si on change de port il faut en faire une nouvelle ...
Le coup de l'antivirus, j'y croyais pas trop mais ça m'est arrivé dernièrement suite à une maj de W10 (insider).
Sinon, c'est sympa resmon, joli et on voit pas mal de trucs. :-)
0
oui effectivement j'aurais sans doute du vérifier le pare-feu avant mais c'est la première fois que je fais des programme qui utilisent le réseau donc je n'ai pas encore les bons réflexes.
Sinon j'ai réussi a faire accepter le trafic entrant pour python comme je l'ai expliqué plus haut. Mais je me demandais si c'est n'est pas une faille de sécurité d'autorisé totalement python et pas uniquement mes programmes à moi ?
Et j'ai toujours le problème que ca bloque une fois sur 2 ^^'
0