Programmation rseau Les sockets de Berkeley
BTS IRIS 2
Les sockets
Gnralits
Les sockets : modle permettant la communication inter processus (IPC - Inter Process Communication) sur un mme poste ou travers un rseau TCP/IP Avant leur introduction, le seul mcanisme standard qui permettait deux processus de communiquer se faisait par l'intermdiaire des pipes.
Les sockets se situent juste au-dessus de la couche transport Deux modes de communication possibles :
Le mode connect, utilisant le protocole TCP Le mode non connect, utilisant le protocole UDP
BTS IRIS 2
Les sockets
Plan du cours
Le
modle client/serveur Prsentation des sockets Les primitives dinitialisation Les primitives dchange dinformation Exemples
BTS IRIS 2
Les sockets
Le modle client/serveur
BTS IRIS 2
Les sockets
Protocoles de communication
Les protocoles de communication (comme TCP/IP) permettent la communication entre 2 applications diffrentes (point--point), ventuellement sur 2 postes diffrents
Le dtail du transfert effectif des donnes est spcifi par le protocole de communication de la couche transport mais le moment et la faon dont les applications interagissent entre elles sont dfinis par le programmeur Pour la communication point--point utilisant un protocole de type TCP/IP : le modle client/serveur est le + utilis (et le plus simple)
Les sockets
BTS IRIS 2
Connexion / Sans connexion
Il
Applications orientes connexion Applications orientes sans connexion
existe 2 types dapplication :
Applications
protocole sous-jacent en mode connect : TCP/IP protocole fiable
orientes connexion :
Applications
protocole sous-jacent en mode non connect : UDP/IP vrifications doivent tre faites au niveau applicatif Protocole non fiable mais rapide
Les sockets
orientes sans connexion :
BTS IRIS 2
Mode de connexion
Le
communication tlphonique protocole TCP. une connexion durable est tablie entre les deux processus
mode connect :
l'adresse
de destination n'est pas ncessaire chaque envoi de donnes. faut penser fermer la connexion
Les sockets
Il
BTS IRIS 2
Mode de connexion
Le
communication par courrier protocole UDP
mode non connect
ncessite
envoi
l'adresse de destination chaque
aucun
Risque de paquets perdu Ordre des paquets inconnu
Les sockets
accus de rception n'est donn.
BTS IRIS 2
Les sockets
BTS IRIS 2
Les sockets
Positionnement dans le modle OSI
Les
sockets se situent juste au-dessus de la couche transport du modle OSI (protocoles UDP ou TCP)
Application utilisateur Oriente connexion Application utilisateur Oriente sans connexion
Couche application
sockets Couche transport TCP UDP
BTS IRIS 2
Les sockets
10
Cration dun socket
Le concept de socket a t cr pour accomplir les communications inter-processus (IPC) Un socket est utilis pour permettre aux processus de communiquer entre eux, de la mme manire que le tlphone ou le courrier permet de communiquer entre plusieurs personnes Pour attendre des demandes de communications : crer un socket (sorte de point dcoute) Il faut crer un socket avec les bonnes options
BTS IRIS 2
Les sockets
11
Options
Il faut spcifier son type dadressage Les deux types dadressage les plus rpandus :
AF_UNIX : famille dadresse UNIX (locale : pas de rseau) AF_INET : famille dadresse Internet (format [Link])
Il faut spcifier un numro de port sur la machine
Ce numro doit tre compris entre 49152 et 65535
Il faut spcifier son type
les deux types les plus rpandus sont
SOCK_STREAM : spcifiques au mode connect (TCP) SOCK_DGRAM : spcifiques au mode non-connect (UDP)
BTS IRIS 2
Les sockets
12
Options
De
la mme faon quon attribue un numro de tlphone une personne pour recevoir des appels, il faut spcifier au socket une adresse laquelle il doit recevoir les messages qui lui sont destins (bind)
sockets de type SOCK_STREAM ont la possibilit de mettre les requtes de communication dans une file dattente (listen)
Les
BTS IRIS 2
Les sockets
13
Attente les demandes
Une
fois cr, le socket va attendre les demandes de communication (accept)
Aprs
la prise en compte de cette demande, le socket peut se remettre attendre les demandes de communication Utilisation de Thread ou de fork()
BTS IRIS 2
Les sockets
14
Connexion entre 2 sockets
Une
fois cr le socket qui reoit des demandes de communication, peut tre appel par un autre socket Il faut connecter un socket un autre socket qui est en attente (connect)
Une
fois la connexion tablie, la conversation peut commencer (read, write) la fin de la communication (comme on raccroche le tlphone) il faut fermer le socket qui a servi la communication (close)
Les sockets
BTS IRIS 2
15
Les primitives dinitialisation et de mise en relation
BTS IRIS 2
Les sockets
16
Initialisation
Initialisation
des sockets
obligatoire avant utilisation
WSADATA WSAData; WSAStartup(MAKEWORD(2,0), &WSAData);
//faire WSACleanup(); la fin de lutilisation des sockets
BTS IRIS 2 Les sockets
17
Cration du socket
SOCKET sock; //initialiser une variable de type socket
SOCKADDR_IN sin; //informations techniques du socket //si serveur : sin.sin_addr.s_addr = htonl(INADDR_ANY); //si client : //sin.sin_addr.s_addr = inet_addr("[Link]"); //adresse serveur sin.sin_family = AF_INET; //famille du socket sin.sin_port = htons(4148); //port sur lequel se connecter ou couter // ports rservs sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //cration du socket TCP/IP //1er paramtre : famille du socket //2ime paramtre : type de socket //3ime paramtre : protocole IP
BTS IRIS 2 Les sockets
18
Relier le socket ladresse et au port
bind(sock, (SOCKADDR *) &sin, sizeof(sin));
Attache Trois
le socket directement au port et l'adresse dfinis dans sin paramtres
sock : le socket initialis &sin : adresse de structure SOCKADDR_IN sizeof(sin) : la taille de ladresse
BTS IRIS 2
Les sockets
19
couter le port (serveur)
int val = listen(sock, 0);
couter le port sur le socket :
gnralement utilis aprs les appels socket et bind et juste avant accept Ne sutilise quen mode connect
1er argument, sock : socket sur lequel le listen() coutera 2nd argument, le BACKLOG : nombre maximum de connections qui seront coutes en mme temps retourne 0, ou SOCKET_ERROR en cas de problme
Largument backlog spcifie le nombre de connections tablir dans une file dattente par le systme lorsque le serveur excute lappel accept
Les sockets
BTS IRIS 2
20
Accepter une connexion (serveur)
SOCKADDR_IN csin; int val; val = accept(sock, (SOCKADDR *)&csin, sizeof(csin))
permet
d'accepter une connection
1er argument: le socket (qui est en coute) 2me argument : SOCKADDR du client connect
3me argument : la taille de ladresse du client retourne un identificateur du socket de rponse, ou INVALID_SOCKET en cas derreur
BTS IRIS 2
Les sockets
21
Demander une connexion (client)
int s; s = connect(sock, (SOCKADDR *)&ssin, sizeof(ssin))
permet
d'tablir une connexion avec un serveur
1er argument : le socket 2me argument : adresse de l'hte contacter 3me argument : taille de l'adresse de l'hte retourne 0 si la connexion a eu lieu, sinon -1
Pour
tablir une connexion, le client ne ncessite pas de faire un bind()
Les sockets
BTS IRIS 2
22
Les primitives dchanges dinformation
BTS IRIS 2
Les sockets
23
mission dinformation
Une
fois que le programme dapplication dispose dun socket, il peut lutiliser afin de transfrer des donnes 5 primitives utilisables :
BTS IRIS 2
send sendto sendmsg write writev
Les sockets
24
Mode connect
send, write et writev ne permettent pas dindiquer dadresse de destination
write ( int sockfd, char *buff, int nbytes ) ; writev ( int sockfd, iovec *vect_E/S, int lgr_vect_E/S ) ; int send (int sockfd, char *buff, int nbytes, int flags ) ;
sockfd : descripteur de socket buff : pointeur sur un tampon o sont stockes les donnes envoyer nbytes : nombre doctets ou de caractres que lon dsire envoyer vect_E/S : pointeur vers un tableau de pointeurs sur des blocs qui constituent le message envoyer flags : drapeau de contrle de la transmission
BTS IRIS 2
Les sockets
25
Mode non-connect
sendto et sendmsg imposent dindiquer ladresse de destination
int sendto (int sockfd, char *buff, int nbytes, int flags, struct sockaddr *to, int addrlen) ; 4 premiers arguments : mmes que pour send 2 derniers arguments : adresse de destination et sa taille int sendmsg ( int sockfd, struct struct_mesg, int flags ) ; on utilise la structure :
struct struct_mesg { int *sockaddr ; int sockaddr_len ; iovec *vecteur_E/S int vecteur_E/S_len int *droit_dacces int droit_dacces_len }
Pour les cas o lappel sendto frquemment utilis, on utilise galement cette structure
Les sockets
BTS IRIS 2
26
Rception dinformation
5
primitives de rception dinformation symtriques aux appels denvoi :
read readv recv recvfrom recvmsg
BTS IRIS 2
Les sockets
27
Mode connect
int read ( int sockfd, char *buff, int nbytes ) ; int recv (int sockfd, char *buff, int nbytes, int flags ) ;
sockfd : descripteur du socket sur lequel les donnes seront lues buff : pointeur sur un buffer o seront stockes les donnes lues nbytes : nombre maximal doctets ou de caractres qui seront lus flags : drapeau de contrle de la transmission
int readv ( int sockfd, iovec *vect_E/S, int lgr_vect_E/S ) ;
readv permet de mettre les donnes lues dans des cases mmoire non contigus Ces cases mmoires sont pointes par un tableau de pointeurs qui lui mme est point par vect_E/S lgr_vect_E/S est la longueur de ce tableau
Les sockets
BTS IRIS 2
28
Mode non-connect
il
faut prciser les adresses des correspondants desquels on attend des donnes
int recvfrom (int sockfd, char *buff, int nbytes, int flags, struct sockaddr *from, int addrlen) ;
Symtrique
de sendto
int recvmsg (int sockfd, struct struct_mesg, int flags);
Symtrique
de sendmsg utilise la mme structure struct_mesg
BTS IRIS 2 Les sockets
29
Les ports rservs Unix
echo echo systat daytime daytime netstat ftp-data ftp telnet smtp time time name whois domain domain hostnames
7 (tcp) 7 (udp) 11 (tcp users) 13 (tcp) 13 (udp) 15 (tcp) 20 (tcp) 21 (tcp) 23 (tcp) 25 (tcp mail) 37 (tcp timserver) 37 (udp timserver) 42 (udp nameserver) 43 (tcp nicname) 53 (udp) 53 (tcp) 101 (tcp hostname)
BTS IRIS 2
Les sockets
30
BTS IRIS 2
Les sockets
31
BTS IRIS 2
Les sockets
32
Exemple : serveur Hello World !
BTS IRIS 2
Les sockets
33
Fichiers den-tte et bibliothques
Windows
: #include <stdio.h> #include "winsock2.h"
Unix
: #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h>
BTS IRIS 2 Les sockets
34
void main() { WSADATA WSAData; WSAStartup(MAKEWORD(2,0), &WSAData); SOCKET sock, SOCKET csock; SOCKADDR_IN sin, SOCKADDR_IN csin; sock = socket(AF_INET, SOCK_STREAM, 0); sin.sin_addr.s_addr = INADDR_ANY; sin.sin_family = AF_INET; sin.sin_port = htons(5500); if(bind(sock, (SOCKADDR *)&sin, sizeof(sin)) < 0) cout<<"error bind"; else cout<<"bind ok"; if(listen(sock, 0)<0) cout<<"erreur de listen"; else cout<<"listen ok"; while(true) { int sinsize = sizeof(csin); if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET) { if(send(csock, "yes!", 4, 0)<0) cout<<"error send"; else cout<<"send ok !"; } } }
BTS IRIS 2 Les sockets
Serveur
35
Client
void main() { WSADATA WSAData; WSAStartup(MAKEWORD(2,0), &WSAData); SOCKET sock; SOCKADDR_IN sin; char *buffer = new char[255]; //configuration en local TCP/IP if(sock = socket(AF_INET, SOCK_STREAM, 0) < 0) cout<<"error sock"; else cout<<"sock ok!"<<endl; sin.sin_addr.s_addr = inet_addr("[Link]");//mettre l'adrese IP du serveur sin.sin_family = AF_INET; sin.sin_port = htons(5500);//mettre le port correspondant if(connect(sock, (SOCKADDR *)&sin, sizeof(sin))<0) cout<<"error connect"; recv(sock, buffer, sizeof(buffer), 0); string stringBuffer(buffer,sizeof(buffer)); cout << stringBuffer << endl; closesocket(sock); WSACleanup(); }
BTS IRIS 2 Les sockets
36
Diffrents types de serveurs
Tant quil ny a pas de connexions le serveur se bloque sur cette appel Lorsquune demande de connexion arrive, lappel accept se termine Le serveur peut grer les demandes de 2 manires :
Itrativement : le serveur traite lui mme la requte, ferme le nouveau socket puis invoque de nouveau accept pour obtenir la demande suivante Simultanment : lorsque lappel accept se termine, le serveur cre un serveur fils charg de traiter la demande (appel de fork et exec). Lorsque le fils a terminer il ferme le socket et meurt. Le serveur matre ferme quand lui la copie du nouveau socket aprs avoir excut le fork. Il appel ensuite de nouveau accept pour obtenir la demande suivante.
BTS IRIS 2 Les sockets
37
Exemple de serveur itratif
int sockfd, newsockfd ; if ( ( sockfd = socket (.....)) < 0 ) err_sys( erreur de socket ) ; if ( bind ( sockfd, ....) < 0 ) err_sys ( erreur de bind ) if ( listen ( sockfd , 5) < 0 ) ; err_sys ( erreur de listen ) ; for ( ; ; ) { newsockfd = accept ( sockfd, .....) ; if ( newsockfd < 0) err_sys( erreur de accept ) ; execute_la_demande( newsockfd ) ; close ( newsockfd ) ; }
BTS IRIS 2 Les sockets
38
Exemple de serveur accs concurrent
int sockfd, newsockfd ; if ( ( sockfd = socket (.....)) < 0 ) err_sys( erreur de socket ) ; if ( bind ( sockfd, ....) < 0 ) err_sys ( erreur de bind ) if ( listen ( sockfd , 5) < 0 ) ; err_sys ( erreur de listen ) ; for ( ; ; ) { newsockfd = accept ( sockfd, .....) ; if ( newsockfd < 0) err_sys( erreur de accept ) ; if ( fork() == 0 ) { close ( sockfd ) ; execute_la_demande( newsockfd ) ; exit (1) ; } close ( newsockfd ) ; }
BTS IRIS 2
Les sockets
39