Partage
  • Partager sur Facebook
  • Partager sur Twitter

Transfert UDP

    18 février 2012 à 22:18:50

    Bonsoir, j'ai un programme qui me permet d'envoyer des fichiers en UDP ( Oui je sais il y'a TCp :p ) d'un ordinateur à un autre en théorie. Je dis en théorie car ce programme fonctionne en local mais avec des ordinateurs distants ça ne marche plus.

    J'aimerai savoir si c'est normal, car il faut spécifier le port également donc ça pourrait être un problème d'ouverture de port ...

    Dans chaque tuto que j'ai suivi, on ne mentionne jamais cette histoire de port à ouvrir mais comme ça marche pas je commence à me poser des questions ...

    Merci d'avance ^^
    • Partager sur Facebook
    • Partager sur Twitter
      19 février 2012 à 1:15:55

      La réponse à ta question tiens en effet plus au réseau qu'à la programmation Java.


      En réseau, un canal de connexion représente un lien de communication d'un port local vers un port distant.
      Quand un client veut se connecter sur un port distant, le système d'exploitation associe au socket un port local.

      Ainsi, quand on programme un client, si on définit le port distant pour la connexion, il n'est pas possible de définir le port local. On peut avoir connaissance par des méthodes de type getLocalPort().


      Le plus simple à comprendre (le plus "naturel" d'un point de vue humain; à mon sens), c'est le TCP. Je commence par là comme base avant d'expliquer l'UDP.


      En TCP, le serveur écoute sur un port, et les clients se connectent sur ce port. La configuration (routage de port) ne doit être effectuée que pour le serveur, afin que des clients se connectent dessus.
      Quand un client se connecte, le système d'exploitation du serveur crée un nouveau canal de communication sur un nouveau port libr. Le port d'écoute (celui que l'on paramètre) ne sert donc qu'à l'écoute, et non au transfert de données. Les données ne transiterons que par le nouveau port ouvert coté serveur.
      L'avantage de cette technique, c'est que chaque client va communiquer sur un port qui lui est spécifique. Le serveur peut donc très facilement savoir qui parle.


      En UDP, comme il n'y a pas de notion de "connexion", on ne crée qu'un seul port qui ne fait que recevoir des données directement. Sans traitement particulier, il est impossible pour le serveur de savoir qui a envoyer des données.
      Dans la pratique, le Datagramme fournis des informations sur l’émetteur du message: son adresse IP et son port (de son coté ! Il s'agit du port de communication sur le client, et non pas le serveur).

      C'est ce couple "IP + port du client" qui va permettre d'identifier un client. Si on veut répondre à ce client, il faut renvoyer des informations à ce couple précis.


      De mémoire, en java ces informations sont contenus dans l'objet SocketAddress.

      La lecture se fait à partir d'un objet de type DatagramSocket, avec la méthode receive(DatagramPacket p)

      http://docs.oracle.com/javase/1.4.2/do [...] amSocket.html

      DatagramPacket permet les informations de connexion avec la méthode getSocketAddress()

      http://docs.oracle.com/javase/1.4.2/do [...] amPacket.html



      Avec ces informations, il n'est plus indispensable de connaitre à l'avance les ports utilisé par un client. Le serveur peut répondre dynamiquement sur le bon port.

      Utiliser ces informations est indispensable. Sans quoi, comme tu l'as vu, la communication entre le serveur et le client devient inopérante sur Internet. Et ça, c'est à cause du NAT. En effet, le serveur ne voit que l'IP publique. Comment différencier plusieurs ordinateurs derrière un même routeur ?
      La solution pour ce cheminement est à la charge du NAT, qui va changer les ports pour assurer que chaque PC ai un port différent, même s'ils communique avec le même serveur.

      Si tu veux plus d'informations sur le sujet:

      http://fr.wikipedia.org/wiki/Network_address_translation
      • Partager sur Facebook
      • Partager sur Twitter
        20 février 2012 à 14:55:00

        Merci beaucoup pour ta réponse ! En effet c'est bien ce que je pensais. Seulement voilà, si on fait un ipconfig d'une machine, on obtient bien l'adresse de cette machine, et non l'adresse du routeur (enfin je dis ça j'y connais rien). Si on configure ensuite le socket le datagramme de sorte que les ports client et serveur soient les même et que l'adresse de destination soit la bonne , la connexion devrait être établie non ?

        Il est vrai qu'avec l'UDP des trames peuvent être perdues, mais j'ai refait les test plusieurs fois et ça ne change absolument rien.
        • Partager sur Facebook
        • Partager sur Twitter

        Transfert UDP

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown