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 :

récupérer la taille d'un packet UDP


Sujet :

Réseau C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 71
    Points : 59
    Points
    59
    Par défaut récupérer la taille d'un packet UDP
    Je cherche à récupérer la taille d'un packet UDP. En gros le seul moyen de savoir la quantité que je dois recevoir est de la calculer à partir de l'information de taille de packet UDP. Comment faire ca en C ??

    J'ai essayé de trouver ca sur le net mais bif bof je vois pas :s

    Merci de m'éclairer

  2. #2
    Membre habitué Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Points : 185
    Points
    185
    Par défaut
    Ta question n'est pas tres precise, mais je vais tacher d'y repondre. Je suppose que tu as ton datagramme sous forme de chaine de caractere et que tu veux extraire le champ length.

    D'apres la norme UDP, le champ Length se situe au 32eme bit et contient 16 bits soit 2 octets.

    Donc en C tu copies (fonction memcpy) dans une variable de type short (qui a au minimum 2 octets) les bits 32 a 47 de ton datagramme.

    Cependant la valeur obtenue n'est pas forcement bonne : tu dois tenir compte des problemes d'endianess. Il te faut utiliser la fonction ntohs (network to host short) pour convertir la variable recue dans l'endian de ta machine.

    Une fois cela fait, tu peux utiliser ta variable

  3. #3
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par Ksempac
    Je suppose que tu as ton datagramme sous forme de chaine de caractere...
    Et comment fait-on? Ce n'est pas obtenu par recvfrom().

  4. #4
    Membre habitué Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Points : 185
    Points
    185
    Par défaut
    Citation Envoyé par stephl
    Et comment fait-on? Ce n'est pas obtenu par recvfrom().
    Tout d'abord, j'ai bien précisé que sa question n'est pas tres claire, on ne sait pas où il bloque exactement (creation de socket ? récupération du message ? lecture du champ length ?). C'est bien pour cela que j'ai dit que je "supposais" quelquechose.

    En ce qui concerne recvfrom il remplit un buffer a l'adresse que tu lui fournis. Rien ne t'empeche de passer une adresse pointée par un char*.

  5. #5
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par Ksempac
    En ce qui concerne recvfrom il remplit un buffer a l'adresse que tu lui fournis. Rien ne t'empeche de passer une adresse pointée par un char*.
    OK, mais recvfrom() retourne juste la partie DATA du datagramme, pas le datagramme complet. La taille n'est donc pas -je pense- accessible de cette manière.

  6. #6
    Membre habitué Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Points : 185
    Points
    185
    Par défaut
    En fait si il utilise recvfrom, celui ci renvoie le nombre d'octets du message.

    Donc si ce que tu dis est vrai, il faut ensuite obtenir la taille du header (entre 4 et 8 octets) pour pouvoir obtenir la valeur du champ length
    Cela dit je suis pas sur que tout ca a un interet...pourquoi recuperer la taille du header si il est séparé du message...il faudrait vraiment plus d'information sur ce qu'il veut faire pour l'aider.

    Je serais interessé de savoir ou tu as trouvé le fait que recvfrom ne renvoie que la partie DATA du message ?

  7. #7
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par Ksempac
    En fait si il utilise recvfrom, celui ci renvoie le nombre d'octets du message.
    Pas exactement. Si le buffer n'est pas assez grand, alors recvfrom() renvoie WSAEMSGSIZE (Windows) et le reste des données est perdu. Sinon, si on peut connaître à l'avance la taille maximale, je suis d'accord que l'on peut allouer un buffer suffisament grand et utiliser la valeur de retour de recvfrom().
    Citation Envoyé par Ksempac
    Je serais interessé de savoir ou tu as trouvé le fait que recvfrom ne renvoie que la partie DATA du message ?
    Il n'y a qu'à tester: le buffer passé à recvfrom() contient seulement les données du buffer passé en paramètre à sendto(), ce qui correspond au champ DATA du datagramme; le reste du datagramme ne semble pas accessible de cette manière.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    C'est effectivement la que je bloque. J'utilise a priori un recvfrom. Il me semble effectivement que celui-ci ne renvoie que le champ DATA. Je ne vois pas comment accéder à l'header UDP

  9. #9
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Personnellement, je ne sais pas comment récupérer la totalité du datagramme. Je pense qu'il serait plus simple de convenir d'un message de fin entre le serveur et le client.

  10. #10
    Membre habitué Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Points : 185
    Points
    185
    Par défaut
    Mais pourquoi veux tu absolument récuperer le header et ce champ length ?

    L'adresse source tu peux la récuperer via le champ from de recvfrom, l'adresse de destination tu la connais (puisque c'est la tienne), la length ne te sert pas si tu n'as pas le header, et le checksum, si il existe, a déjà été vérifié à la réception de ton datagramme.

  11. #11
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par Ksempac
    Mais pourquoi veux tu absolument récuperer le header et ce champ length ?
    Peut-être pour savoir quelle taille doit faire le buffer servant à récupérer les données envoyées?

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par beLz
    Je cherche à récupérer la taille d'un packet UDP. En gros le seul moyen de savoir la quantité que je dois recevoir est de la calculer à partir de l'information de taille de packet UDP. Comment faire ca en C ??
    Bah, recvfrom() te dis combien d'octets tu as reçu (valeur de retour)...
    Pas de Wi-Fi à la maison : CPL

  13. #13
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Ksempac
    Je serais interessé de savoir ou tu as trouvé le fait que recvfrom ne renvoie que la partie DATA du message ?
    Bah, c'est la base des sockets. Si tu veux la trame complète, il faut utiliser les raw sockets. Rien à voir.
    Pas de Wi-Fi à la maison : CPL

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par stephl
    Peut-être pour savoir quelle taille doit faire le buffer servant à récupérer les données envoyées?
    Absurde. En théorie, en UDP, le buffer doit être 'grand' (64k pour être tranquille...).

    Mais dans la pratique, en UDP, on envoi pas de grosses trames, trop risqué (l'UDP, c'est du send & forget). On connait l'ordre de grandeur (1k, 10k...) et on dimensionne le buffer de réception en conséquence.

    Maintenant, rien n'empêche, au niveau applicatif, d'ajouter des informations supplémentaires genre taille et nom du fichier, taille max des trames (1ere trame), trame N° x / n etc. Mais c'est du protocole applicatif. Les sockets ne sont pas concernées.
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Absurde. En théorie, en UDP, le buffer doit être 'grand' (64k pour être tranquille...).

    Mais dans la pratique, en UDP, on envoi pas de grosses trames, trop risqué (l'UDP, c'est du send & forget). On connait l'ordre de grandeur (1k, 10k...) et on dimensionne le buffer de réception en conséquence.
    OK, mais 1k et 10k ce n'est pas la même chose. Alors ce n'est pas si absurde que cela. En outre, en toute généralité, il ne peut peut-être pas connaître à l'avance la taille des données.

  16. #16
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par stephl
    OK, mais 1k et 10k ce n'est pas la même chose. Alors ce n'est pas si absurde que cela. En outre, en toute généralité, il ne peut peut-être pas connaître à l'avance la taille des données.
    De toutes façons, c'est 64 k maximum... Affaire réglée.
    Pas de Wi-Fi à la maison : CPL

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    Je peux effectivement résoudre mon problème en récupérant la valeur de retour du recvfrom. Ca résout mon problème à ce niveau Je m'interroge toujours par contre sur la manière de récupérer le header UDP en C par contre ^^

  18. #18
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par beLz
    Je m'interroge toujours par contre sur la manière de récupérer le header UDP en C par contre ^^
    cf Emmanuel:
    http://www.developpez.net/forums/sho...0&postcount=13
    Je n'ai jamais utilisé cela personnellement, mais je ne vois pas de raison pour que ça ne marche pas.

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

Discussions similaires

  1. Comment connaitre la taille d'un packet UDP ?
    Par Djobird dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 16/07/2009, 16h58
  2. Récupérer la taille d'une image dans un fichier (GIF/JPEG)
    Par SheikYerbouti dans le forum Multimédia
    Réponses: 4
    Dernier message: 12/05/2005, 14h17
  3. [J2ME][debutant] Récupérer la taille d'un écran
    Par kisscool31 dans le forum Java ME
    Réponses: 4
    Dernier message: 21/04/2005, 16h56
  4. Réponses: 2
    Dernier message: 13/08/2004, 16h50
  5. Réponses: 3
    Dernier message: 23/01/2004, 21h02

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