OVH Cloud OVH Cloud

Socket Java et C++

22 réponses
Avatar
David Noyelle
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

2 réponses

1 2 3
Avatar
drkm
writes:

drkm wrote in message
news:...

writes:



[explication intéressante des conversions signés vers non-signés
coupée]

et on utilise les fonctions htons, htonl, ntohs et ntohl pour
passer de la convention locale à la machine à la convention
Internet et vice-versa.


Fonctions qui ne sont pas présentes sur toutes les
implémentations C++.


Bof. S'il s'occupe de transmissions réseaux ...


Je ne sais pas. Est-ce qu'elles sont présentent sous Windows ? Est-ce
qu'elles sont même présentes sur tous les Unix -- je ne les trouve pas
dans la norme Posix ?


Elles font partie de « The Single UNIX Specification, Version 2 »,
au moins :

<URL:http://www.opengroup.org/onlinepubs/007908799/xns/htonl.html>

mais je n'ai jamais vraiement compris exactement quelles étaient les
différentes normes Unix.

Mais je voualis dire que l'argument comme quoi elles « ne sont pas
présentes sur toutes les implémentations C++ » ne tient pas vraiment
la route dans ce contexte. Il s'occupe de transimissions réseaux.
S'il doit utiliser ces fonctions, je ne vois pas le problème. Mais je
ne dit absolument pas qu'il le doit, je te fait confiance sur ce
point.

PS: fu2 f.c.l.c++

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html




Avatar
kanze
drkm wrote in message
news:...
writes:

drkm wrote in message
news:...

writes:



[explication intéressante des conversions signés vers non-signés
coupée]

et on utilise les fonctions htons, htonl, ntohs et ntohl pour
passer de la convention locale à la machine à la convention
Internet et vice-versa.


Fonctions qui ne sont pas présentes sur toutes les
implémentations C++.


Bof. S'il s'occupe de transmissions réseaux ...


Je ne sais pas. Est-ce qu'elles sont présentent sous Windows ?
Est-ce qu'elles sont même présentes sur tous les Unix -- je ne les
trouve pas dans la norme Posix ?


Elles font partie de « The Single UNIX Specification, Version 2 »,
au moins :

<URL:http://www.opengroup.org/onlinepubs/007908799/xns/htonl.html>

mais je n'ai jamais vraiement compris exactement quelles étaient les
différentes normes Unix.


En effet. Je ne sais pas ce que j'ai cherché pour ne pas les trouver.

En ce qui concerne les normes diverses, c'est effectivement un peu
compliqué ; « The Single UNIX Specification » est le document normatif
pour deux normes, Posix (IEEE) et Unix (Open Group) -- en plus, les deux
ont beaucoup de parties optionnelles. Mais pour les fonctions en
question, il n'y a pas de « Margin Code Notation », ce qui implique
qu'elles font partie du noyau obligatoire des deux normes.

Mais je voualis dire que l'argument comme quoi elles « ne sont pas
présentes sur toutes les implémentations C++ » ne tient pas vraiment
la route dans ce contexte.


Je le conviens. Bien que... Il arrive de plus en plus de faire du reseau
sur des systèmes embarqués. Je ne connais pas trop ce qu'offre
l'environement dans de tels systèmes -- je doute fort qu'ils soient
Unix, ni même Unix-like.

Il s'occupe de transimissions réseaux. S'il doit utiliser ces
fonctions, je ne vois pas le problème. Mais je ne dit absolument pas
qu'il le doit, je te fait confiance sur ce point.


Il n'y a pas que moi:-). Dans la section « Application Usage » de la
spécification Posix/Unix de ces fonctions : « These functions are most
often used in conjunction with IPv4 addresses and ports as returned by
gethostent() and getservent(). » J'avoue que même dans ce cas-là, je
n'en vois pas l'intérêt : les adresses IP dans le hostent dont se
servent gethostent() et getservent() sont stocké en forme de char[]. Il
faut donc les convertir en uint32_t (p.e. pour appliquer la masque du
reseau, voire simplement pour les copier plus facilement). Or, pour la
conversion, la solution que j'ai posté ailleurs marche très bien, sans
s'occuper de l'ordre des octets. (En revanche, je comprends bien qu'on
pourrait s'intéresser un peu dans l'ordre des octets ici, dans la mésure
que selon la représentation, on les traite parfois comme un entier de 32
bits, parfois comme une suite de quatre octets.)

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





1 2 3