Vous êtes sur la page 1sur 40

Programmation en C dune application client-serveur laide des Sockets

Protocole Application Application Sockets 4 3 2 1 Transport Rseau Liaison Physique Protocole de Transport TCP-UDP Application Sockets Transport

P. Sicard-Cours Rseaux

Les Sockets

Principes
Socket : tymologie: prise (de courant,...) Interface des sockets: librairies de primitives (fonctions/ procdures) daccs aux deux protocoles transport dInternet : TCP et UDP Dveloppe par luniversit de Berkeley (on parle de Berkeley Socket Interface) Disponible dans diffrents langages (C, Java ...)

Cette interface permet la programmation dapplications client/serveur:

. Deux programmes diffrents


Le serveur se met en attente de demandes (passif) Le client initie le dialogue par une demande (actif)
P. Sicard-Cours Rseaux Les Sockets 2

Rfrences
Livres ! J. M. Rifet, J.-B. Yuns. Unix - Programmation et Communication, Dunod (2003), chap. 19 R. Stevens. Unix Network Programming. Prentice-Hall. Web ! http://www.eng.auburn.edu/department/cse/classes/cse605/ examples/index.html http://www.scit.wlv.ac.uk/~jphb/comms/sockets.html man de Unix

P. Sicard-Cours Rseaux

Les Sockets

Analogie avec le tlphone


Une socket est un point daccs au rseau que lon peut comparer un tlphone Cest lextrmit dun canal de communication permettant lchange de donne entre deux entits (les utilisateurs du 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 l: cest le serveur, il dcroche Une fois la communication tablie, elle est bi-directionnelle et symtrique
P. Sicard-Cours Rseaux Les Sockets 4

Exemple dutilisation dune application client/serveur


Application ssh /etc/services:
- ssh - ssh 22/udp 22/tcp # SSH Remote Login Protocol # SSH Remote Login Protocol

- ssh kernighan.imag.fr
- On lance le client en lui donnant le nom DNS ou ladresse Internet du serveur connecter - Lapplication consulte lannuaire DNS : kernighan.imag.fr ->195.221.225.6 - Elle demande une connexion avec la socket du serveur (195.221.225.6, 22) - La socket ct client est (192.1.1.2, 3400) : numro de port libre ce moment sur la machine o tourne le client (192.1.1.2)

- Il faut quun serveur ssh soit lanc sur la machine destination


- Processus (ou dmon) sshd (ps -aux | grep sshd)
P. Sicard-Cours Rseaux Les Sockets 5

Exemple dutilisation dune application client/serveur


CLIENT ssh kernighan SERVEUR sshd

(192.1.1.2, 3400)

(195.221.225.6, 22)

Rseau

Une fois la communication tablie, le ux de donne peut tre bi-directionnel La communication est identie par le quadruplet:
- (adresse IP source, port source, adresse IP destination port destination)
P. Sicard-Cours Rseaux Les Sockets 6

Numros et annuaires
Identication dun point daccs laide du couple: - Une adresse Internet: identie la machine dans le rseau - Un numro de port: identie lapplication sur la machine Annuaires disponibles: - Local Nom/adresses internet: chier systme sur la machine (/etc/hosts) - Global Nom/adresses internet: le DNS (Domain Name System) Distribu Client et serveur DNS - Local Application/numro de port : chier 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, on parle aussi de service
P. Sicard-Cours Rseaux Les Sockets 7

Accs lannuaire
La recherche dans lannuaire local ou le DNS peut tre dni dans un chier systme: /etc/host.conf sous free-BSD Rcupration de ladresse partir du nom - struct hostent *gethostbyname (char *nom)
- retourne un pointeur sur une structure contenant les adresses Internet 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

P. Sicard-Cours Rseaux

Les Sockets

Accs son adresse et numro de port


Rcupration de sa propre adresse:
- Permet de dnir la socket locale

- int gethostname (char *nom, int longueur_nom)


renseigne le nom de la machine sur laquelle sexcute la procdure - On utilise ensuite gethostbyname pour avoir ladresse associe

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, attention cest un paramtre donne/rsultat
P. Sicard-Cours Rseaux Les Sockets 9

Installer une nouvelle prise de tlphone


La fonction int socket (int domaine, int mode, int protocole) Elle retourne un identicateur de socket (entier qui est un descripteur de chier), -1 en cas derreur
- Cet identicateur est locale la machine et nest pas connu par le destinataire

domaine:
- AF-INET : prise Rseau Internet - PF-INET : prise pour utilisation locale (interne la machine entre processus)

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)
P. Sicard-Cours Rseaux Les Sockets 10

Associer un numro la prise de tlphone


La fonction int bind( int sock, sockaddr_in *p_adr_s, int lg_struct)
- sock: identicateur de la socket - p_adr_s: pointeur vers une structure contenant les numros associer la socket (@IP et port) - lg_struct: la longueur de la structure

Structure sockaddr_in
- A remplir avant lappel de bind - struct sockaddr_in
{
short sin_family;
/* famille dadresse*/ ushort sin_port;
/* numro de port */ ulong sin_addr;
/* adresse de niveau 3: IP*/ char sin_zero [8];
/* inutilis (mis zro) */ }
P. Sicard-Cours Rseaux Les Sockets

AF_INET 3400 192.1.1.2

11

Numros spciaux
Il est possible de laisser au systme le choix dun numro de port libre au moment de lappel la fonction bind
- Cest intressant dans le cas dun client - Il suft de mettre dans la structure sockaddr_in le champ sin_port 0

Il est possible dassocier une socket lensemble des adresses IP de la machine dans le cas o elle est connecte plusieurs rseaux Cela permet dans le cas dun serveur dtre accessible via ces diffrents rseaux
- Il suft de remplir dans la structure sockaddr_in le champ sin_addr par la constante INADDR_ANY
P. Sicard-Cours Rseaux Les Sockets

12

Allocation des sockets et affectation des numros


CLIENT socket bind 192.1.1.2, 0 SERVEUR socket bind INADDR_ANY, 22

Identicateur: 3

Identicateur: 5

(192.1.1.2, 3400)

(*, 22)

P. Sicard-Cours Rseaux

Les Sockets

13

Appel dun numro et tablissement de la communication par le client


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 qui dpend du protocole (UDP ou TCP)

P. Sicard-Cours Rseaux

Les Sockets

14

Ltablissement de la communication par le client dans le cas dUDP


Pas dtablissement de connexion pralable, on envoie le premier paquet de donne Fonction int sendto (int sock, char *data, int lg_data, struct sockaddr_in *p_ad_s, int ags, int lg_struct)
- Data: Les donnes tableau (ou chane) de caractres envoyer - Lg_data : on prcise leur longueur - p_ad_s : structure contenant les numros du destinataires - Flags : non utilis , mettre 0 - Retourne -1 si il y a une erreur, sinon le nombre doctets

P. Sicard-Cours Rseaux

Les Sockets

15

Attente dappel sur un tlphone Cas du serveur avec UDP


Comme pour le client il faut mettre en place la prise (socket) et lui affecter des numros (bind) Ensuite il faut se tenir prt recevoir des coups de l des clients Dans le cas de UDP, cela se manifeste par lenvoi dun premier paquet de donne La fonction int recvfrom (int sock, char *data, int lg_data, struct sockaddr_in *p_ad_s, int ags, int lg_struct)
- Data: Le tableau (ou chane) de caractres reu (rempli par la fonction) - Lg_data : on prcise leur longueur - p_ad_s: structure qui est remplie par recvfrom et qui contient les numros du client qui vient denvoyer ces donnes - Retourne le nombre doctet effectivement reu, -1 sil y a une erreur
P. Sicard-Cours Rseaux Les Sockets 16

Un appel tlphonique avec UDP


CLIENT UDP CLIENT UDP socket socket bind 192.1.1.2, 3400 bind 192.1.1.2, 3400
sendto bonjour sendto bonjour bonjour bonjour

SERVEUR UDP SERVEUR UDP socket socket bind 195.221.225.6, bind 192.1.1.2, 3400 22
recvfrom recvfrom

Identicateur: Identicateur: 33

Identicateur: 55 Identicateur:

(192.1.1.2, 3400)

(192.1.1.2, 3400)

(195.221.225.6, 22)

(195.221.225.6, 22)

Le rcepteur possde un buffer dune taille xe Une fois le premier paquet mis le serveur peut aussi envoyer des donnes au client
P. Sicard-Cours Rseaux Les Sockets 17

Ltablissement de la communication par le client dans le cas de TCP


Il y a ltablissement dune connexion pralable, les donnes seront envoyes ensuite Fonction int connect (int sock, struct sockaddr_in *p_ad_s, int lg_struct)
- p_ad_s : structure contenant les numros du destinataires

Si ltablissement de la connexion par TCP est russie, la fonction retourne 0 sinon -1

P. Sicard-Cours Rseaux

Les Sockets

18

Attente dappel sur un tlphone Cas du serveur avec TCP


Comme pour le client il faut mettre en place la prise (socket) et lui affecter des numros (bind) Ensuite il faut se tenir prt recevoir des coups de l des clients La fonction int listen ( int sock, int nb_requete)
- sock : identicateur de la socket dont on renseigner prcdemment les numros - nb_requete : nombre maximale de requte pouvant tre mmoris en attendant un traitement par le serveur

P. Sicard-Cours Rseaux

Les Sockets

19

Acceptation dun appel sur un tlphone Cas du serveur avec TCP


Le serveur peut accepter une demande de communication sur une socket prcedemment mise en attente (listen) La fonction int accept ( int sock, struct sockaddr_in *p_ad_s, int lg_struct)
- sock : identicateur de la socket en attente - p_ad_s: structure qui est remplie par recvfrom et qui contient les numros du client qui vient denvoyer ces donnes - cette fonction est bloquante si il ny a pas eu de demande de connexion de client - ATTENTION: elle retourne un nouvel identicateur de socket mais portant les mme numros (port et adresse). - Cest sur cette nouvelle socket que peuvent se faire les changes
P. Sicard-Cours Rseaux Les Sockets 20

Un appel tlphonique avec TCP


CLIENT TCP socket bind 192.1.1.2, 3400 connect Etablissement connexion en 3 paquets SERVEUR TCP socket bind 195.221.225.6, 22 listen accept Identicateur: 6

write bonjour

Bonjour

read (195.221.225.6, 22)

Identicateur: 2

Identicateur: 5

(192.1.1.2, 3400)
P. Sicard-Cours Rseaux

(195.221.225.6, 22)
Les Sockets

21

On parle dans le tlphone Cas de TCP


Une fois la connexion tablie le client peut envoyer et recevoir des donnes, le serveur aussi (aprs laccept) La fonction int write ( int sock, char *data, int lg_data)
- Data: Le tableau (ou chane) de caractres reu (rempli par la fonction) - Lg_data : on prcise la taille du tableau - Retourne le nombre doctets effectivement envoys, -1 sil y a une erreur

La fonction int read ( int sock, char *data, int lg_data)


- Data: Le tableau (ou chane) de caractres envoyer - Lg_data : on prcise la taille du tableau - Retourne le nombre doctets effectivement reus, -1 sil y a une erreur
P. Sicard-Cours Rseaux Les Sockets 22

Le problme de la langue
Les donnes ne sont pas reprsentes de la mme faon suivant les processeurs (little-big endian) Il faut passer par un traducteur avant de les envoyer sur le rseau La fonction short int htons (short int x)
- retourne lentier court (2 octets) la norme rseau de x (pass en norme machine) - home to network

La fonction long int htonl (long int x)


- retourne lentier long (4 octets) la norme rseau de x

La fonction short int ntohs (short int x)


- retourne lentier court (2 octets) la norme machine de x (pass en norme rseau) - home to network

La fonction long int ntohl (long int x)


- retourne lentier long (4 octets) la norme rseau de x
P. Sicard-Cours Rseaux Les Sockets 23

Fin de la communication Cas de UDP et TCP


Il faut maintenant raccrocher le tlphone La fonction int close ( int sock)
- Retourne -1 si il 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 - la fermeture est symtrique: le client ou le serveur peut commencer la fermeture

La fonction 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


P. Sicard-Cours Rseaux Les Sockets 24

Les options
On peut consulter/modier des options sur des sockets alloues Exemples
- Taille du buffer de rception, dmission - Dnition de socket multicast - Rception/mission de paquets broadcast - Priorit - ...

Fonction int getsockopt


- Consultation des options en cours

Fonction int setsockopt


- Modication des options
P. Sicard-Cours Rseaux Les Sockets 25

En Travaux pratiques
Librairie encapsule des primitives des sockets (chier fon.c, fon.h) Exemple : bind -> h_bind Simplication des appels des primitives (moins de paramtre) Evite de manipuler la structure sockaddr_in grce la procedure adr_socket (char *service, char *adresse, char protocole, struct sockaddr_in *p_ad_s)
- service : numro de port ou nom associ dans /etc/services (Ex: 3400) - adresse: adresse en dcimal point ou nom associ (/etc/hosts ou DNS) (ex: 192.1.1.2) - protocole: udp ou tcp - p_ad_s: pointeur sur la structure qui est remplie par la procdure - Exemple: adr_socket(3400, 192.1.1.2, tcp, &sockclient);
P. Sicard-Cours Rseaux Les Sockets 26

En Travaux pratiques Compilation et debugage


client.c et serveur.c prt lemploi
- Rcupration des arguments passs au moment du lancement
client 192.0.1.1 2200 udp serveur 2200 udp

makele pour compiler fon.c, fon.h avec client.c et serveur.c Commandes: make, make clean Mode debug possible (voir dans le makele : -DDEBUG) pour avoir des traces dexcution lcran des primitives des sockets Pour tester votre client indpendamment du serveur, vous pouvez utiliser socklab pour dialoguer avec votre programme

P. Sicard-Cours Rseaux

Les Sockets

27

Serveur traitement itratif des clients


Cas de TCP :
- les demandes de connexion sont mmoriss par TCP en attente de traitement - La socket passive est toujours lcoute - Les connexions sont traites les unes aprs les autres travers la socket gnre par la fonction accept

P. Sicard-Cours Rseaux

Les Sockets

28

Serveur traitement itratif des clients avec TCP


CLIENTS SERVEUR ITERATIF un client la fois socket bind INADDR_ANY, 22 (192.1.1.2, 3400) listen Id: 5

(*, 22) (56.1.1.10, 5000) socket bind connect read/write close accept read/write close 6 (195.221.226.2, 22) Id: 6

close 5
P. Sicard-Cours Rseaux Les Sockets 29

Serveur traitement itratif des clients


Cas de UDP:
- les paquets reus sont mmoriss dans un buffer en attente de rception - Si le dialogue se rsume lchange de deux paquets (question/ rponse), on traite successivement les demandes - Si le dialogue est plus compliqu (dialogue tat) - Il va y avoir mlange des demandes de communication et des changes dans des communications dj tablies - Il faut alors crer une nouvelle socket la main (comme le fait laccept) et continuer le dialogue sur cette nouvelle socket - Cette socket est forcment sur un port diffrent - Ce nouveau port doit donc tre communiqu au client au moment de sa demande de communication

P. Sicard-Cours Rseaux

Les Sockets

30

Serveur traitement itratif des clients avec UDP - Question/rponse


CLIENTS SERVEUR ITERATIF un client la fois socket bind INADDR_ANY, 22 (192.1.1.2, 3400) recvfrom sendto (56.1.1.10, 5000) socket bind sendto recvfrom close
P. Sicard-Cours Rseaux Les Sockets 31

Id: 5

(*, 22)

close 5

Serveur traitement itratif des clients avec UDP - Dialogue/serveur tat


CLIENTS SERVEUR ITERATIF UDP socket bind INADDR_ANY, 22 Id: 5 recvfrom (56.1.1.10, 5000) socket bind sendto sur 22 recvfrom sur 22 (reoit le nouveau numero de port sendto /recvfrom sur port 4444 close
P. Sicard-Cours Rseaux

(192.1.1.2, 3400)

(*, 22) socket bind 195.2.2.2, 4444 ou port "0" puis getsockname sendto nouveau port 4444 recvfrom/sendto sur port 4444 close 6 close 5 Id: 6

(195.2.2.2, 4444)

Les Sockets

32

Serveur traitement parallle des clients


Il faut gnrer des processus qui vont sexcuter en parallle Le processus lcoute des demandes gnre un processus par client
Serveur
Processus serveurpassif

socket passive
Client 1

Processus serveur traitement client 1 Client 2 Processus serveur traitement client 2

Cration processus

socket service client

P. Sicard-Cours Rseaux

Les Sockets

33

La cration de processus
Fonction int fork()
- Cre un nouveau processus (appel ls) lidentique du processus pre - Le processus pre est dupliqu en mmoire (instruction machines et variables) - Il ny pas de partage de variable entre les processus - Pour les sockets il faut que les deux processus pre et ls ferme la socket pour quelle soit compltement libre - La seule diffrence entre les deux processus est la valeur retourne par la fonction fork
Pour le pre elle retourne la valeur du PID (Processus Identier) du ls Pour le ls elle retourne 0
P. Sicard-Cours Rseaux Les Sockets 34

Exemple dutilisation du fork


int pid; pid=fork(); if (pid==0) printf(ls\n) else printf (pre\n); printf(pre et ls\n); A lexcution lcran:
ls pre pre et ls pre et ls

- On ne connat lordre dans lequel ces printf seront excuts


P. Sicard-Cours Rseaux Les Sockets 35

Serveur traitement parallle des clients avec TCP


CLIENTS SERVEUR socket bind INADDR_ANY, 22 listen (192.1.1.2, 3400) Id: 5

(*, 22) (56.1.1.10, 5000) socket bind connect read/write close accept fork pre close 6 close 5
P. Sicard-Cours Rseaux

Id: 6 fils (195.221.226.2, 22) close 5 read/write close 6 exit


Les Sockets 36

Serveur traitement parallle des clients avec UDP


CLIENTS SERVEUR ITERATIF UDP socket bind INADDR_ANY, 22 Id: 5 recvfrom fork (56.1.1.10, 5000) socket bind sendto sur 22 recvfrom sur 22 (reoit le nouveau port) sendto /recvfrom sur port 4444 close
P. Sicard-Cours Rseaux

(192.1.1.2, 3400)

(*, 22) fils socket bind 195.2.2.2, "4444" (ou "0")

close 5

sendto (envoi nouveau port 4444) close 5 Id: 6 recvfrom/sendto sur 4444 close 6 (195.2.2.2, nouvport) exit

Les Sockets

37

Attente dvnement sur plusieurs sockets


Autre faon de servir les clients en parallle La fonction int select(int maxfdpl, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
- Supprime de lensemble de socket readfds les sockets qui ne sont pas en attente de lecture - Bloquante tant quune des sockets au moins de readfds nest pas en attente de lecture

Exemple:
fdset set; int idsock1, idsock2, maxsock; FD_ZERO(&set); /* initialise set vide */ FD_SET(idsock1, &set); /*ajoute idsock1 a set */ FD_SET(idsock2, &set); /*ajoute idsock2 a set */ maxsock=getdtablesize(); select (maxsock, &set,0,0,0) if (FD_ISSET(idsock1, &set) ...
P. Sicard-Cours Rseaux Les Sockets 38

Attente dvnement sur plusieurs sockets


Librairie <sys/types.h> Le clavier et lcran sont associs aux descripteurs de chier 0 et 1 On peut donc attendre un vnement sur un ensemble de socket et le clavier Indispensable par exemple pour faire un talk asynchrone

P. Sicard-Cours Rseaux

Les Sockets

39

Choix du protocole
Avantages UDP par rapport TCP
- Plus rapide (pas dtablissement de connexion) - Moins coteux pour le rseau (petite entte, pas dautres paquets (syn, ack, close)) - Possibilit de broadcast et multicast - Intressant si communication question-rponse - Mobilise moins de ressources sur la machine que TCP

Inconvnients UDP par rapport TCP


- Pas de rcupration derreur ni de contrle de ux, grer par lapplication - Peu adapt une communication tat (dialogue labor) Problme des pertes de paquets dans le dialogue
P. Sicard-Cours Rseaux Les Sockets 40

Vous aimerez peut-être aussi