Compare commits

..

No commits in common. "0d982d3be000f638e4a0e15aca3f0627fca9ffaf" and "93ef30f24d7521d59fe36a6c528e5c881c9c65f8" have entirely different histories.

9 changed files with 15 additions and 1663 deletions

1117
Doxyfile

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
SUBDIRS = src SUBDIRS = src
EXTRA_DIST = doc INSTALL README Doxyfile autogen.sh EXTRA_DIST = doc INSTALL README Doxyfile autogen.sh rapport

187
README
View file

@ -1,187 +0,0 @@
Programmation répartie - TP2
1. Description
Le but de ce TP est de concevoir une implémentation des protocoles
ABCAST et CBCAST.
Il possède les caractéristiques suivantes :
* Il est distribué sous la licence [1]GNU General Public License
* Il est écrit en C++,
* Il implémente ABCAST,
* Il implémente CBCAST.
Cette implémentation utilise trois threads, un "envoyeur de bas
niveau" (LowSender), un "recepteur de bas niveau" (LowReceiver) et un
"recepteur de haut niveau" (HighReceiver).
1.1. Auteurs
Cet exercice a été entièrement réalisé par Glenn ROLLAND
<[2]glenux@fr.st> à l'occasion de travaux pratiques du cours de
Programmation Répartie du Master 2 Ingénierie Informatique - Systèmes,
Réseaux et Internet.
1.2. Implémentation des protocoles
J'ai choisi d'écrire un protocole unique Multi-BroadCast Protocol
(MBCP) utilisable aussi bien pour envoyer les datagrammes d'ABCAST que
de CBCAST.
1.2.1. Structures des datagrammes
Le datagramme MBCP se décompose de la façon suivante:
+------+-----------+---------+
| Type | Timestamp | Message |
+------+-----------+---------+
Dans ce datagrame:
Type est de type unsigned char et peu prendre les valeurs suivantes:
'A'
Indique l'utilisation du protocole ABCAST
'C'
indique l'utilisation du protocole CBCAST
une autre valeur
indique un protocole inconnu
Timestamp peut varier en fonction de Type.
* Si Type == 'A', alors la structure de Timestamp est la suivante:
+------------+-------------+
| Site index | Clock value |
+------------+-------------+
* Si Type == 'C', alors la structure de Timestamp est la suivante:
+------------+------------+-------------+
| Site_index | Clock_size | Clock_value |
+------------+------------+-------------+
* Si Type est différent, alors on considère le paquet illisible.
Site_index est de type unsigned short (16 bits).
Il indique l'index du site emetteur. La numérotation des index débute
à zéro.
Clock_size est de type unsigned short (16 bits).
Ce champ indique la taille de l'horloge (si celle-ci est vectorielle).
Clock_value peut varier en fonction de Type.
* Si Type == 'A', alors Clock_value est de type unsigned short (16
bits)
* Si Type == 'C', alors Clock_value est un tableau de valeurs
unsigned short (16 bits * Clock_size)
Message possède la structure suivante:
+--------------+--------------+
| Message_size | Message_data |
+--------------+--------------+
Message_size est de type unsigned short (16 bits). Cette valeur
indique la taille du message.
Message_data est un tableau de valeurs char (8 bits * Message_size).
Ce champ contient le message (qui peut être une estampille).
2. Pré-requis
Cet exercice nécessite:
* un système compatible unix,
* le compilateur GNU GCC (version >= 2.95)
* une version récente des GNU Autotools.
3. Se procurer le sources
Vous pouvez télécharger la dernière archive des sources, ou bien
directement leur version la plus récente sur le dépôt Subversion du
projet.
3.1. L'archive compressée
Elle est disponible à l'adresse :
[3]http://glenux2.free.fr/pub/projets/Programmation_Repartie/TP2/archi
ves/
3.2. Le dépôt Subversion
Afin d'obtenir les sources les plus à jour, vous pouvez utiliser le
logiciel de contrôle de sources Subversion
$ svn checkout \
http://repository.glenux.ath.cx/svn/Cours/M2/Programmation_Repartie/
TP2/ \
prog-repartie-tp2
Il n'y a pas de mot de passe, il suffit donc de presser la touche
"Entrée" pour l'utilisateur "anonymous", si ce dernier vous est
demandé.
4. Utiliser le logiciel
4.1. Compilation
Si vous avez choisi l'archive, commencez par la décompressez.
$ tar -xzvf prog-repartie-tp2.tar.gz
Rendez vous ensuite dans le dossier qui vient d'être créé lors de la
décompression.
$ cd prog-repartie-tp2
Puis lancez la compilation du logiciel:
$ ./autogen.sh
$ ./configure
$ make
4.3. Utilisation
On supposera que les machines weber, beethoven et mozart font partie
du même groupe, que leur ports respectifs pour la reception sont 2300,
2330, et 2360.
4.3.1. ABCAST
Pour la machine weber, on lancera:
$ ./dabcast -A -p 2300 -g weber:2300 -g beethoven:2330 -g mozart:2360
-i 1
Pour la machine beethoven:
$ ./dabcast -A -p 2330 -g weber:2300 -g beethoven:2330 -g mozart:2360
-i 2
Pour la machine mozart:
$ ./dabcast -A -p 2360 -g weber:2300 -g beethoven:2330 -g mozart:2360
-i 3
4.3.2. CBCAST
On supposera que les machines weber, beethoven et mozart font partie
du même groupe, que leur ports respectifs pour la reception sont 2300,
2330, et 2360.
Pour la machine weber, on lancera:
$ ./dabcast -C -p 2300 -g weber:2300 -g beethoven:2330 -g mozart:2360
-i 1
Pour la machine beethoven:
$ ./dabcast -C -p 2330 -g weber:2300 -g beethoven:2330 -g mozart:2360
-i 2
Pour la machine mozart:
$ ./dabcast -C -p 2360 -g weber:2300 -g beethoven:2330 -g mozart:2360
-i 3
Références
1. http://www.gnu.org/copyleft/gpl.html
2. mailto:glenux@fr.st
3. http://glenux2.free.fr/pub/projets/Programmation_Repartie/TP2/archives/

View file

@ -1,36 +0,0 @@
p.code { border: 2px dashed rgb(153, 153, 153);
padding: 5px;
background: rgb(204, 204, 204) none repeat scroll 0% 50%;
-moz-background-clip: initial;
-moz-background-origin: initial;
-moz-background-inline-policy: initial;
font-family: monospace;
}
div.page { border: 2px dashed rgb(153, 153, 153);
padding: 10px;
top: 10px;
left: 10px;
right: 10px;
bottom: 10px;
margin-right: auto;
margin-left: auto;
background-color: rgb(255, 255, 255);
opacity: 1;
width: 60%;
font-family: Arial,Helvetica,sans-serif;
}
body { background-color: rgb(51, 51, 51);
}
span.code { border: 1px dashed rgb(153, 153, 153);
background-color: rgb(204, 204, 204);
font-family: monospace;
}
dt { font-weight: bold; }
.code_var { font-weight: bold; font-family: monospace; }
.code_type { font-family: monospace; font-style: italic; }

View file

@ -1,302 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html style="direction: ltr;" lang="fr-fr">
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
<link rel="stylesheet" type="text/css" href="readme.css">
<title>Programmation R&eacute;partie - TP2</title>
<meta content="Glenn ROLLAND" name="author">
</head>
<body style="direction: ltr;">
<div style="text-align: justify;" class="page code code">
<h1>Programmation r&eacute;partie - TP2</h1>
<h2><a name="1._Description"></a>1.
Description</h2>
<p>Le but de ce TP est de concevoir une impl&eacute;mentation
des protocoles ABCAST et CBCAST.&nbsp;</p>
<p> Il poss&egrave;de les
caract&eacute;ristiques
suivantes :</p>
<ul>
<li>Il est distribu&eacute;
sous la licence&nbsp;<a href="http://www.gnu.org/copyleft/gpl.html">GNU
General Public License</a></li>
<li>Il&nbsp;est
&eacute;crit en C++,&nbsp;</li>
<li>Il impl&eacute;mente ABCAST,</li>
<li>Il impl&eacute;mente CBCAST.</li>
</ul>
<p>Cette impl&eacute;mentation utilise&nbsp;trois <span style="font-style: italic;">threads</span>, un
"envoyeur de bas
niveau" (<span style="font-weight: bold;">LowSender</span>),
un "recepteur de bas niveau" (<span style="font-weight: bold;">LowReceiver</span>)
et un
"recepteur de haut niveau" (<span style="font-weight: bold;">HighReceiver</span>).</p>
<h3>1.1.
Auteurs</h3>
<p>Cet exercice a
&eacute;t&eacute; enti&egrave;rement
r&eacute;alis&eacute; par Glenn ROLLAND &lt;<a href="mailto:glenux@fr.st">glenux@fr.st</a>&gt;
&agrave; l'occasion de travaux pratiques du cours de <span style="font-style: italic;">Programmation R&eacute;partie</span>
du Master 2 Ing&eacute;nierie Informatique
-
Syst&egrave;mes, R&eacute;seaux et Internet.</p>
<h3>1.2. Impl&eacute;mentation des protocoles</h3>
<p>J'ai choisi d'&eacute;crire un protocole unique <span style="font-weight: bold;">Multi-BroadCast Protocol</span>
(MBCP) utilisable aussi bien pour envoyer les datagrammes d'ABCAST que
de CBCAST.</p>
<h4>1.2.1. Structures des datagrammes</h4>
<span class="code_var">Le datagramme MBCP</span> se
d&eacute;compose de la fa&ccedil;on
suivante:
<pre>+------+-----------+---------+<br>| Type | Timestamp | Message |<br>+------+-----------+---------+<br></pre>
<p>Dans ce datagrame:</p>
<p><span class="code_var" style="font-weight: bold;">Type</span>
est de type <span class="code_type">unsigned char</span>
et peu prendre les valeurs suivantes:
</p>
<dl>
<dt style="font-weight: bold;">'A'</dt>
<dd>Indique l'utilisation du protocole ABCAST</dd>
<dt style="font-weight: bold;">'C'</dt>
<dd>indique l'utilisation du protocole CBCAST</dd>
<dt style="font-weight: bold;">une autre valeur</dt>
<dd>indique un protocole inconnu</dd>
</dl>
<p><span class="code_var" style="font-weight: bold;">Timestamp</span>
peut varier en fonction de <span class="code_var">Type</span>.&nbsp;</p>
<ul>
<li>Si <span class="code_var" style="font-weight: bold;">Type</span> == 'A', alors
la structure de <span class="code_var">Timestamp</span>
est la suivante:<br>
<pre>+------------+-------------+<br>| Site index | Clock value |<br>+------------+-------------+</pre>
</li>
<li>Si <span class="code_var">Type</span>
== 'C', alors la structure de <span class="code_var">Timestamp</span>
est la suivante:<br>
<pre>+------------+------------+-------------+<br>| Site_index | Clock_size | Clock_value |<br>+------------+------------+-------------+</pre>
</li>
<li>Si <span class="code_var">Type</span>
est diff&eacute;rent, alors on consid&egrave;re le paquet
illisible.</li>
</ul>
<p><span class="code_var">Site_index</span>
est de type <span class="code_type">unsigned short</span>
(16 bits).<br>
Il indique l'index du site emetteur. La num&eacute;rotation des
index d&eacute;bute &agrave; z&eacute;ro.</p>
<p><span class="code_var">Clock_size</span>
est de type <span class="code_type">unsigned short</span>
(16 bits).<br>
Ce champ indique la taille de l'horloge (si celle-ci est vectorielle).</p>
<p><span class="code_var">Clock_value</span>
peut varier en fonction de Type.</p>
<ul>
<li>Si <span class="code_var">Type</span>
== 'A', alors <span class="code_var">Clock_value</span>
est de type <span class="code_type">unsigned short</span>
(16 bits)</li>
<li>Si <span class="code_var">Type</span>
== 'C', alors <span class="code_var">Clock_value</span>
est un tableau de valeurs <span class="code_type">unsigned
short</span> (16 bits * <span class="code_var">Clock_size</span>)</li>
</ul>
<p><span class="code_var">Message</span>
poss&egrave;de la structure suivante:</p>
<pre>+--------------+--------------+<br>| Message_size | Message_data |<br>+--------------+--------------+<br></pre>
<p><span class="code_var">Message_size</span>
est de type <span class="code_type">unsigned short</span>
(16 bits). Cette valeur indique la taille du message.</p>
<p><span class="code_var">Message_data</span>
est un tableau de valeurs <span class="code_type">char</span>
(8 bits * <span class="code_var">Message_size</span>).
Ce champ contient le message (qui peut &ecirc;tre une estampille).</p>
<dl>
</dl>
<h2><a99 name="2._Pr&eacute;-requis">2.
Pr&eacute;-requis</a99></h2>
<p>Cet exercice n&eacute;cessite:</p>
<ul>
<li>un syst&egrave;me compatible unix,&nbsp;</li>
<li>le compilateur GNU GCC&nbsp;
(version&nbsp;&ge;
2.95)</li>
<li>une version r&eacute;cente des GNU Autotools.</li>
</ul>
<h2>3.
Se procurer le sources</h2>
<p>Vous
pouvez t&eacute;l&eacute;charger la derni&egrave;re archive
des
sources, ou bien directement leur version la plus r&eacute;cente
sur le d&eacute;p&ocirc;t Subversion du projet.</p>
<h3>3.1. L'archive compress&eacute;e</h3>
<p>Elle est disponible &agrave; l'adresse :<br>
<a href="http://glenux2.free.fr/pub/projets/ProgRepartie/TP2/Archives/">http://glenux2.free.fr/pub/projets/ProgRepartie/TP2/Archives/</a><br>
</p>
<h3>3.2. Le
d&eacute;p&ocirc;t Subversion</h3>
<p>Afin d'obtenir les sources les
plus &agrave; jour, vous pouvez utiliser le logiciel de
contr&ocirc;le de sources Subversion </p>
<p class="code">$ svn
checkout \<br>
&nbsp;&nbsp;https://websvn.glenux.ath.cx/svn/Cours/M2/Programmation_Repartie/TP2/
\<br>
&nbsp;&nbsp;prog-repartie-tp2</p>
<p>Il n'y a pas de mot de passe,
il suffit donc de presser la touche
"Entr&eacute;e" pour l'utilisateur "anonymous", si ce dernier vous
est
demand&eacute;.</p>
<h2>4. Utiliser le logiciel</h2>
<h3>4.1. Compilation</h3>
<p>Si vous avez choisi l'archive, commencez par la
d&eacute;compressez.</p>
<p class="code">$ tar -xzvf prog-repartie-tp2.tar.gz</p>
<p>Rendez vous ensuite dans le
dossier qui vient d'&ecirc;tre cr&eacute;&eacute; lors de
la d&eacute;compression.</p>
<p class="code">$ cd prog-repartie-tp2</p>
<p>Puis lancez&nbsp;la compilation du logiciel:</p>
<p class="code">$ ./autogen.sh<br>
$ ./configure<br>
$ make</p>
<h3>4.3. Utilisation</h3>
<p>On supposera que les machines <span style="font-style: italic;">weber</span>, <span style="font-style: italic;">beethoven</span> et <span style="font-style: italic;">mozart </span>font partie
du m&ecirc;me groupe,&nbsp;que leur ports respectifs pour la
reception sont <span style="font-style: italic;">2300</span>,
<span style="font-style: italic;">2330</span>, et <span style="font-style: italic;">2360</span>.</p>
<h4>4.3.1. ABCAST</h4>
<p>Pour la machine <span style="font-style: italic;">weber</span>, on lancera:</p>
<p class="code">$ ./dabcast -A -p 2300 -g weber:2300 -g
beethoven:2330 -g mozart:2360 -i 1</p>
<p>Pour la machine <span style="font-style: italic;">beethoven</span>:</p>
<p class="code">$ ./dabcast -A -p 2330 -g weber:2300 -g
beethoven:2330 -g mozart:2360 -i 2</p>
<p>Pour la machine <span style="font-style: italic;">mozart</span>:&nbsp;</p>
<p class="code">$ ./dabcast -A -p 2360 -g weber:2300 -g
beethoven:2330 -g mozart:2360 -i 3</p>
<h4>4.3.2. CBCAST</h4>
<p>On supposera que les machines <span style="font-weight: bold;">weber</span>, <span style="font-weight: bold;">beethoven</span> et <span style="font-weight: bold;">mozart</span> font partie
du m&ecirc;me groupe,&nbsp;que leur ports respectifs pour la
reception sont <span style="font-weight: bold;">2300</span>,
<span style="font-weight: bold;">2330</span>, et <span style="font-weight: bold;">2360</span>.</p>
<p>Pour la machine <span style="font-style: italic;">weber</span>, on lancera:</p>
<p class="code">$ ./dabcast -C -p 2300 -g weber:2300 -g
beethoven:2330 -g mozart:2360 -i 1</p>
<p>Pour la machine <span style="font-style: italic;">beethoven</span>:</p>
<p class="code">$ ./dabcast -C -p 2330 -g weber:2300 -g
beethoven:2330 -g mozart:2360 -i 2</p>
<p>Pour la machine <span style="font-style: italic;">mozart</span>:&nbsp;</p>
<p class="code">$ ./dabcast -C -p 2360 -g weber:2300 -g
beethoven:2330 -g mozart:2360 -i 3</p>
</div>
</body>
</html>

View file

@ -0,0 +1,2 @@
./dabcast -A -p 2400 -g localhost:2400 -g localhost:2450 -i 1
./dabcast -A -p 2450 -g localhost:2400 -g localhost:2450 -i 2

View file

@ -0,0 +1,3 @@
dans la RFC, indiquer si le temps commence à 0 ou à 1
indiquer si l'index de la machine commence à 0 ou à 1
envoyer les messages au highreceiver

View file

@ -152,7 +152,7 @@ int Config::getPort(){
} }
void Config::usage() { void Config::usage() {
printf("Usage: dabcast <mode> [options]\n"); printf("Usage: webreducer <mode> [options]\n");
printf("\n"); printf("\n");
printf("Modes (mutualy exclusive):\n"); printf("Modes (mutualy exclusive):\n");
printf("-T, -test Test mode (simple broadcast)\n"); printf("-T, -test Test mode (simple broadcast)\n");
@ -161,5 +161,4 @@ void Config::usage() {
printf("Mandatory options:\n"); printf("Mandatory options:\n");
printf("-g, -group <host:port> Add an host to the group\n"); printf("-g, -group <host:port> Add an host to the group\n");
printf("-p, -port <port> Use this port on localhost\n"); printf("-p, -port <port> Use this port on localhost\n");
printf("-i, -index <int> The index of current host in the group\n");
} }

View file

@ -14,7 +14,6 @@ void LowReceiver::manage_abcast(Message * mesg) {
static short minimum_deliverable_stamp = -1; static short minimum_deliverable_stamp = -1;
std::list<MessageCellAb *>::iterator iter; std::list<MessageCellAb *>::iterator iter;
std::list<MessageCellAb *>::iterator iter2;
printf("LowReceiver::manage_abcast -- init\n"); printf("LowReceiver::manage_abcast -- init\n");
// identifiant = horloge + id_site_emeteur // identifiant = horloge + id_site_emeteur
@ -112,35 +111,26 @@ void LowReceiver::manage_abcast(Message * mesg) {
// l'estampille... // l'estampille...
Message * nMsg = new Message(Protocol::TYPE_ABCAST, Message * nMsg = new Message(Protocol::TYPE_ABCAST,
st, st,
nSt.getRaw(), nSt->getRaw(),
nSt.getRawSize()); nSt->getRawSize());
_group.sendto(*(cell->message), cell->message->getStamp().getIndex()); _group.sendto(*(cell->message), cell->message->getStamp().getIndex());
} else { } else {
// sinon // sinon
// - l'estampille du message est mise à jour // - l'estampille du message est mise a jour
TimeStamp st = mesg->getStamp(); TimeStamp st = mesg->getStamp();
TimeStamp nSt = _clock.inc(); TimeStamp nSt = _clock.inc();
Message * nMsg = new Message(Protocol::TYPE_ABCAST, Message * nMsg = new Message(Protocol::TYPE_ABCAST,
st, st,
cell->message->getData(), nSt->getRaw(),
cell->message->getDataSize()); nSt->getRawSize());
// - le message est ajouté dans deliverable // - le message est marqué comme final
fifo_deliverable.push_back(nMsg); cell->type = MessageCellAb::TYPE_DEFINITIVE;
// Trouver l'iterator
for (iter = fifo_get.begin(); iter != fifo_get.end(); iter++){
MessageCellAb * itCell = *iter;
if (cell == itCell){
iter2 = iter;
}
}
// normalement on a trouvé l'iterateur...
fifo_get.erase(iter2);
// - FIXME: on défile les estampille finale la
} }
} }