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

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 :

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.

  1. 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).
  2. 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).

  1. 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.
  2. 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.