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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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 ?
Marc Boyer a exposé le 30/09/2010 :
Le 29-09-2010, Yo <nomail@nomail_invalid.net> 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 ?
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 ?
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
Le 29-09-2010, Yo <nomail@nomail_invalid.net> 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
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
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
Yo <nomail@nomail_invalid.net> 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
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
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 ?
Le 30/09/2010, Jean-Marc Bourguet a supposé :
Yo <nomail@nomail_invalid.net> 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 ?
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 ?
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
Yo <nomail@nomail_invalid.net> writes:
Le 30/09/2010, Jean-Marc Bourguet a supposé :
> Yo <nomail@nomail_invalid.net> 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
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
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.
Jean-Marc Bourguet a écrit :
Yo <nomail@nomail_invalid.net> writes:
Le 30/09/2010, Jean-Marc Bourguet a supposé :
Yo <nomail@nomail_invalid.net> 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.
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.
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
Le 30-09-2010, Yo <nomail@nomail_invalid.net> a écrit :
Marc Boyer a exposé le 30/09/2010 :
Le 29-09-2010, Yo <nomail@nomail_invalid.net> 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
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