Numéro de port changeant  [RESOLU]

Votre Apache se cache, votre Pi gémit, votre SoC fume ? La panne quoi ! C'est ici que vous trouverez sans doute une solution... Sinon du réconfort :)

Modérateurs : Francois, maxty01

Répondre
Melchior59
Messages : 28
Enregistré le : lun. 2 mars 2020 12:53

Numéro de port changeant

Message par Melchior59 » lun. 30 août 2021 11:36

Bonjour,
Je suis un débutant de 68 ans.
Je n'ai pas de problème ..... juste une interrogation.
J'ai réussi à faire communiquer mon ordinateur (sous ZINDOZ) avec une raspberry pi zero W grâce à un serveur et un client rudimentaire (programmes trouvés sur internet et parfaitement fonctionnels).
Le client (la raspberry) envoie (à l'adresse IP de l'ordi et sur le port 50000) toutes les 3 secondes un nombre et le serveur affiche "connexion réussie à l'adresse 192.168.1.26 et sur le port 42454"(exemple), réceptionne le nombre et dit "OK". Cà marche nickel!
A chaque envoi du client, le numéro de port est incrémenté de 2 ??? (42454, 42456, 42458, etc...) Pourquoi ne reste-t-il pas à 50000 ?
C'est de la pure curiosité et, en même temps, je me dis que ce n'est pas normal et que j'ai peut-être un pb.
Merci à celui(ceux) qui veut(veulent) bien m'éclairer.

piper
Raspinaute
Messages : 645
Enregistré le : sam. 5 juin 2021 18:57

Re: Numéro de port changeant

Message par piper » lun. 30 août 2021 12:03

Bonjour.
Ce ne peux etre que voulu par le developpeur.
L'url de la ou se trouve ces programmes nous permettrait d'en savoir plus.
Sur quels sites sont-ils ?

Envoyé de mon SM-J710F en utilisant Tapatalk

3 Pi4 : Emby / Samba , Librelec, Android TV
3 Pi3 : Hifiberry /OSMC, Games station, Samba / VPN / HotSpot Wifi
2 Pi2 : RFID, radio reveil (PiReveil)
1 Pi0 : traker GPS et acquisitions
1 Pi0 2W : tests divers
5 Arduinos dont 4 nanos et 1 Mega
1 ESP32

Melchior59
Messages : 28
Enregistré le : lun. 2 mars 2020 12:53

Re: Numéro de port changeant

Message par Melchior59 » lun. 30 août 2021 13:24

Bonjour piper,
ci dessous une synthèse des programmes client et serveur en python. vraiment très rudimentaires mais fonctionnels!
SERVEUR
adresseIP = "192.xxx.x.x" (du client)
port = 50000
mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
while True:
# Etablissement de la connexion :
connexion, adresse = mySocket.accept()
print("Client connecté, adresse IP %s, port %s" % (adresse[0], adresse[1]))
donneesclient = connexion.recv(8).decode("utf-8")
# je mets les données dans une variable
# le serveur envoie 'OK' au client
donneesServeur = ("OK").encode("utf_8")
connexion.send(donneesServeur)

CLIENT
adresseIP = "192.xxx.x.x" (du serveur)
port = 50000
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
message_client = ("1") #j'envoie "1" au serveur
client.send(message_client.encode("utf-8"))
# le serveur me répond "OK"
message_serveur = client.recv(8).decode("utf-8")
client.close

côté serveur, c'est le numéro du port (avec print("client......) qui s'incrémente de 2 à chaque réception?
Voili, voilou!!!

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: Numéro de port changeant

Message par Bud Spencer » lun. 30 août 2021 16:12

C‘est le comportement normal d’une connexion IP. Le serveur à forcément un n° de port défini (ici 50000, sinon, il faudrait le deviner entre 65534 possible …) mais pas le client. Le n° de port coté client est par défaut dynamique et change à chaque création du socket en fonction des ports dispo sur l’interface (tout ça est géré en toute transparence par le système). Quand le serveur accepte la connexion d’un client, il récupère le n° de port du socket de ce client et lui répond sur celui-ci.

Pour des cas bien particulier (et plutôt rare), on peut bien sur fixer le n° de port d’un socket client, mais ça sous-entend que ce port ne pourrait pas être utilisé par autre chose et qu’il ne pourrait y avoir qu’un seul client par interface ip. Quel que soit le langage ou la libraire socket utilisée, le port par défaut d’un socket est 0 (dynamique). Si on veut qu’il soit fixe (cas systématique d'un serveur et dans certains cas d'un client), il suffit de le définir à la création du socket (gendre socket.bind('',port)
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Melchior59
Messages : 28
Enregistré le : lun. 2 mars 2020 12:53

Re: Numéro de port changeant  [RESOLU]

Message par Melchior59 » lun. 30 août 2021 16:21

Grand merci Bud Spencer! Voilà une réponse claire et, somme toute, satisfaisante pour mon ignorance et ma curiosité.
Passes une bonne semaine.

Ah! je suis vraiment ignorant! comment fait-on pour marquer 'RESOLU' :idea:

Melchior59
Messages : 28
Enregistré le : lun. 2 mars 2020 12:53

Re: Numéro de port changeant

Message par Melchior59 » lun. 30 août 2021 16:31

Bud! J'ai trouvé le bouton avec la petite coche! super. Encore merci

piper
Raspinaute
Messages : 645
Enregistré le : sam. 5 juin 2021 18:57

Re: Numéro de port changeant

Message par piper » mar. 31 août 2021 08:51

Oui, effectivement :
Variable port = 50000 non utilisée dans le code du serveur
Par de bind, précisant le port d'écoute.
Pas de listen
Ce code ne devrait fonctionner que si le code serveur et le code client ne s'exécutent sur la même machine non ?
3 Pi4 : Emby / Samba , Librelec, Android TV
3 Pi3 : Hifiberry /OSMC, Games station, Samba / VPN / HotSpot Wifi
2 Pi2 : RFID, radio reveil (PiReveil)
1 Pi0 : traker GPS et acquisitions
1 Pi0 2W : tests divers
5 Arduinos dont 4 nanos et 1 Mega
1 ESP32

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: Numéro de port changeant

Message par Bud Spencer » mar. 31 août 2021 12:00

piper a écrit :
mar. 31 août 2021 08:51
...
Ce code ne devrait fonctionner que si le code serveur et le code client ne s'exécutent sur la même machine non ?
Non, pas nécessairement. A partir du moment ou un socket TCP/IP à un n° de port d’attribué (bind) et que l’on lui dit d’écouter (listen) il peut accepter toutes les connexions qu’elles soient locale ou distante (si toutes règle d’éventuels routages et firewall l’autorise bien entendu). Si on veut restreindre l’accès a un serveur uniquement a des demandes locales, alors on définit l’ip du socket serveur avec une adresse de bouclage (utile en phase de développement surtout si l’on a des contraintes de sécurité)

Au plus simple, voilà sommairement comment fonctionne une connexion client/serveur en mode TCP/IP :
Dans les 2 cas on commence par initialiser un socket en lui définissant la famille d’adressage, et le protocole. Ici dans les 2 cas on a comme paramètres AF_INET qui correspond au type d’adressage Internet (IP v4) et SOCK_STREAM qui correspond au mode du protocole (TCP).

Ensuite on définit le point de terminaison du socket. Un point de terminaison, c‘est une adresse et un n° de port.

Pour un serveur : on doit impérativement lui assigner un n° Port (ici 50000). Pour l’IP, c’est différent dans le sens ou le système peut avoir plusieurs interface réseau ou même plusieurs adresses sur une même interface. Donc soit-on défini une de ces adresses ou alors on laisse par défaut, ce qui correspond en IPv4 ‘0.0.0.0’ soit toutes les adresses de toutes les interfaces. Ce dernier cas peut par exemple être utile si vous avez développer un serveur sur un PI et vous voulez pouvoir y accéder aussi bien en ciblant l’IP Ethernet ou l’ip WIFI. L’attachement du point de terminaison au socket se fait dans la plupart des langage par une instruction bind(ip,port). Comme c’est un serveur, on doit le mettre à l’écoute des connexions entrantes. Ça, c’est le rôle de la fonction listen().

Pour un client : Dans l’absolu et la majorité des cas, on laisse par défaut l'ip et le port par défaut ‘0.0.0.0’,0 (toutes les adresses de toutes les interface et n° de port dynamique). De ce fait, avec beaucoup de langage et librairie socket, pas besoin d’instruction bind pour définir le point de terminaison. Si vraiment on a besoin d’un port fixe ou que l’on veut impérativement utiliser une ip précise, alors on le défini comme pour un serveur. Par contre, pas d’instruction listen pour un client puisqu’il n’est pas sensé être à l’écoute de connexion autre que celle qu’il lui-même demandé.


On a donc un serveur qui est à l’écoute de demande de connexion TCP/IP sur le port 50000 d’une ou de toutes les IP du système. Le client s’attribue un n° de port automatiquement (cas par défaut avec port 0) et envois une demande de connexion en direction de (d’une) l’adresse du serveur sur le n° de port 50000. L’ip et le n° port du client sont contenu dans les trames réseaux sous forme d’une structure bien définie appelée NPDU (Network Protocol Data Unit). Quand un serveur TCP/IP reçoit une demande de connexion ou des données d’un client, ils identifie le client en trouvant son ip et son n° de port (et bien d’autres chose) dans cette structure. C’est ce qui permet à un serveur de dialoguer avec une multitude de client en renvoyant les bonnes données à chaque client.

Les p’tit + pour les débutants en réseaux IP

Il faut voir le socket comme une interface entre le soft et le hard réseaux.

Si vous vous lancez dans le développement d’un petit serveur TCP/IP, vous pouvez tester les connexions sans avoir besoin de développer tout de suite un client. Vous pouvez pour ça utiliser un simple terminal telnet. A noter que je vous recommande vivement de boycotter Python pour tout ce qui est serveur réseaux. Si vous etes débutant, tournez vous plutôt vers NodeJs pour ca.

Les sockets sont une très bonne solution aussi si l’on a besoin de faire dialoguer ensemble plusieurs programmes qui tourne sur un même système. L’énorme avantage d’un socket ip est qu’il permet de dialoguer aussi bien entre des programmes locaux que distant et contrairement aux com+ , named pipe ou socket unix, ils sont multi-plateforme et travaillent de la même façon sur tous les système. Attention toutefois de ne pas en abusé. Le nombre de port est limité (il y a de la marge quand meme)

Attention avec les codes serveur comme celui de Melchior59. Le programme est bloqué en attente de connexion dans le thread principale, ce qui veut que le programme ne peut rien faire d’autre en même temps et tous les traitements doivent être fait dans l’annexe de la boucle while. Pour un tout petit programme qui ne va traiter qu’un seul client à la fois et qui ne fait pas grand-chose, ça peut suffire, mais pas au-delà.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

piper
Raspinaute
Messages : 645
Enregistré le : sam. 5 juin 2021 18:57

Re: Numéro de port changeant

Message par piper » mar. 31 août 2021 12:30

"A partir du moment ou un socket TCP/IP à un n° de port d’attribué (bind) et que l’on lui dit d’écouter (listen)"

Comme ce n'est pas le cas.
C'est bien ce que j'ai dit : ce code ne peut fonctionner que client et serveur tournant sur la meme machine non ?

Envoyé de mon SM-J710F en utilisant Tapatalk

3 Pi4 : Emby / Samba , Librelec, Android TV
3 Pi3 : Hifiberry /OSMC, Games station, Samba / VPN / HotSpot Wifi
2 Pi2 : RFID, radio reveil (PiReveil)
1 Pi0 : traker GPS et acquisitions
1 Pi0 2W : tests divers
5 Arduinos dont 4 nanos et 1 Mega
1 ESP32

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: Numéro de port changeant

Message par Bud Spencer » mar. 31 août 2021 14:30

piper a écrit :
mar. 31 août 2021 12:30
"A partir du moment ou un socket TCP/IP à un n° de port d’attribué (bind) et que l’on lui dit d’écouter (listen)"

Comme ce n'est pas le cas.
C'est bien ce que j'ai dit : ce code ne peut fonctionner que client et serveur tournant sur la meme machine non ?
Non, ce code seul ne peut pas fonctionner ni en local ni distant en tant que serveur (il en manque forcément un bout) puisque dans le code, la variable port est bien initialisé a 50000 mais à aucun endroit cette variable port n’est bindé au socket donc il ne va pas le deviner tout seul. Pour ce qui est de l'ip, si elle n'est pas définie ou non valable, elle garde la valeur par défaut soit 0.0.0.0. En plus a aucun endroit il ni a d'instruction pour ouvrir le socket server en écoute (listen), donc il ne peut pas accepter de connexion d'ou qu'elle vienne.
Un détail, mais dans le commentaire de la ligne d’initialisation de la variable adresseIP du serveur il y a marqué (du client), ce qui ne peut pas être le cas pour l’utiliser comme ip de terminaison du socket serveur.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Répondre

Retourner vers « En panne ? »