Upload
others
View
12
Download
0
Embed Size (px)
Citation preview
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
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
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
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
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
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
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]
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]
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, …)
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);
où
tube[0] : descripteur en lecture
buf : pointeur sur TAILLE_BUF
nb_lu : nombre de caractères lus
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
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);
où
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
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)
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);}
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);}
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);
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);
}}
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");}
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());
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");
}
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
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)
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
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é
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
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>
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>
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.
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]);
}
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
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
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);
}
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
}
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);}
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);
}
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é
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.
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.
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)
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
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.
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
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
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)
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é)
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