Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Serveur

7 réponses
Avatar
Yo
Bonjour,

Je développe un serveur qui doit communiquer avec des terminaux. Pour
décoder des données en provenance de ces terminaux, je dois définir des
structures permettant de mapper les messages du protocole utilisé.
Or le protocole indique que si l'en tête du message est fixe, le nombre
d'octets du message peut varier selon le message reçu.

Pouvez vous m'indiquer dans ce cas comment définir les structures qui
me permettront par un cast de décoder le message ?

Merci.

7 réponses

Avatar
Yo
Marc Boyer a exposé le 30/09/2010 :
Le 29-09-2010, Yo a écrit :
Je développe un serveur qui doit communiquer avec des terminaux. Pour
décoder des données en provenance de ces terminaux, je dois définir des
structures permettant de mapper les messages du protocole utilisé.
Or le protocole indique que si l'en tête du message est fixe, le nombre
d'octets du message peut varier selon le message reçu.

Pouvez vous m'indiquer dans ce cas comment définir les structures qui
me permettront par un cast de décoder le message ?



Qu'appelles-tu "décoder par un cast" ?

Marc Boyer



On m'a suggéré qu'en définissant une structure adéquate (appelons la
sMessage), il me serait possible de décoder un message en le "castant"
en sMessage (sMessage messageDecode = (sMessage)buffer;), de façon que
chaque octet contenu dans le buffer du message se retrouve à la bonne
position dans la structure. Mais je ne vois pas comment cela peut se
faire avec un message de longueur variable ...

Sans doute cela est il possible pour l'en tête du message, mais pas
pour les données elles même ?
Avatar
Marc Boyer
Le 29-09-2010, Yo a écrit :
Je développe un serveur qui doit communiquer avec des terminaux. Pour
décoder des données en provenance de ces terminaux, je dois définir des
structures permettant de mapper les messages du protocole utilisé.
Or le protocole indique que si l'en tête du message est fixe, le nombre
d'octets du message peut varier selon le message reçu.

Pouvez vous m'indiquer dans ce cas comment définir les structures qui
me permettront par un cast de décoder le message ?



Qu'appelles-tu "décoder par un cast" ?

Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot0
Avatar
Jean-Marc Bourguet
Yo writes:

On m'a suggéré qu'en définissant une structure adéquate (appelons la
sMessage), il me serait possible de décoder un message en le "castant" en
sMessage (sMessage messageDecode = (sMessage)buffer;), de façon que chaque
octet contenu dans le buffer du message se retrouve à la bonne position
dans la structure.



Pour que ce genre de choses fonctionnent, il faut que le format defini par
le protocole corresponde au format choisi par l'implementation pour la
structure, du point de vue ordre et taille des champs, boutisme, alignement
etc... autrement dit quand ca fonctionne c'est plutot qu'on a fonctionne
dans l'autre sens en definissant le protocole en fonction de la maniere
dont un compilateur donne (avec un jeu d'options donnes) met en forme la
structure. Et ca pose probleme quand on change de compilateur -- parfois
simplement de version du compilateur ou meme d'options -- et surtout de
plateforme cible.

Mais je ne vois pas comment cela peut se faire avec un message de
longueur variable ...



Je vois pas le probleme, une fois accepte les risques donnes ci-dessus.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
Yo
Le 30/09/2010, Jean-Marc Bourguet a supposé :
Yo writes:


Mais je ne vois pas comment cela peut se faire avec un message de
longueur variable ...



Je vois pas le probleme, une fois accepte les risques donnes ci-dessus.




Je ne vois toujours pas comment définir une structure qui comprendrait
un champ de taille variable ? Pouvez vous préciser comment vous voyez
les choses ?
Avatar
Jean-Marc Bourguet
Yo writes:

Le 30/09/2010, Jean-Marc Bourguet a supposé :
> Yo writes:
>

>> Mais je ne vois pas comment cela peut se faire avec un message de
>> longueur variable ...
>
> Je vois pas le probleme, une fois accepte les risques donnes ci-dessus.
>

Je ne vois toujours pas comment définir une structure qui comprendrait un
champ de taille variable ? Pouvez vous préciser comment vous voyez les
choses ?



Une structure par type de message. Si la structure des types de messages
est suffisemment complexe pour que ca ne fonctionne pas, alors ce n'est
jamais qu'une indication de plus que ce hack n'est pas une bonne idee...

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
Yo
Jean-Marc Bourguet a écrit :
Yo writes:

Le 30/09/2010, Jean-Marc Bourguet a supposé :
Yo writes:




Mais je ne vois pas comment cela peut se faire avec un message de
longueur variable ...



Je vois pas le probleme, une fois accepte les risques donnes ci-dessus.




Je ne vois toujours pas comment définir une structure qui comprendrait un
champ de taille variable ? Pouvez vous préciser comment vous voyez les
choses ?



Une structure par type de message. Si la structure des types de messages
est suffisemment complexe pour que ca ne fonctionne pas, alors ce n'est
jamais qu'une indication de plus que ce hack n'est pas une bonne idee...

A+



OK, c'est plus clair maintenant. Merci beaucoup pour vos réponses.
Avatar
Marc Boyer
Le 30-09-2010, Yo a écrit :
Marc Boyer a exposé le 30/09/2010 :
Le 29-09-2010, Yo a écrit :
Je développe un serveur qui doit communiquer avec des terminaux. Pour
décoder des données en provenance de ces terminaux, je dois définir des
structures permettant de mapper les messages du protocole utilisé.
Or le protocole indique que si l'en tête du message est fixe, le nombre
d'octets du message peut varier selon le message reçu.

Pouvez vous m'indiquer dans ce cas comment définir les structures qui
me permettront par un cast de décoder le message ?



Qu'appelles-tu "décoder par un cast" ?



On m'a suggéré qu'en définissant une structure adéquate (appelons la
sMessage), il me serait possible de décoder un message en le "castant"
en sMessage (sMessage messageDecode = (sMessage)buffer;), de façon que
chaque octet contenu dans le buffer du message se retrouve à la bonne
position dans la structure.



Comme énoncé par Jean-Marc, ça fonctionne tant que le compilo
organise sa structure de manière binairement compatible avec
ce que le protocole met sur le réseau.

Et puis je sais pas trop si cela fonctionnerait avec des objets
ayant des méthodes virtuelles, de l'héritage, etc (cf ci dessus).

Il me semblerait plus raisonnable de faire un constructeur qui prend
un buffer en entrée, et copie champ par champ, avec un conteneur
pour la partie variable.

Mais je ne vois pas comment cela peut se faire avec un message de
longueur variable ...



A été ajouté en C99 les "flexible array member".
typedef struct mes {
int toto; // Entête
char payload[];
} mes;

Mais comme la taille est variable, ça impose qu'on ne peut pas déclarer de
variable de ce type, seulement des pointeurs sur ces variables. Donc,
pas un cast comme évoqué, mais un memcpy.

Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot0