Vous êtes sur la page 1sur 39

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 xx.xx.xx.xx)

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("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

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("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

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

Vous aimerez peut-être aussi