question sur les ports utilisé par OpenNetworkConnection

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
supercdfr
Messages : 105
Inscription : sam. 21/juil./2007 15:16

question sur les ports utilisé par OpenNetworkConnection

Message par supercdfr »

Bonjour,

il y a quelque chose d’incompréhensible.

Pour OpenNetworkConnection, on doit preciser un port.

Code : Tout sélectionner

Port = 3095
ConnexionID = OpenNetworkConnection(IPString(GetClientIP(ClientID)), Port)
MessageRequester("PureBasic - Server", "Connexion nouveau client ! " + Str(ClientID) + "  Port :" + Str(GetClientPort(ClientID)), 0)

Mais quand un client se connecte, ce n'est jamais le bon port qui est donné (1 fois 13950, 1 fois 40964).

Comment on fait quand on est derrière un routeur bloqué ?
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: question sur les ports utilisé par OpenNetworkConnection

Message par Golfy »

Principe de fonctionnement de la pile TCP/IP :
en mode TCP, le port source peut changer à chaque déconnexion

D'où le fait de créer un serveur dont le port de réception (destination) ne change jamais).
Le serveur mémorise le tuple IP distante, port distant pour reconnaitre une session.
Cela autorise plusieurs sessions sur le même poste sans mélange... :)

A noter : il y a un bug dans PB4.61 que la version 5.0 doit corriger (j'ai pas encore testé...) --> pour le port, l'octet de poids fort et inversé avec l'octet de poids faible.
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
supercdfr
Messages : 105
Inscription : sam. 21/juil./2007 15:16

Re: question sur les ports utilisé par OpenNetworkConnection

Message par supercdfr »

Golfy a écrit :Principe de fonctionnement de la pile TCP/IP :
en mode TCP, le port source peut changer à chaque déconnexion

D'où le fait de créer un serveur dont le port de réception (destination) ne change jamais).
Le serveur mémorise le tuple IP distante, port distant pour reconnaitre une session.
Cela autorise plusieurs sessions sur le même poste sans mélange... :)

A noter : il y a un bug dans PB4.61 que la version 5.0 doit corriger (j'ai pas encore testé...) --> pour le port, l'octet de poids fort et inversé avec l'octet de poids faible.
Comment on fait pour "créer un serveur dont le port de réception (destination) ne change jamais" ?
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: question sur les ports utilisé par OpenNetworkConnection

Message par Ar-S »

Ne serait-ce pas lors de ton CreateNetworkServer() ?

Code : Tout sélectionner

Resultat = CreateNetworkServer(#Serveur, Port [, Mode])
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
supercdfr
Messages : 105
Inscription : sam. 21/juil./2007 15:16

Re: question sur les ports utilisé par OpenNetworkConnection

Message par supercdfr »

aussi bien CreateNetworkServer que OpenNetworkConnection sont sur le même port.

C'est pour cela que je comprends pas le port que je reçois quand je fait :

Serveur :

Code : Tout sélectionner

CreateNetworkServer(#reseau, 5900)
Client :

Code : Tout sélectionner

SEvent = NetworkServerEvent()
ClientID = EventClient()
     Select SEvent
        Case #PB_NetworkEvent_Connect
          ConnexionID = OpenNetworkConnection(IPString(GetClientIP(ClientID)), 5900)
          MessageRequester("PureBasic - Server", "Connexion nouveau client ! " + Str(ClientID) + "  Port :" + Str(GetClientPort(ClientID)), 0)
Le messagerequester me renvoi un port totalement different de 5900 a chaque fois.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: question sur les ports utilisé par OpenNetworkConnection

Message par falsam »

Bonjoru supercdfr.

Code : Tout sélectionner

OpenNetworkConnection(IPString(GetClientIP(ClientID)), 5900)
Voila qui est bizarre !

GetClientIP() et GetClientPort() peuvent servir à collecter plus d'informations à propos du client qui a émis les données. Mais ces commandes sont utilisées par ton serveur et non pas par ton client.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
supercdfr
Messages : 105
Inscription : sam. 21/juil./2007 15:16

Re: question sur les ports utilisé par OpenNetworkConnection

Message par supercdfr »

Pour voir mon probleme, je reprends l'exemple donné par pure basic :

Code client (inchangé) :

Code : Tout sélectionner

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Port = 6832

ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
If ConnectionID
  MessageRequester("PureBasic - Client", "Client connected to server...", 0)
  
  SendNetworkString(ConnectionID, "An hello from a client !!! :-)")
    
  MessageRequester("PureBasic - Client", "A string has been sent to the server, please check it before quit...", 0)
  
  CloseNetworkConnection(ConnectionID)
Else
  MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
EndIf
  
End
Code serveur (1 ligne changée, ligne 34)

Code : Tout sélectionner

;
; ------------------------------------------------------------
;
;   PureBasic - Network (Server) example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Port = 6832
*Buffer = AllocateMemory(1000)

If CreateNetworkServer(0, Port)

  MessageRequester("PureBasic - Server", "Server created (Port "+Str(Port)+").", 0)
  
  Repeat
      
    SEvent = NetworkServerEvent()
  
    If SEvent
    
      ClientID = EventClient()
  
      Select SEvent
      
        Case #PB_NetworkEvent_Connect
          ; instruction d'origine :
          ; MessageRequester("PureBasic - Server", "A new client has connected !", 0)
          ; remplacer par
          MessageRequester("PureBasic - Server", "Connexion nouveau client ! " + Str(ClientID) + "  Port :" + Str(GetClientPort(ClientID)), 0)
  
        Case #PB_NetworkEvent_Data
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a packet !", 0)
          ReceiveNetworkData(ClientID, *Buffer, 1000)
          MessageRequester("Info", "String: "+PeekS(*Buffer), 0)
  
        Case #PB_NetworkEvent_File
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a file via the network !", 0)
          ReceiveNetworkFile(ClientID, "C:\TEST_Network.ftp3")
  
        Case #PB_NetworkEvent_Disconnect
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has closed the connection...", 0)
          Quit = 1
    
      EndSelect
    EndIf
    
  Until Quit = 1 
  
  MessageRequester("PureBasic - Server", "Click to quit the server.", 0)
  
  CloseNetworkServer(0)
Else
  MessageRequester("Error", "Can't create the server (port in use ?).", 0)
EndIf

  
End 


Quand on exécute ce code, on voit bien que le port du client n'est pas celui capter par le serveur.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: question sur les ports utilisé par OpenNetworkConnection

Message par falsam »

Les codes que tu reproduis n'ont rien à voir avec ton exemple.
L'exemple que tu cites cotes client

Code : Tout sélectionner

ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
et maintenant ton code cotes client

Code : Tout sélectionner

ConnexionID = OpenNetworkConnection(IPString(GetClientIP(ClientID)), 5900)
Ici, GetClientIP ne peut pas s'utiliser puisqu'il s'agit justement du code cotes client.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
supercdfr
Messages : 105
Inscription : sam. 21/juil./2007 15:16

Re: question sur les ports utilisé par OpenNetworkConnection

Message par supercdfr »

ça ne réponds pas a ma question.

Pourquoi dans l'exemple de la doc purebasic, le port récupérer n'est pas celui envoyer ?
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: question sur les ports utilisé par OpenNetworkConnection

Message par falsam »

j'ai testé à l'instant tes dernier exemple issus de la doc et qui ne m'apporte rien de plus.
Je vais quand meme répondre à ta question
supercdfr a écrit :Comment on fait pour "créer un serveur dont le port de réception (destination) ne change jamais" ?
Ton port ne changera pas.
-Si tu attache un serveur sur le port 6832 alors il le restera.
-le client qui se connecte devra le faire avec l'adresse IP + le port de ton serveur.
-Ton serveur pourra connaitre l'adresse IP de ton client GetClientIP() et il pourra aussi connaitre le port sur lequel le client communique GetClientPort().
Mais attention, ce port n'est pas celui de ton serveur, mais celui du client. Un client qui se connecte deux fois de suite n'aura pas forcement le même port.

-Cotes serveur, l'adresse IP et le port (ici le 6832) doit être ouvert. Cotes client si le port 6832 n'est pas ouvert ça n'a aucune importance. la connexion se fera. J'espére que j'ai répondu :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre