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
Applications
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
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
ncessite
envoi
aucun
BTS IRIS 2
Les sockets
BTS IRIS 2
Les sockets
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
BTS IRIS 2
Les sockets
10
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 xx.xx.xx.xx)
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
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
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
BTS IRIS 2
Les sockets
16
Initialisation
Initialisation
des 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("10.7.9.1"); //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
Attache Trois
BTS IRIS 2
Les sockets
19
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
permet
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
permet
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
BTS IRIS 2
22
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
24
Mode connect
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
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
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
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
Symtrique
29
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
BTS IRIS 2
Les sockets
33
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("127.0.0.1");//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
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
38
BTS IRIS 2
Les sockets
39