 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
David Noyelle Guest
|
Posted: Thu Aug 12, 2004 4:57 pm Post subject: Socket Java et C++ |
|
|
Bonjour a tous,
j'ai 2 programmes :
- un programme en C++ qui fait office de socket d'ecoute.
- un programme Java qui se connecte a la socket du programme C++.
Jusqu'ici la connexion fonctionne bien. Une fois la connexion creee, le
programme Java demande au programme C++ de lui transmettre une structure qui
est la suivante:
--------------------------------------------
typedef struct
{
CONFIG_TRACE trace;
CONFIG_COM config_com;
WORD PORT_ECOUTE;
WORD PORT_ECOUTE_ADMIN;
WORD modbus_timeout;
WORD modbus_turnaround;
} CONFIG;
--------------------------------------------
Mais le programme Java ne recoit pas correctement cette structure (a
l'affichage ca me donne "_CONFIG") car la socket Java place le contenu de
son entree (in = socket.getInputStream()) dans une variable de type String
(inString = monProg.in.readLine()) .
Ma question est la suivante : est-ce que je dois creer une structure du cote
Java qui soit identique a la structure du cote C++ pour pouvoir la recuperer
correctement ? Ou est-ce que je peux recuperer cette structure dans un
tableau ?
Par exemple : structureJava = monProg.in.readLine()
tableauJava = monProg.in.readLine()
Je precise que la structure emise par le programme C++ est essentiellement
constituee de variable de type WORD (16 bits - short) et DWORD (32 bits -
int) .
Merci d'avance pour vos suggestions,
--
David NOYELLE
davidnoyelle chez yahoo point fr
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Thu Aug 12, 2004 5:23 pm Post subject: Re: Socket Java et C++ |
|
|
"David Noyelle" <widax (AT) free (DOT) fr> writes:
| Quote: | j'ai 2 programmes :
- un programme en C++ qui fait office de socket d'ecoute.
- un programme Java qui se connecte a la socket du programme C++.
Jusqu'ici la connexion fonctionne bien. Une fois la connexion creee, le
programme Java demande au programme C++ de lui transmettre une structure qui
est la suivante:
|
[...]
Je pense que la solution consiste à mettre en place un protocole de
transfert de ta structure. L'émetteur converti la structure en une
chaîne de caractères d'un format que tu définis. Le récepteur reçoit
cette chaîne et l'interprète selon le dit format. Pour les détails,
comme le problème BE/LE, je laisse d'autres contributeurs te
renseigner.
--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html
|
|
| Back to top |
|
 |
Emmanuel Feller Guest
|
Posted: Thu Aug 12, 2004 5:27 pm Post subject: Re: Socket Java et C++ |
|
|
"David Noyelle" <widax (AT) free (DOT) fr> a écrit dans le message de
news:411ba18b$0$22040$626a14ce (AT) news (DOT) free.fr...
| Quote: | Bonjour a tous,
[...]
Ma question est la suivante : est-ce que je dois creer une structure du
cote
Java qui soit identique a la structure du cote C++ pour pouvoir la
recuperer
correctement ? Ou est-ce que je peux recuperer cette structure dans un
tableau ?
[....] |
Petite règle de base : faire le plus possible des échanges en texte, pas en
données binaires.
Les avantages :
- pas de pb en cas de migration d'un env à l'autre de ta partie C++
- pas d'adhérence entre ton java et ton peer ici le C++.
L'incovénient c'est que tu dois écrire un parseur pour récupérer ton flux un
peu plus complexe.
Bon ca c'est beau mais ca répond pas à ta question. Je dirais que c'est
comme tu veux, mais ca semble plus raisonnable de créer une classe qui mappe
la structure.
Maintenant voyons du coup l'aspect protocole de communication.
Le plus simple est de définir un séparateur de champs et un séparateur de
message et d'écrire coté C++ tes champs en texte séparés par ton délimiteur.
Le début de message et la fin de message sont ton délimiteur de message.
Ainsi tu écris @@32767&32134&blabla@@ ... au lieu de FFFFFFCBblabla.
Du cote java, tu prend un stringtokenizer pour récuperer tes bouts et après
tu n'as plus qu'à peupler ta classe qui mappe la structure.
Tu évites les problèmes présents et à venir comme ça.
Si tes messages sont complexes, tu peux voir à échanger un flux XML pour
être flexible.
(Je suis raisonnable, je ne te conseille pas de faire tes échange sur http
.... ) )
Emmanuel
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Fri Aug 13, 2004 7:36 am Post subject: Re: Socket Java et C++ |
|
|
drkm <usenet.fclcxx (AT) fgeorges (DOT) org> wrote
| Quote: | "David Noyelle" <widax (AT) free (DOT) fr> writes:
j'ai 2 programmes :
- un programme en C++ qui fait office de socket d'ecoute.
- un programme Java qui se connecte a la socket du programme C++.
Jusqu'ici la connexion fonctionne bien. Une fois la connexion creee,
le programme Java demande au programme C++ de lui transmettre une
structure qui est la suivante:
[...]
Je pense que la solution consiste à mettre en place un protocole de
transfert de ta structure. L'émetteur converti la structure en une
chaîne de caractères d'un format que tu définis. Le récepteur reçoit
cette chaîne et l'interprète selon le dit format.
|
Tout à fait exact, sauf que je dirais « chaîne d'octets », plutôt que
chaîne de caractères. Dans la mésure du possible, il est préférable de
passer par un format texte, mais ce n'est pas absolument nécessaire. En
revanche, il faut bien définir le format des données dans le protocol
dans tous les cas.
| Quote: | Pour les détails, comme le problème BE/LE, je laisse d'autres
contributeurs te renseigner.
|
Vue qu'on transmet un flux d'octets, il n'y a pas de problème BE/LE.
Typiquement, en C++, on définit d'une part un streambuf basé sur des
sockets, de l'autre un nouveau type de flux qui dérive de ios (mais non
de istream ou de ostream) qui se sert des streambuf pour transmettre les
octets. L'idiome, c'est que le flux s'occupe du formattage, et le
streambuf et ses dérivés des entrées/sorties proprement dites.
En Java, c'est un peu moins propre, ou plutôt, il n'y a pas d'idiome
aussi consacré. Le java.net.Socket permet d'obtenir un
java.io.InputStream et un java.io.OutputStream, qui à leur tour s'occupe
de lire de l'écrire des octets (type byte en Java). Ce qui se passe par
la suite est en revanche moins clair.
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
M. B. Guest
|
Posted: Fri Aug 13, 2004 7:49 am Post subject: Re: Socket Java et C++ |
|
|
<kanze (AT) gabi-soft (DOT) fr> a écrit dans le message de news:
[email]d6652001.0408122336.21cc0cfe (AT) posting (DOT) google.com[/email]...
| Quote: |
Tout à fait exact, sauf que je dirais « chaîne d'octets », plutôt que
chaîne de caractères. Dans la mésure du possible, il est préférable de
passer par un format texte, mais ce n'est pas absolument nécessaire. En
revanche, il faut bien définir le format des données dans le protocol
dans tous les cas.
|
La remarque d'Emmanuel Feller me parait fort judicieuse : utiliser un
flux XML pour une grande flexibilite.
D'autant que ce flux peut alors servir pour une serialisation tout aussi
flexible.
MB
|
|
| Back to top |
|
 |
Michaël Delva Guest
|
Posted: Fri Aug 13, 2004 9:18 am Post subject: Re: Socket Java et C++ |
|
|
| Quote: | Pour les détails, comme le problème BE/LE, je laisse d'autres
contributeurs te renseigner.
|
Qu'est-ce que c'est que ces problèmes de BE/LE? J'en ai déjà entendu
parler, mais je ne sais pas ce que c'est?
|
|
| Back to top |
|
 |
Arnaud Debaene Guest
|
Posted: Fri Aug 13, 2004 9:29 am Post subject: Re: Socket Java et C++ |
|
|
Michaël Delva wrote:
| Quote: | Pour les détails, comme le problème BE/LE, je laisse d'autres
contributeurs te renseigner.
Qu'est-ce que c'est que ces problèmes de BE/LE? J'en ai déjà entendu
parler, mais je ne sais pas ce que c'est?
|
Big Endian / Littel Endian. Un nombre représenté sur plusieurs octets peut
l'être de 2 façons : soit avec l'octet de poids faible à l'adresse la plus
basse (little endian), soit avec l'octet de poids fort à l'adresse la plus
basse (big endian). Différents processeurs utilisent l'une ou l'autre de ces
conventions. Si des machines avec des processeurs différents communiquent
entre elles, il faut en tenir compte.
Généralement, on utilise la convention Internet (Big Endian si je me
souviens bien) pour sérialiser les données, et on utilise les fonctions
htons, htonl, ntohs et ntohl pour passer de la convention locale à la
machine à la convention Internet et vice-versa. Sur une machine big endian,
ces fonctions ne font rien mais sur un machine little endian, elles
inversent l'ordre des octets de leur paramètre.
Arnaud
|
|
| Back to top |
|
 |
Michaël Delva Guest
|
Posted: Fri Aug 13, 2004 11:16 am Post subject: Re: Socket Java et C++ |
|
|
Merci!!
|
|
| Back to top |
|
 |
Jean-Christophe Garnier Guest
|
Posted: Sat Aug 14, 2004 1:12 pm Post subject: Re: Socket Java et C++ |
|
|
David Noyelle a écrit :
| Quote: | Bonjour a tous,
j'ai 2 programmes :
- un programme en C++ qui fait office de socket d'ecoute.
- un programme Java qui se connecte a la socket du programme C++.
Jusqu'ici la connexion fonctionne bien. Une fois la connexion creee, le
programme Java demande au programme C++ de lui transmettre une structure qui
est la suivante:
--------------------------------------------
typedef struct
{
CONFIG_TRACE trace;
CONFIG_COM config_com;
WORD PORT_ECOUTE;
WORD PORT_ECOUTE_ADMIN;
WORD modbus_timeout;
WORD modbus_turnaround;
} CONFIG;
--------------------------------------------
Mais le programme Java ne recoit pas correctement cette structure (a
l'affichage ca me donne "_CONFIG") car la socket Java place le contenu de
son entree (in = socket.getInputStream()) dans une variable de type String
(inString = monProg.in.readLine()) .
Ma question est la suivante : est-ce que je dois creer une structure du cote
Java qui soit identique a la structure du cote C++ pour pouvoir la recuperer
correctement ? Ou est-ce que je peux recuperer cette structure dans un
tableau ?
Par exemple : structureJava = monProg.in.readLine()
tableauJava = monProg.in.readLine()
Je precise que la structure emise par le programme C++ est essentiellement
constituee de variable de type WORD (16 bits - short) et DWORD (32 bits -
int) .
Merci d'avance pour vos suggestions,
Si j'étais toi, je ferais tout de suite du XML/RPC ou du SOAP... pas de |
problème de type, portable sur d'autres langages et d'autres
plateformes, etc.
Cela vaut le coup de prendre le temps au début, on en gagne énormément
par la suite.
JC
|
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Sun Aug 15, 2004 7:11 pm Post subject: Re: Socket Java et C++ |
|
|
"M. B." <m_binder (AT) magicnet (DOT) com> writes:
| Quote: | kanze (AT) gabi-soft (DOT) fr> a écrit dans le message de news:
[email]d6652001.0408122336.21cc0cfe (AT) posting (DOT) google.com[/email]...
Tout à fait exact, sauf que je dirais « chaîne d'octets », plutôt
que chaîne de caractères. Dans la mésure du possible, il est
préférable de passer par un format texte, mais ce n'est pas
absolument nécessaire. En revanche, il faut bien définir le format
des données dans le protocol dans tous les cas.
La remarque d'Emmanuel Feller me parait fort judicieuse : utiliser
un flux XML pour une grande flexibilite.
|
Ça dépend des buts récherchés. Si le but est d'utiliser un maximum de la
bande passante, l'XML est un bon moyen.
| Quote: | D'autant que ce flux peut alors servir pour une serialisation tout
aussi flexible.
|
Je ne comprends pas cette phrase.
--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Sun Aug 15, 2004 7:13 pm Post subject: Re: Socket Java et C++ |
|
|
"Michaël Delva" <michael_delva (AT) i_cant_remember (DOT) com> writes:
| Quote: | Pour les détails, comme le problème BE/LE, je laisse d'autres
contributeurs te renseigner.
Qu'est-ce que c'est que ces problèmes de BE/LE? J'en ai déjà entendu
parler, mais je ne sais pas ce que c'est?
|
Ça signifie Big-Endian et Little-Endien, et ça fait référence à l'ordre
des octets dans un mot. Si on écrit un mot (int, etc.) phyiquement sur
un Sparc, et on le lit physiquement sur un PC, la valeur ne serait pas
la même.
Donc, on n'écrit que des octets, et il n'y a pas de problème.
--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Sun Aug 15, 2004 7:17 pm Post subject: Re: Socket Java et C++ |
|
|
"Arnaud Debaene" <adebaene (AT) club-internet (DOT) fr> writes:
| Quote: | Généralement, on utilise la convention Internet (Big Endian si je me
souviens bien) pour sérialiser les données, et on utilise les
fonctions htons, htonl, ntohs et ntohl pour passer de la convention
locale à la machine à la convention Internet et vice-versa. Sur une
machine big endian, ces fonctions ne font rien mais sur un machine
little endian, elles inversent l'ordre des octets de leur paramètre.
|
Généralement, on définit un format, et à partir de là, le flux ne
contient que des octets, et je ne sais pas s'il y a un sens de parler de
BE/LE. (Dans la mésure où un seul octet ne suffit pas pour transmettre
un int, le format va sans doute parler de l'ordre des octets. De même
que la représentation des valeurs négatives, voire des valeurs en
général -- texte, binaire...)
Et bien que je travaille sur des protocols de transmission depuis
longtemps, je ne me suis jamais servi de htons, etc. Je n'en vois pas
l'intérêt.
--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
Arnaud Debaene Guest
|
Posted: Sun Aug 15, 2004 10:36 pm Post subject: Re: Socket Java et C++ |
|
|
James Kanze wrote:
| Quote: | "Arnaud Debaene" <adebaene (AT) club-internet (DOT) fr> writes:
Généralement, on définit un format, et à partir de là, le flux ne
contient que des octets, et je ne sais pas s'il y a un sens de parler
de BE/LE. (Dans la mésure où un seul octet ne suffit pas pour
transmettre un int, le format va sans doute parler de l'ordre des
octets.
....et donc va employer les termes big endian ou little endian, d'où |
l'intérêt de connaître leur signification ;-)
| Quote: |
Et bien que je travaille sur des protocols de transmission depuis
longtemps, je ne me suis jamais servi de htons, etc. Je n'en vois pas
l'intérêt.
Tu fais les inversions des octets toi-même quand tu sérialise / désérialise |
des données?
Arnaud
|
|
| Back to top |
|
 |
jerome moliere Guest
|
Posted: Mon Aug 16, 2004 9:20 am Post subject: Re: Socket Java et C++ |
|
|
David Noyelle wrote:
| Quote: | Bonjour a tous,
j'ai 2 programmes :
snip
Ma question est la suivante : est-ce que je dois creer une structure du cote
Java qui soit identique a la structure du cote C++ pour pouvoir la recuperer
correctement ? Ou est-ce que je peux recuperer cette structure dans un
tableau ?
je vais peut etre pas t'arranger et proposer autre chose que tout ce qui |
a ete dit mais je pense que l'approche la plus viable en terme :
de qualite logicielle
de maintenance du code
de performance
serait d'utiliser un dialogue regi par CORBA...
avec 2 ORBs de ton choix (cela ne manque pas)
tu ecriras en effet une IDL avec tes services et les structs devant
vehiculer sur le reseau (ta structure STRUCT !!) mais tu ne t'occuperas
pas de la plomberie et tu feras de l'objet...
car personne n'a parle de la montee en charge mais elle me parait plus
simple a gerer avec une Policy adequate au niveau du POA de ton ORB qu'a
coder a la mimine....
my 2 pieces
jerome
--
Auteur cahier du programmeur Java tome 2 - Eyrolles 10/2003
http://www.eyrolles.com/php.informatique/Ouvrages/ouvrage.php3?ouv_ean13=9782212111941
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Mon Aug 16, 2004 10:12 am Post subject: Re: Socket Java et C++ |
|
|
"Arnaud Debaene" <adebaene (AT) club-internet (DOT) fr> wrote
| Quote: | James Kanze wrote:
"Arnaud Debaene" <adebaene (AT) club-internet (DOT) fr> writes:
Généralement, on définit un format, et à partir de là, le flux ne
contient que des octets, et je ne sais pas s'il y a un sens de
parler de BE/LE. (Dans la mésure où un seul octet ne suffit pas pour
transmettre un int, le format va sans doute parler de l'ordre des
octets.
...et donc va employer les termes big endian ou little endian, d'où
l'intérêt de connaître leur signification
|
Éventuellement. Mais la signification dans un protocol n'est pas tout à
fait identique que quand on parle de la mémoire.
| Quote: | Et bien que je travaille sur des protocols de transmission depuis
longtemps, je ne me suis jamais servi de htons, etc. Je n'en vois
pas l'intérêt.
Tu fais les inversions des octets toi-même quand tu sérialise /
désérialise des données?
|
Quelles inversions ? Si le protocol démande de transmettre un entier en
quatre octets, complément à deux, octet de poids fort d'abord, j'écris
du code pour mettre d'abord les bits 24-31, puis les bits 16-23, etc.
d'un int :
obstream&
operator<<( obstream& dest, int value )
{
obstream::sentry s( dest ) ;
if ( s ) {
unsigned tmp = value ;
streambuf* sb = dest.rdbuf() ;
int shift = 32 ;
while ( tmp && shift > 0 ) {
shift -= 8 ;
if ( sb->sputc( (tmp >> shift) & 0xff ) == EOF ) {
dest.setstate( std::ios::badbit ) ;
}
}
}
return dest ;
}
Ça marche sur toutes les machines où la taille d'un int est au moins 32
bits. Indépendamment de comment les int sont représentés dans la
machine.
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|