Académique Documents
Professionnel Documents
Culture Documents
*************
********
DEPARTEMENT D’INFORMATIQUE
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
1
OBJECTIFS
STRATEGIE PEDAGOGIQUE
Les connaissances seront transmises sous forme d’un cours magistral et des travaux
Dirigés. L’étudiant(e) ou l’Ingénieur aura à compléter les travaux et les cours par l’étude
personnelle et des efforts personnels.
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
2
SOMMAIRE
PARTIE I : ARCHITECTURE CLIENT-
CLIENT-SERVEUR
CHAPITRE 1 : RAPPELSNSUR LE MODELE TCP/IP
I- ARCHITECTURE DES PROTOCOLES TCP/IP
1.1-Couche Application
1.2-Couche Transport
1.3-Couche Internet
1.4-Couche Accès au Réseau
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
4
PARTIE I : ARCHITECTURE CLIENT-
CLIENT-SERVEUR
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
5
CHAPITRE 1 : RAPPELSNSUR LE MODELE TCP/IP
I- ARCHITECTURE DES PROTOCOLES TCP/IP
TCP/IP ou Transmission Control Protocol / Internet Protocol définit une suite de protocoles
qui permettent à des ordinateurs de communiquer.
Internet IP
Les protocoles de la couche application fournissent des services aux logiciels applicatifs
s’exécutant sur un ordinateur.
Lorsqu’une couche spécifique sur un ordinateur souhaite communiquer avec son homologue
sur un autre ordinateur, les deux machines emploient des en – têtes pour contenir les
informations qu’elles veulent échanger. Ces en – têtes sont des éléments essentiels de la
transmission qui a lieu entre les deux ordinateurs. On qualifie ce processus d’interaction
entre couches homologues
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
6
1.2- La couche Transport
TCP/IP devait disposer d’un mécanisme pour garantir la livraison des données à travers le
réseau. TCP fourni un mécanisme de récupération des erreurs au moyen d’acquittement.
L’interaction entre couches adjacentes définit la façon dont les couches adjacentes d’un
modèle de réseau sur un même ordinateur collaborent.
Entre couches homologues sur des ordinateurs différents, les deux ordinateurs
communiquent l’un avec l’autre au niveau de la même couche par le biais d’un protocole. Le
protocole défini par chaque couche utilise un en – tête qui permet aux deux ordinateurs
d’échanger les informations dont ils ont besoins.
Entre couches adjacentes sur un même ordinateur, chaque couche offre un service à la
couche immédiatement supérieure. Le logiciel ou matériel qui implémente la couche
supérieure attend de la couche inférieure qu’elle assure la fonction requise.
Elle définit des adresses logiques et le processus de routage autorisant des équipements
appelé routeurs à choisir ou à envoyer les paquets de données pour qu’ils parviennent a
destination, puis les détails de la façon de créer une infrastructure pour pouvoir transférer
des données entre tous les ordinateurs du réseau.
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
7
1.4- La couche Accès réseau
Elle définit les protocoles et le matériel requis pour acheminer des données sur un réseau
physique. Cette couche es constituée de deux couches : Liaison de données et Physique. La
couche Accès réseau du modèle TCP/IP inclut les protocoles, les normes de câblage, ainsi
que les en – têtes et les en – queues qui définissent la façon dont les données sont
transmises sur une grande variété de types de réseaux physiques.
L’encapsulation des données désigne le processus qui consiste à placer des en – têtes et
des en – queues autour de données. Par exemple le serveur WEB encapsulait la page
d’accueil home.htm au moyen des en – têtes HTML ; la couche TCP encapsulait les en –
têtes http et les données au moyen d’un en – tête TCP ; le protocole IP encapsulait les en –
têtes TCP et les données au moyen d’un en – tête IP. Enfin, la couche Accès réseau
encapsulait les paquets IP au moyen d’en – têtes et d’en – queues PPP et Ethernet.
En résumé, le processus d’encapsulation des données avec TCP/IP peut être décomposé en
5 étapes suivantes :
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
8
4- Encapsulation des données fournies par la couche Internet entre un en – tête et un
en – queue de niveau Accès réseau
5- Transmission de Bit
Données Application
Transmission de Bits
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
9
CHAPITRE 2 : LE MODELE CLIENT - SERVEUR
I- PRESENTATION
Bien souvent les parties cliente et serveur ne sont pas écrites par les mêmes programmeurs
(Navigateur Netscape/Serveur apache) --> rôle important des RFCs qui spécifient le
protocole
Idée : l'application est répartie sur différents sites pour optimiser le traitement, le
stockage...
Le client
o effectue une demande de service auprès du serveur (requête)
o initie le contact (parle en premier), ouvre la session
Le serveur
o est la partie de l'application qui offre un service
o est à l'écoute des requêtes clientes
o répond au service demandé par le client (réponse)
Le client et le serveur ne sont pas identiques, ils forment un système coopératif
o les parties client et serveur de l'application peuvent
o s'exécuter sur des systèmes différents
o une même machine peut implanter les côtés client ET serveur de l'application
o un serveur peut répondre à plusieurs clients
o simultanément
L'architecture à deux niveaux (aussi appelée architecture 2-tier, tier signifiant rangée en
anglais) caractérise les systèmes clients/serveurs pour lesquels le client demande une
ressource et le serveur la lui fournit directement, en utilisant ses propres ressources. Cela
signifie que le serveur ne fait pas appel à une autre application afin de fournir une partie du
service.
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
10
1.2- Présentation de l'architecture à 3 niveaux
Etant donné l'emploi massif du terme d'architecture à 3 niveaux, celui-ci peut parfois
désigner aussi les architectures suivantes :
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
11
1.3- Comparaison des deux types d'architecture
L'architecture à deux niveaux est donc une architecture client/serveur dans laquelle le
serveur est polyvalent, c'est-à-dire qu'il est capable de fournir directement l'ensemble des
ressources demandées par le client.
Dans l'architecture à trois niveaux par contre, les applications au niveau serveur sont
délocalisées, c'est-à-dire que chaque serveur est spécialisé dans une tâche (serveur
web/serveur de base de données par exemple). L'architecture à trois niveaux permet :
Dans l'architecture à 3 niveaux, chaque serveur (niveaux 2 et 3) effectue une tâche (un
service) spécialisée. Un serveur peut donc utiliser les services d'un ou plusieurs autres
serveurs afin de fournir son propre service. Par conséquent, l'architecture à trois niveaux est
potentiellement une architecture à N niveaux...
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
12
II- LES APPLICATIONS RESEAU
Processus :
o une entité communicante
o un programme qui s'exécute sur un hôte d'extrémité
Communications inter-processus locales :
o communications entre des processus qui s'exécutent sur un même hôte
o communications régies par le système d'exploitation (tubes UNIX, mémoire
partagée, …)
Communications inter-processus distantes :
o les processus s'échangent des messages à travers le réseau selon un
protocole de la couche applications
o nécessite une infrastructure de transport sous-jacente
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
13
Il faut une interface entre l'application réseau et la couche transport
o le transport n'est qu'un tuyau (TCP ou UDP dans Internet)
o l'API (Application Programming Interface) n'est que le moyen d'y accéder
(interface de programmation)
III- LE MIDDLEWARE
On appelle middleware (ou logiciel médiateur), l’élément du milieu, l’ensemble des couches
réseau et services logiciels qui permettent le dialogue entre les différents composants d’une
application répartie. Ce dialogue se base sur un protocole applicatif commun, défini par l’API
du middleware.
Autres exemples
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
15
Modèle de Gartner pour les systèmes à 2 niveaux (2-tiers) :
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
16
4.2- Mode non connecté
Serveur itératif :
traite séquentiellement les requêtes
adapté aux requêtes qui peuvent s'exécuter rapidement
souvent utilisé en mode non connecté (recherche de la performance)
Serveur concurrent :
le serveur accepte les requêtes puis les "délègue" à un processus fils (traitement de
plusieurs clients)
adapté aux requêtes qui demandent un certain traitement (le coût du traitement est
suffisamment important pour que la création du processus fils ne soit pas
pénalisante)
souvent utilisé en mode connecté
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
17
PARTIE II : PROGRAMMATION DES SOCKETS
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
18
CHAPITRE 3 : LES SOCKETS
I- INTRODUTION
Le socket est utilisé pour permettre aux processus de communiquer entre eux de la même
manière que le téléphone nous permet de communiquer entre nous.
L’analogie entre le concept de socket et le téléphone est assez proche, et sera utilisé pour
éclaircir la notion de socket.
On sait maintenant comment créer un socket qui reçoit des demandes de communication,
mais comment l’appeler ?
1. Pour le téléphone vous devez d’abord avoir le numéro avant de pouvoir appeler. Le
rôle de la fonction connect() est de connecter un socket a un autre socket qui est en
attente de demande de communication.
2. Maintenant qu’une connexion est établie entre deux sockets, la conversation peut
commencer. C’est le rôle des fonction read() et write().
3. A la fin de la communication on doit raccrocher le téléphone ou fermer le socket qui a
servi la communication. C’est le rôle de la fonction close().
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
19
Sous UNIX l’implémentation est de la forme suivante:
<sys/socket.h> ;
struct sockaddr
{
u_short sa_family ;
char sa_data[14] ;
};
Pour la famille Internet les structures suivantes sont définis dans le fichier
<netinet/in.h>.
struct in_addr
{
u_long s_addr ;
};
struct sockaddr_in
{
short sin_family ;
u_short sin_port ;
struct in_addr sin_addr ;
char sin_zero[8] ;
};
sin_family : AF_INET ;
sin_port : 16 bits de num.ro de port ( ordonnancement réseau) ;
sin_addr : 32 bits constituants l’identificateur du réseau et de la machine hôte
ordonnes selon l’ordre réseau.
sin_zero[8] : inutilisés ;
Le fichier <sys/types.h> fourni des définitions de C et de types de donn.es qui sont utilisés
dans le système.
La variable family peut prendre 4 valeurs dont les préfixes commencent par AF
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
21
comme Famille d’adresse :
AF_UNIX Protocoles internes de UNIX
AF_INET Protocoles Internet
AF_NS Protocols de Xerox NS
AF_IMPLINK Famille spéciale pour des applications particulières auxquelles nous ne
nous intéresserons pas.
La variable type peut prendre 5 valeurs :
Le mode raw accessible par l’option SOCK_RAW lors de la création d’un socket, permet
l’accès aux interfaces internes du réseau. Ce mode n’est accessible qu’au super-utilisateur
et ne sera pas détaillé..
L’argument protocole dans l’appel système socket est généralement mis à 0. Dans certaines
applications spécifiques, il faut cependant spécifier la valeur du protocole. Les combinaisons
valides pour la famille AF_INET sont les suivantes :
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
22
4.3 - L’appel système connect
Un socket est initialement créé dans l’état non connecté, ce qui signifie qu’il n’est associé a
aucune destination éloignée. L’appel système connect associe de façon permanente un
socket a une destination éloignée et le place dans l’état connect..
Un programme d’application doit invoquer connect pour établir une connexion avant de
pouvoir transférer les donn.es via un socket de transfert fiable en mode connect.
Les sockets utilisées avec les services de transfert en mode datagramme n’ont pas besoin
d’établir une connexion avant d’être utilisés, mais procéder de la sorte interdit de transférer
des données sans mentionner à chaque fois, l’adresse de destination.
#include <sys/types.h>
#include <sys/socket.h>
int connect (int sockfd, struct sockaddr *servaddr , int addrlen) ;
Cet appel est généralement utilisé après les appels socket et bind et juste avant
les appels l’appel accept.
L’argument sockfd désigne le descripteur de socket sur lequel seront attendues les
connexions.
Peer est un pointeur vers une structure d’adresse de socket.
Lorsqu’une requête arrive, le système enregistre l’adresse du client dans la stucture *peer et
la longueur de l’adresse dans *addrlen. Il crée alors un nouveau socket connect. avec la
destination spécifie par le client, et renvoie à l’appelant un descripteur de socket. Les
changes futurs avec ce client se feront donc par l’intermédiaire de ce socket.
Le socket initiale sockfd n’a donc pas de destination et reste ouvert pour accepter de futures
demandes.
Tant qu’il n’y a pas de connexions le serveur se bloque sur cette appel.
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
23
Lorsqu’une demande de connexion arrive, l’appel système accept se termine. Le serveur
peut gérer les demandes itérativement ou simultanément :
for ( ; ; )
{
newsockfd = accept ( sockfd, .....) ;
if ( newsockfd < 0)
err_sys( ‘’erreur de accept’’) ;
execute_la_demande( newsockfd ) ;
close ( newsockfd ) ;
}
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
24
close ( newsockfd ) ;
}
#include <sys/types.h>
#include <sys/socket.h>
Pour le mode non connecté. on a deux appels sendto et sendmsg qui imposent
d’indiquer l’adresse de destination :
#include <sys/types.h>
#include <sys/socket.h>
int sendto (int sockfd, char *buff, int nbytes, int flags, struct sockaddr *to, int addrlen) ;
Les quatre premiers arguments sont les mêmes que pour send, les deux derniers
sont l’adresse de destination et la taille de cette adresse.
Pour les cas où on utiliserait fréquemment l’appel sendto qui nécessite beaucoup
d’arguments et qui serait donc d’une utilisation trop lourde on définit la structure suivante:
struct struct_mesg
{
int *sockaddr ;
int sockaddr_len ;
iovec *vecteur_E/S
int vecteur_E/S_len
int *droit_dÕacces
int droit_dÕacces_len
}
Cette structure sera utilisée par l’appel sendmsg :
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
25
int sendmsg ( int sockfd, struct struct_mesg, int flags ) ;
readv permet de mettre les donn.es lues dans des cases mémoire non contiguës.
Ces cases mémoires sont point.es par un tableau de pointeurs qui lui-même est point par
vect_E/S.
lgr_vect_E/S est la longueur de ce tableau.
Pour le mode sans connexion, il faut préciser les adresses des correspondants desquels on
attend des données.
int recvfrom (int sockfd, char *buff, int nbytes, int flags, struct sockaddr *from, int addrlen) ;
Pour les mêmes raisons que pour sendto et sendmsg, et pour des raison de symétrie on a
définie l’appel recvmsg qui utilise la même structure que sendmsg.
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
26
si plusieurs sockets sont susceptibles de recevoir des donn.es hors bande, l’appel de la
fonction select() permet de sélectionner le socket devant recevoir la donnée urgente. Pour
envoyer des donn.es hors bande, l’option MSG_OOB doit très utilisé lors de l’appel de
send() ou sendto().
LE MULTIPLEXAGE
L’appel système qui permet le multiplexage des sockets est select(). select() examine les
descripteurs qui lui sont passés en paramètre et teste si certains sont prêts . lire, écrire ou
ont une condition d’exception. Les données hors bande sont les seules conditions
d’exception que peut recevoir un socket. description de l’appel système select():
int select ( int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval
*timeout )
On ne s’attardera pas sur les structures pass.es en paramètre, seuls les fonctions qui
permettront leur manipulation seront d.taill.es. Les arguments 2, 3 et 4 de select sont des
pointeurs sur des structures qui contiendront les descripteurs de sockets à tester en lecture,
écriture et en réception d’exception par le select.
Le dernier argument timeout, s’il est non nul , spécifie l’intervalle de temps maximal .
attendre avant de sortir de select. Si ce pointeur est nulle select() bloquera
indéfiniment. Pour réaliser un polling sur select() ( i.e. select ne rendra la main que lorsqu’au
moins un descripteur aura été sélectionnée) le pointeur timeout doit être non nul mais
pointant sur une STRUCTURE timeval nulle.
Avant d’appeler select() , il faut initialiser ses arguments. On commencera toujours par les
initialiser à une structure nulle par la fonction FD_ZERO (fd_set &fdset).
void FD_SET ( int fd, fd_set &fdset ) ajoute le descripteur fd à fdset.
void FD_CLR ( int fd, fd_set &fdset ) retire le descripteur fd à fdset.
A la fin de select, la fonction int FD_ISSET ( int fd, fd_set &fdset ) nous permet de savoir si
le descripteur fd est sélectionnée dans fdset ou non. Cette fonction est à appeler après
select().
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
27
Dans l’approche parallèle, lorsque l’appel système accept se termine le serveur crée un
serveur fils chargé de traiter la demande (appel de fork et exec). Lorsque le fils à terminer il
ferme le socket et meurt. Le serveur maitre ferme quant à lui la copie du nouveau socket
après avoir exécuté le fork. Il appel ensuite de nouveau accept pour obtenir la demande
suivante.
L’enchainement des appels systèmes pour un serveur parallèle se résume par la figure
suivante:
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
28
6.2- Mode non connect.
Dans le cas d’un protocole sans connexion, les appels système sont différents. Le client
n’établit pas de connexion avec le serveur. Le client envoi un datagramme au serveur en
utilisant l’appel système sendto(). Symétriquement le serveur n’accepte pas de connexion
d’un client, mais attend un datagramme d’un client avec l’appel système recvfrom(). Ce
dernier revoie l’adresse réseau du client, avec le datagramme, pour que le serveur puisse
répondre à la bonne adresse. L’enchaînement dans le temps des appels systèmes pour une
communication en mode non connecté. et pour un serveur itératif se résume par la figure
suivante:
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
29
L’enchainement dans le temps des appels systèmes pour une communication en mode non
connecté. et pour un serveur parallèle se résume par la figure suivante:
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
30
VII - DES PROCEDURES BIEN UTILE
Pour que les programmes soient portables sur toutes les machines il faut pouvoir convertir
les représentations réseaux en représentation machine à chaque de paquet et vice et versa.
htonl (val) :
host to network long : convertit une valeur sur 32 bits de la représentation machine vers la
représentation réseau.
htons (val) :
host to network short : convertit une valeur sur 16 bits de la représentation machine vers la
représentation réseau.
ntohl (val) :
network to host long : convertit une valeur sur 32 bits de la représentation réseau vers la
représentation machine.
ntohs (val) :
network to host short : convertit une valeur sur 16 bits de la représentation réseau vers la
représentation machine.
La fonction gethostbyaddr ( rechercher une machine par son adresse) produit le même
résultat . La différence entre les deux est que cette fonction a pour argument l’adresse de la
machine.
ptr = gethostbyaddr (char *addr,int lgr,int type ) ;
addr pointe vers l’adresse de la machine.
lgr longueur de l’adresse.
type indique le type d’adresse ( adresse IP par exemple ).
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
33
CHAPITRE 4 : LES APPELS DE PROCEDURES A DISTANCE
Cette section présente d'abord les principes généraux des RPC, sans se fixer sur un
système particulier comme SUN RPC ou OSF DCE RPC (utilisé, notamment, par Microsoft).
Ensuite, SUN RPC, qui est typique, est présenté en détails.
1.1- Définition
Les appels de procédures éloignées (Remote Procedure Calls) permettent d'appeler des
procédures en dehors de l'espace d'adressage du processus
Les RPC permettent d'écrire des applications réparties qui peuvent exploiter des ressources
réparties dans tout le réseau.
Un système RPC est une manière de prendre en charge la répartition dans une application
informatique
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
34
1.2- Les RPCS en général
1. Le processus client appelle une procédure locale: la souche cliente ("client stub").
2. La souche cliente emballe l'identification et les arguments de la procédure dans un
format normalisé et les envoie en un ou plusieurs messages sur le réseau.
3. Le réseau transmet les messages au système distant.
4. La souche serveur ("server stub") (un programme) reçoit et déballe les messages.
5. La souche serveur appelle la procédure locale demandée avec les arguments reçus
de la souche cliente.
6. Quand la procédure est terminée, elle renvoie ses résultats à la souche serveur.
7. La souche serveur emballe les résultats dans un format normalisé et les envoie en un
ou plusieurs messages sur le réseau.
8. Le réseau transmet les messages au système client.
9. La souche cliente reçoit et déballe les messages.
10. La souche cliente renvoie les résultats comme une procédure ordinaire.
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
35
III- PROBLEMES DE TRANSPARENCE DES RPC
o comment?
o quand?
o à qui?
• Sémantique de l'appel
Une procédure locale est exécutée exactement une fois.
Une procédure éloignée peut être exécutée
o exactement une fois,
o au moins une fois,
o au plus une fois.
• Performance: Perte d'un facteur 10 à 100 par rapport à un appel de procédure local.
Sécurité
• Permettre à un programme distant d'exécuter une procédure sur votre système est
comparable à lui permettre d'y exécuter une commande :chaque demande doit être
examinée du point de vue sécurité.
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
37
Sun RPC: un survol
Présentation
• Sun RPC est un environnement développé par Sun pour permettre la conception
d'applications réparties basées sur le paradigme d'Appels de Procédures Eloignées.
• Cet environnement a été construit sur base des sockets, mais peut maintenant
s'utiliser sur n'importe quel type d'interface réseau.
• Les détails des sockets sont tout-à-fait cachés aux utilisateurs.
• Il est possible d'utiliser seulement certaines composantes de l'environnement RPC
pour certaines applications. Dans ce cas, les sockets, ou une interface réseau
similaire peut être visible.
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
38
Schéma d'une application RPC
Chaque procédure RPC est définie par un numéro de programme, un numéro de version
et un numéro de procédure.
L'appelant d'une procédure éloignée doit utiliser ces trois nombres pour désigner cette
procédure.
Certaines applications bien connues ont reçu un numéro de programme repris dans /etc/rpc).
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
39
o transport fiable –> sémantique=au plus une fois (pour autant qu'il n'y ait pas
de bogue dans le serveur) !): le seul problème possible est une coupure de la
connexion;
o transport non fiable –> grâce aux retransmissions sur time-out du système,
sémantique=au moins une fois (les time-out doivent être gérés par le
programmeur): ceci convient pour les procédures idempotentes.
• sémantique=au plus une fois peut être obtenue même avec un protocole non fiable
dans certaines des implémentations des RPC:
o dans le protocole Sun RPC, chaque appel d'un client est identifié par un
identificateur de transaction de 32 bits: le xid;
o avec un transport par datagramme (comme UDP), on peut demander au
serveur de maintenir une cache des réponses aux dernières transactions qu'il
a traitées (indexé par xid, prog., vers., proc. et adresse UDP du client);
o si, suite à une erreur réseau ou à un time-out, la souche cliente renvoie à
nouveau la même requète, le serveur ne répète pas l'opération, mais renvoie
le résultat précédent gardé dans sa cache.
o L'utilisateur est responsable de la taille de la cache et de la valeur du time-out
de retransmission; en cas de mauvais choix, le comportement est
imprévisible!
• Lorsque ce service n'est pas disponible, le programmeur peut l'implémenter lui-
même.
• Grâce à XDR, Sun RPC accepte n'importe quelles structures de données dans les
arguments et résultats, indépendamment de
o l'ordre des bytes dans les mots des différentes machines,
o les conventions de représentation en mémoire des structures de données.
• RPC convertit les structures de données dans le format XDR avant de les envoyer
sur le réseau (sérialisation),
• convertit dans le format local les données reçues encodées en XDR (désérialisation).
• Des outils sont disponibles pour construire automatiquement les procédures de
sérialisation et désérialisation.
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
40
Ces outils sont basés sur un langage de description des structures de données
(XDRL) assez proche de C.
Le portmapper est un service destiné à localiser une procédure distante sur un hôte
donné:
• la localisation est le numéro du port par lequel le serveur attend les requêtes pour les
procédures d'une version donnée d'un certain programme;
• le serveur doit s'être enregistré auprès du portmapper en communiquant à celui-ci le
numéro de port sur lequel il attend les requêtes concernant les procédures de cette
version de ce programme ;
• la souche cliente consulte le portmapper de la machine du serveur pour découvrir ce
numéro de port.
•
Souvent, quand un client envoie une requête (des paramètres), il est bloqué jusqu'à la
réception d'une réponse.
L'objectif des RPC est de faire en sorte qu'un appel distant ressemble le plus possible à un
appel local
o Le processus client (l'appelant) est lié à une petite procédure de bibliothèque,
appelée stub client, qui représente la procédure du serveur dans l'espace
d'adressage du client
o Le processus serveur (l'exécutant) est lié à un stub serveur qui représente l'exécution
du client
o Dissimule le fait que l'appel de la procédure n'est pas local : le programmeur de
l'application utilise un appel de procédure "normal"
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
42
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
43
CHAPITRE 5 : LA PROGRAMMATION RESEAU TCP ET UDP EN C
I- PREAMBULE
Le réseau doit être configuré de la manière suivante :
II- UDP
Récupérez le programme les programmes : udpc1.c (client UDP en C), udps1.c (serveur
UDP en C).
(a) vérifiez avec la commande ps -aux que le programme serveur udps1 est bien en
cours d’exécution et qu’il n’y en a qu’un seul
(b) vérifiiez avec la commande netstat -a -n que le port UDP/5000 est effectivement
ouvert
(c) lancez l’exécution du client udpc1
4. lisez les deux programmes udpc1.c et udps1.c et déduisez-en le protocole applicatif
dont vous dessinerez le diagramme.
5. lancez wireshark et relancez l’exécution de udpc1 et udps1. Verifiez que votre
diagramme d’´échange est correct.
6. lancez udps1 et udpc1 sur deux ordinateurs séparées. Vous prendrez soin de
modifier udpc1.c pour atteindre l’adresse adaptée.
III- TCP
Mêmes questions avec les programmes simples client/serveur TCP en C: tcp1c.c, tcp1s.c
IV- ANNEXE
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
44
4.1- Programmation en C avec les sockets
Structure sockaddr in (IPv4) Point de communication défini par une adresse et un port.
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
45
famille : famille de protocole utilisée (PF INET pour IP)
type : type de service (orientée connexion ou non).
o SOCK STREAM : mode connecté (TCP)
o SOCK DGRAM : mode déconnecté (UDP)
o SOCK RAW : (IP)
protocole : protocole permettant de fournir le service desiré. Dans le cas d’IP, on le
mettra ainsi toujours à 0 (le système choisit).
Options de la socket : setsockopt Manipule les options associées à une socket.
level : à quel niveau il faut interpréter les options (socket ? TCP?) En général
SOL SOCKET.
optname : options binaires :
SO KEEPALIVE : gardant la socket ouverte pour les sockets orientées
connexion
SO REUSEADDR : autoriser la reutilisation des adresses locales
SO LINGER : un appel close ou shutdown ne se terminera pas avant que tous
les messages en attente pour la socket aient été correctement émise ou que
le délai soit ´écoulé
SO BROADCAST Fixer ou lire l’attribut broadcast
s la socket
adr l’adresse. Structure sockaddr in pour IPv4, sockaddr in6 pour IPv6.
lg est la taille de adr
Programmation TCP
Le serveur :
1. créée une socket (SOCK STREAM)
2. définit un point de communication sockaddr in
3. (INADDR ANY, port d’ecoute)
4. utilise bind pour lier les deux
5. place la socket en mode ouverture passive avec listen
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
46
6. attend une connexion d’un client avec accept sur la socket d’´écoute.
7. le dialogue se fait par read/write ou send/recv par la socket de dialogue renvoyée par
accept.
8. la socket de dialogue et la socket d’´écoute sont fermées (close).
Le client :
1. créée une socket (SOCK STREAM)
2. se connecte au serveur (désignée par un point de communication ”adresse IP du
serveur, numéro de port d’écoute du serveur”) avec connect
3. le dialogue se fait par read/write ou send/recv par la
4. socket.
5. la socket est fermée (close)
serveur : listen Pour indiquer que la socket pourra accepter des connexions entrantes.
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
47
Assure la connexion vers le serveur
Utilisée uniquement par le client
serv addr l’adresse+port du serveur à contacter
serv len la longueur de serv addr
retourne 0 si la connexion s’est bien déroulée, sinon -1.
s : la socket
buffer : tampon contenant les octets `a envoyer au client
len : nombre d’octets `a envoyer
renvoie le nombre d’octets effectivement envoy´es
s : la socket
buffer : tampon contenant les octets à envoyer au client
len : nombre d’octets à envoyer
flags : type d’envoi :
MSG DONTROUTE : les données ne routeront pas
MSG OOB : les données urgentes (Out Of Band) doivent être envoyées
le flag 0 : envoi normal
renvoie le nombre d’octets effectivement envoyées
s : la socket
buffer : tampon qui sera rempli avec les octets reçus
len : nombre d’octets à lire
read est une fonction bloquante
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
48
s : la socket
buffer : tampon qui sera rempli avec les octets reçus
len : nombre d’octets `a lire
flags : type de lecture :
MSG PEEK : les données lues ne sont pas retirées de la file de réception
MSG OOB : les données urgentes (Out Of Band) doivent être lues.
le flag 0 : lecture normal
renvoie le nombre d’octets effectivement lus.
recv est une fonction bloquante.
La fonction shutdown() permet la fermeture d’un socket dans un des deux sens (pour une
connexion full-duplex) ou les deux :
Programmation UDP
Etapes de la programmation UDP Suivant le dialogue, chaque participant est tour à tour
receveur et expéditeur.
Le receveur
1. crée une socket (SOCK DGRAM)
2. définit un point de communication sockaddr in (INADDR ANY, port d’´ecoute)
3. utilise bind pour lier les deux
4. reçoit les messages avec rcvfrom
5. ferme la socket avec close
L’expéditeur
1. crée une socket (SOCK DGRAM)
2. définit un point de communication sockaddr in (INADDR ANY, 0)
3. utilise bind pour lier les deux
4. cree le message `a envoyer, et le point de communication décrivant le destinataire
sockaddr in (adresse + port)
5. envoie les messages avec sendto à cette adresse.
6. ferme la socket avec close
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
49
sendto Envoyer un message en mode non connecté
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
50
4.3- Programmation en C avec les chaines
Fonctions de manipulation de chaines :
remplit la chaine ch de n caractères nuls bzero (char *ch, int n)
copie la chaine src dans la chaine dest. char *strcpy(char *dest, const char
*src)
4.4- Outils
Tests de protocoles
Etablissement d’un dialogue TCP : telnet <adresse à atteindre> <numéro de port> (pour
quitter : Ctrl AltGr ] en mode X ou Ctrl AltGr $ en mode console)
Emulation d’un client ou d’un serveur en TCP ou en UDP : netcat (ou nc) :
Client TCP : nc host port On peut également utiliser telnet adresse numéro de
port
Serveur TCP : nc -l -p port
Client UDP : nc -u host port
Serveur UDP : nc -u -l host -p port
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
51
BIBLIOGRAPHIE
WEBOGRAPHIE
1- http://www.commentcamarche.net/contents/221-reseaux-architecture-client-serveur-
a-3-niveaux
2- http://perso.univ-lyon1.fr/olivier.gluck/Cours/Supports/M2SIR_CS/SPAI-C1-ArchiC-
S.pdf
3- http://www.info.uqam.ca/~obaid/INF4481/A01/Plan.htm
Support de cours sur l’architecture client – serveur et les sockets – Enseignant : Edgard NDASSIMBA
52