39
BTS IRIS 2 BTS IRIS 2 Les sockets Les sockets 1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

Embed Size (px)

Citation preview

Page 1: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets 11

Programmation réseau

Les sockets de Berkeley

Page 2: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

22

GénéralitésGénéralités► Les Les socketssockets : modèle permettant la : modèle permettant la communication inter communication inter

processusprocessus ( (IPCIPC - - Inter Process CommunicationInter Process Communication) sur un même ) sur un même poste ou à travers un poste ou à travers un réseauréseau TCP/IPTCP/IP

► Avant leur introduction, le seul mécanisme standard qui Avant leur introduction, le seul mécanisme standard qui permettait à deux processus de communiquer se faisait par permettait à deux processus de communiquer se faisait par l'intermédiaire des pipes. l'intermédiaire des pipes.

► Les sockets se situent juste Les sockets se situent juste au-dessus de la couche au-dessus de la couche transporttransport

► Deux modes de communicationDeux modes de communication possibles :  possibles : Le mode Le mode connectéconnecté, utilisant le protocole TCP, utilisant le protocole TCP Le mode Le mode non connecténon connecté, utilisant le protocole UDP, utilisant le protocole UDP

Page 3: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

33

►Le modèle client/serveurLe modèle client/serveur►Présentation des socketsPrésentation des sockets►Les primitives d’initialisationLes primitives d’initialisation►Les primitives d’échange d’informationLes primitives d’échange d’information►ExemplesExemples

Plan du cours Plan du cours

Page 4: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

44

Le modèle client/serveurLe modèle client/serveur

Page 5: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

55

Protocoles de communicationProtocoles de communication

► Les protocoles de communication (comme TCP/IP) permettent la communication entre 2 applications différentes (point-à-point), éventuellement sur 2 postes différents

► Le détail du transfert effectif des données est spécifié par le protocole de communication de la couche transport

► mais le moment et la façon dont les applications interagissent entre elles sont définis par le programmeur

► Pour la communication point-à-point utilisant un protocole de type TCP/IP : le modèle client/serveur est le + utilisé (et le plus simple)

Page 6: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

66

Connexion / Sans connexionConnexion / Sans connexion

► Il existe 2 types d’application : Applications orientées connexion Applications orientées sans connexion

►Applications orientées connexion : protocole sous-jacent en mode connecté : TCP/IP protocole fiable

►Applications orientées sans connexion : protocole sous-jacent en mode non connecté :

UDP/IP vérifications doivent être faites au niveau applicatif Protocole non fiable mais rapide

Page 7: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

77

Mode de connexionMode de connexion

► Le Le mode connectémode connecté : : ⋍ ⋍ communication téléphoniquecommunication téléphonique protocole protocole TCPTCP. . une connexion durable est établie entre les deux une connexion durable est établie entre les deux

processusprocessus

► l'adresse de destination n'est pas l'adresse de destination n'est pas nécessaire à chaque envoi de nécessaire à chaque envoi de données. données.

► Il faut penser à fermer la connexionIl faut penser à fermer la connexion

Page 8: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

88

Mode de connexionMode de connexion

► Le Le mode non connectémode non connecté ⋍ ⋍ communication par courriercommunication par courrier protocole protocole UDPUDP

►nécessite l'adresse de destination à nécessite l'adresse de destination à chaque envoichaque envoi

►aucun accusé de réception n'est aucun accusé de réception n'est donné.donné. Risque de paquets perdu…Risque de paquets perdu… Ordre des paquets inconnu…Ordre des paquets inconnu…

Page 9: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

99

Les socketsLes sockets

Page 10: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

1010

Positionnement dans le modèle Positionnement dans le modèle OSI OSI

►Les sockets se situent juste au-dessus Les sockets se situent juste au-dessus de la couche transport du modèle OSI de la couche transport du modèle OSI (protocoles UDP ou TCP)(protocoles UDP ou TCP)

Couche application Application utilisateurOrientée connexion

Application utilisateurOrientée sans connexion

Couche transport TCP UDP

sockets

Page 11: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

1111

Création d’un socketCréation d’un 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 même manière que le téléphone ou le courrier permet de communiquer entre plusieurs personnes

► Pour attendre des demandes de communications : créer un socket (sorte de point d’écoute)

► Il faut créer un socket avec les bonnes options

Page 12: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

1212

OptionsOptions

► Il faut spécifier son type d’adressage► Les deux types d’adressage les plus répandus :

AF_UNIX : famille d’adresse UNIX (locale : pas de réseau) AF_INET : famille d’adresse Internet (format xx.xx.xx.xx)

► Il faut spécifier un numéro de port sur la machine Ce numéro doit être compris entre 49152 et 65535

► Il faut spécifier son type les deux types les plus répandus sont

► SOCK_STREAM : spécifiques au mode connecté (TCP)► SOCK_DGRAM : spécifiques au mode non-connecté (UDP)

Page 13: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

1313

OptionsOptions

►De la même façon qu’on attribue un numéro de téléphone à une personne pour recevoir des appels, il faut spécifier au socket une adresse à laquelle il doit recevoir les messages qui lui sont destinés (bind)

► Les sockets de type SOCK_STREAM ont la possibilité de mettre les requêtes de communication dans une file d’attente (listen)

Page 14: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

1414

Attente les demandesAttente les demandes

►Une fois créé, le socket va attendre les demandes de communication (accept)

►Après la prise en compte de cette demande, le socket peut se remettre à attendre les demandes de communication

►Utilisation de Thread ou de fork()

Page 15: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

1515

Connexion entre 2 socketsConnexion entre 2 sockets

►Une fois créé le socket qui reçoit 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 téléphone) il faut fermer le socket qui a servi à la communication (close)

Page 16: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

1616

Les primitivesLes primitivesd’initialisation et de mise en d’initialisation et de mise en

relationrelation

Page 17: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

1717

Initialisation Initialisation

►Initialisation obligatoireInitialisation obligatoire avant avant utilisation des socketsutilisation des sockets

WSADATA WSAData; WSADATA WSAData;

WSAStartup(MAKEWORD(2,0), &WSAData);WSAStartup(MAKEWORD(2,0), &WSAData);

//faire //faire WSACleanup();WSACleanup(); à la fin de à la fin de l’utilisation des socketsl’utilisation des sockets

Page 18: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

1818

Création du socketCréation du socketSOCKET sock;SOCKET sock; ////initialiserinitialiser une variable de type socket une variable de type socket

SOCKADDR_IN sin;SOCKADDR_IN sin; ////informations techniquesinformations techniques du socket du socket//si serveur ://si serveur :sin.sin_addr.s_addr = htonl(INADDR_ANY);sin.sin_addr.s_addr = htonl(INADDR_ANY);//si client ://si client :////sin.sin_addr.s_addr = inet_addr("10.7.9.1");sin.sin_addr.s_addr = inet_addr("10.7.9.1"); // //adresseadresse serveur serveur

sin.sin_family = AF_INET;sin.sin_family = AF_INET; ////famillefamille du socket du socketsin.sin_port = htons(4148);sin.sin_port = htons(4148); // //portport sur lequel se connecter ou sur lequel se connecter ou

écouterécouter // ports réservés// ports réservés

sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // //créationcréation du du socket TCP/IPsocket TCP/IP

//1er paramètre : famille du socket//1er paramètre : famille du socket//2ième paramètre : type de socket//2ième paramètre : type de socket//3//3ièmeième paramètre : protocole IP paramètre : protocole IP

Page 19: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

1919

Relier le socket à l’adresse et au Relier le socket à l’adresse et au portport

bind(sock, (SOCKADDR *) &sin, sizeof(sin));bind(sock, (SOCKADDR *) &sin, sizeof(sin));

►Attache le socketAttache le socket directement au directement au port et à l'adresse définis dans port et à l'adresse définis dans sinsin

►Trois paramètres Trois paramètres socksock : le socket initialisé : le socket initialisé &sin&sin : adresse de structure : adresse de structure SOCKADDR_INSOCKADDR_IN sizeof(sin)sizeof(sin) : la taille de l’adresse : la taille de l’adresse

Page 20: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

2020

Écouter le port (serveur)Écouter le port (serveur)

int val = listen(sock, 0);int val = listen(sock, 0);

► écouter le portécouter le port sur le socket : sur le socket : 1er argument, sock : socket sur lequel le 1er argument, sock : socket sur lequel le listen()listen()

écouteraécoutera 2nd argument, le BACKLOG : nombre maximum de 2nd argument, le BACKLOG : nombre maximum de

connections qui seront écoutées en même temps connections qui seront écoutées en même temps retourne 0, ou retourne 0, ou SOCKET_ERRORSOCKET_ERROR en cas de problème en cas de problème

► généralement utilisé après les appels généralement utilisé après les appels socketsocket et et bindbind et juste avant et juste avant acceptaccept

► Ne s’utilise qu’en Ne s’utilise qu’en mode connectémode connecté

► L’argument L’argument backlogbacklog spécifie le nombre de spécifie le nombre de connections à établir dans une file d’attente par le connections à établir dans une file d’attente par le système lorsque le serveur exécute l’appel système lorsque le serveur exécute l’appel acceptaccept

Page 21: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

2121

Accepter une connexion Accepter une connexion (serveur) (serveur)

SOCKADDR_IN csin;SOCKADDR_IN csin;

int val; int val;

val = accept(sock, (SOCKADDR *)&csin, sizeof(csin)) val = accept(sock, (SOCKADDR *)&csin, sizeof(csin))

► permet d'accepter une connectionpermet d'accepter une connection 1er argument: le socket (qui est en écoute…)1er argument: le socket (qui est en écoute…) 2ème argument : 2ème argument : SOCKADDRSOCKADDR du client connecté du client connecté 3ème argument : la taille de l’adresse du client3ème argument : la taille de l’adresse du client retourne un identificateur du socket de réponse, retourne un identificateur du socket de réponse,

ou ou INVALID_SOCKETINVALID_SOCKET enen cas d’erreur cas d’erreur

Page 22: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

2222

Demander une connexion Demander une connexion (client)(client)

int s; int s; s = connect(sock, (SOCKADDR *)&ssin, sizeof(ssin))s = connect(sock, (SOCKADDR *)&ssin, sizeof(ssin))

► permet d'établir une connexion avec un permet d'établir une connexion avec un serveurserveur 1er argument : le socket1er argument : le socket 2ème argument : adresse de l'hôte à contacter2ème argument : adresse de l'hôte à contacter 3ème argument : taille de l'adresse de l'hôte3ème argument : taille de l'adresse de l'hôte retourne 0 si la connexion a eu lieu, sinon -1retourne 0 si la connexion a eu lieu, sinon -1

► Pour établir une connexion, le client ne Pour établir une connexion, le client ne nécessite pas de faire un nécessite pas de faire un bind()bind()

Page 23: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

2323

Les primitivesLes primitivesd’échanges d’informationd’échanges d’information

Page 24: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

2424

Émission d’informationÉmission d’information

►Une fois que le programme d’application dispose d’un socket, il peut l’utiliser afin de transférer des données

►5 primitives utilisables : send sendto sendmsg write writev

Page 25: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

2525

Mode connectéMode connecté► send, write et writev ne permettent pas d’indiquer

d’adresse 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 stockées les données à

envoyer► nbytes : nombre d’octets ou de caractères que l’on désire

envoyer► vect_E/S : pointeur vers un tableau de pointeurs sur des

blocs qui constituent le message à envoyer► flags : drapeau de contrôle de la transmission

Page 26: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

2626

Mode non-connectéMode non-connecté► sendto et sendmsg imposent d’indiquer l’adresse de destination

int sendto (int sockfd, char *buff, int nbytes, int flags, struct sockaddr *to, int addrlen) ;

► 4 premiers arguments : mêmes 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/Sint vecteur_E/S_lenint *droit_daccesint droit_dacces_len

}

► Pour les cas où l’appel sendto fréquemment utilisé, on utilise également cette structure

Page 27: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

2727

Réception d’informationRéception d’information

►5 primitives de réception d’information symétriques aux appels d’envoi : read readv recv recvfrom recvmsg

Page 28: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

2828

Mode connecté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 données seront lues► buff : pointeur sur un buffer où seront stockées les données lues► nbytes : nombre maximal d’octets ou de caractères qui seront lus► flags : drapeau de contrôle de la transmission

int readv ( int sockfd, iovec *vect_E/S, int lgr_vect_E/S ) ;

► readv permet de mettre les données lues dans des cases mémoire non contiguës

► Ces cases mémoires sont pointées par un tableau de pointeurs qui lui même est pointé par vect_E/S

► lgr_vect_E/S est la longueur de ce tableau

Page 29: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

2929

Mode non-connectéMode non-connecté

► il faut préciser les adresses des correspondants desquels on attend des données

int recvfrom (int sockfd, char *buff, int nbytes,

int flags, struct sockaddr *from, int addrlen) ;

►Symétrique de sendto

int recvmsg (int sockfd, struct struct_mesg, int flags);

►Symétrique de sendmsg►utilise la même structure struct_mesg

Page 30: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

3030

Les ports réservés UnixLes ports réservés Unix► echo 7 (tcp)► echo 7 (udp)► systat 11 (tcp users)► daytime 13 (tcp)► daytime 13 (udp)► netstat 15 (tcp)► ftp-data 20 (tcp)► ftp 21 (tcp)► telnet 23 (tcp)► smtp 25 (tcp mail)► time 37 (tcp timserver)► time 37 (udp timserver)► name 42 (udp nameserver)► whois 43 (tcp nicname)► domain 53 (udp)► domain 53 (tcp)► hostnames 101 (tcp hostname)

Page 31: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

3131

Page 32: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

3232

Page 33: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

3333

Exemple : Exemple : serveur « Hello World ! » serveur « Hello World ! »

Page 34: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

3434

Fichiers d’en-tête et Fichiers d’en-tête et bibliothèquesbibliothèques

►Windows :Windows :#include <stdio.h>

#include "winsock2.h"

►Unix :#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

Page 35: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

3535

ServeurServeurvoid main()void main(){{

WSADATA WSAData;WSADATA WSAData;WSAStartup(MAKEWORD(2,0), &WSAData);WSAStartup(MAKEWORD(2,0), &WSAData);SOCKET sock, SOCKET csock;SOCKET sock, SOCKET csock;SOCKADDR_IN sin, SOCKADDR_IN csin;SOCKADDR_IN sin, SOCKADDR_IN csin;sock = socket(AF_INET, SOCK_STREAM, 0);sock = socket(AF_INET, SOCK_STREAM, 0);sin.sin_addr.s_addr = INADDR_ANY;sin.sin_addr.s_addr = INADDR_ANY;sin.sin_family = AF_INET;sin.sin_family = AF_INET;sin.sin_port = htons(5500);sin.sin_port = htons(5500);if(bind(sock, (SOCKADDR *)&sin, sizeof(sin)) < 0)if(bind(sock, (SOCKADDR *)&sin, sizeof(sin)) < 0)

cout<<"error bind";cout<<"error bind";elseelse

cout<<"bind ok";cout<<"bind ok";if(listen(sock, 0)<0)if(listen(sock, 0)<0)

cout<<"erreur de listen";cout<<"erreur de listen";elseelse

cout<<"listen ok";cout<<"listen ok";while(true)while(true){{

int sinsize = sizeof(csin);int sinsize = sizeof(csin);if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET){{

if(send(csock, "yes!", 4, 0)<0)if(send(csock, "yes!", 4, 0)<0)cout<<"error send";cout<<"error send";

else else cout<<"send ok !";cout<<"send ok !";

}}}}

}}

Page 36: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

3636

Client Client void main()void main(){{

WSADATA WSAData;WSADATA WSAData;WSAStartup(MAKEWORD(2,0), &WSAData);WSAStartup(MAKEWORD(2,0), &WSAData);SOCKET sock;SOCKET sock;SOCKADDR_IN sin;SOCKADDR_IN sin;char *buffer = new char[255];char *buffer = new char[255];//configuration en local TCP/IP//configuration en local TCP/IPif(sock = socket(AF_INET, SOCK_STREAM, 0) < 0)if(sock = socket(AF_INET, SOCK_STREAM, 0) < 0)

cout<<"error sock";cout<<"error sock";elseelse

cout<<"sock ok!"<<endl;cout<<"sock ok!"<<endl;sin.sin_addr.s_addr = inet_addr("127.0.0.1");//mettre l'adrese IP du sin.sin_addr.s_addr = inet_addr("127.0.0.1");//mettre l'adrese IP du serveurserveursin.sin_family = AF_INET;sin.sin_family = AF_INET;sin.sin_port = htons(5500);//mettre le port correspondantsin.sin_port = htons(5500);//mettre le port correspondantif(connect(sock, (SOCKADDR *)&sin, sizeof(sin))<0)if(connect(sock, (SOCKADDR *)&sin, sizeof(sin))<0)

cout<<"error connect";cout<<"error connect";recv(sock, buffer, sizeof(buffer), 0);recv(sock, buffer, sizeof(buffer), 0);string stringBuffer(buffer,sizeof(buffer));string stringBuffer(buffer,sizeof(buffer));cout << stringBuffer << endl;cout << stringBuffer << endl;closesocket(sock);closesocket(sock);WSACleanup();WSACleanup();

}}

Page 37: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

3737

Différents types de serveursDifférents types de serveurs

► Tant qu’il n’y a pas de connexions le serveur se bloque sur cette appel

► Lorsqu’une demande de connexion arrive, l’appel accept se termine

► Le serveur peut gérer les demandes de 2 manières : Itérativement : le serveur traite lui même la requête, ferme le

nouveau socket puis invoque de nouveau accept pour obtenir la demande suivante

Simultanément : lorsque l’appel accept se termine, le serveur crée 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 maître ferme quand à lui la copie du nouveau socket après avoir exécuté le fork. Il appel ensuite de nouveau accept pour obtenir la demande suivante.

Page 38: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

3838

Exemple de serveur itératif

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 ) ;

}

Page 39: BTS IRIS 2Les sockets1 Programmation réseau Les sockets de Berkeley

BTS IRIS 2BTS IRIS 2 Les socketsLes sockets

3939

Exemple de serveur à accès 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 ) ;

}