Développement d'applications réseaux (client-serveur)

Les services standards

La communication entre une application cliente et une application serveur situées sur deux machines différentes nécessite l'existence d'un réseau reliant les deux machines.

Nous supposerons ici qu'il s'agit d'un réseau tcpip, chaque machine est identifiée par son adresse ip.

Le serveur propose des services. Comme il peut en proposer plusieurs, chaque service est identifié par un numéro que l'on appelle le port.

Voici ci-dessous quelques services standards et les ports couramment associés:


Nom du service

Description

Numéro de port

Pop3

Mise à disposition d'une interface de gestion à distance du courrier électronique

110

Ssh

Accés au shell sécurisé à distance

22

Smtp

Envoi de courrier électronique

25

Http

Mise à disposition de contenu web

80

Ftp

Mise à disposition de fichiers

21

On dit que le serveur écoute sur un port. Ainsi le service ipop3d est un démon (programme qui tourne tout le temps) qui écoute sur le port 110.

Les protocoles

Attachons nous maintenant à comprendre le protocole de communication entre un service et un client qui souhaite utiliser ce service. Nous allons examiner une conversation pop3.


Nous allons utiliser pour cela l'outil de communication universel telnet:


le client entamme la conversation:

telnet bigserv.gapline.org pop3

le serveur répond :

+OK POP3 ANice-106-2-2-246.abo.wanadoo.fr v2001.78mdk server ready

le client sait qu'il doit s'authentifier ie donner son login et son pass:

il donne donc son login:

USER gthom

le serveur aprés avoir contrôlé l'existence du compte répond :

+OK User name accepted, password please

le client donne alors son pass:

PASS ghfyu25s6

Le serveur va alors contrôler le pass fournit.

Dans ce cas là le mot de passe n'est pas bon et voilà ce que va répondre le serveur:


-ERR Bad login

-ERR Autologout

+OK Sayonara


reprenons avec un mot de passe correct:

PASS hgdt25

le serveur répond:

+OK Mailbox open, 4 messages


le client est authentifié, il peut: lister ses messages, les récupérer, les supprimer.


Il décide de voir les 50 lignes du premier message:

TOP 1 50

Le serveur lui répond:

+OK Top of message follows

Return-Path: <news@bigserv.btsinfogap.org>

Delivered-To: root@bigserv.btsinfogap.org

Received: by bigserv.btsinfogap.org (Postfix, from userid 9)

id 6D79F2D6C41; Fri, 28 Feb 2003 04:02:32 +0100 (CET)

To: news@bigserv.btsinfogap.org

Subject: bigserv.btsinfogap.org Daily Usenet report for ven fév 28 04:02:01 CET 2003

Message-Id: <20030228030232.6D79F2D6C41@bigserv.btsinfogap.org>

Date: Fri, 28 Feb 2003 04:02:32 +0100 (CET)

From: news@bigserv.btsinfogap.org (news)

Status:


Server status:

No innd.pid file; did server die?

Can't send "mode" command (sendto failure) No such file or directory.


Disk usage:

/etc/news 1778816 Kbytes available

/var/lib/news 25085240 Kbytes available

/var/log/news 25085240 Kbytes available

/var/spool/news/articles 25085240 Kbytes available


le client décide alors de le supprimer:

DELE 1

le serveur répond:

+OK Message deleted


le client souhaite connaître la taille des messages suivant:

LIST


le serveur lui répond:

+OK Mailbox scan listing follows

2 623

3 25072

4 859

le client quitte

QUIT

le serveur lui répond:

+OK Sayonara


L'ensemble de ses étapes, la syntaxe et l'ordre dans lequel les différentes étapes doivent être réalisées forme le "PROTOCOLE"

Le protocole définit le langage de communication entre les applications clientes et les applications serveur. Il définit les différentes étapes de la communication, la forme des messages que peut envoyer le client ainsi que la forme des messages que peut envoyer le serveur.


Chaque protocole esr définit précisément dans des documents publiques que l'on appelle les RFC. Chaque protocole dispose de sa RFC.


A l'aide d'un moteur de recherche, recherchez la RFC correspondant au protocole POP3. (si possible en français)


écrire un programme client

Les sockets: Pour qu'une application puisse communiquer avec une autre via le réseau tcpip, le client va ouvrir une socket vers le serveur et le port qu'elle souhaite atteindre.

La socket une fois obtenue, se comporte comme un fichier texte ouvert en lecture écriture. Lorsqu'une application cliente écrit dans la socket, c'est un message qui sera transmis au serveur. Lorsqu'elle lit dans la socket, elle reçoit les messages que le serveur émet.

Comme tout fichier, la socket doit être ouverte et fermée.


Exemple:

$hote="bigserv.gapline.org";

$port=110;

$maSocket=fsockopen($hote,$port);

if($maSocket)

{

//le service pop3 écoute sur ce serveur

//recup du message d'accueil

$poubelle=fgets($maSocket,250);

//essais de connexion:

fputs($maSocket,"USER gaston\r\n");

$poubelle=fgets($maSocket,250);

fputs($maSocket,"PASS introuvable\r\n");

$reponse=fgets($maSocket,250);

if (substr(fgets($maSocket, 250), 0, 3) != "+OK")

{

echo ("hum pas bon !!!");

}

else

{

//on va faire un stat

fputs($maSocket,"STAT\r\n");

//reception de la réponse

$reponse=fgets($maSocket,250);

$monTab=split(" ",$reponse);

$nbMessage=$monTab[1];

$tailleMessages=$monTab[2];

echo "vous avez $nbMessage messages qui occupent $tailleMessages octets";

//affichage des sujets et des emetteurs des messages

//boucle: pour chaque message

// obtention du top des premières lignes du message

// boucle de lecture du top

while (substr($ligne= fgets($maSocket, 250), 0, 2) != chr(13).chr(10))

{

//si c'est le sujet

if (substr($ligne, 0, 9) == "Subject: ")

{$sujet = htmlspecialchars(substr($ligne, 9));}

//si c'est l'emetteur

if (substr($ligne, 0, 6) == "From: ") {

$sujet = htmlspecialchars(substr($ligne, 6));}

}//fin boucle lecture du top


//fin boucle pour chaque message


}

//fermeture de la socket

fclose($maSocket);

}

else

{

echo("le service pop3 ne semble pas être lancé sur ce serveur");

}

A vous

travail à réaliser:

1) écrire un ensemble de pages web permettant à un utilisateur de voir ses mails, de lire ses mails, et de supprimer ses mails d'un serveur pop3.


2) aprés avoir obtenu la RFC smtp, écrire un ensemble de scripts permettant d'envoyer un courrier à n'importe qui en se servant du serveur smtp du destinataire du courrier.