You are on page 1of 13

Les Sockets TCP/IP

Numro de session 1 2 3 Intitul de la session Gnralits Initialisation Le mode connect - Prsentation - Primitives Le mode datagramme - Prsentation - Primitives Architecture des serveurs Complments

5 6

1
1.1

Session 1 : Gnralits
Dfinition :

Les sockets sont apparues sous UNIX en 1981, elles forment un composant de base de la communication entre processus (processus situs sur une mme machine ou sur deux machines distinctes). Elles fournissent un accs aux protocoles de la couche transport. Une socket est une extrmit de connexion (assimilable une prise lectrique femelle) laquelle on peut associer un nom. Elle peut tre de diffrents types et tre associe plusieurs processus. Elles peuvent tre assimiles : Une interface : Une socket peut tre reprsente comme une interface entre les programmes d'application et les protocoles de communication. Une abstraction : Une socket peut sapparenter un canal de communication logique, accessible par un processus. Des primitives : - pour attribuer aux processus un rle de client ou de serveur, - pour changer des messages protocolaires en rendant transparents les services de communication rseau, - pour manipuler des informations de communication, - pour contrler et paramtrer les sockets.

Caractristiques gnrales des sockets

1.2

L'abstraction pour le programmeur

Vision rseau : Cest une association d'application reprsente par le quintuplet suivant : - adresse IP locale, - numro de port local, - adresse IP distante, - numro de port distant - mode de communication : protocole TCP ou UDP. Vision systme : Une socket est gre en mode FIFO, on y associe galement un descripteur. Socket = extrmit d'association + identificateur logique

2
2.1

Session 2 : Initialisation
Cration dune socket

La primitive socket() demande au systme la cration d'une socket devant fonctionner selon un mode de communication (datagramme ou connect) dans un domaine spcifi (AF_INET ou AF_UNIX). Le systme retourne un descripteur de fichier qui permet d'identifier logiquement ce canal de communication. Syntaxe : int socket(domaine,type,protocole) : int domaine, /*AF_INET ou AF_UNIX. */ int type, /*SOCK_STREAM ou SOCK_DGRAM. */ int protocole ; /*code du protocole utiliser , 0 pour dtermination automatique.*/

Valeur de retour : entier qui identifiera la socket dans tout le reste du programme (descripteur de socket). Exemple : int sid ; sid = socket(AF_INET, SOCK_STREAM, 0) ;

2.2

Association d'adresse

La primitive bind() permet dassocier une adresse locale au descripteur de socket cr par socket(). Cette opration est facultative pour les clients car ladresse est attribu au moment de la connexion avec le serveur si le bind() na pas t effectu. Pour les sockets TCP/IP, il est possible de donner la valeur 0 pour le numro de port. Le systme attribue alors un numro que lon peut retrouver par la primitive getsockname(). Syntaxe : : int bind(sock, localaddr, addrlen), int sock, /*descripteur de socket*/ struct sockaddr_in *localaddr, /*adresse de socket locale*/ int addrlen ; /*longueur de ladresse*/

Valeur de retour : nombre ngatif si lopration sest mal droule. Remarque : Avant dappeler cette primitive, il est ncessaire dinitialiser les champs de la structure de type sockaddr_in zro avec la primitive bzero(), puis de donner les valeurs correctes des champs suivants : - le domaine de communication - le numro de port (soit fix , soit 0) - ladresse internet de la machine Syntaxe de la primitive bzero() qui remet zro les nboctets partir de ladresse addr_struct : bzero(addr_struct, nboctets), char *addr_struct, /*adresse de la socket locale*/ int nboctets; /*taille de la structure*/

Exemple : struct sockaddr_in s_addr ; /* initialisation des champs de s_addr zero */ bzero((char*)&s_addr, sizeof(s_addr)); /* initialisation des champs de s_addr aux valeurs correctes */ bind(sid, &s_addr, sizeof(s_addr));

Initialisation 1

Initialisation 2

3
3.1

Session 3 : Le mode connect


Prsentation

Lchange dinformations en mode connect sassimile un flot bidirectionnel d'octets, transfrs de faon fiable et ordonne. Il ny a ni perte, ni duplication de donnes. Pour une communication en mode connect on utilisera le service TCP 3 phases sont alors ncessaires : - ltablissement de connexion - le transfert de donnes - la libration de connexion Cependant, il faut dabord avoir cr la socket et lui avoir associ une adresse. Au pralable, cration et caractrisation des sockets (voir initialisation) = = >MODE dINTERACTION ASYNCHRONE permis

3.2

Les primitives

Etablissement de la connexion

Le client doit initier l'interaction, pour se faire il demande un tablissement de connexion grce la primitive connect(). Cette primitive permet de spcifier les caractristiques de l'extrmit de la connexion distante ; cest dire ladresse IP et le numro de port associ la socket du serveur.

Syntaxe :

int connect (sock, serv_addr, addrlen), int sock, /*descripteur de socket*/ struct sockaddr_in *servaddr, /*adresse de la socket du serveur*/ int addrlen ; /*longueur de ladresse*/

Valeur de retour : un entier ngatif si la connexion na pu tre ralis.

Remarque : Avant dappeler cette primitive, il est ncessaire dinitialiser les champs de la structure servaddr zro, puis de fixer les valeurs correctes pour les champs suivants : - le domaine de communication - le numro de port (soit fix par programme, soit 0) - ladresse Internet de la machine

Exemple : struct sockaddr_in s_addr ; /* initialisation des champs de s_addr zero */ /* initialisation des champs de s_addr aux valeurs correctes */ connect (sid, &s_addr, sizeof(s_addr)) ; Le serveur doit tre capable de considrer des demandes de connexion, on dit quil coute sur une socket gnrique . La primitive listen() permet au processus serveur de se connecter sur la socket et de se bloquer jusqu' l'arrive d'une demande de connexion entrante. On parle douverture passive. Syntaxe : int listen(sock, qlen), int sock, /*descripteur de socket*/ int qlen ; /*nombre maximum de demande de connexion qui peuvent tre mises en attente (entre 1 et 20)*/ Cette fonction indique que le serveur est prt recevoir au maximum qlen demandes de connexion Valeur de retour : Nant. Exemple : listen(sid, 1) ; Le processus serveur doit ensuite accepter une demande de connexion, et diffrencier la connexion ainsi tablie.

La primitive accept() permet au serveur d'extraire une requte de connexion de la file d'attente, et cre une nouvelle socket pour chaque connexion. Chaque nouvelle socket est cre avec un descripteur logique spcifique affect par le systme : ce descripteur est utilis pour la suite des oprations sur cette connexion. Syntaxe : int accept(sock, addr_dist, addrlen) int sock: /*descripteur de socket*/ struct sockaddr_in *addr_dist, /*adresse du socket distant*/ int addrlen ; /*longueur de ladresse*/

Valeur de retour : cette fonction retourne un entier ngatif si la connexion na pu tre ralis.

Exemple : int newsock ; int sid ; struc sockaddr_in c_addr ; newsock = accept(sid, &c_adr, (sizeof(c_adr));

Transfert de donnes Il permet de supporter les diffrents changes entre protocoles applicatifs. Pour raliser les changes protocolaires le client utilise sa socket tandis que le serveur utilise la socket spcifique cette connexion. Emission La primitive send() permet l'envoi de donnes sans prciser ladresse car elle a dj t prcise lors de la connexion. Syntaxe : int send(sock, mess, longmess, 0), int sock, /*descripteur de socket*/ char *mess, /*message expdier*/ int longmess ; /*nombre de caractres*/

Cette primitive permet denvoyer sur la socket sock un message mess de longmess caractres.

Remarque : La fonction dcriture revient ds que le buffer crire a t transmis UDP. La primitive write() permet galement l'envoi de donnes travers le rseau. Elle est identique la fonction lie aux entres-sorties classiques et comporte les mmes arguments (descripteur de socket, adresse du tampon o sont stockes les donnes et taille de ce tampon). Syntaxe : int write(sock, mess, longmess), int sock, /*descripteur de socket*/ char *mess, /*message expdier*/ int longmess ; /*nombre de caractres*/

Valeur de retour : nombre de caractres envoys.

Rception La primitive recv() permet la rception de donnes. Syntaxe : int recv(sock, mess, longmess, 0), int sock, /*descripteur de socket*/ char *mess, /*stockage du message reu*/ int longmess ; /*nombre doctets prlever*/

Cette primitive permet de retirer sur la socket sock un message mess de longmess caractres Valeur de retour : - = -1 : si la connexion est rompue ou nexiste pas - = >0 : un certain nombre doctets a t reu - = 0 : lapplication distante a fait un close() ou sest arrt

La primitive read() permet galement la rception de donnes. Elle se comporte de la mme faon que la fonction lie aux entres-sorties classiques et prend les mmes arguments (descripteur de socket, adresse du tampon o stocker les caractres reus, et taille de ce tampon). Elle renvoie le nombre de caractres lus (toujours infrieur ou gal la taille donne pour le buffer).

Syntaxe:

int read(sock, mess, longmess), int sock, /*descripteur de socket*/ char *mess, /*stockage du message reu*/ int longmess ; /*nombre doctets prlever*/

Valeur de retour : nombre de caractres reus. Ces primitives sont bloquantes tant que rien n'est prlever (le buffer dentre est vide).

Libration de connexion Client et serveur doivent librer chacun leur extrmit de connexion. La primitive close() permet de fermer un descripteur de socket. La communication ne sera ferme rellement que s'il n'y a plus de processus utilisant cette connexion. Le noyau essaie denvoyer les donnes non mises avant de sortir du close(). Syntaxe : Exemple : Int sid ; Close (sid) ; int close(sock) ;

Rcapitulatif des primitives en mode connect

4
4.1

Session 4 : Le mode datagramme


Prsentation

Contrairement au mode connect, le mode datagramme ne comporte quune seule phase : le transfert de donnes. Le protocole utilis est UDP, le transfert est donc non fiable. Le client initie l'interaction, envoi de message protocolaire. Transfert de donnes Emission La primitive sendto() permet l'envoi de donnes en prcisant l'adresse du destinataire : on spcifie les caractristiques de l'extrmit de connexion distante, savoir ladresse IP et le numro de port de la socket du serveur.

Syntaxe :

int sendto (sid, msg, lg, 0, dest, lgdest), int sid, /*descripteur de socket*/ char *mess, /*message envoyer*/ int lg, /*longueur du message*/ struct sockaddr_in *dest, /*descripteur du socket destinataire*/ int lgdest ; /*longueur de ladresse destinataire*/

Remarque : Il faut auparavant initialiser ladresse de la socket destinataire. La fonction dcriture revient ds que le buffer crire a t transmis UDP.

Rception Le serveur attend des messages sur sa socket, rception de messages protocolaires. La primitive recvfrom() permet la rception de donnes en rcuprant l'adresse de l'envoyeur : rcupration des caractristiques de l'extrmit de connexion distante , savoir ladresse IP et la numro de port de la socket du client. Syntaxe : int recvfrom (sid, msg, lg, 0, emet, lgemet) ; int sid, /*descripteur de socket*/ char *mess, /*message envoyer*/ int lg, /*longueur du message*/ struct sockaddr_in *emet, /*descripteur du socket metteur*/ int lgdemet ; /*longueur de ladresse metteur*/

Valeur de retour : - = -1 : si la connexion est rompue ou nexiste pas, - = >0 : un certain nombre doctets a t reu, - = 0 : lapplication distante a fait un close() ou sest arrte. Lapproche est symtrique pour le transfert de la rponse.

On parle de mode dinteraction SYNCHRONE.

4.2

Principe

Rcapitulatif des primitives en mode datagramme

5
5.1

Session 5 : Architecture des serveurs


Serveur Itratif : un client la fois

Un processus serveur offre via une socket une connectivit sur le rseau et entre indfiniment dans un processus d'attente de requtes clientes. Lorsquune requte arrive sur la socket, le processus dclenche le traitement de la requte puis met le rsultat vers le client. Le serveur traite les requtes clientes squentiellement. CLIENTS TRAITS EN SQUENCE, PROCESSUS UNIQUE

5.2

Serveur Concurrent : plusieurs clients la fois

Un processus serveur offre, via une socket, une connectivit sur le rseau. Rptitivement il rceptionne une initiative d'interaction d'un client, offre une nouvelle socket et cre un processus secondaire charg de traiter l'interaction courante. CLIENTS TRAITS EN PARALLELE,

5.3

Serveur Multi Protocoles

Le mme service est offert simultanment sur plusieurs protocoles de communication. Exemple: DAYTIME port 13 sur UDP et TCP. Ce type de serveur permet de satisfaire les clients qui ont des exigences diffrentes de transfert (fiabilit). On distingue 2 approches d'implmentation : - un serveur par protocole, l'un servant les requtes TCP, l'autre les requtes UDP. Cette approche est plus aisment contrlable (accs UDP interdits sur systme) - un seul et mme serveur capable de servir la fois les requtes TCP et UDP : - non duplication des ressources, cohrence dans la gestion du service - implmentation possible en mode itratif et en mode concurrent.

5.4

Serveur Multi Services

Un mme serveur offre plusieurs services.Un tel service permet de diminuer le nombre de processus et de ressources consommes. - Serveur multi services et multi protocoles : - cas du daemon inetd super serveur Internet sous UNIX - interface de configuration (/etc/services)

5.5

Multiplexage d'Entre/Sortie

La primitive select() permet de surveiller plusieurs descripteurs d'entre/sortie, en particulier plusieurs sockets, en vue d'y oprer des rceptions et missions. Cette primitive est utile pour les serveurs multi.

6
6.1

Session 6 Complments
Primitives de gestion d'informations

getsockname(), getpeername() : gestion d'adresses de sockets locales ou distantes. gethostbyname(), gethostbyaddr(), sethostname() : gestion de noms d'ordinateurs getdomainname : gestion de noms de domaines getnetbyname(), getnetbyaddr() : gestion de rseau getprobyname(), getprobynumber() : gestion de protocoles getservbyname() : gestion de services

Dtail de certaines primitives : gethostbyname() : cette fonction retourne un pointeur sur une structure de type hostent Syntaxe : struct hostent *gethostbyname (hostname), char *hostname ; /*nom de la machine*/

getsockname() : cette fonction retourne le numro de port attribu par le systme la socket sock. Syntaxe : int getsockname(sock, addr, addrlen), int sock, /*descripteur de socket*/ struct sockaddr_in addr, /*adresse de la socket*/ int addrlen ; /*longueur de ladresse*/

getpeername() : cette function retourne ladresse de la socket homologue qui est en connexion avec la socket sock. Syntaxe : int getpeername(sock, addr, addrlen), int sock, /*descripteur de socket*/ struct sockaddr_in addr, /*adresse de la socket*/ int addrlen ; /*longueur de ladresse*/

6.2

Primitives de reprsentation et de conversion

Reprsentation normalise TCP/IP pour les entiers utiliss dans les protocoles (ex : numro de port) appele Network Byte Order. htonl(), htons(), ntohl(), ntohs() : conversion reprsentation machine locale/NBO. inet_addr(), inet_network() : manipulation d'adresses IP : conversion 32 bits/notation dcimale.

6.3

Primitive de contrle des sockets

Permet la rcupration d'informations caractrisant la socket. getsockopt() : configuration de valeurs de temporisations, allocation de mmoire tampon, autorisation donnes urgentes.

You might also like