DUT Informatique Module Système S4 C Département Informatique 2009 / 2010. Travaux Dirigés n o 3 : Sockets Stream



Documents pareils
DUT Informatique Module Système S4 C Département Informatique 2009 / Travaux Pratiques n o 5 : Sockets Stream

Programmation système de commandes en C

Communication par sockets

Exercice sur les Dockers

Java Licence Professionnelle CISII,

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

1. Fonctionnement de l Internet 2. Protocoles applicatifs 3. Programmation réseau

Applications client/serveur TCP/IP - Sockets Rappels. C.Crochepeyre Applications CS 1

Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée)

Cours 6 : Tubes anonymes et nommés

Programmation système I Les entrées/sorties

Programmation client-serveur sockets - RPC

3IS - Système d'exploitation linux - Programmation système

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

SYSTEME DE GESTION DES ENERGIES EWTS EMBEDDED WIRELESS TELEMETRY SYSTEM

Présentation du modèle OSI(Open Systems Interconnection)

Algorithmique et Programmation, IMA

Communication sous UNIX les sockets

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

OS Réseaux et Programmation Système - C5

Travaux Pratiques Introduction aux réseaux IP

Le modèle client-serveur

Programmation Internet en Java

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Programmation Web. Madalina Croitoru IUT Montpellier

Création, analyse de questionnaires et d'entretiens pour Windows 2008, 7, 8 et MacOs 10

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, Fabienne.Boyer@imag.fr

Bases de programmation. Cours 5. Structurer les données

Compression de Données - Algorithme de Huffman Document de Conception

Introduction au langage C

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Le service FTP. M.BOUABID, Page 1 sur 5

GESTION DES FICHIERS C/UNIX

1 Recherche en table par balayage

Processus! programme. DIMA, Systèmes Centralisés (Ph. Mauran) " Processus = suite d'actions = suite d'états obtenus = trace

Simulation d un système de paiement par carte bancaire

Cours 1: Java et les objets

Plan global. Programmation système II. Socket du domaine UNIX. Plan. Socket UNIX, Terminaux, Async IO, Mémoire, ELF.


Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Enseignement secondaire technique

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

1 Lecture de fichiers

Master 1 ère année. UE Réseaux Avancés I. Corrections décembre Durée : 2h Documents autorisés

Initiation à la Programmation en Logique avec SISCtus Prolog

Programmation système en C/C++

LEs processus coopèrent souvent pour traiter un même problème. Ces

Traduction des Langages : Le Compilateur Micro Java

Configurer le Serveur avec une adresse IP Statique (INTERFACE :FastEthernet) : et un masque

Le système de gestion des fichiers, les entrées/sorties.

Dis papa, c est quoi un bus logiciel réparti?

II/ Le modèle OSI II.1/ Présentation du modèle OSI(Open Systems Interconnection)

Network musical jammin

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Cours d Algorithmique et de Langage C v 3.0

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

Programmation Classique en langage C

Gestion distribuée (par sockets) de banque en Java

Cours de Systèmes d Exploitation

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Utilisation du BDE pour la maintenance des fichiers DBF de l'application TopoCad:

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Le prototype de la fonction main()

Utilisation d objets : String et ArrayList

SSL. Secure Socket Layer. R. Kobylanski janvier version 1.1 FC INPG. Protocole SSL Application avec stunnel

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Projet gestion d'objets dupliqués

4. Groupement d objets

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Internets. Informatique de l Internet: le(s) Internet(s) Composantes de l internet R3LR RENATER

Programmation en Java IUT GEII (MC-II1) 1

Intérêt du NAT (Network Address Translation) Administration Réseau Niveau routage. Exemple d Intranet. Principe NAT

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique

Cours Programmation Système

Programmer en JAVA. par Tama

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

EPREUVE PRATIQUE DES TECHNIQUES INFORMATIQUES ACTIVITE N 1. Thème de l activité : Configuration d un firewall

Entraînement à l épreuve de QCM 40 mn

Rapport final. Mise en place du réseau d'une entreprise de taille moyenne. Date de rendu : 18/07/2011 Promotion : 4PPA SRS

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Programmation C. Apprendre à développer des programmes simples dans le langage C

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Définitions. Numéro à préciser. (Durée : )

Installation du client

TD3: tableaux avancées, première classe et chaînes

Programme des Obligations d épargne du Canada. Guide d utilisation du serveur FTPS. Version 2.4

Lier Erlang avec d autres langages de programmation

NiceLabel pour Services Microsoft Windows Terminal Serveur et Citrix MetaFrame

Rappel: Le routage dans Internet. Contraintes. Environnement et contraintes. La décision dans IP du routage: - Table de routage:

Le protocole TCP. Services de TCP

le minimum pour communiquer par réseau (sans toutefois y comprendre grand chose)

Cours CCNA 1. Exercices

Corrigé des TD 1 à 5

Transcription:

iut ORSAY DUT Informatique Département Informatique 2009 / 2010 Travaux Dirigés n o 3 : Sockets Stream Objectifs : comprendre les principes et les mécanismes de communication par sockets stream, être capable de réaliser des systèmes client-serveur sur ce mode de communication. 1 Notes de cours Les sockets sont des interfaces de communication bidirectionnelles entre différents processus, qu ils appartiennent à un même système ou non. Dans le cas des sockets stream, cette interface s apparente à un téléphone : les informations sont transmises avec fiabilité en continu après établissement d une connexion. Ce type de communication s utilise entre un serveur (l appelé) et un client (l appelant), les rôles ne sont donc pas symétriques. La principale caractéristique, en comparaison des sockets datagramme, est l utilisation par le serveur d au moins deux sockets : une dite d écoute dédiée à la mise en place de connexions, et une autre dite de service dédiée à l échange d information proprement dit. Le schéma général de communication par sockets stream est le suivant : 1 2 3 4 5 6 7 8 Serveur (appelé) Client (appelant) Préparation de la connexion secoute = socket(...) sclient = socket(...) Liaison bind(secoute,...) Écoute sur la socket listen(secoute,...) Demande de connexion connect(sclient,...) Acceptation de la connexion sservice = accept(secoute,...) Communication write(sservice,...) write(sclient,...) read(sservice,...) read(sclient,...) Terminaison shutdown(sservice,...) shutdown(sclient,...) Libération des ressources close(sservice) close(sclient) close(secoute) Il y a donc simplement 9 primitives fondamentales pour communiquer avec les sockets stream. Trois d entre elles, socket, bind et close, sont communes à la communication par sockets datagramme (qui est supposée connue). L unique différence est que nous utiliserons le type SOCK_STREAM dans le champ type de la primitive socket.

Travaux Dirigés n o 3 Sockets Stream 2/7 1.1 Écoute sur une socket i n t l i s t e n ( i n t d e s c r i p t e u r, / D e s c r i p t e u r de l a s o c k e t d e c o u t e / s t r u c t n b _ p e n d a n t e s / Nombre maximum de c o n n e x i o n s p e n d a n t e s / La primitive listen permet à un processus serveur de déclarer au système d exploitation qu il est prêt à accepter les demandes de connections arrivant à sa socket d écoute (désignée par descripteur). Il peut y avoir des délais entre l arrivée de demandes de connexions et l acceptation de ces connexions (primitive accept, voir section 1.2). Les connections en attente d acceptation sont dites pendantes. Le paramètre nb_pendantes permet de préciser le nombre maximum de telles connexions. Cette primitive retourne 0 en cas de succès ou -1 en cas d échec. 1.2 Acceptation d une connexion i n t a c c e p t ( i n t d e s c r i p t e u r, / D e s c r i p t e u r de l a s o c k e t d e c o u t e / s t r u c t s o c k a d d r a d r e s s e, / P o i n t e u r v e r s a d r e s s e de l a p p e l a n t / i n t l o n g u e u r _ a d r e s s e / P o i n t e u r v e r s l o n g u e u r de l a d r e s s e / / de l a p p e l a n t / La primitive accept permet à un processus serveur d accepter une demande de connexion arrivée sur sa socket d écoute (désignée par le paramètre descripteur), de la part d un client ayant invoqué la primitive connect (voir section 1.3). Au moment de l appel à cette primitive, le champ longueur_adresse pointe sur une donnée indiquant la taille de l espace alloué à l adresse adresse, il faut donc l initialiser (typiquement à sizeof(struct sockaddr)). Au retour de cette fonction, les champs adresse et longueur_adresse permettront de connaître les coordonnées du client dont la demande a été acceptée. Cette primitive retourne le descripteur vers la socket de service dédiée à cette connection, ou -1 en cas d échec. 1.3 Demande de connexion i n t c o n n e c t ( i n t d e s c r i p t e u r, / D e s c r i p t e u r de s o c k e t de l a p p e l a n t / s t r u c t s o c k a d d r a d r e s s e, / P o i n t e u r v e r s a d r e s s e de l a s o c k e t / / de l a p p e l e / i n t l o n g u e u r _ a d r e s s e / Longueur de l a d r e s s e de l a s o c k e t / / de l a p p e l e / La primitive connect permet à un processus client de demander une connection entre sa socket désignée par le paramètre descripteur et la socket (d un serveur) dont l adresse est pointée par adresse et a pour longueur longueur_adresse et. L appel à cette primitive est bloquant : le processus est bloqué jusqu à ce que la communication s établisse (elle renvoie alors 0) ou échoue (elle renvoie alors -1).

Travaux Dirigés n o 3 Sockets Stream 3/7 1.4 Réception d information # i n c l u d e < u n i s t d. h> s s i z e _ t r e a d ( i n t d e s c r i p t e u r, / D e s c r i p t e u r de l a s o c k e t / void message, / A d r e s s e de r e c e p t i o n / s i z e _ t l o n g u e u r / Longueur maximum du message / La primitive read est simplement la primitive standard de lecture. Dans le cas d une socket, on lira sur la socket désignée par descripteur au plus longueur caractères contenus dans le tampon de réception de la socket et on les écrira à l adresse message. Cette primitive retourne le nombre de caractères effectivement lus. 1.5 Envoi d information # i n c l u d e < u n i s t d. h> s s i z e _ t w r i t e ( i n t d e s c r i p t e u r, / D e s c r i p t e u r de l a s o c k e t / void message, / A d r e s s e de r e c e p t i o n / s i z e _ t l o n g u e u r / Longueur du message / La primitive write est simplement la primitive standard d écriture. Dans le cas d une socket, on écrira sur la socket désignée par descripteur les longueur caractères se trouvant à l adresse message. Cette primitive retourne le nombre de caractères écrits. 1.6 Terminaison i n t shutdown ( i n t d e s c r i p t e u r, / D e s c r i p t e u r de l a s o c k e t / i n t s e n s / 0: l e c t u r e, 1: e c r i t u r e, 2: l e s deux / La primitive shutdown ferme la connexion établie par la socket désignée par descripteur dans le sens défini par la paramètre sens. Si sens vaut 0, la socket est fermée en lecture, si sens vaut 1, elle sera fermée en écriture, et elle sera enfin fermée dans les deux sens pour 2. 2 Exercices 2.1 Exercice 1 : client/serveur simple Construisez un serveur qui à la réception d un caractère ASCII renvoie le même caractère s il ne s agît pas d une lettre de l alphabet et de la majuscule correspondante dans le cas contraire. Les communications se feront par les sockets SOCK_STREAM et dans le donaine AF_INET. Le serveur ne pourra traiter qu une seule communication à la fois et ne pourra attendre que 5 communications au maximum. Écrivez de même le programme d un client.

Travaux Dirigés n o 3 Sockets Stream 4/7 2.2 Exercice 2 : client/serveur évolué On se propose d écrire les codes d un client et d un micro-serveur utilisant les sockets de type SOCK_STREAM dans le domaine AF_INET pour établir les communications avec un nombre quelconque de clients. Le serveur s exécute sur une machine de nom réseau tests.iut-orsay.fr et utilise pour le service qu il rend le port 5015. Les clients peuvent s exécuter sur n importe quelle machine du réseau. La structure du serveur est basée sur le multitâche. Un premier processus est lancé pour créer la socket d écoute et faire fonction de superviseur des demandes de connections. Lorsqu une demande se présente, il crée un processus «communication» pour accepter l appel et gérer la communication jusquà sa libération. Le premier processus est prévenu de cette terminaison par le signal SIGCHLD. On limitera le nombre de clients simultanés à 5. Le squelette du serveur est le suivant : Mettre en place un traitant pour le signal SIGCHLD (primitive signal) Créer une socket d écoute (primitive socket) Attacher la socket à une adresse (primitive bind) Attendre des demandes de communications (primitive listen) tant_que vrai faire si demande de connection (primitive accept) Créer un processus communication (c) (c) tant_que pas_fini faire (c) Lecture des requêtes (primitive read) (c) Envoi des réponses (primitive write) (c) Fermeture des flux (primitive shutdown) (c) Destruction de la socket de service (primitive close) Le squelette du client est le suivant : Créer une socket (primitive socket) tant_que non_connecté faire Tenter de se connecter au seveur (primitive connect) tant_que pas_fini faire Envoi des requêtes (primitive read) Lecture des réponses (primitive write) Traitement des réponses Fermeture des flux (primitive shutdown) Destruction de la socket (primitive close) 1. Pourquoi est-il nécessaire de traiter le signal SIGCHLD dans une telle application? 2. Implantez serveur et client. 3 Entraînement : exercice corrigé 3.1 Énoncé : calculateur L objectif de cet exercice est de réaliser un serveur de calcul inspiré des calculatrices HP à notation polonaise inversée (on se limitera au support des 4 opérations de base, +, -,, /). On rappelle que ce type de calculatrice utilise une pile pour effectuer les calculs. Le client se connecte au serveur puis envoie des commandes. Une commande est : soit un nombre ;

Travaux Dirigés n o 3 Sockets Stream 5/7 soit un opérateur. Le protocole (pour chaque envoi de commande) est le suivant : 1. le client envoie la commande terminée par un caractère de retour à la ligne ; 2. le serveur traite la commande : nombre : le nombre est empilé, opérateur : les opérandes de l opérateur sont dépilés, puis le résultat de l application de l opérateur à ces opérandes est empilé. 3. le contenu du niveau 1 de la pile est retourné au client. À la fermeture du client, le serveur repasse en mode acceptation de client. On suppose pour l implantation que les opérations de base sur les piles sont disponibles dans une bibliothèque. 3.2 Correction (essayez d abord!!!) L implantation est principalement la simple traduction du schéma des notes de cours à l aide de primitives C. Le client envoie son chiffre ou sa commande et reçoit un message de réponse de la part du serveur tant qu il ne souhaite pas s arrêter (envoi de la commande f). Le serveur fait une boucle infinie autour de l acceptation d une connection et du traitement des messages qu il reçoit. Ainsi lorsqu un client se déconnecte, c est le suivant qui sera servi par le serveur. On supposera que le client prend en argument sur la ligne de commande l adresse IP et le port du serveur. Le serveur prend simplement en argument le port sur lequel il doit être attaché. Des codes possibles sont les suivants, on présente tout d abord le code d un client puis celui du serveur. Les tests d échec des primitives ne sont pas faits, ils sont à rajouter dans tout travail sérieux.

Travaux Dirigés n o 3 Sockets Stream 6/7 / CLIENT. Donner l a d r e s s e IP e t l e p o r t du s e r v e u r en arguments, / / par exemple " c l i e n t 1 2 7. 0. 0. 1 5000", l a n c e r en d e r n i e r. / # i n c l u d e < s t d i o. h> / f i c h i e r s d en t e t e c l a s s i q u e s / # i n c l u d e < s t d l i b. h> # i n c l u d e < s t r i n g. h> # i n c l u d e < s y s / t y p e s. h> / f i c h i e r s d en t e t e " r é s e a u " / # i n c l u d e < n e t i n e t / i n. h> # i n c l u d e < a r p a / i n e t. h> # i n c l u d e < n e t d b. h> # d e f i n e BUFFER_SIZE 1024 / T a i l l e maximum des messages / i n t main ( i n t argc, char argv [ ] ) { i n t s c l i e n t ; / D e s c r i p t e u r de l a s o c k e t c l i e n t / char commande [ BUFFER_SIZE ], / Commande a e n v o y e r / message [ BUFFER_SIZE ] ; / Message recu / s t r u c t s o c k a d d r _ i n s a d d r ; / A d r e s s e du s e r v e u r / / 1. On c r e e l a s o c k e t du c l i e n t. / s c l i e n t = s o c k e t ( AF_INET, SOCK_STREAM, 0 / 4. 1. On p r e p a r e l a d r e s s e du s e r v e u r. / memset ( ( char )& saddr, 0, s i z e o f ( s t r u c t s o c k a d d r _ i n ) s a d d r. s i n _ f a m i l y = AF_INET ; s a d d r. s i n _ p o r t = h t o n s ( a t o i ( argv [ 2 ] ) s a d d r. s i n _ a d d r. s _ a d d r = i n e t _ a d d r ( argv [ 1 ] / 4. 2. On demande une c o n n e c t i o n au s e r v e u r, t a n t qu on y a r r i v e pas. / while ( c o n n e c t ( s c l i e n t, ( s t r u c t s o c k a d d r )& saddr, s i z e o f ( s a d d r ) ) == 1 / 6. On communique. / commande [ 0 ] = i ; while ( commande [ 0 ]!= f ) { p r i n t f ( " E n t r e z un nombre, un o p e r a t e u r (+ ou ) ou f pour s o r t i r. \ n " s c a n f ( " %s ", commande / L e c t u r e commande c l a v i e r / w r i t e ( s c l i e n t, commande, s t r l e n ( commande ) + 1 / Envoi de l a commande / r e a d ( s c l i e n t, message, BUFFER_SIZE / R e c e p t i o n du message / p r i n t f ( " Message r e c u : %s \ n ", message / A f f i c h a g e / / 7 e t 8. On t e r m i n e e t l i b e r e l e s r e s s o u r c e s. / shutdown ( s c l i e n t, 2 c l o s e ( s c l i e n t return 0 ;

Travaux Dirigés n o 3 Sockets Stream 7/7 / SERVEUR. Donner l e p o r t d a t t a c h e m e n t du p r o c e s s u s en argument, / / par exemple " s e r v e u r 5000", l a n c e r ce programme en p r e m i e r. / # i n c l u d e < s t d i o. h> / f i c h i e r s d en t e t e c l a s s i q u e s / # i n c l u d e < s t d l i b. h> # i n c l u d e < s y s / t y p e s. h> # i n c l u d e < s t r i n g. h> # i n c l u d e " p i l e. h " / B i b l i o t h e q u e de p i l e / / f i c h i e r s d en t e t e " r e s e a u " / # i n c l u d e < n e t i n e t / i n. h> # i n c l u d e < a r p a / i n e t. h> # i n c l u d e < n e t d b. h> # d e f i n e BUFFER_SIZE 1024 / T a i l l e maximum des messages / i n t main ( i n t argc, char argv [ ] ) { i n t s e c o u t e, / D e s c r i p t e u r s o c k e t d e c o u t e / s s e r v i c e, / D e s c r i p t e u r s o c k e t de s e r v i c e / c a d d r l e n ; / Longueur de l a d r e s s e du c l i e n t / f l o a t r e s u l t a t ; / R e s u l t a t pour l e s c a l c u l s / char message [ BUFFER_SIZE ] ; / Message recu ou a e n v o y e r / s t r u c t s o c k a d d r _ i n saddr, / Mon a d r e s s e s e r v e u r / c a d d r ; / A d r e s s e du c l i e n t / p i l e p ; / La p i l e / / 1. On c r e e l a s o c k e t d e c o u t e. / s e c o u t e = s o c k e t ( AF_INET, SOCK_STREAM, 0 / 2. 1 On p r e p a r e l a d r e s s e du s e r v e u r. / memset ( ( char )& saddr, 0, s i z e o f ( s t r u c t s o c k a d d r _ i n ) s a d d r. s i n _ f a m i l y = AF_INET ; s a d d r. s i n _ a d d r. s _ a d d r = INADDR_ANY; s a d d r. s i n _ p o r t = h t o n s ( a t o i ( argv [ 1 ] ) / 2. 2. On a t t a c h e l a s o c k e t a l a d r e s s e du s e r v e u r. / bind ( s e c o u t e, ( s t r u c t s o c k a d d r )& saddr, s i z e o f ( s a d d r ) / 3. On a t t e n d l e s demandes de c o n n e x i o n. / l i s t e n ( s e c o u t e, 5 while ( 1 ) { / 5. On a c c e p t e une c o n n e x i o n. / c a d d r l e n = s i z e o f ( c a d d r / I n i t i a l i s a t i o n de c a d d r l e n / s s e r v i c e = a c c e p t ( s e c o u t e, ( s t r u c t s o c k a d d r )& caddr,& c a d d r l e n / 6. On communique. / message [ 0 ] = i ; i n i t _ p i l e (&p / On i n i t i a l i s e l a p i l e / while ( message [ 0 ]!= f ) { b z e r o ( message, BUFFER_SIZE / Mise a 0 du message / r e a d ( s s e r v i c e, message, BUFFER_SIZE switch ( message [ 0 ] ) { / T r a i t e m e n t du message ( t r e s b a s i q u e! ) / case + : r e s u l t a t = d e p i l e r (&p )+ d e p i l e r (&p / Cas o p e r a t e u r + / e m p i l e r (&p, r e s u l t a t s p r i n t f ( message, "%f ", r e s u l t a t w r i t e ( s s e r v i c e,& message, s t r l e n ( message ) + 1 break ; case : r e s u l t a t = d e p i l e r (&p) d e p i l e r (&p / Cas o p e r a t e u r / e m p i l e r (&p, r e s u l t a t s p r i n t f ( message, "%f ", r e s u l t a t w r i t e ( s s e r v i c e,& message, s t r l e n ( message ) + 1 break ; case f : break ; / Cas f : f i n / d e f a u l t : e m p i l e r (&p, a t o f ( message ) / Cas nombre / w r i t e ( s s e r v i c e, " Empilement OK", 1 4 / 7 e t 8. T e r m i n a i s o n e t l i b e r a t i o n des r e s s o u r c e s. / shutdown ( s s e r v i c e, 2 c l o s e ( s s e r v i c e c l o s e ( s e c o u t e return 0 ;