Interopératibilité matérielle et logicielle dans les systèmes distribués
Le but de ce TP est de gérer les problèmes de codage des types
de données lors de l'échange d'information entre 2 applications distribuées.
Deux problèmes seront traités :
- Interopérabilité matérielle : problème de codage des nombres selon le type de processeur utilisé
- Interopérabilité logicielle : problème de codage de types de données entre des langages différents
Interopérabilité matérielle
Il s'agit dans cette première partie de faire un client/serveur TCP
très simple mais montrant clairement les problèmes des différents
formats de données entre des machines d'architectures matérielles
différentes.
Pour cela, nous utiliserons deux types de machines :
- Les machines PC des salles de TP fonctionnant avec un processeur
x86 (codage des entiers en LittleEndian) sous Linux
-
Une machine Sun fonctionnant avec un processeur SPARC (codage des
entiers en BigEndian) sous Solaris
Une fois la connexion TCP établie, l'application client/serveur
réalisera la communication simple suivante : le client envoie un
entier (type int
) au serveur qui ensuite lui retourne ce
même entier.
- Compiler et lancer le serveur sur la machine Sun (utiliser
l'option de compilation
-lxnet
pour inclure les fonctions
gérant les sockets). Compiler et lancer le client sur un PC. Vérifier
que coté serveur l'entier reçu est mal lu. Vérifier ensuite que coté
client l'entier reçu du serveur est bien celui qui avait été envoyé
(ce qui prouve bien que l'erreur ne vient pas de la transmission).
- Modifier le client et le serveur pour encoder l'entier avant
émission et le décoder à la réception. Pour cela, utiliser les
fonctions
htonl
et ntohl
. Vérifier que les
données sont désormais correctement lues des 2 cotés.
Note : utilisez un port suffisament grand (autour de 10000
par exemple) coté serveur pour passer le firewall.
Interopérabilité logicielle
Maintenant nous allons faire communiquer des éléments écrits dans
des langages différents et constater le problème de codage différent
de types de base comme les entiers et les chaînes de caractères. Ces
éléments seront écrits en C et en Java (et seront exécutés sur vos
machines des salles de TP).
- Reprenez de vos TP précédents le client UDP écrit en C et le
serveur UDP écrit en Java. Modifiez les pour que le client envoie un
entier puis une chaîne de caractères au serveur et que le serveur lui
renvoie à son tour un entier puis une chaîne. Constatez que les
données reçues peuvent être mal lues.
- Définissez un mode de codage "pivot" de ces 2 types et créer de
chaque coté (C et Java) des fonctions permettant de convertir une
donnée en son codage local (C ou Java) en votre codage pivot et
inversement. Utilisez ces fonctions dans votre programme
client/serveur et vérifiez que les données sont correctement lues de
part et d'autres.
En C, ces fonctions pourront être placées dans un
fichier à part avec son ".h" pour créer une librairie et en Java, on
pourra créer une classe dédiée au codage des données.