Vous êtes sur la page 1sur 32

La programmation client-serveur

Olivier Aubert

1/32

Sources
http://www.info.uqam.ca/~obaid/INF4481/A01/Plan.htm
http://bat710.univ-lyon1.fr/~exco/COURS/clientserveur.html
man 2 socket
http://www.developerweb.net/sock-faq/ FAQ socket
RFC 791 (IP), RFC 793 (TCP), RFC 768 (UDP)
Richard Stevens, UNIX Network Programming

2/32

Le modle client-serveur
I Communication entre processus : un client, lautre serveur,
qui cooprent.
I Cette coopration seffectue sous la forme dun change de
donnes. Le client reoit les rsultats finaux dlivrs par le
serveur.

3/32

Utilisation du modle C/S


I Stend de plus en plus vers tous les domaines dactivits :
World Wide Web
Gestion de bases de donnes
Systmes transactionnels
Systmes de messagerie
Systmes de partage de donnes
Calcul scientifique
etc.

4/32

Les modes de connexion


I Le mode non connect
ne garantit pas :
 lintgrit des donnes
 lordonnancement des donnes
 la non-duplication des donnes
Ces proprits doivent tre garanties par lapplication.
I Le mode connect :
garantit les proprits ci-dessus
implique une diminution des performances brutes par
rapport au mode non-connect. Peut constituer une
contrainte.
Permet une implmentation asynchrone des changes

5/32

Les clients
I Une application cliente est moins complexe quune
application serveur.
La plupart des applications clientes ne grent pas
dinteractions avec plusieurs serveurs.
La plupart des applications clientes sont traites comme un
processus conventionnel ; un serveur peut ncessiter des
accs privilgis.

6/32

Les serveurs
Le processus serveur :
I offre un point dentre sur le rseau
I entre dans une boucle infinie dattente de requtes
I la rception dune requte, dclenche les processus
associs la requte, puis met la rponse vers le client
I Deux types de serveurs :
itratifs : ne grent quun seul client la fois
parallles : fonctionnent en mode concurrent

7/32

Choix du type de serveur


I Serveurs itratifs en mode non-connect :
pour les services qui ncessitent trs peu de traitements par
requte. Par exemple, un serveur de temps.
I Serveurs itratifs en mode connnect :
pour les services qui ncessitent trs peu de traitements par
requte, mais ont besoin dun transport fiable.
I Serveurs concurrents en mode non-connect :
Temps de cration dun processus extrmement faible par
rapport au temps de traitement dune requte.
Les requtes ncessitent des accs priphriques
importants.

8/32

Les sockets
I Interface client/serveur utilise lorigine dans le monde
UNIX et TCP/IP.
I Fournit les primitives pour le support des communications
reposant sur le protocole IP.
I Les applications client et serveur ne voient les couches de
communication qu travers lAPI socket.

9/32

Dfinition des sockets


I Les sockets peuvent tre vues comme un point daccs par
lequel un processus peut envoyer ou recevoir des donnes.
I La socket se prsente sous la forme dun descripteur de
fichier.
I Les sockets sont une interface daccs au rseau au dessus
du service transport. Cest une interface souple mais de bas
niveau.

10/32

Structure des sockets


I Il existe diffrents types de sockets dtermines selon les
proprits de la communication que lon veut tablir.
I Les proprits que lon peut choisir sont :
respect de la squentialit des envois
viter les doubles envois
messages caractre urgent
mode connect

11/32

Caractristiques des sockets


Une socket possde trois caractristiques :
I Type Dcrit la manire dont les donnes sont transmises :
SOCK_DGRAM, SOCK_STREAM, SOCK_RAW.
I Domaine Dfinit la nommage des sockets et les formats
dadressage utiliss : AF_UNIX, AF_INET, AF_INET6,
AF_X25.
I Protocole Dcrit le protocole de communication utiliser
pour mettre et recevoir les donnes. Gnralement
dtermin par le domaine : PF_UNIX, PF_INET, PF_INET6,
PF_X25.

12/32

Les domaines des sockets


I Le domaine dune socket permet de spcifier le mode
dadressage et lensemble des protocoles utilisables par la
socket.
I Les domaines dadressage les plus courants sont Unix
(AF_UNIX) et IP (AF_INET), voire IPv6 (AF_INET6).

13/32

Le domaine dadressage
I Domaine AF_UNIX : pour les processus qui communiquent
sur la mme machine.
I Domaine AF_INET : pour les processus qui communiquent
travers le rseau IP. Les protocoles disponibles sont TCP/IP
ou UDP/IP, voire IP.

14/32

Adressage
I Lorsquun processus serveur veut fournir des services, il a
besoin dun port dattache pour la localisation de ses services.
I Un certain nombre de numros est rserv aux services
standards.
I Pour le serveur, les ports infrieurs 1024 ne peuvent tre
utiliss que par le super-utilisateur root.
I Les numros de port standard sont dfinis dans le fichier
/etc/services, et accessibles via la commande
getservbyname().

15/32

Structures de socket

Les structures sockaddr et sockaddr_in sont dfinies


comme suit :
struct sockaddr {
sa_family_t
sa_family;
/* domaine */
char
sa_data[14];
/* adresse eff
}
struct sockaddr_in {
sa_family_t
unsigned short int
struct in_addr
unsigned char
}

sin_family;
/* domaine
sin_port;
/* numro de po
sin_addr;
/* adresse IP
__pad[__SOCK_SIZE__ - ...] /*

16/32

Cration dune socket


On cre une socket avec la primitive socket() :
s = socket (AF_INET, SOCK_STREAM, 0);
s est lidentificateur de la socket. On peut lutiliser pour les
oprations de lecture/criture.

17/32

Gestion des connexions


I bind() permet dassocier une adresse une socket :
int bind(int sockfd, struct sockaddr *my_addr,
socklen_t addrlen)
I connect() est utilise par le client pour tablir la connexion :
int connect(int sockfd, const struct sockaddr
*serv_addr, socklen_t addrlen);
I listen() est utilise par le serveur pour tablir la
connexion :
int listen(int s, int backlog);
I accept() est utilise par le serveur pour indiquer quil est
prt accepter des connexions. Appel gnralement
bloquant :
int accept(int s, struct sockaddr *addr,
socklen_t *addrlen);
I shutdown() et close() permettent de fermer une
connexion :
int shutdown(int s, int how);
18/32

Transfert en mode connect

I Les commandes send() et recv() permettent dchanger


des donnes :
int send(int s, const void *msg, size_t len, int fl
int recv(int s, void *buf, size_t len, int flags);
I On peut prciser des options dans les champs flags. Par
exemple, MSG_OOB pour les donnes urgentes.
I Attention : send() peut nenvoyer quune partie des
donnes. Ne pas oublier de vrifier sa valeur de retour...
I Il est galement possible dutiliser les appels read() et
write() qui offre moins de possibilits de contrle.

19/32

Client-serveur en mode connect


Dans ce mode, on tablit dabord une connexion. On peut
ensuite transfrer des donnes travers le tuyau cr.
socket()

bind()

socket()

listen()

connect()

accept()
Connexion 'etablie

read()/write()

Transfert de donnees

read()/write()

shutdown()

shutdown()

Client

Serveur
20/32

Client-serveur en mode non-connect


Dans ce mode, on ntablit pas de connexion au pralable.
socket()
socket()
bind()

bind()
recvfrom()

sendto()

donnees

sendto()
donnees

Client

sendto()

Serveur
21/32

Serveur squentiel
Le serveur ne peut grer quune connexion la fois :
s = socket (...);
bind (...);
listen (s, ...);
for (;;) {
ns = accept (s, ...);
executer_service (ns, ...);
close (ns);
}

22/32

Serveur concurrent
Le serveur peut grer plusieurs connexions en parallle :
s = socket (...);
bind (...);
listen (s, ...);
for (;;) {
ns = accept (s, ...);
if (fork() == 0) {
close (s);
executer_service (ns, ...);
close (ns);
} else {
close (ns);
}
}

23/32

Autre gestion de la concurrence

I Fonction select()
I
int select(int n, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
I Manipulation des fdsets : FD_ZERO, FD_SET, FD_CLR,
FD_ISSET

24/32

Transfert en mode non-connect

I Aussi appel mode datagramme.


I On utilise les commandes sendto() et recvfrom().
int
sendto(int s, const void *msg, size_t len, int flags
const struct sockaddr *to, socklen_t tolen);
int
recvfrom(int s, void *buf, size_t len, int flags
struct sockaddr *from, socklen_t *fromlen);

25/32

Les conversions de donnes


I Exemple de big endian/little endian :
12 34 56 78 (Little endian - Motorola)
78 56 34 12 (Big endian - Intel)
Network order : 12 34 56 78 (little endian)
I unsigned long int htonl(unsigned long int
hostlong);
Convertit une valeur dans lencodage rseau en une valeur
dans lencodage local.
I unsigned short int htons(unsigned short int
hostshort);
Idem pour des valeurs short.
I unsigned long int ntohl(unsigned long int
netlong);
Convertit une valeur dans lencodage local en une valeur
dans lencodage rseau.
I unsigned short int ntohs(unsigned short int
netshort);
Idem pour des valeurs short

26/32

Traduction dadresses
I Un nom de machine (bat710.univ-lyon1.fr) peut tre
converti en adresse IP (134.214.88.10) par la commande
gethostbyname().
I Les donnes ncessaires sont stockes en local (fichier
/etc/hosts) ou sur des serveurs DNS.
I Fonction inverse : gethostbyaddr.

27/32

Encapsulation des donnes


Ethernet

IP

UDP TFTP

Data

28/32

Options
I setsockopt : permet de spcifier des options sur les
connexions
I SO_REUSEADDR
I SO_PRIORITY
I SO_DONTROUTE
I SO_BROADCAST

29/32

Obtention dinformations
I getpeername : retourne le nom de la machine connecte
une socket

30/32

Inetd
I inetd : exemple de super-serveur UNIX
I Dclenche lexcution de programmes lors dune connexion
sur un port particulier
I Les services sont nomms dans le fichier /etc/services :
echo
7/tcp
echo
7/udp
daytime
13/tcp
daytime
13/udp
ssh
22/tcp
telnet
23/tcp
smtp
25/tcp
mail
tftp
69/udp

# SS

31/32

Inetd.conf
Configuration de inetd
# <service_name> <sock_type> <proto> <flags> <user> <server_path> <args>
daytime
stream tcp
nowait root
internal
telnet
stream tcp
nowait telnetd.telnetd /usr/sbin/in.telnetd
smtp
stream tcp
nowait mail
/usr/sbin/exim exim -bs
ident
stream tcp
wait
identd /usr/sbin/identd
identd

32/32