Page 1 sur 1

question sur les ports utilisé par OpenNetworkConnection

Publié : mer. 10/oct./2012 9:20
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é ?

Re: question sur les ports utilisé par OpenNetworkConnection

Publié : mer. 10/oct./2012 10:01
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.

Re: question sur les ports utilisé par OpenNetworkConnection

Publié : mer. 10/oct./2012 10:22
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" ?

Re: question sur les ports utilisé par OpenNetworkConnection

Publié : mer. 10/oct./2012 14:21
par Ar-S
Ne serait-ce pas lors de ton CreateNetworkServer() ?

Code : Tout sélectionner

Resultat = CreateNetworkServer(#Serveur, Port [, Mode])

Re: question sur les ports utilisé par OpenNetworkConnection

Publié : mer. 10/oct./2012 14:50
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.

Re: question sur les ports utilisé par OpenNetworkConnection

Publié : mer. 10/oct./2012 15:05
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.

Re: question sur les ports utilisé par OpenNetworkConnection

Publié : mer. 10/oct./2012 17:57
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.

Re: question sur les ports utilisé par OpenNetworkConnection

Publié : mer. 10/oct./2012 21:25
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.

Re: question sur les ports utilisé par OpenNetworkConnection

Publié : mer. 10/oct./2012 21:54
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 ?

Re: question sur les ports utilisé par OpenNetworkConnection

Publié : mer. 10/oct./2012 22:17
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 :)