C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Socket Java et C++
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
David Noyelle
Guest





PostPosted: Thu Aug 12, 2004 4:57 pm    Post subject: Socket Java et C++ Reply with 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,

--
David NOYELLE
davidnoyelle chez yahoo point fr


Back to top
drkm
Guest





PostPosted: Thu Aug 12, 2004 5:23 pm    Post subject: Re: Socket Java et C++ Reply with quote



"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





PostPosted: Thu Aug 12, 2004 5:27 pm    Post subject: Re: Socket Java et C++ Reply with quote



"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
.... Wink) )
Emmanuel



Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Fri Aug 13, 2004 7:36 am    Post subject: Re: Socket Java et C++ Reply with quote

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





PostPosted: Fri Aug 13, 2004 7:49 am    Post subject: Re: Socket Java et C++ Reply with quote

<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





PostPosted: Fri Aug 13, 2004 9:18 am    Post subject: Re: Socket Java et C++ Reply with quote

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





PostPosted: Fri Aug 13, 2004 9:29 am    Post subject: Re: Socket Java et C++ Reply with quote

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





PostPosted: Fri Aug 13, 2004 11:16 am    Post subject: Re: Socket Java et C++ Reply with quote

Merci!!
Back to top
Jean-Christophe Garnier
Guest





PostPosted: Sat Aug 14, 2004 1:12 pm    Post subject: Re: Socket Java et C++ Reply with quote

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





PostPosted: Sun Aug 15, 2004 7:11 pm    Post subject: Re: Socket Java et C++ Reply with quote

"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





PostPosted: Sun Aug 15, 2004 7:13 pm    Post subject: Re: Socket Java et C++ Reply with quote

"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





PostPosted: Sun Aug 15, 2004 7:17 pm    Post subject: Re: Socket Java et C++ Reply with quote

"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





PostPosted: Sun Aug 15, 2004 10:36 pm    Post subject: Re: Socket Java et C++ Reply with quote

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





PostPosted: Mon Aug 16, 2004 9:20 am    Post subject: Re: Socket Java et C++ Reply with quote

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 Smile 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





PostPosted: Mon Aug 16, 2004 10:12 am    Post subject: Re: Socket Java et C++ Reply with quote

"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 Wink

É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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.