IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Problême de communication en UDP


Sujet :

Réseau C

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Points : 356
    Points
    356
    Par défaut Problême de communication en UDP
    Normalement, je chercherais moi-même la solution à ce problème, mais j'ai un problème de sciatique qui m’empêche d'être assis trop longtemps devant un ordi, alors pardonnez ma question.

    Le problème, c'est que je communique en UDP avec un bidule (sur lequel je n'ai aucun contrôle) qui me répond sur le port que j'utilise pour la transmission, qui n'est pas celui que j'utilise pour la réception.

    C'est que, dans mon code, le port utilisé pour la transmission est alloué par Windows et varie pour chaque trame transmise (2013,2014,2015...).

    Idéalement, il faudrait que je puisse "tromper" celui qui reçoit en modifiant l'information du port qui a été utilisé pour la transmission pour qu'il corresponde à celui que j'utilise pour la réception.

    Sinon, il faudrait que je puisse fixer moi-même le port de transmission. Je sais que ça se fait, mais je sais pas trop comment. Mais je ne suis pas certain que je pourrais utiliser le même port UDP pour la transmission et la réception.

    Voici le code de la fonction que j'utilise présentement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    bool TUdpSockit::Send(AnsiString ipAddr, int port, const void* data, int count)
     {
         // Créer un socket
         SOCKET txSocket;
         txSocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
         if (txSocket==INVALID_SOCKET)
         {
           fErrorMes = MES_TX_SOCKET_ERR ;
           return false ;
         }
     
         // Spécifier l'adresse du destinataire
        sockaddr_in clientService;
        clientService.sin_family = AF_INET;
        clientService.sin_addr.s_addr = inet_addr(ipAddr.c_str());
        clientService.sin_port = htons(port);
     
        // connexion au serveur
        if( connect(txSocket, (SOCKADDR *) & clientService,
                     sizeof (clientService)) == SOCKET_ERROR)
        {
          fErrorMes = MES_TX_CONNECT_ERR ;
          return false ;
        }
     
       // Transmet données (blocking mode)
       send(txSocket,(const char*)data,count,0) ;
     
       // ferme socket
       closesocket(txSocket);
       return true ;
    }
    J'espère que c'est assez clair comme question.

    Merci!

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 191
    Points : 28 070
    Points
    28 070
    Par défaut
    Citation Envoyé par Guyt54 Voir le message
    Le problème, c'est que je communique en UDP avec un bidule (sur lequel je n'ai aucun contrôle) qui me répond sur le port que j'utilise pour la transmission, qui n'est pas celui que j'utilise pour la réception.
    Jusque là tout va bien !
    Citation Envoyé par Guyt54 Voir le message
    C'est que, dans mon code, le port utilisé pour la transmission est alloué par Windows et varie pour chaque trame transmise (2013,2014,2015...).
    Ici non plus rien d'anormal !

    Citation Envoyé par Guyt54 Voir le message
    Idéalement, il faudrait que je puisse "tromper" celui qui reçoit en modifiant l'information du port qui a été utilisé pour la transmission pour qu'il corresponde à celui que j'utilise pour la réception.

    Sinon, il faudrait que je puisse fixer moi-même le port de transmission. Je sais que ça se fait, mais je sais pas trop comment. Mais je ne suis pas certain que je pourrais utiliser le même port UDP pour la transmission et la réception.
    Quel est ton intérêt dans une telle manipulation ?


    En matière de réseau, port de transmission et port de réception ne signifie rien. On parle de port source et de port destination, les ports étant à chaque fois bidirectionnel (transmission et réception donc).

    Le port que tu spécifie dans ton code est le port de destination, c'est à dire le port de la machine distante, c'est à dire le port sur lequel le service que tu vas interroger est à l'écoute. Ce port là doit être connu et fixe pour que le service soit accessible.

    Quant au port source, le port que ta machine va utilisé, il est fixé aléatoirement par le système d'exploitation parmi les ports qu'il sait libre lorsque tu vas ouvrir ton socket. Ce port là, tu n'as normalement pas besoin de t'en soucier. Lorsque ta machine va communiquer avec le serveur, en plus des données elle va lui passer ce n° de port. Le serveur, lorsqu'il répondra, répondra sur le n° de port qu'il a reçu. Les transmissions et réceptions, pour reprendre tes termes, se font chaque fois sur le même port, port aléatoire coté client qui initie la connexion, port fixe et connu coté serveur qui attend la demande de connexion.

    Le port est réservé tant que le socket est ouvert. Si tu ferme le socket, et que tu en réouvre un autre ensuite, c'est un nouveau un port, aléatoirement choisi (en théorie), qui sera utilisé.
    En théorie, parce que bien souvent les systèmes d'exploitations, pour un process donné, choisissent le 1er port aléatoirement, et pour les autres ports dans la même session, ils prennent les ports successifs, mais cela n'a rien d'une obligation
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Points : 356
    Points
    356
    Par défaut
    Citation Envoyé par sevyc64 Voir le message
    Quel est ton intérêt dans une telle manipulation ?
    Merci pour ta réponse, sevyc.

    Mon problème, c'est que l'autre bidule me répond par le port que j'avais utilisé pour la transmission, qui ne correspond pas à celui que j'utilise pour la réception.

    Ma question demeure donc entière.

    Comment puis-je imposer un port pour la transmission? Ca se fait, la composante Indy "TidSocketClient" le fait.

    Mais si je pouvais "tromper" mon bidule en lui passant comme port celui que j'utilise pour la réception, ça serait l'idéal...

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Guyt54 Voir le message
    Mais si je pouvais "tromper" mon bidule en lui passant comme port celui que j'utilise pour la réception, ça serait l'idéal...
    Apparemment ton code crée une socket pour chaque datagramme UDP envoyé. Il faut créer une socket par paire (port source, IP serveur).

    Cf

    http://broux.developpez.com/articles/c/sockets/

    Steph

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Points : 356
    Points
    356
    Par défaut
    Citation Envoyé par IP_Steph Voir le message
    Apparemment ton code crée une socket pour chaque datagramme UDP envoyé. Il faut créer une socket par paire (port source, IP serveur).

    Cf

    http://broux.developpez.com/articles/c/sockets/

    Steph
    Effectivement, mon code crée un socket pour chaque datagramme envoyé (contrairement à ma réception).

    Merci pour la piste et le lien, je vais regarder ça attentivement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de communication par sockets
    Par Linio dans le forum Entrée/Sortie
    Réponses: 33
    Dernier message: 06/05/2006, 19h50
  2. problème de communication
    Par yassinchaouki dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 20/04/2006, 11h46
  3. Problème de communication client/serveur
    Par alex6891 dans le forum Développement
    Réponses: 10
    Dernier message: 09/03/2006, 14h12
  4. Problème de communications entre threads
    Par maya09 dans le forum Windows
    Réponses: 1
    Dernier message: 22/02/2006, 23h18
  5. [WinService][C#] Problème de communication
    Par Pfeffer dans le forum Windows Forms
    Réponses: 2
    Dernier message: 08/07/2005, 16h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo