bonjour à tous,
je developpe une serveur Java qui doit dialoguer avec
une client codé en C++ embarqué sur une carte.
J'utilise UDP pour envoyer des paquets.
Je me demande si je vais avoir des problèmes d'endianness.
En effet, le serveur sera sur un PC (x86) donc little-endian
et le client embarqué sur une carte donc big-endian.
Or, j'ai vu que la machine virtuelle Java fonctionne en big-endian.
Pourtant, j'ai déjà réussi à dialoguer sans problème avec le client
qui tourne encore sur un PC (x86) pour l'instant.
Voici mes questions :
1) Comment se fait-il que j'ai réussi à faire communiquer
mon serveur java avec le client alors que la JVM est en big-endian
et que le client codé en C++, encore sur un PC, était en little-endian ?
2) Voici un exemple d'envoie de paquet :
Comme vous pouvez le voir, j'envoie en little-endian.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 DatagramSocket socket = new DatagramSocket(2000); byte[] buf = new byte[1024]; //Je veux envoyer : 0x0B110100 buf[0]=0x00; buf[1]=0x01; buf[2]=0x11; buf[3]=0x0B; DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getByName(IP_ADDRESS), PORT); socket.send(packet);
La JVM va t-elle convertir mon paquet automatiquement en big-endian ?
3) Je voudrais que le serveur, en fonction du choix de l'utilisateur,
envoie les paquets soit en big, soit en little.
Mais je voudrais éviter de coder un truc lourd avec des "if" partout genre :
Comment feriez-vous pour coder ça proprement ? Faut-il utiliser un design pattern ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 DatagramSocket socket = new DatagramSocket(2000); byte[] buf = new byte[1024]; if(endian == little) { //Je veux envoyer : 0x0B110100 buf[0]=0x00; buf[1]=0x01; buf[2]=0x11; buf[3]=0x0B; } else if(endian == big) { //J'inverse les indices buf[3]=0x00; buf[2]=0x01; buf[1]=0x11; buf[0]=0x0B; } DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getByName(IP_ADDRESS), PORT); socket.send(packet);
Merci.
Partager