envoyer une structure avec une socket udp

envoyer une structure avec une socket udp - C - Programmation

Marsh Posté le 15-11-2005 à 14:13:06    

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!

Reply

Marsh Posté le 15-11-2005 à 14:13:06   

Reply

Marsh Posté le 15-11-2005 à 14:15:34    

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 )-
Reply

Marsh Posté le 15-11-2005 à 14:22:27    

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/
Reply

Marsh Posté le 15-11-2005 à 14:27:39    

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:

Reply

Marsh Posté le 15-11-2005 à 14:31:46    

pourquoi ne pas utiliser tcp ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 15-11-2005 à 14:34:02    

blackgoddess a écrit :

pourquoi ne pas utiliser tcp ?


 
udp est imposé pour gérer cette partie.

Reply

Marsh Posté le 15-11-2005 à 14:37:57    

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/
Reply

Marsh Posté le 15-11-2005 à 18:30:30    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed