Introduction to Client/Server Architecture and Programming with Sockets

Page 1 sur 40Lecteur de document UniversityLib

Introduction to Client/Server Architecture and Programming with Sockets

Computer Networking · notes

Voir tous les documents en réseaux

Client/Server

Socket

Architecture Client/Serveur

Qu'est-ce qu'un serveur ?

Client/Serveur

• un « logiciel serveur » offre un service sur le réseau,

• le « serveur » est la machine sur laquelle s'exécute le logiciel serveur,

• le serveur doit être sur un site avec accès permanent

et s'exécuter en permanence. Un site peut offrir plusieurs services.

Le serveur accepte des requêtes, les traite

et envoie le résultat au demandeur.

• Un service est fourni sur un Port de communication identifié par un numéro.

• Certains numéros de Port (internationalement définis) identifient le service quelque soit le site

ex :

  • le service FTP est offert sur les ports numéros 21 (contrôle) et 20 (données),
  • le service TELNET (émulation terminal) sur le port 23,
  • le service SMTP (mail) sur le port 25,
  • etc.

• Pour accéder à un service, il faut l'adresse du site et le numéro du port.

[email protected]

2

Qu'est-ce qu'un client ?

Architecture Client/Serveur

Qu'est-ce qu'un client ?

Client/Serveur

• un « logiciel client » utilise le service offert par un serveur,

• le « client » est la machine sur laquelle s ’exécute le logiciel client,

• Le client est raccordé par une liaison temporaire.

Le client envoie des requêtes

et reçoit des réponses.

Quelle architecture client/serveur ?

client

[email protected]

serveur

3

Architecture Client/Serveur

Architecture client/serveur ?

description du fonctionnement coopératif entre le serveur et le client.

Un serveur peut être utilisé par plusieurs clients,

ceux-ci pouvant être développés sur différents systèmes : Unix, Mac ou PC par ex.

Mais obligation de respecter le protocole entre les deux processus communicants.

Pile de protocoles TCP/IP très souvent utilisée (Internet par ex.)

L ’Application Program Interface (API) utilisée est l'API Sockets.

(dans notre cas)

API = un ensemble de primitives pour l'accès à la pile de protocoles TCP/IP.

[email protected]

Notion de Sockets (et principales primitives)

4

Architecture Client/Serveur

Notion de Sockets (prises de raccordement)

Processus

d ’Application

Ce n ’est ni une norme de communication

ni une couche de protocole

Socket

Transfert

des données

C ’est une interface entre

le programme d'application et

les protocoles de communication

mécanisme de communication bidirectionnel interprocessus

(dans un environnement distribué)

Socket

[email protected]

API (ensemble de primitives de programmation)

et

Extrémités de la communication {Add IP, numéro Port}

Cf. modèle TCP/IP

5

Architecture Client/Serveur

Principe de programmation

Processus

d ’Application

Socket

Transfert

des données

Un socket s'utilise comme un fichier :

1. Création/Définition/Ouverture

2. Communication

3. Fermeture/Libération.

• Création/Définition/Ouverture

  • réservation des ressources pour l ’interface de communication
  • création d ’un descripteur du socket (similaire descripteur de fichier)

seulement une extrémité de connexion

• Communication

  • utilisation des primitives read (réception), write (émission) … (idem fichier)
  • plusieurs variantes de primitive d ’émission et de réception

• Fermeture/Libération

  • utilisation de la primitive close (fermeture de la communication)

[email protected]

6

Architecture Client/Serveur

Algorithmes

Programme serveur pour un seul client

Demande le droit d'utiliser

l'identificateur de port réservé 21

(illustré pour FTP)

Initialisation du serveur

Non

Autorisé

Fin échec

Oui

Attente connexion

Attente CLIENT sur le port 21

Service rendu au client

Fin connexion

Publicité

(pour ce client)

Arrivée CLIENT sur le port 21

Servir CLIENT

[email protected]

11

Architecture Client/Serveur

Algorithmes

Concept de serveur multi-clients

(programmation concurrente)

(illustré pour FTP)

Non

Fin échec

Connexion d ’un client Ci,

le serveur génère un processus fils

(duplication du prog. serveur)

pour répondre à la demande

du client Ci.

Ainsi, le programme serveur

peut-il attendre un autre client.

connexion refusée pour cause

de saturation du serveur

(nombre max de clients atteint )

Demande le droit d'utiliser

l'identificateur de port réservé 21

Autorisé

Attente CLIENT sur le port 21

Arrivée CLIENT sur le port 21

Oui

refus connexion

Nbre client > N

création d'un processus serveur fils p

Non

Nbre client++

[email protected]

12

Architecture Client/Serveur

Algorithmes

Concept de serveur multi-clients

(programmation concurrente)

Prog. serveur dupliqué (fork()) à

chaque connexion

d ’un client Ci .

serveur fils p

serveur fils k

servir client k

serveur fils j

servir client j

Arrêt connexion

serveur fils i

servir client i

Arrêt connexion

servir client p

Arrêt connexion

indication au processus père

de la fin de la connexion

Arrêt connexion

indication au processus père

de la fin de la connexion

destruction du processus

serveur fils i

indication au processus père

de la fin de la connexion

destruction du processus

serveur fils j

indication au processus père

de la fin de la connexion

destruction du processus

serveur fils k

destruction du processus

serveur fils p

[email protected]

13

Introduction aux Sockets

n  IPC : Inter Process Communication

n  UNIX

n  Bibliothèque

n  #include <sys/socket.h>

n  La communication par socket utilise un

descripteur pour désigner la connexion

sur laquelle on envoie/reçoit les

données

10

Communication locales

11

Communication locales

n  Dans le domaine UNIX

n  Communication locale à une machine

n  Les identificateurs sone des nomes de

fichiers

n  Utilise une modalité de communication

non connecté

n  Le destinataire reçoit le message petit à

petit

n  Taille du message indéterminée

12

Communication locales

n  L’ouverture d’un socket se fait en 2

étapes :

n  Création d’un socket et de son descripteur

n  Fonction socket ()

n  Spécifier le type de communication

Publicité

n  Fonction bind ()

n  Un server écoute

n  Un client envoie

13

Socket data structure

n  Structure générique

14

Socket data structure

n  Famille AF_UNIX

n  Plus grand que la structure générique

n  Il faut spécifier la taille

15

Fonction socket ()

n  int socket (int af, int type, int protocol)

n  af: AF_UNIX, AF_INET

n  Type:

n  Protocol: 0 (car af et type suffit)

SOCK_STREAM, SOCK_DGRAM, SOCK_STREAM

n  Retourne le descripteur

n  Aucun transfert pour le moment

16

Fonction bind ()

n  Assignation d’une adresse/numéro de port

locaux à un socket

n  int bind(int sockfd, struct sockaddr

*mon_adr, int lg_adr)

17

Fonctions

sendto () recvfrom ()

n  Transmission/reception des données

n  Flags = 0

18

Communication en mode

connecté

19

Socket data structure

n  Structure générique

20

Socket data structure

n  Famille AF_INET

n  IPv4 AF_INET sockets:

struct sockaddr_in {

short sin_family;

unsigned short sin_port; // 2 bytes

struct in_addr sin_addr;

char sin_zero[8];

};

struct in_addr {

unsigned long s_addr; // 4 bytes

};

21

Fonction socket ()

n  int socket (int af, int type, int protocol)

n  af: AF_UNIX, AF_INET

n  Type:

n  Protocol: 0 (car af et type suffit)

SOCK_STREAM, SOCK_DGRAM, SOCK_RAW

n  Retourne le descripteur

n  Aucun transfert pour le moment

22

Fonction bind ()

n  Assignation d’une adresse/numéro de port

locaux à un socket

int bind( int sockfd,

struct sockaddr *mon_adr,

int lg_adr)

n  Serveur: enregistre son adresse publique

n  IP + port

n  Client: pas besoin en général

23

exemple

24

htonl (); htons ();

unsigned long int htonl (unsigned long int hostlong);

unsigned short int htons (unsigned short int hostshort);

n  La fonction htonl() convertit un entier long hostlong

depuis l'ordre des octets de l'hôte vers celui du réseau.

n  La fonction htons() convertit un entier court (short)

hostshort depuis l'ordre des octets de l'hôte vers celui

du réseau.

25

Adresse IP

n  INADDR_ANY le socket est associé à

n’importe quelle adresse IP de la

machine

n  La fonction inet_addr () spécifie

une adress IP

26

Port

n  Le socket peut être reliée à un port libre

quelconque en utilisant le numéro 0

27

Port

n  Vérifier la port utilise par le serveur:

getsockname(hServerSocket, (struct sockaddr *) &Address,

printf("opened socket as fd (%d) on port (%d) for stream i/o\n",hServerSocket,

ntohs(Address.sin_port) );

(socklen_t *)&nAddressSize);

printf("Server\n\

sin_family = %d\n\

sin_addr.s_addr = %d\n\

Publicité

sin_port = %d\n"

, Address.sin_family

, Address.sin_addr.s_addr

, ntohs(Address.sin_port)

);

28

Listen ()

n  int listen(int s, int backlog);

n  Le serveur est prêt à recevoir des demandes

d’ouvertures des connexions

n  Le paramètre backlog définit une longueur

maximale pour la file des connexions en attente.

Si une nouvelle connexion arrive alors que la file

est pleine, le client reçoit une erreur

29

Accept ()

n  int accept(int sock, struct sockaddr *adresse,

socklent_t

*longueur);

n  La fonction accept extrait la première connexion de la file des

connexions en attente, crée une nouvelle socket avec essentiellement

les mêmes propriétés que sock et alloue un nouveau descripteur de

fichier pour cette socket (retourné par la fonction).

n  Fonction bloquante

30

Connect ()

n  int connect(int socket, const struct sockaddr

*address, socklen_t address_len);

n  Débuter une connexion sur une socket

31

Fonctions

read () write ()

n  Réception des données

n  int read(int sockfd, char *buf, int count);

n  read lit jusqu'à count octets depuis le

descripteur de socket dans le buffer pointé

par buf.

n  read renvoie -1 s'il échoue, sinon read

renvoie le nombre d'octets lus

32

Fonctions

read () write ()

n  Transmission des données

n  int write(int sockfd, char *buf, int

count);

n  write écrit jusqu'à count octets dans le

fichier associé au descripteur sockfd depuis

le buffer pointé par buf

n  write renvoie le nombre d'octets écrits (0

signifiant aucune écriture), ou -1 s'il

échoue.

33

Close ()

n  int close(int sockfd);

n  close ferme le descripteur sockfd,

n  close renvoie 0 s'il réussit, ou -1 en cas

d'échec

34

SERVEUR

Processus

d ’Application

Socket

Processus

d ’Application

Socket

193.49.108.49

21

Processus

d ’Application

Socket

21

193.49.108.49

Architecture Client/Serveur

Primitives de programmation (API)

Berkeley Sockets (UNIX)

  • socket() -

crée le socket (extrémité de connexion) en définissant :

  • domaine (ex: Internet)... AF_INET
  • type (service utilisé)… SOCK_STREAM (mode connecté)
  • protocole...

IPPROTO_TCP

(adressage IP)

(TCP/IP)

  • bind() -

pas nécessaire

associe le descripteur crée par socket()

à l'adresse et au port du serveur

Rem : c ’est un socket découte, i.e. non associé précisément

  • listen() -

spécifie le nombre de demandes de connexions max

acceptées (mises en attente si le serveur est occupé)

CLIENT

Processus

d ’Application

Socket

Processus

d ’Application

Socket

193.49.108.87

Rem: pour pouvoir traiter plusieurs connexions (n>1), un processus fils doit être créé

après chaque accept() permettant de traiter cette communication,

tandis que le processus père traite les demandes de connexion (listen()).

…/...

Publicité

[email protected]

7

Architecture Client/Serveur

Primitives de programmation (API)

CLIENT

  • accept() -

traite une demande de connexion dans la file des demandes,

si aucune demande de connexion alors blocage (i.e. inactivité)

  • connect() -

émet une demande de connexion au serveur

et attend une réponse de connexion avant de continuer

• Précisions sur les paramètres de connect():

  • indiquer l ’adresse IP et le Port du serveur,

i.e. l ’extrémité de connexion souhaitée {193.49.108.49, 21}

  • automatique pour l ’extrémité locale (i.e. client)

le système attribue un numéro de port (pas encore utilisé)

et récupère l ’adresse IP de la machine ! {193.49.108.87,2065}

accept() débloqué et création d ’un nouveau socket

associé à cette communication

Processus

d ’Application

Socket

2065

193.49.108.87

Processus

d ’Application

Socket

SERVEUR

Processus

d ’Application

Socket

21

193.49.108.49

Processus

d ’Application

Socket

{193.49.108.49, 21}

{193.49.108.87, 2065}

[email protected]

8

…/...

SERVEUR

Processus

d ’Application

Socket

Transfert

des données

Architecture Client/Serveur

Primitives de programmation (API)

Communication établie

(deux extrémités de connexion couplées)

… échanges de données possibles.

write() ou send().

read() ou recv()

read() ou recv()

write() ou send().

CLIENT

Processus

d ’Application

Socket

Transfert

des données

{193.49.108.49, 21}

{193.49.108.87, 2065}

Rupture de la communication

(connexions relatives aux sockets sont fermées)

Processus

d ’Application

  • Close() -

Processus

d ’Application

• La fermeture d'un socket n'implique pas la perte des données

restant à acheminer.

• Le système tient compte des différents processus utilisant le socket et

le transport des données en attente est assuré avant la fermeture réelle.

• La terminaison d ’un processus (normalement ou non) ferme d’autorité les sockets.

[email protected]

9

Debug

n  Commande netstat!

n  Affiche toutes les sockets réseaux

ouvertes

n  Permet de vérifier les connexion

ouvertes

38

Debug

n  Commande telnet!

n  telnet <server> <port>!

n Ouvre une connexion TCP vers le

<server><port>

n Permet de recevoir/transmettre

chaine de caractère

n Fin chaine de caractère avec

1310

39

Debug

40