Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
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.
Client/Serveur
• un « logiciel client » utilise le service offert par un serveur,
client serveur
andreu@lirmm.fr 3
Architecture Client/Serveur
Architecture client/serveur ?
(dans notre cas) API = un ensemble de primitives pour l'accès à la pile de protocoles TCP/IP.
Socket
C ’est une interface entre
le programme d'application et
Transfert les protocoles de communication
des données
• 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)
andreu@lirmm.fr 6
Architecture Client/Serveur
Algorithmes
Servir CLIENT
Fin connexion
(pour ce client)
andreu@lirmm.fr 11
Architecture Client/Serveur
Algorithmes
Demande le droit d'utiliser
l'identificateur de port réservé 21
andreu@lirmm.fr 12
Architecture Client/Serveur
Algorithmes
Concept de serveur multi-clients
(programmation concurrente)
serveur fils i
Prog. serveur dupliqué (fork()) à
chaque connexion serveur fils j
d ’un client Ci .
servir client i
serveur fils k
servir client j
serveur fils p Arrêt connexion
servir client k
Arrêt connexion
servir client p indication au processus père
Arrêt connexion de la fin de la connexion
indication au processus père
Arrêt connexion de la fin de la connexion
indication au processus père destruction du processus
de la fin de la connexion serveur fils i
destruction du processus
indication au processus père
serveur fils j
de la fin de la connexiondestruction du processus
serveur fils k
destruction du processus
serveur fils p
andreu@lirmm.fr 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
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
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: SOCK_STREAM, SOCK_DGRAM, SOCK_STREAM
n Protocol: 0 (car af et type suffit)
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: SOCK_STREAM, SOCK_DGRAM, SOCK_RAW
n Protocol: 0 (car af et type suffit)
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)
24
htonl (); htons ();
unsigned long int htonl (unsigned long int hostlong);
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,
(socklen_t *)&nAddressSize);
printf("opened socket as fd (%d) on port (%d) for stream i/o\n",hServerSocket,
ntohs(Address.sin_port) );
printf("Server\n\
sin_family = %d\n\
sin_addr.s_addr = %d\n\
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
29
Accept ()
n int accept(int sock, struct sockaddr *adresse,
socklent_t
*longueur);
30
Connect ()
n int connect(int socket, const struct sockaddr
*address, socklen_t address_len);
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
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
d'échec
34
Architecture Client/Serveur
Primitives de programmation (API)
SERVEUR Berkeley Sockets (UNIX) CLIENT
- socket() - Processus
Processus
d ’Application
d ’Application
crée le socket (extrémité de connexion) en définissant :
Socket - domaine (ex: Internet)... AF_INET (adressage IP) Socket
193.49.108.49
à l'adresse et au port du serveur
193.49.108.87
21 Rem : c ’est un socket découte, i.e. non associé précisément
Processus - listen() -
d ’Application
spécifie le nombre de demandes de connexions max
acceptées (mises en attente si le serveur est occupé)
Socket
21 Rem: pour pouvoir traiter plusieurs connexions (n>1), un processus fils doit être créé
193.49.108.49 après chaque accept() permettant de traiter cette communication,
tandis que le processus père traite les demandes de connexion (listen()).
…/...
andreu@lirmm.fr 7
Architecture Client/Serveur
SERVEUR Primitives de programmation (API) CLIENT
Processus
d ’Application - accept() -
traite une demande de connexion dans la file des demandes,
Socket si aucune demande de connexion alors blocage (i.e. inactivité)
Processus
21 d ’Application
193.49.108.49
- connect() -
émet une demande de connexion au serveur
Socket
et attend une réponse de connexion avant de continuer
• Précisions sur les paramètres de connect(): 2065
- indiquer l ’adresse IP et le Port du serveur, 193.49.108.87
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é)
Processus et récupère l ’adresse IP de la machine ! {193.49.108.87,2065}
Processus
d ’Application
d ’Application
accept() débloqué et création d ’un nouveau socket
Socket associé à cette communication Socket
…/...
andreu@lirmm.fr 8
Architecture Client/Serveur
SERVEUR Primitives de programmation (API) CLIENT
Communication établie
Processus (deux extrémités de connexion couplées) Processus
d ’Application … échanges de données possibles. d ’Application
Socket Socket
write() ou send(). read() ou recv()
Transfert Transfert
des données des données
read() ou recv() write() ou send().
{193.49.108.49, 21} {193.49.108.87, 2065}
Rupture de la communication
(connexions relatives aux sockets sont fermées)
Processus
Processus - Close() - d ’Application
d ’Application
andreu@lirmm.fr 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>!
<server><port>
n Permet de recevoir/transmettre
chaine de caractère
n Fin chaine de caractère avec
1310
39
Debug
40