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 :

2 recvfrom pour la meme donnée


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 11
    Par défaut 2 recvfrom pour la meme donnée
    Bonjour,

    Je developpe actuellement une application réseau en UDP.
    Pour l'envoie des données j'ai opter pour une structure contenant un int et un data:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct netData
    {
        int size;
        void* Data;
    };
    jusque la tout va bien, le champ size contient la taille de 'Data', j'envoie donc ma structure par le reseau, et quand je la reçoit, je n'est donc aucune information de la taille de ma data par contre, je sais que j'ai un int puis une data de taille variable, j'aurais donc aimer pouvoir lire une première fois avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    recvfrom(sockfd, &netData.size, sizeof(netData.size), 0, src_addr, addrlen)
    pour récupérer la taille de ma data puis refaire un recvfrom pour remplir ma data hors mon deuxieme recvfrom bloque jusqu'a ce que je lui renvoye un nouveau datagram.
    J'aurais donc voulu savoir si en appelant 2 fois d'affilée recvfrom, je suis obligée de recevoir 2 datagram ou bien je peut relire des informations de mon 1er datagram?
    Merci et bonne soirée.

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Attention, si tu envois une structure netData sur le réseau, alors tu ne transmettras que 8 octets de données : size (4 octets) et Data (4 octets, si la taille d'un pointeur est bien de 4 octets). Pour bien transmettre la structure il faut faire (en supposant que mydata.Data pointe bien vers les données à transmettre) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Send(..., &mydata.size, sizeof(mydata.size));
    Send(..., mydata.Data, DataLength);
    Pour la réception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Recv(..., &mydata.size, sizeof(mydata.size));
    Recv(..., mydata.Data, BUF_SIZE);
    En supposant que mydata.Data pointe bien vers un buffer de taille BUF_SIZE minimum.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 11
    Par défaut
    Ah oui effectivement j'avais pas vu sa dans mon exemple, dans mes tests j'avais fait une structure avec que des int:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct test
    {
        int size;
        int test1;
        int test2;
        int test3;
    };
    et je faisait un premier recvfrom pour récuperer juste la taille du paquet, sa marchait mais apres pour remplir mes autres int par un deuxieme recv, y restait bloquer meme avec une taille de lecture de 1 donc c'est comme si il lisait tout le datagram dans mon premier recvfrom.

    Mais je ne peut pas faire comme tu ma proposer car je suis en UDP et je n'est aucune idée dans quel ordre les paquets arriveront, mais j'ai bien compris l'histoire du pointeur j'avait juste pas pensé quand j'ai écrit mon exemple surtout que dans l'application sa ne sera pas un pointeur et dans mes tests a coté j'avais utiliser la structure plus haut.
    Je pense qu'il va falloir que je lise un datagram avec comme taille max, la taille d'un datagram, j'essayerai demain, la je vais dodo.
    Merci, et bonne nuit.

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Je vais prendre un meilleur exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct test
    {
        int size;
        char data[256];
    };
    La taille de cette structure est de 260 octets mais on n'est pas obligé d'envoyer la structure entière à chaque fois. Prenons un exemple :

    On veut envoyer "Bonjour.\n", y compris le '\0', c'est-à-dire 10 caractères. Plus la taille du champ size, on va donc envoyer 14 octets.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    strcpy(mytest.data, "Bonjour.\n");
    mytest.size = 10;
    Send(..., &mytest, 14);
    A la réception, on lit tout d'abord la taille des données reçues avant de lire le reste.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Recv(..., &mytest.size, sizeof(mytest.size));
    Recv(..., mytest.data, mytest.size);
    - Attention, l'argument size des fonctions Recv indique la capacité du buffer de destination des données à lire, pas le nombre d'octets que la fonction doit lire. Le nombre d'octets lus est fourni en valeur de retour de la fonction quand tout s'est bien passé. Il faut donc faire une boucle qui ne s'arrête que lorsque le nombre total d'octets lus ait atteint n si on veut lire exactement n octets, ni plus ni moins.

    - Tu ne vas quand même pas utiliser des valeurs hard-codées (10, 14, etc.) comme je l'ai fait dans ton programme ... Tu peux faire mieux.

  5. #5
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Si je dis pas de bêtises les paquets sont tous terminés par "\r\n" du coup je pense que tu peux faire une fonction qui accepte un socket et un buffer (et peut-être d'autres paramètres) et tu continues à recevoir tant que tes données ne sont pas terminées par "\r\n" ou jusqu'à une taille max définie (taille max du buffer).

  6. #6
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    C'est une convention utilisée sur Internet et c'est utilisable uniquement avec des protocoles à base de texte, ce n'est pas une obligation. Le '\r\n' joue le rôle du '\0' du C. Si les messages échangés n'ont pas de marque de fin, alors il faut évidemment indiquer la taille de chaque message envoyé.

Discussions similaires

  1. avoir plusieurs MasterSource pour le meme ensemble de donnée
    Par adelneo dans le forum Bases de données
    Réponses: 7
    Dernier message: 08/02/2011, 11h39
  2. Delphi7-DOA : procédure dynamique pour ramener les données?
    Par delphim dans le forum Bases de données
    Réponses: 5
    Dernier message: 06/12/2004, 19h26
  3. Meilleur méthode pour stocker mes données
    Par cyberlewis dans le forum Windows
    Réponses: 6
    Dernier message: 03/07/2004, 12h53
  4. [CR] Filtrer pour une période donnée
    Par liberio dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 21/04/2004, 17h32
  5. cherche module ou langage pour récupérer des données audio..
    Par Ry_Yo dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 12/05/2003, 18h44

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