Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1155 connectés 

  FORUM HardWare.fr
  Programmation
  C

  envoyer une structure avec une socket udp

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

envoyer une structure avec une socket udp

n°1245996
meumeul
Stay Heavy
Posté le 15-11-2005 à 14:13:06  profilanswer
 

Bonjour,
 
Je développe un client et un serveur et je cherche à échanger une structure entre les deux en passant par udp, je voulais savoir si il y avait un moyen simple d'envoyer une struture où si je devais me débrouiller pour la coder en char* moi meme et la décoder de l'autre coté.
 
Merci!

mood
Publicité
Posté le 15-11-2005 à 14:13:06  profilanswer
 

n°1245998
blackgodde​ss
vive le troll !
Posté le 15-11-2005 à 14:15:34  profilanswer
 

Tu peux envoyer les données "sous forme binaire" si ta structure ne contient pas de pointeur. Par contre à la réception tu dois vérifier son intégrité me semble-t-il
 
edit : une vague ébauche :
 
envoi :

Code :
  1. int envoi(void *data, int data_size)
  2. {
  3.    return sendto(..., data, data_size);
  4. }
  5. struct ta_struct data;
  6. ...
  7. envoi(&data, sizeof(data));


 
reception

Code :
  1. int reception()
  2. {
  3.    struct ta_struct data;
  4.    if(recvfrom(...., (char*)&data, sizeof(data)) != sizeof(data))
  5.    {
  6.       // erreur : ou bien les données sont incomplètes, ou bien erreur réseau
  7.    }
  8. }


Message édité par blackgoddess le 15-11-2005 à 14:23:23

---------------
-( BlackGoddess )-
n°1246008
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-11-2005 à 14:22:27  profilanswer
 

meumeul a écrit :

Je développe un client et un serveur et je cherche à échanger une structure entre les deux en passant par udp, je voulais savoir si il y avait un moyen simple d'envoyer une struture où si je devais me débrouiller pour la coder en char* moi meme et la décoder de l'autre coté.


C'est techniquement faisable si la structure est linéaire, mais c'est ce n'est pas du tout portable (une structure C dépend fortement de l'architecture). C'est donc fortement déconseillé, surtout si on doit travailler en environnement hétérogène.  
 
Le plus simple : encodage/decodage texte comme tu l'as envisagé. On peut coder en binaire (BER, XDR etc.) mais c'est compliqué.


Message édité par Emmanuel Delahaye le 15-11-2005 à 14:23:40

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1246012
meumeul
Stay Heavy
Posté le 15-11-2005 à 14:27:39  profilanswer
 

ok de toute façon je n'y avais pas pensé mais j'ai un pointeur dans ma struture donc je ne peux évidement pas l'envoyer tel quel mon problème c'est que ma donnée a une taille variable et peut être assez grosse. Du coup si j'ai bien compris je doit faire plusieurs sendto() en découpant ma donnée car la taille du paquet udp est limité, non ?
 
Ce qui implique que je doit reconstruire ma donnée coté serveur en recevant (recvfrom()) plusieurs paquet udp, d'où plein de soucis, déséquencement, perte etc....
 
Comment je fais ?  :cry:

n°1246016
blackgodde​ss
vive le troll !
Posté le 15-11-2005 à 14:31:46  profilanswer
 

pourquoi ne pas utiliser tcp ?


---------------
-( BlackGoddess )-
n°1246020
meumeul
Stay Heavy
Posté le 15-11-2005 à 14:34:02  profilanswer
 

blackgoddess a écrit :

pourquoi ne pas utiliser tcp ?


 
udp est imposé pour gérer cette partie.

n°1246025
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-11-2005 à 14:37:57  profilanswer
 

meumeul a écrit :

ok de toute façon je n'y avais pas pensé mais j'ai un pointeur dans ma struture donc je ne peux évidement pas l'envoyer tel quel mon problème c'est que ma donnée a une taille variable et peut être assez grosse. Du coup si j'ai bien compris je doit faire plusieurs sendto() en découpant ma donnée car la taille du paquet udp est limité, non ?
 
Ce qui implique que je doit reconstruire ma donnée coté serveur en recevant (recvfrom()) plusieurs paquet udp, d'où plein de soucis, déséquencement, perte etc....
 
Comment je fais ?  :cry:


Le sendto() t'indique combien de bytes ont été émis. Tu boucles jusquà ce que le bloc entier ait été émis. Le 0 final n'est en principe pas transmis. Si on est en ASCII, on peut par contre utiliser les codes de formatage de texte (SOH, STX, ETX etc.)
Le recvfrom() t'indique combien de bytes ont été recus. Ca permet de reformater la chaine reçue (placer le 0) Tu formattes l'ensemble avec les codes de contrôles ASCII...
 
Sinon, un simple échange de lignes ("xxx\n" ) peut suffire.


Message édité par Emmanuel Delahaye le 15-11-2005 à 14:38:43

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1246245
moi23372
Posté le 15-11-2005 à 18:30:30  profilanswer
 

moi à ta place je n'enverais pas sur le réseau une structure, mais une chaine de caractère continue. Soit des bytes. Pas question d'envoyer des entier, float ou autre type (attention que toute les machines ne sont pas en big_endian, mais il y en a également en little_endian, de ce fait, boujour la conversion, chaque fois obligé d'utiliser des fonctions de conversions, passe tout en chaine de caractère, même les entiers que tu auras bien entendu transformé en chaine de caractère).
 
Bon amusement


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  envoyer une structure avec une socket udp

 

Sujets relatifs
[VB6] Suppression message ou envoyer un sendkeysBufferedReader en attente pendant lecture socket[Resolu]
Récupérer l'état d'une socket en sortie d'un select()Problèmes pour envoyer fichiers excel avec javaMail
Envoyer un mailEnvoyer du xml avec php
Problème de vitesse d'envoi de données par socketPointeur sur structure
Envoyer un email sans risquer le spam.Envoyer cette page a un ami
Plus de sujets relatifs à : envoyer une structure avec une socket udp


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR