Projet Systèmes Distribués - 2020/21

Ce projet a pour but d'implémenter un système distribué de ventes aux enchères.

Principes

Il y aura deux types d'éléments :

Connexion

Le commissaire priseur attend des connexions TCP de la part des clients. Pour cela, les clients sont lancés en précisant en paramètre, dans l'ordre : le nom de la machine du serveur et le numéro de port d'écoute TCP.

Quand un client se connecte, il envoie son pseudo au serveur. Le serveur lui envoie en réponse l'adresse d'un groupe multicast UDP : une adresse IP et un numéro de port. Le client connecte alors une socket multicast UDP à ce groupe. Ce groupe sera utilisé pour les communications lors d'une enchère.

Enchères

Une seule vente a lieu simultanément. C'est le commissaire priseur qui s'occupe de lancer la vente et de gérer les enchères des clients.

N'importe quel client peut lancer une vente. Pour cela, il envoie une demande en TCP au commissaire priseur dans laquelle il précise la description textuelle de l'objet à vendre et le prix de départ (en euros sans centime pour utiliser un entier). Si une vente était déjà en cours, il met la demande de coté tant qu'elle n'est pas terminée. Sinon, il lance la vente.

Quand une vente est lancée, le commissaire priseur diffuse l'annonce sur le groupe multicast en précisant le pseudo du vendeur, la description de l'objet et le prix initial. Si un client veut surenchérir, il diffuse un nouveau prix avec son pseudo sur le groupe multicast. Ainsi, tout le monde est au courant des enchères de chacun et le commissaire priseur peut tenir à jour l'enchère la plus élevée.

Si au bout de 5 secondes après la dernière enchère, plus aucun client ne propose un nouveau prix, la vente est considérée comme terminée. Le commissaire priseur diffuse sur le groupe multicast l'information de la fin de la vente avec le nom de l'acquéreur et le prix. Ensuite, en point à point en TCP, il informe le vendeur que la vente est terminée et l'acheteur que c'est bien lui qui a acquis l'objet.

Si aucune enchère n'a été faite en moins de 5 secondes après le début de la vente, le vendeur est informé en point par point TCP que la vente n'a pas eu lieu. Le commissaire priseur diffuse également sur le groupe multicast que l'objet n'a pas trouvé preneur et que la vente est terminée.

Gestion des erreurs

Le commissaire priseur ou les clients devront se rendre compte des plantages des différents éléments et en fonction d'où en est l'exécution d'une enchère, d'être capable de décider de ce qui doit être fait. Par exemple, si au bout de X secondes, un vendeur n'a pas reçu d'information sur le fait que son objet a été vendu alors que la vente a débuté, il doit comprendre que le commissaire priseur ne fait plus son travail parce que planté.

A vous de déterminer les cas d'erreurs à gérer, tant du coté des clients que du commissaire priseur. Les erreurs ne doivent pas aboutir au plantage d'éléments, il faut gérer de la tolérance aux fautes.

Aide technique

Pour pouvoir au besoin lancer plusieurs éléments sur la même machine qui devront lier leur socket multicast sur le même port UDP, il faut autoriser plusieurs sockets à se lier sur le même port local. Pour cela, en C, il faut positionner l'option SO_REUSEADDR comme vu en cours. En Java, avec une socket multicast UDP, cette option est positionnée automatiquement.

L'attente de données sur les sockets est bloquante. On a vu en TD comment réaliser des sockets UDP asynchrones en Java. On pourrait implémenter la même chose en C. Par rapport au projet, on peut de manière plus simple gérer des timeout sur l'attente d'un packet de données sur une socket UDP. En Java, on a vu la méthode setSoTimeout(int timeout). En C, on pourra positionner également un timeout : pour cela il faudra passer par l'option SO_RCVTIMEO (cf cette documentation).

Travail attendu

Vous implémenterez le système distribué en respectant les spécifications précisées ci-dessus. Le commissaire priseur est à implémenter en C. Les clients sont implémentés de manière identique en une version C et une version Java.

Vous m'enverrez pour le XXX les sources de votre projet. Le projet est à réaliser en binôme. Une évaluation sur machine pourrait être programmée selon l'évolution des contraintes sanitaires.

Barême (approximatif) :