Anda di halaman 1dari 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
Communication entre processus : un client, lautre serveur, qui cooprent. Cette coopration seffectue sous la forme dun change de donnes. Le client reoit les rsultats naux dlivrs par le serveur.

3/32

Utilisation du modle C/S


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 scientique etc.

4/32

Les modes de connexion


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. 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
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 : offre un point dentre sur le rseau entre dans une boucle innie dattente de requtes la rception dune requte, dclenche les processus associs la requte, puis met la rponse vers le client Deux types de serveurs : itratifs : ne grent quun seul client la fois parallles : fonctionnent en mode concurrent

7/32

Choix du type de serveur


Serveurs itratifs en mode non-connect : pour les services qui ncessitent trs peu de traitements par requte. Par exemple, un serveur de temps. Serveurs itratifs en mode connnect : pour les services qui ncessitent trs peu de traitements par requte, mais ont besoin dun transport able. 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
Interface client/serveur utilise lorigine dans le monde UNIX et TCP/IP. Fournit les primitives pour le support des communications reposant sur le protocole IP. Les applications client et serveur ne voient les couches de communication qu travers lAPI socket.

9/32

Dnition des sockets


Les sockets peuvent tre vues comme un point daccs par lequel un processus peut envoyer ou recevoir des donnes. La socket se prsente sous la forme dun descripteur de chier. 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


Il existe diffrents types de sockets dtermines selon les proprits de la communication que lon veut tablir. 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 : Type Dcrit la manire dont les donnes sont transmises : SOCK_DGRAM, SOCK_STREAM, SOCK_RAW. Domaine Dnit la nommage des sockets et les formats dadressage utiliss : AF_UNIX, AF_INET, AF_INET6, AF_X25. 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


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

13/32

Le domaine dadressage
Domaine AF_UNIX : pour les processus qui communiquent sur la mme machine. 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
Lorsquun processus serveur veut fournir des services, il a besoin dun port dattache pour la localisation de ses services. Un certain nombre de numros est rserv aux services standards. Pour le serveur, les ports infrieurs 1024 ne peuvent tre utiliss que par le super-utilisateur root. Les numros de port standard sont dnis dans le chier /etc/services, et accessibles via la commande getservbyname().

15/32

Structures de socket

Les structures sockaddr et sockaddr_in sont dnies 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, PF_INET); s est lidenticateur de la socket. On peut lutiliser pour les oprations de lecture/criture.

17/32

Gestion des connexions


bind() permet dassocier une adresse une socket : int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen) connect() est utilise par le client pour tablir la connexion : int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen) ; listen() est utilise par le serveur pour tablir la connexion : int listen(int s, int backlog) ; 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) ; shutdown() et close() permettent de fermer une connexion : int shutdown(int s, int how) ;
18/32

Transfert en mode connect

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); On peut prciser des options dans les champs flags. Par exemple, MSG_OOB pour les donnes urgentes. Attention : send() peut nenvoyer quune partie des donnes. Ne pas oublier de vrier sa valeur de retour... 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()
Connexion etablie

accept()

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

sendto()

Client

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


Fonction select()

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

24/32

Transfert en mode non-connect

Aussi appel mode datagramme. 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


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) unsigned long int htonl(unsigned long int hostlong) ; Convertit une valeur dans lencodage rseau en une valeur dans lencodage local. unsigned short int htons(unsigned short int hostshort) ; Idem pour des valeurs short. unsigned long int ntohl(unsigned long int netlong) ; Convertit une valeur dans lencodage local en une valeur dans lencodage rseau. unsigned short int ntohs(unsigned short int netshort) ; Idem pour des valeurs short

26/32

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

27/32

Encapsulation des donnes


Ethernet IP UDP TFTP
Data

28/32

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

29/32

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

30/32

Inetd
inetd : exemple de super-serveur UNIX Dclenche lexcution de programmes lors dune connexion sur un port particulier Les services sont nomms dans le chier /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
Conguration 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

Anda mungkin juga menyukai