You are on page 1of 8

31/10/2011

1
2 BTS DSI
Programmation
Client / Serveur
Sockets
V.1
Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 1
Dfinition
Socket : Canal de communication permettant un
processus denvoyer ou recevoir des donnes.

Elments logiciels permettant une communication entre
processus.
La communication interprocessus peut-tre locale ou
distante. Les sockets rseau permettent 2 processus
sexcutant sur deux machines diffrentes de communiquer.
Elles sont bidirectionnelles.

Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 2
Technologies de communication rseau
Deux technologies principales :
La commutation de circuits:
Equipements intermdiaires entre la machine source
et la machine destination : une fois le circuit tabli, il
n'est pas possible de le modifier pour la
communication en cours.

Sil y a panne, la communication est coupe.
Le cas de surcharge, il n'est pas possible d'en changer
pour en utiliser un autre.
Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 3
Technologies de communication rseau
La commutation de paquets
Dcoupage des informations en paquets, dont chacun est expdi
sur le rseau indpendamment des autres.
Le routeur, est charg d'aiguiller les paquets dans la bonne
direction, vers le routeur suivant.
Le routage statique : les paquets envoys vers tel rseau doivent
passer par tel routeur.
Le routage dynamique : dialogue entre routeurs permet de
modifier le routage suivant l'tat du rseau.
si un routeur tombe en panne les paquets empruntent un autre
chemin.
si un chemin est surcharg, le routage achemine les paquets par
un chemin moins embouteill.
Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 4
31/10/2011
2
Le protocole IP
IP (Internet Protocol) : Protocole de commutation de paquets.
Chaque machine relie un rseau IP se voit attribuer une adresse,
dite adresse IP . exemple : 172.112.115
DNS (Domain Name System) : convertir les noms en adresses IP
et vice versa.
Chaque paquet IP contient deux parties :
L'en-tte:
contient :
.l'adresse IP de la machine source ;
.l'adresse IP de la machine destination ;
.la taille du paquet.
Le contenu du paquet : les donnes transmettre.
Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 5
Le protocole IP
IP ne garantit pas que les paquets mis soient reus par leur
destinataire.

Deux protocoles volus ont t btis au-dessus d'IP :

UDP (User Datagram Protocol)

TCP (Transmission Control Protocol)

Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 6
Le protocole UDP
UDP (User Datagram Protocol) : protocole trs simple.
Ajoute deux fonctionnalits au-dessus d'IP :
L'utilisation de numros de ports par l'metteur et le
destinataire : faire la distinction entre les processus.
Contrle d'intgrit sur les paquets reus.

Un paquet UDP est compos de trois parties :
1. l'en-tte IP ;
2. l'en-tte UDP : contient les numros de ports ainsi que le
code de contrle d'intgrit ;
3. le contenu du paquet.

UDP ne permet pas de grer la retransmission des paquets en cas de perte

Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 7
Le protocole TCP
TCP (Transmission Control Protocol) : tablis un canal
bidirectionnel entre deux processus.
Un paquet TCP est donc compos de trois parties :
1. l'en-tte IP ;
2. l'en-tte TCP : contient, entre autres, les numros de ports
source et destination, et le code de contrle d'intgrit ;
3. le contenu du paquet.
Contrairement UDP,
TCP gre lui-mme le dcoupage des donnes en paquets, le
recollage des paquets dans le bon ordre et la retransmission des
paquets perdus si besoin.
TCP s'adapte galement la bande passante disponible en
ralentissant l'envoi des paquets.
Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 8
31/10/2011
3
SocketsDfinition
Une Socket : un canal (lments logiciels) de communication
permettant un processus denvoyer ou recevoir des donnes.

Disponible dans diffrents langages (C, Java ...)
Cette interface permet la programmation dapplications
client/serveur:

Le serveur se met en attente de demandes (passif)
Le client initie le dialogue par une demande (actif)

Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 9
Sockets
On distingue ainsi deux modes de communication:
Le mode connect (comparable une communication
tlphonique), utilisant le protocole TCP. Dans ce mode de
communication, une connexion durable est tablie entre les deux
processus, de telle faon que l'adresse de destination n'est pas
ncessaire chaque envoi de donnes.






Le mode non connect (analogue une communication par
courrier), utilisant le protocole UDP. Ce mode ncessite l'adresse de
destination chaque envoi, et aucun accus de rception n'est donn
Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 10
Sockets Analogie avec le tlphone
On peut comparer une socket un tlphone:
Les applications qui utilisent ces sockets sont les
utilisateurs des tlphones
Un utilisateur : un processus sexcutant sur un
ordinateur
Un utilisateur demandeur : cest le client, cest lui qui
compose le numro
Un utilisateur en attente de coup de fil: cest le serveur,
il dcroche
Une fois la communication tablie, elle est bi-
directionnelle et symtrique

Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 11
Utilisation dune application
client/serveur
On lance le client en lui donnant le nom DNS ou ladresse IP
du serveur connecter
Lapplication consulte lannuaire DNS : Nom ->Adresse IP
Elle demande une connexion avec la socket du serveur
(Adresse IP serveur , Numro de Port)
La socket ct client est (@IP client, Port): port libre ce
moment sur la machine o tourne le client.
Il faut quun serveur soit lanc sur la machine destination
Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 12
31/10/2011
4
Numros et annuaires
Identification dun point daccs laide de:

Une adresse IP: identifie la machine dans le rseau
Un numro de port: identifie lapplication sur la machine

Annuaires disponibles:
Local Nom/adresses : fichier systme sur la machine (/etc/hosts)
Global Nom/adresses IP: le DNS (Domain Name System)
Local Application/numro de port : fichier systme sur la machine
(/etc/services)

Numro de port attribus aux applications standards (rservs < 1024)
Ceux sont les numros de port des sockets des serveurs (srvices).
Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 13
Accs lannuaire
Rcupration de ladresse partir du nom:

struct hostent *gethostbyname (char *nom)

Retourne un pointeur sur une structure contenant les adresses IP
correspondant au nom.
Rcupration du numro de port partir du nom du service
(donn dans /etc/services):

struct servent *getservbyname(char *nom, char *protocole)

Retourne un pointeur sur une structure contenant le numro de port
correspondant au nom et au protocole associ
Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 14
Accs son adresse et numro de port
Rcupration de sa propre adresse:
Permet de dfinir la socket locale:

int gethostname (char *nom, int longueur_nom)
renseigne le nom de la machine sur laquelle sexcute la procdure.

Rcupration dun numro de port allou dynamiquement

int getsockname(int socket, struct sockaddr_in *p_ad_s, int*len)

*len doit contenir la longueur de la structure sockaddr_in
Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 15
Algorithme dun client en mode connect
Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 16
31/10/2011
5
Algorithme dun serveur en mode connect
Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 17
Cration de la socket
int socket (int domaine, int mode, int protocole)
Retourne un identificateur (local) de socket (entier qui est un descripteur de fichier),
-1 en cas derreur
domaine:
- AF-INET : permet 2 processus distants de communiquer.
- PF-INET : 2 processus locales (interne la machine)
mode:
- SOCK_STREAM (pour TCP),
- SOCK_DGRAM (pour UDP),
- SOCK_RAW (pour IP)
protocole:
- associ au mode
(IPPROTO_UDP, IPPROTO_TCP, IPPROTO_RAW, IPPROTO_ICMP)
Exemple dune socket rseau TCP :
int sd = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP);

Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 18
Adresse des sockets
Une socket est associe une adresse/port .
Les adresses utilisent la structure sockaddr_in dfinie dans <winsok2.h> :
struct sockaddr_in {
short sin_family; /* famille de protocole (AF_INET) */
u_short sin_port; /* numro de port contacter */
struct in_addr sin_addr; /* adresse IP de l'hte*/
char sin_zero[8]; /* initialis zro */
}
Exemple dune socket rseau TCP :
#define IP "192.168.1.11"
struct sockaddr_in adresse;
memset(&adresse,0,sizeof(struct sockaddr_in)); //initialisation de l@
adresse.sin_family=AF_INET; // deux processus distants
adresse.sin_port=htons(7000); // Numro de port de la socket: 7000
adresse.sin_addr.s_addr=inet_addr(IP); // adresse IP
- Les primitives htons() et inet_addr() sont utilses pour obtenir le format adquat
- le champ sin_port 0 laisse au systme le choix dun numro de port.
- pour associer une socket toutes des adresses IP du rseau : remplir sin_addr par INADDR_ANY
Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 19
Prciser une adresse la socket
La fonction bind()
Une fois la socket cre, il est possible de lui attacher une adresse qui sera
son adresse locale. On attache une adresse une socket l'aide de bind().
int bind (
int descr, /* descripteur de la socket */
struct sockaddr *addr, /* adresse et port attacher */
int addr_size /* taille de l'adresse */
);
La fonction bind() renvoie 0 en cas de succs et -1 sinon.
Exemple dune socket rseau TCP :
if (bind(sd,(struct sockaddr*) &adresse, sizeof(adresse) == -1)
{
perror("Attachement de la socket impossible");
}
Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 20
31/10/2011
6
Connexion au serveur

Il faut prciser les numros du destinataire (serveur)

Il faut remplir une structure sockaddr_in avec les
numros du destinataire

Puis appeler la fonction dtablissement de communication
Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 21
Demande de connexion a un serveur
La fonction connect()
Il s'agit ici d'tablir une connexion avec une machine distante afin de
pouvoir communiquer par lenvoi de flux de caractres.
int connect (
int descr, /* descripteur de la socket */
struct sockaddr *addr, /* adresse et port attacher */
int addr_size /* taille de l'adresse */
);
La fonction connect() renvoie -1 en cas derreur.
Exemple :
if (connect(sd,(struct sockaddr*) &adresse, sizeof(adresse) == -1)
{
perror( erreur de connection");
}
Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 22
Attente dappel sur le serveur
Comme pour le client il faut construire une socket et lui affecter des
numros (bind())
Ensuite il faut se tenir prt recevoir une demande des clients. Cest le
rle de La fonction listen()
int listen (
int desc, /* descripteur de la socket */
int nb_pendantes /* nombre maximal de connexions en attente */
);
La fonction listen() renvoie 0 en cas de succ et -1 en cas derreur.
Exemple :
if (listen(sd, 10) == -1)
{
perror( erreur de connection");
}
Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 23
Autoriser les demandes de connexion
Le serveur peut accepter une demande de connexion sur une socket
prcdemment mise en attente par listen()
int accept (
int desc, /* descripteur de la socket */
struct sockaddr *ptr_adresse, /* adresse de lmetteur (lappelant)*/
int *long_adresse /* taille de la zone adresse */
);
- La fonction accept() renvoie un nouveau descripteur pour le socket qui accepte les
connexions. les changes se fait sur cette nouvelle socket.
- Cette fonction est bloquante si il ny a pas eu de demande de connexion de client
Exemple :
SOCKET sv;
int taille=sizeof(adresse);
if (sv =accept(sd,(struct sockaddr*) &adresse, &taille))==-1)
perror( Erreur dacceptation");

Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 24
31/10/2011
7
Communication avec TCP
Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 25
Ecriture de donnes en mode connect
Une fois la connexion est tablie le client peut envoyer et recevoir des
donnes, le serveur aussi (aprs accept())
La communication peut alors se faire l'aide des fonctions write et read.
int write (
int desc, /* descripteur de la socket */
char *data, /* Le tableau (ou chane) de caractres envoyer */
int lg_data /* on prcise la taille du tableau */
);
- La fonction write() retourne le nombre doctets effectivement envoys, -1 sil y a une erreur.
Exemple :
char message[100]="Bonjour";
if (write(desc_socket, message, strlen(message));==-1)
perror(" Erreur denvoi");

Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 26
Lecture de donnes en mode connect
int read (
int desc, /* descripteur de la socket */
char *data, /* Le tableau (ou chane) de caractres reu*/
int lg_data /* on prcise la taille du tableau */
);
- La fonction read() retourne le nombre doctets reu, -1 sil y a une erreur.
Exemple :
char message[100]="Bonjour";
if (read(desc_socket, message, strlen(message));==-1)
perror(" Erreur de rcption");

Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 27
Fin de la communication
Il faut maintenant raccrocher le tlphone
int close ( int sock);
-La fonction close() retourne -1 sil y a une erreur.
- Fermeture complte, on ne peut plus envoyer ou recevoir de donnes
-La connexion est compltement ferme et libre une fois que le client et le serveur on fait
close
int shutdown ( int sock, int sens)
- On peut prciser le sens de fermeture, la connexion nest alors pas compltement ferme
- Sens:
0 fermeture en entre
1 fermeture en sortie
2 fermeture dans les deux sens: quivalent un close
-Retourne -1 si il y a une erreur, 0 sinon

Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 28
31/10/2011
8
Remarque sur la programmation des sockets sous Windows

Sous Windows, il faut appeler 2 fonctions supplmentaires en dbut de
programme et en fin de programme pour respectivement initialiser une DLL
permettant d'utiliser les sockets et pour librer cette mme DLL
(Winsock.DLL).
Au dbut
WSADATA wsa;
WSAStartup(MAKEWORD(2, 2), &wsa);

A la fin

int WSACleanup(void);

Cette fonction libre la DLL qui permet d'utiliser les sockets sous Windows.
Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 29
Rcapitulatif
Alors quoi utiliser quand et dans quel ordre ?
Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 30
TCP ct client
socket
connect
send/write
recv/read
close


TCP ct serveur
socket
bind
listen
accept
send/write
recv/read
close
UDP ct client
socket
sendto
recvfrom
close


UDP ct serveur
socket
bind
recvfrom
sendto
close
Application
La cration d'un petit client/serveur, de type chat.
Prof: A.El magri : Cours Client/Serveur Prof: A.El magri : Cours Client/Serveur Les Sockets 31

You might also like