Socket

Communication par sockets Olivier Dalle Université de Nice – Sophia Antipolis http://deptinfo. unice. fr/ D’après le cours original de Sacha Krakowiak Université Joseph Fourier projet sardes (INRIA et IMAG-LSR) http://sardes. inrialpes. fr/—krakowia Rappel : le réseau vu de l’utilisateur (1) Client Serveur org Sni* to View (demande un service) (fournit un service) Le schéma client-serveur a été vu en TD pour des processus sur une même machine.

Ce schéma se transpose à un réseau, où les processus client et serveur sont sur des machines différentes. Pour le client, un service est souvent désigné par un nom ymbolique (pa exemple mail, http://… , telnet, etc. ). Ce nom doit être converti en une adresse interprétable par les protocoles du réseau. La conversion d’un nom symbolique (par ex. Krakowiak) 23 : telnet (connexion à distance) 25 : mail 7-3 Le réseau vu de l’utilisateur (3) 194. 199. 25. 9:34231 socket client (demande un seraice) serveur 216. 239. 39. 99:45321 adresse IP no de port Pour programmer une application client-serveur, il est commode d’utiliser les sockets (disponibles en particulier sous Unix). Les sockets fournissent une interface qui permet d’utiliser facilement les protocoles de ransport TCP et IJDP une socket est simplement un moyen de désigner l’extrémité d’une connexion, côté émetteur ou récepteur, en l’associant à un port. ne fois la connexion *AGF 9 rif q 7-5 Le protocole TCP prlncpales caractéristiques de TCP Communication bidirectionnelle par flots d’octets Transmission fiable Fiabilité garantie dès lors que la liaison physique existe Transmission ordonnée Ordre de réception identique à l’ordre d’émission Contrôle de flux Permet au récepteur de limiter le débit d’émission en fonction de ses capacités de réception Contrôle de congestion Permet d’agir sur le débit d’émission pour éviter la surcharge du réseau ne pas confondre contrôle de flux (entre récepteur et émetteur ) et contrôle de congestion (entre réseau et émetteur) O.

Dalle (cours original de S. Krakowiak) 7-6 Sockets côté sep,’eur (1) Un serveur fournit un service à des clients. Il doit donc attendre demande, puis la traiter. Les fonctions d’attente et de traitement sont séparées, pour permettre au serveur d’attendre de nouvelles demandes pendant qu’il traite des requêtes en cours. socket serveur connsock 0) Internet TCP protocole, sans usage ICI onnsock est un objet socket port Étape 2 : associer la socket à un port: Créer un adresse locale (couple {adresse,port}) serveraddr = («  »,5678) connsock. ind(serveraddr) 7-8 Sockets côté serveur (3) Étape 3 : indiquer que c’est une socket serveur QUEUE_SIZE 5 # par exemple import socket sock socket. socket(domain, type, protocol) # crée une socket client ou serveur, renvoie descripteur) # associe une socket à une adresse locale sock. listen(maxqueuesize) # déclare une socket comme serveur avec taille max queue readsock = sock. accept() # met une socket serveur en attente de demandes de connexion Il existe en outre une primitive select, traitée plus loin. -11 Sockets côté client (1 ) On procède en 2 étapes, décrites schématiquement ci-après On suppose que l’on connaît l’adresse d’un serveur et le numéro de port d’une socket serveur sur celui-ci (un processus serveur est en attente sur ce port) Étape 1 : créer une socket : N. B. : opération identique à la création d’une socket seweur clisock socket. socket(socket. AF_INET, socket. SOCK_STREAM, 0) établie connfd Le client et le serveur peuvent maintenant dialoguer sur la 7-13 Résumé des primitives pour les sockets côté client lisock socket. ocket(domain, type, protocol); clisock. connect((addr,port)) # envoie une demande de connexion à un serveur sur un # port donné 7-14 Échanges sur une connexion entre sockets Une fois la connexion établie, le client et le serveur disposent chacun d’un Object socket vers l’extrémité correspondante de la connexion. Cet objet fonctionne de façon un peu similaire à un descripteur de fichier : on peut l’utiliser pour les méthodes recv et send ; on le ferme avec close. lientfd *AGF 6 rif q connfd. close() # maintenant on va accepter la prochaine connexion -16 LJn application client-serveur avec sockets (2) Principes de la programmation d’une application avec sockets (les déclarations sont omises). Côté client : clisock – clisock. connect((« www. unice. fr »,port)) # ouvre une connexion vers le serveur client_prog(clisock) # envoyer requêtes et recevoir réponses avec clientfd # en utilisant recv et send # à la fin des échanges, fermer le descripteur clisock. lose() 7-17 LJn application client-serveur avec sockets (3) Pour exécuter l’application : Lancer le programme serveur sur une machine, en indiquant un numéro de ort 023, les numéros SI 023 sont réservés) ; de préférence en travail de fond Lancer le programme client sur une autre machine (ou dans un autre processus de la même ma cifiant adresse du serveur exit() requête reponse boucle d’interaction clientserveur (spécifique de l’application) s. recv() attente nouvelle connexlon s. send() s. lose(s) 7-19 Client-serveur en mode concurrent (1) Pour réaliser un serveur en mode concurrent, une solution consiste ? créer un nouveau processus pour sen,’ir chaque demande de connexion, le programme principal du serveur ne faisant que la boucle d’attente sur les emandes de connexion. Donc il y a un processus principal (appelé veilleur) qui attend sur accept(). Lorsqu’il reçoit une demande de connexion, il crée un processus fils (appelé exécutant) qui va interagir . Le veilleur revient se PAGFac.

Fq S’il n’y a rien a lire, on attend indéfiniment… • Comment lire et recevoir de plusieurs sources en meme temps ? • par exemple attendre en même temps: soit une entrée au clavier lire fd=O soit l’arrivée d’un message sur un socket connecté listensock soit l’arrivée d’une demande de connection lire connsock • Pb: si je me bloque en attendant sur fd=O (stdin=clavier), je ne eux pas savoir ce qui se passe sur listensock ou connsock • Solutions • Serveur concurrent select. elect 7-22 Exemple d’utilisation de select. select liste_lectures = [clisock,sys. stdin] tt en entrée on surveille clisock et sys. stdin liste_ecritures,liste_erreurs = # en ecriture et en erreur on ne surveille rien readers,writers,errors = select. select(liste_lectures,liste_ecrltures, # on recupère le résu tat de l’attente dans 3 listes for input in readers: if input clisock: tt ici on a quelque chose a lire sur clisock mse = clisock. recv(1000) # mse = clisock. recv(1000) # ne bloque pas .