envoyer une structure avec une socket udp - C - Programmation
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 :
|
reception
Code :
|
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é.
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 ?
Marsh Posté le 15-11-2005 à 14:31:46
ReplyMarsh Posté le 15-11-2005 à 14:34:02
ReplyMarsh 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 ? |
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.
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
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!