unix : communication inter processus,...

46
8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005 Unix : communication inter processus, sockets Viviane Gal CNAM – Département Informatique/Laboratoire CEDRIC

Upload: others

Post on 03-Sep-2020

14 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Unix : communication interprocessus, sockets

Viviane Gal

CNAM – Département Informatique/Laboratoire CEDRIC

Page 2: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

bibliographie

Ce support a été élaboré à partir des références suivantes :

• UNIX

Programmation et communication

Jean-Marie Rifflet, JeanBaptiste Yunès

Editions Dunod

• Cours "Introduction à la communication IPC Internet"

Eric Gressier-Soudan, CNAM-CEDRIC

• Programmation des sockets sous Unix

Hafid Bourzoufi et Didier Donsez – Université de Valenciennes

• Merci à Samia Bouzefrane

Page 3: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Unix : Communication interprocessus, sockets

• Introduction

• Communication par tubes

• Les sockets

Page 4: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

IntroductionUnix : communication inter processus, sockets

• Entrées/sorties– A chaque fichier Unix : i-nœud ou nœud d’index avec

ensemble de caractéristiques du fichier

– Plusieurs types fichiers :• Fichiers réguliers• Les répertoires• Les tubes• Les fichiers spéciaux• Les liens symboliques• Les sockets

Page 5: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Communication par tubesUnix : communication inter processus, sockets

• Différents types de tubes :• anonymes• nommés

• Caractéristiques communes• Mécanismes de communication• A priori unidirectionnels (1 entrée en lecture, 1 en écriture)• Durant son existence possibilité 1 extrémité inaccessible• La lecture est destructrice• Communication d’un flot continue (stream par opposition à

datagramme)• Gestion mode fifo• Capacité limitée• Comportement fonction du nombre de lecteurs et du nombre

d’écrivains

Page 6: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les tubes anonymes (pipes)Unix : communication inter processus, sockets

• Caractéristiques spécifiques

• Tubes anonymes = 1er mécanisme de communication avecsynchronisation

• Nécessité de disposer d’un descripteur

• Acquisition de descripteurs– Soit par appel primitive pipe

– Soit par héritage

Page 7: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les tubes anonymes (pipes)Unix : communication inter processus, sockets

• Primitive de création : pipe# include <unistd.h>int pipe (int *tubeDesc);

• La création d’un tube anonyme =>• allocation d’un nœud sur disque des tubes• allocation de 2 entrées dans table des fichiers ouverts et d’un

descripteur dans table descripteurs processus appelant

• tubeDesc correspond à un tableau de 2 entiers• tubeDesc[0] lecture p[0]• tubeDesc[1] écriture p[1]

Page 8: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les tubes anonymes (pipes)Unix : communication inter processus, sockets

• Schéma des tables du système

• Schéma du tube

p[0]

p[1] 1

1

rd

wr

2 0 Nœud associéau tube

Compteur référencesinternes

Table des descripteursdu processus appelant

Table des fichiers ouverts Table des i-nœuds en mémoire

writeread

tubeDesc[1]tubeDesc[0]

Page 9: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les tubes anonymes (pipes)Unix : communication inter processus, sockets

• Opérations non autorisées sur ces tubes

Anonymes signifie sans référence

⇒ Impossible d’appliquer des primitives nécessitantle nommage

(ex. : open, rename, chmod, …)

Page 10: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les tubes anonymes (pipes)Unix : communication inter processus, sockets

• Lecture dans un tubePrimitive read

nb_lu = read(tube[0], buf, TAILLE_BUF);

tube[0] : descripteur en lecture

buf : pointeur sur TAILLE_BUF

nb_lu : nombre de caractères lus

Page 11: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les tubes anonymes (pipes)Unix : communication inter processus, sockets

• Comment ça marche ?si le tube ≠ 0 et contient taille caractères

alors primitive extrait du tube min (taille, TAILLE_BUF) caractères à l’adresse buf

sinonsi nbre écrivains = 0, fin de fichier atteinte alors pas de caractère lu et

renvoie de 0 par primitivefsisi nbre écrivains ≠ 0 alors

si lecture bloquante alors processus mis en sommeil jusqu’àtube non vide ou 0 écrivain

fsisi lecture non bloquante alors retour immédiat et valeur retour = -1

et errno = EAGAINfsi

fsi

Page 12: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les tubes anonymes (pipes)Unix : communication inter processus, sockets

• Ecriture dans un tubePrimitive write

nbEcrit = write(tube[1], buffer, taillebuf);

tube[1] : descripteur en écriture

buffer : pointeur sur taillebuf

taillebuf : caractères accessibles

Rq : Si le nombre de caractères à écrire < à la taille du tube l’écrituresera atomique sinon décomposition arbitraire

Page 13: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les tubes anonymes (pipes)Unix : communication inter processus, sockets

• Comment ça marche ?si nbre lecteurs dans tube = 0

alors SIGPIPE délivré au processus écrivain ⇒ terminaisonprocessus

sinonsi écriture bloquante alors retour primitive vrai que si les n

caractères sont écrits et processus endormi jusqu’àtube vide

sinonsi n > PIPE_BUF alors retour = nbre < nsi n ≤ PIPE_BUF et nbre emplacements libres ≥ n

alors écriture atomiquesi n ≤ PIPE_BUF et nbre emplacements libres < n

alors retour immédiat sans écriture(renvoi –1 et errno =EAGAIN)

Page 14: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les tubes anonymes (pipes)Unix : communication inter processus, sockets

• Exercice : Ecriture dans un tube sans lecteur/* usage : ecrivain sans lecteur */#include <stdio.h>#include <stdlib.h>#include <unistd.h>struct sigaction action;void handSigpipe(int sig) { printf("Signal SIGPIPE reçu\n");}main() {

int nbEcriture, tube[2];action.sa_hendler = handSigpipe;sigaction(SIGPIPE, &action, NULL);pipe(tube); close(tube[0]);if ((nbEcriture = write(tube[1], "A", 1)) == -1)

perror("Write");else

printf("Retour du write : %d\n", nbEcriture);}

Page 15: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les tubes anonymes (pipes)Unix : communication inter processus, sockets

Exercice :Utiliser un fichier pour faire communiquerun processus et son père : le fils exécute "ls –l" etle père "wc –l"/* tube.c */#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>main(int argc, char *argv[]){int desc, desc2; switch (fork()) {case -1 : perror("fork"); exit(1);case 0 :if ((desc=open(argv[1], O_WRONLY|O_CREAT, 0666))== -1){ perror("open"); exit(2);}

Page 16: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les tubes anonymes (pipes)Unix : communication inter processus, sockets

close(STDOUT_FILENO); /* fermer la sortie standard */ dup(desc); /* STDOUT_FILENO pointe le meme fichierque desc *//* dup: cree un nouveau descripteur qui pointe lememe fichier que desc, de plus le numero choisicorrespond a la premiere entree libre dans la tabledes descripteurs, dans ce cas ce sera STDOUT_FILENOpuisque l'entree correspondante est libre *//* equivalent a : dup2(desc, STDOUT_FILENO); */close(desc); /* fermer le descripteur desc car il estinutile */

execlp("ls", "ls", "-l", NULL);perror("execlp");exit(1);

Page 17: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les tubes anonymes (pipes)Unix : communication inter processus, sockets

default : wait(NULL); if ((desc2=open(argv[1],O_RDONLY))==-1){ perror("open"); exit(2); }

close(STDIN_FILENO); dup(desc2); close(desc2); execlp("wc", "wc", "-l", NULL); perror("execlp"); exit(1);

}}

Page 18: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les tubes anonymes (pipes)Unix : communication inter processus, sockets

• Autre exercice : le programme traduit la tentative delecture d'un processus alors qu'il n'y a pas de rédacteur

/* tube1.c*/#include <stdio.h>

void main(){char c;

int p[2];int nb_lus;

pipe(p); /* creation du tube */

close(p[1]); /* descripteur en ecriture non utilise' è lefermer*/

if((nb_lus = read(p[0],&c,1)) == -1 ) perror("Erreurlecture dans tube");

else if(nb_lus==0) printf("Pas de caractere lu \n");

printf("processus termine\n");}

Page 19: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les tubes anonymes (pipes)Unix : communication inter processus, sockets

• Encore un exercice : nouvelle illustration d'un processustentant d'écriture alors qu'il n'y a pas de lecteur

/* tube2.c */#include <stdio.h>

#include <signal.h>

struct sigaction action;

void capture() {printf("\007 SIGPIPE a ete recu par leprocessus %d \n", getpid());}

void main() {int p[2];

action.sa_handler = capture;sigaction(SIGPIPE,&action,NULL);

printf("Mon pid est %d\n", getpid());

Page 20: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les tubes anonymes (pipes)Unix : communication inter processus, sockets

pipe(p);close(p[0]); /* fermer le descripteur dutube en lecture */

/*Tentative d'ecriture dans un tube sanslecteur ==> reception de SIGPIPE */

if( write(p[1],"jsk",3)== -1 )perror("Erreur ecriture dans tube"); else printf("Je ne dois jamais passerpar la");

}

Page 21: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les tubes anonymes (pipes)Unix : communication inter processus, sockets

Le programme que vous allez utiliser maintenant(pipe1.c) réalise la commande :

ps –l | grep toto

en créant 2 processus qui communiquent via un tube

Page 22: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les tubes nommés (fifo)Unix : communication inter processus, sockets

• Introduits sous le nom : fifo

• Permettent aux processus la communication en modeflot

• Mêmes caractéristiques que tubes anonymes

• En + : référencés dans système de gestion de fichiers=> utilisation de certaines primitives comme open

• Identifiables via la commande shell ls –l (caractère p)

Page 23: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les tubes nommés (fifo)Unix : communication inter processus, sockets

• Utilisation d'un tube nommé dans le shell

$ mknod nom_tube p

• Mise en œuvre

$ mknod nom_tube p$ script1 < tube & exécution en arrière-plan$ script2 > tube$ wait attente de la fin du script1

Page 24: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les tubes nommés (fifo)Unix : communication inter processus, sockets

Création d'un tube nommé dans un programme

La fonction mkfifo

#include <sys/types.h>#include <sys/stat.h>int mkfifo(const char *ref, mode_t mode);

Exemple : le modèle producteur-consommateuravec un tube nommé

Page 25: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les socketsUnix : communication inter processus, sockets

• Une socket = point de communication d’où il estpossible d’envoyer des informations ou d’enrecevoir. Il est donc un moyen bidirectionnel

• Comprendre les sockets :– // avec courrier ou le téléphone (point de contact : boîtes ou poste

téléphonique)– Socket ≈ points de contact– Nature des informations en émission ou réception fonction du type de

la socket– Définition par la notion de domaine de :

• L’ensemble des sockets• Un ensemble de protocoles de communication

Page 26: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les socketsUnix : communication inter processus, sockets

• Caractéristiques principales– Structure

Socket associée à objet de structure socket dans le fichier<sys/socketvar.h>

– Type• Détermine la sémantique des communications• Associe un ensemble de propriétés (fiabilité, séquencement, …)• Fichier standard <sys/socket.h> contient les définitions des

constantes symboliques

– Domaine• Définit le format des adresses• Définit un ensemble de protocoles• Certains domaines prédéfinis se trouvent dans le fichier

<sys/socket.h>

Page 27: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les socketsUnix : communication inter processus, sockets

• Tableau de différents types de sockets

• Exemple de domaines

Symbole Caractéristiques principales de la socket

SOCK_RAW Orientée vers l’échange de datagrammes (niveau bas de protocole – ex. : IP)

SOCK_DGRAM Orientée vers la transmission de datagrammes structurés en mode non connecté sans fiabilité

SOCK_STREAM Orientée vers l’échanges de séquences continues de caractères SOCK_RDM Orientée vers la transmission de datagrammes en mode non

connecté avec maximum de fiabilité SOCK_SEQPACKET Orientée vers la transmission de datagrammes en mode connecté

Nom symmbolique Domaine Format adresses AF_UNIX ou AF_LOCAL Local sockaddr_un (fichier <sys/un.h> AF_INET Internet sockaddr_in (fichier <netinet/in.h> AF_NS Xerox NS Sockaddr_ns (fichier <netns/ns.h>

Page 28: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les socketsUnix : communication inter processus, sockets

• Primitives générales– Création d’une socket : socket

int socket(int domaine, int type, in protocole);

– Suppression d’une socket∃ une socket tant que le dernier descripteur est non fermé

(par appel à la primitive close)

– Attachement d’une socket : bindint bind(int descripteur, struct sockaddr *p_adresse, int

longueur);

C’est le bind qui associe la socket à une adresse.

Page 29: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Les socketsUnix : communication inter processus, sockets

• Exercice sur la création des sockets de différents types et domaines/* usage : socket */#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>Main( ) {

int desc[5]; // tableau des descripteursif ((desc[0] = socket(AF_UNIX, SOCK_STREAM, IPPROTO_TCP)) = = -1)

perror("[AF_UNIX, SOCK_STREAM, IPPROTO_TCP]");else printf("socket [AF_UNIX, SOCK_STREAM, IPPROTO_TCP] créée: %d\n", desc[0]);if ((desc[1] = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) = = -1)

perror("[AF_INET, SOCK_STREAM, IPPROTO_TCP]");else printf("socket [AF_INET, SOCK_STREAM, IPPROTO_TCP] créée: %d\n", desc[1]);if ((desc[2] = socket(AF_INET, SOCK_DGRAM, 0)) = = -1)

perror("[AF_INET, SOCK_DGRAM, 0]");else printf("socket [AF_INET, SOCK_DGRAM, 0] créée: %d\n", desc[2]);if ((desc[3] = socket(AF_INET, SOCK_RAW, IPPROTO_IP)) = = -1)

perror("[AF_INET, SOCK_RAW, IPPROTO_IP]");else printf("socket [AF_INET, SOCK_RAW, IPPROTO_IP] créée: %d\n", desc[3]);if ((desc[4] = socket(AF_NS, SOCK_SEQPACKET, 0)) = = -1)

perror("[AF_NS, SOCK_SEQPACKET, 0]");else printf("socket [AF_NS, SOCK_SEQPACKET, 0] créée: %d\n", desc[4]);

}

Page 30: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Communication via les socketsUnix : communication inter processus, sockets

• Par datagrammes

Sockets du type SOCK_DGRAM

• En mode connecté

Socket du type SOCK_STREAM

Page 31: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Communication par datagrammesUnix : communication inter processus, sockets

• Opérations à réaliser

• Demande création d'une socket dans le domaineadapté

• Demande attachement de la socket sur port convenuou quelconque

• Construction de l'adresse interlocuteur en mémoire• Envoi et réception de messages

Page 32: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Communication par datagrammesUnix : communication inter processus, sockets

• Squelette serveur UDP

/* usage : serveurUDP port commande */#include "creerSocket.h"

struct sockaddr_in adresse;short port; int desc;

main(int argc, char *argv[]) {if (arg != 3) {

fprintf(stderr, "Nombre de paramètres incorrect\n");exit(2);

}/* test d'existence du programme à exécuter par le serveur */if (access(argv[2], X_OK) != 0) {

fprintf(stderr, "Fichier %s non accessible pour exécution\n", argv[2]);exit(2);

}

Page 33: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Communication par datagrammesUnix : communication inter processus, sockets

• Suite squelette serveur UDP/* détachement du terminal */if fork() != 0 exit(0); // après création du fils, le processus se terminesetsid(); // création d'une nouvelle sessionprintf("serveur de pid %d lancé\n", (int)getpid());port = atoi(argv[1]); // décodage du numéro de port donné en paramètre

/* création et attachement de la socket du service */desc = creerSocket(SOCK_DGRAM, port, &adresse);if (desc = = -1) {

fprintf(stderr, "Création de la socket impossible\n");exit(2);

}/* redirection de l'entrée standard de la socket */dup2(desc, STDIN_FILENO);/* dup2(desc, STDOUT_FILENO); */ // éventuellement (variante)/* dup2(desc, STDERR_FILENO); */ // éventuellement (variante)close(desc); // fermeture du descripteur inutiliséexeclp(argv[2], argv[2], NULL); // recouvrement par la commande donnée

}

Page 34: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Communication par datagrammesUnix : communication inter processus, sockets

• Squelette client UDP/* à lier à un objet contenant la définition de la fonction serviceClient *//* usage : machine_serveur port_serveur … */#include "creerSocket.h"#include <netdb.h>#include <string.h>struct sockaddr_in adresse_serveur, adresse_client;extern void serviceClient(int, struct sockaddr_in *, int, void **);main(int argc, char *argv[]) {

int sock; // descripteur de la socket du clientstruct hostent *hp; // pour l'adresse de la machine serveur/* contrôle du nombre de paramètres */if (argc < 3) {fprintf(stderr, "erreur sur le nombre de paramètres\n"); exit(2);}/* recherche de l'adresse Internet de la machine du serveur */if (hp = gethostbyname(argv[1])) = = NULL) {

fprintf(stderr, "machine %s inconnue\n", argv[1]); exit(2);}

Page 35: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Communication par datagrammesUnix : communication inter processus, sockets

• Suite squelette client UDP

/* Création et attachement de la socket du client sur un port quelconque */sock = creerSocket(SOCK_DGRAM, 0, &adresse_client);if (sock = = -1) {

fprintf(stderr, "Création socket du client impossible\n"); exit(2);}printf("Client lancé sur le port %d\n", nthos(adresse_client.sin_port));

/* Préparation de l'adresse du serveur */adresse_serveur.sin_family = AF_INET;adresse_serveur.sin_port = htons(atoi(argv[2]));memcpy(&adresse_serveur.sin_addr.s_addr, hp->h_addr, hp->h_length);

/* appel de la fonction spécifique au service */serviceClient(sock, &adresse_serveur, argc-3, argv+3);

}

Page 36: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Communication par datagrammesUnix : communication inter processus, sockets

• Envoi de message

Appel de la fonction sendtoint sendto(int descripteur, void *message, int longueur, int option,

struct sockaddr *p_adresse, int lg_adresse);

La valeur de retour = nbre de caractères du msg envoyé

La primitive sendmsgint sendmsg(int descripteur, struct msghdr *msghdr, int option);

L'appel à cette fonction permet de transmettre un message constitué

Page 37: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Communication par datagrammesUnix : communication inter processus, sockets

• Lecture de message

La primitive recvfromint recvfrom(int descripteur, void *message, int longueur, int option,

struct sockaddr *p_adresse, int p_lg_adresse);

Elle permet de lire sur la socket un message et d'en récupérer le contenu.

La primitive recvmsgint sendmsg(int socket struct msghdr *msghdr, int option);

cette fonction permet de récupérer un message reçu sur la socket spécifiée.

Page 38: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Communication par datagrammesUnix : communication inter processus, sockets

• Pseudo-connexions

La primitive connect

int connect(int descripteur, struct sockaddr *p_adresse, int lg_adresse);

Une socket pseudo-connectée oblige l'envoi et la réception sur lasocket de la pseudo-connexion.

Page 39: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Communication en mode connectéUnix : communication inter processus, sockets

Ce mode est associé aux sockets de type SOCK_STREAM.Il peut être comparé au téléphone.

• Communication entre 2 points spécifiques

• Connexion (circuit virtuel) entre 2 entités

• Protocole = TCP (Transmission Control Protocol)

Page 40: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Communication en mode connectéUnix : communication inter processus, sockets

• Etablissement de la connexion– Côté serveur TCP

Création d'une socket : socket

Attachement de la socket : bind

Ouverture du service : listen

Acceptation d'une connexion pendante : accept

Création d'un processus (ou d'une thread) : fork (ou pthread_create)nouveau processus ou nouvelle thread

Gestion du dialogue avec le client

Processus ou threadprincipale

Page 41: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Communication en mode connectéUnix : communication inter processus, sockets

• La primitive listenint listen(int desc, int nb_pendantes);

Elle permet de déclarer l'ouverture d'un service auprès de son systèmelocal.

nb_pendantes = nbre de connexions acceptables

• La primitive acceptint accept(int descripteur, struct sockaddr *ptr_adresse, int *p_lg);

Cette fonction permet à un processus de prendre connaissance del'existence d'une nouvelle connexion avec la socket d'écoute.

Cet appel est normalement bloquant.

Page 42: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Communication en mode connectéUnix : communication inter processus, sockets

• Etablissement de la connexion– Côté client

Création d'une socket : socket

Attachement de la socket surun port quelconque : bind

Construction de l'adresse du serveur(n° port supposé connu)

Demande de connexion avec le serveur : connect

Échec réussiteDialogue avec le serveur

Page 43: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Communication en mode connectéUnix : communication inter processus, sockets

• Dialogue client/serveur

écriture

Tampon de réception

Tampon de réception

Tampon d'émission

Tampon d'émission

lectureécriture

lecture

EntitéTCP

EntitéTCP

Caractère urgent

Caractère urgent

Réseauphysique

socketsocket

Page 44: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Communication en mode connectéUnix : communication inter processus, sockets

• Fermeture de connexionLa primitive close

#include <unistd.h>int close(int descripteur);

Elle ferme le descripteur du processus (désalloue l'entrée de la table desdescripteurs).

La primitive shutdown#include <sys/types.h>#include<sys/socket.h>int shutdown(int desc, int sens);

Où sens = niveau de fermeture souhaité (ex. : la valeur SHUT_RD fermel'extrémité de la connexion en réception)

Page 45: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Communication en mode connectéUnix : communication inter processus, sockets

• Exercice (Merci à Eric Gressier-Soudan)

• Prendre les sources dans /users/ensinf/viviane/socket• Les placer dans deux répertoires différents• Ouvrir une fenêtre sous Linux• Modifier Makefile (car sockets natives)• Ouvrir une fenêtre sous Solaris

• isockl.c (serveur sockets AF_INET connecté)• isockt.c (client sockets AF_INET connecté)

Page 46: Unix : communication inter processus, socketsdeptinfo.cnam.fr/.../CDI/ProjetCDI/UnixComProcSockets.pdfUnix : communication inter processus, sockets Exercice :Utiliser un fichier pour

8, 9 et 11 décembre 2004 Département Informatique - Cycle probatoire - Projet CDI 2004/2005

Communication en mode connectéUnix : communication inter processus, sockets

• Exercice

• Compiler par make sur chaque machine• Lancer le serveur sous Linux• Lancer le client sous Solaris

• Modifier le texte du client affiché par le serveur• Tester

• Echanger votre texte avec le serveur d'un autre binôme

• Après le getsockname, enlever la conversion ntohs avantaffichage à l'écran sur le serveur et essayer une connexion avecles deux numéros de port affichés. Que constatez-vous ?

• Transformer le serveur pour qu'il se remette en attente d'unenouvelle requête au lieu de s'arrêter (passer d'un serveur "à uncoup" à un serveur itératif). Tester