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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    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 émérite 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
    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 expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    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 émérite 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
    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 expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    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
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    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)...

+ 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