F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Communication inter-processus (IPC) : tubes & sockets exemples en C et en Java F. Butelle
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Java : implémentation des Evenements public class Evenement { private Boolean Etat; // etat de l'evenement public Evenement() { Etat = Boolean.FALSE; public synchronized void set() { Etat = Boolean.TRUE; notifyall(); // debloque les threads qui attendent cet evenement: public synchronized void reset() { Etat = Boolean.FALSE; public synchronized void attente() { if(etat==boolean.false) { try { wait(); // bloque jusqu'a un notify() catch(interruptedexception e) {; // fin attente // fin classe
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Communications entre processus Processus utilisateur Processus utilisateur Processus utilisateur Processus utilisateur Noyau du SE Noyau SE Noyau SE Communications intra système Communications inter systèmes Réseau
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 IPC Intra-UNIX (entre-autres) Les tubes communication unidirectionnelle en pratique bidirectionnelle à l alternat à condition de retourner le tube à chaque fois! Les sockets en mode intra Unix communication bidirectionnelle gestion similaire aux sockets inter Unix. En commun : communiquer = écrire dans un fichier!
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 IPC Intra-Unix : les Tubes Exemple : la commande Unix : ls grep d sort lire l entrée standard, écrire sur la sortie standard ls grep d sort tube
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 lecture et écriture dans un tube (exemple : communication bidirectionnelle) Processus Processus 2 read write write read tube tube 2 Espace mémoire géré par le noyau Uniquement entre proc. père et fils ou bien de même père Lectures destructives Taille mémoire limitée
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Création d un tube En C : int pipe(int fd[2]) FILE *popen(char *cmd,char *option) // "r" ou "w" = pipe + fork En Java PipedWriter entrée PipedReader sortie
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 la commande pipe en C int pipe(int fd[2]) créé un tube formé de deux descripteurs fd[0] et fd[] retourne 0 en cas de réussite. au programmeur de décider quelle est l'entrée et la sortie ensuite en général on créée des fils par exemple un fils écrit dans fd[0] avec write : write(fd[0],bufentree,nbre_octets); l'autre lit les valeurs transmises avec read read(fd[],bufsortie,nbre); problème : comment savoir qu'il n'y a plus rien à lire?
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 popen() et l exécution de programmes distants Exemple de commande Unix : rsh machine cde params lance sur la machine distante la commande et l'on veut récupérer le résultat (sortie standard). FILE *fp = popen("rsh machine cde params","r"); retour = fread(buf,,nbre_octets,fp);
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Java et les tubes : création // créer une sortie puis une entrée // reliée à cette sortie ou l'inverse! PipedWriter tubout = new PipedWriter(); PipedReader tubin = new PipedReader(tubout); //puis création des threads
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Java : écriture dans un tube. // Dans thread producteur (écrit message m) String m = "bonjour"; // Conversion de m:string en buf:char[] buf = new char[m.length()]; m.getchars(0,m.length(),buf,0); //ecrit dans le tube out.write(cbuf,0,mes.length());
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Java : lecture d'un tube char cbuf[]= new char[20]; int charlu=0; do{ try{ charlu = in.read(cbuf,0,20); //le consommateur se suicide au besoin! if (charlu == ){ System.out.println("fin"); System.exit(0); String s = new String(cbuf,0,charLu);
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Exemple complet (TP JAVA) - Création du tube et des threads class RandomSum { public static void main(string args[]) throws InterruptedException { // Creation du tube: PipedWriter out = new PipedWriter(); PipedReader in; try { in = new PipedReader(out); Emetteur E = new Emetteur(out); Recepteur R = new Recepteur(in); E.start(); R.start(); E.join(); R.join(); catch (IOException e) { e.printstacktrace();
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Exemple complet (TP JAVA) 2- Thread Emetteur class Emetteur extends Thread { private Writer out; private Random generateur; Emetteur( Writer out ) { this.out = out; generateur = new Random(); public void run() { for (int i=0; i < 0; i++) { float x = generateur.nextfloat(); System.out.println( "x= " + new Float(x).toString() ); try { out.write( new Float(x).toString() ); out.write( ';' ); // out.flush(); non necessaire ici catch (IOException e) { e.printstacktrace();
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Exemple complet (TP JAVA) 3- Thread Récepteur class Recepteur extends Thread { private Reader in; private int end; private int nterm = 0; Recepteur( Reader in ) { this.in = in; end = 0; public void run() { float sum = 0; while (end == 0) { sum = sum + LitFloat(); System.out.println( "sum = " + sum ); System.out.println( "nterm = " + nterm );
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Exemple complet (TP JAVA) 3- Thread Récepteur, suite private float LitFloat() { char c = ';'; String s = ""; do { try { c = (char)in.read(); catch (IOException e) { System.out.println( "Recepteur: fin?" ); end = ; return 0; if (c!= ';') { s = s + c; while (c!= ';'); System.out.println( "recu : " + s ); // Conversion de la chaine en float try { float x = Float.parseFloat(s); nterm = nterm + ; return x; catch (NumberFormatException e) { e.printstacktrace(); return 0;
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 TCP/IP et applications (rappels) NFS X RFS RPC NCS TCP XDR UDP Interface Socket ou TLI IP (Internet Protocol)
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Format des messages (ou «segments») TCP 4 octets: 4 bits 6 bits 6 bits 6 bits Port source Port destination Numéro de séquence Numéro d acquittement Longueur entête Réservé Drapeaux Fenêtre Checksum Pointeur urgent Options éventuelles... Données
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 UDP (User Datagram Protocol) Protocole très simple sans connexion, sans acquittement (mode datagramme) Apporte à IP l utilisation des numéros de Port
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Quelques services standards NO M N port P rotocole Com m entaire FT P DA T A 20 TCP Do n n é e s de tra n s f e rt de fi c h i e r FT P 2 TCP Co m m a n d e s de tra n s f e rt de fi c h i e r S S H 22 TCP S ec u re S hel l (c o n n e x i o n à di s t a n c e sé c u ri s é e ) Tel net 23 TCP Term i n a l v i rt u e l di s t a n t S M TP 25 TCP le c o u rri e r éle c t ro n i q u e da y t i m e 3 UDP, T CP Do n n e r l heu re d u jo u r! (ut i l e p o u r de s te s t s ) d o m a i n 53 UDP, T CP S erv e u r de n o m s TF TP 69 UDP Tri v i a l File Tra n s f e r P rot o c o l W W W 80 TCP W o rl d W i d e W e b RP C UDP, T CP Rem o t e P ro c e d u re Call lo g i n 53 TCP Util i sé p o u r rl o g i n : se «lo g u e r» s u r u n e m a c h i n e di s t a n t e NFS 2049 UDP Net w o rk File S y s t e m dae m o n : m o n t a g e de pa r t i t i o n s d i s t a n t e s
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Sockets Un des mécanismes de communications entre processus Une API : Application Program Interface fait partie du noyau d'unix Bibliothèque de primitives l'extrémité d'un point de communication Application CLIENT Application SERVEUR SOCKET(S) SOCKET(S) protocole de transport
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Création de socket Apporte un descripteur sorte de descripteur de fichier lecture/écriture dans un fichier communication bidirectionnelle Full Duplex (contrairement aux pipes) A la création d'un socket : Domaine (AF_UNIX, AF_INET, X25, DECNET, ) Type (SOCK_DGRAM, SOCK_STREAM, SOCK_RAW) PORT (TSAP) Adresse
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Utilisation des sockets en mode connecté Algorithme d'un processus client: Créer une socket Se connecter au serveur ; écrire/lire des données Fermer la connexion. Algorithme d'un processus serveur: Créer un socket sur une machine sur un PORT particulier Ecouter sur le port pour accepter les connexions Accepter une connexion Lire/écrire des données Fermer la connexion
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Utilisation en C en mode connecté C LIE N T S E R V E U R socket () socket () connect () bind () listen () : appel en général bloquant accept () : appel non bloquant write () read () transfert de données read () write () Utilisation de la socket comme d un descripteur de fichier close () close ()
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Utilisation en C en mode non connecté C LIE N T S E R V E U R socket () sendto () recvfrom () transfert de données socket () bind () recvfrom () sendto () : appel en général bloquant : appel non bloquant
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Classes et méthodes en Java -- mode connecté processus client InetAddress getlocalhost() getbyname() // adresse IP du serveur Socket getinputstream() getoutputstream() processus serveur ServerSocket accept() : Socket getinputstream() getoutputstream()
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 En Java, mode connecté CLIENT InetAddress ip = InetAddress.getByName("serv") socket = new Socket(ip,PORT) in = new BufferedReader(... socket.getinputstream())) out = new PrintWriter( socket.getoutputstream())) SERVEUR "serv" ServerSocket s = new ServerSocket(PORT) Socket cxion = s.accept() in = new BufferedReader( new InputStreamReader( cxion.getinputstream())) out = new PrintWriter( new BufferedOutputStream( cxion.getoutputstream())) out.println( );out.flush() Str = In.readLine(); socket.close() Transfert de données Str = In.readLine(); out.println( );out. flush() cxion.close()
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 En Java, serveur Multi-Threads, mode connecté leserveur = new ServerSocket(PORT); System.out.println("Le serveur démarre"); while (true) { System.out.println("Attend une nouvelle connexion"); Socket Cxion = leserveur.accept(); //création d'un thread a chaque connexion ThreadConnexion thcxion = new ThreadConnexion(Cxion); thcxion.start(); // fin while
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Le thread de gestion de la connexion class ThreadConnexion extends Thread { ThreadConnexion(Socket laconnexion) { in=new BufferedReader(... laconnexion.getinputstream()))... out=new PrintWriter( laconnexion.getoutputstream())); public void run() { String str=in.readline(); out.println( );
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Classes et méthodes en Java -- non connecté Processus client InetAddress getlocalhost() getbyname() // adresse IP du serveur s=datagrammsocket() p=datagrammpacket(buffer, adresse IPserveur, Port) s.send(p) Processus serveur s=datagrammsocket(port) s.receive(p)
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Rendre les opérations non bloquantes En C : fcntl(desc, F_SETFL, O_NONBLOCK) En JAVA : setsotimeout(int duree) throws SocketException
F. Butelle, E. Viennet, Système GTR2 IUT Paris 3