Socket - AF_UNIX
Transcript
Socket - AF_UNIX
Program m azione di Sist em a – 6 Lucidi per il corso di Laboratorio di Sistemi Operativi tenuto da Paolo Baldan presso l'Università Ca' Foscari di Venezia, anno accademico 2004/ 2005. Parte di questo materiale è rielaborato dai lucidi del Corso di Laboratorio di Sistemi Operativi tenuto da Rosario Pugliese presso l'Università di Firenze, anno accademico 2001/ 02. IPC: Int er Process Com m unicat ion Meccanism i che perm et t ono a processi dist int i di com unicare e scam biare inform azioni. I processi che com unicano possono risiedere sulla st essa m acchina (segnali, pipe, fifo, socket ) su m acchine diverse (socket ). La com unicazione può essere finalizzat a a cooperazione: i processi scam biano dat i per l'ot t enim ent o di un fine com une sincronizzazione: lo scam bio di inform azioni perm et t e a processi indipendent i, m a correlat i, di schedulare corret t am ent e la propria at t ivit à (es. di non accedere cont em poraneam ent e ad una risorsa condivisa). 2 Socket Socket Pot ent e m eccanism o di com unicazione t ra processi in am bient e Unix. Com unicazione bidirezionale t ra processi. I processi com unicant i possono risiedere nello st esso host in host diversi. Ut ilizza l'int erfaccia di accesso ai file. Es. collegam ent o rem ot o di un ut ent e (rlogin) t rasferim ent o di file da una m acchina all'alt ra. 4 Socket Ast rat t am ent e, un socket rappresent a un endpoint di com unicazione al quale è possibile associare un nom e. server crea te/ bin d co n n e ct crea te clien t a cce p t fork / serv e co m m u n ica t e 5 Socket La com unicazione t ram it e i socket si basa sul m odello client -server. Un processo, il server, crea un socket il cui nom e è not o anche ai processi client . I client possono com unicare col server t ram it e una connessione al suo socket . Il client crea un socket anonim o e quindi chiede che sia connesso al socket del server. Una connessione che ha successo rest it uisce un descrit t ore di file al client ed uno al server, che perm et t ono di leggere e scrivere sul canale. Una volt a creat a la connessione col client , solit am ent e il server crea un processo figlio che si occupa della gest ione della connessione, m ent re il processo originario cont inua ad accet t are alt re connessioni da client . 6 Creazione di un socket : socket () int socket (int domain, int type, int protocol) domain specifica il dom inio in cui si vuole ut ilizzare il socket . Userem o solo i valori AF_UNIX AF_INET. type specifica il t ipo di com unicazione. Userem o solo il valore SOCK_STREAM. protocol specifica il prot ocollo da ut ilizzare per la t rasm issione dei dat i. Se vale 0 indica il prot ocollo di default per la coppia dom ain/t ype in quest ione. Rest it uisce un descrit t ore di file associat o al socket creat o, se ha successo; -1, alt rim ent i. 7 Socket : At t ribut i principali Dom inio: indica dove risiedono server e client . Alcuni dom ini sono AF_UNIX: client e server sono sulla st essa m acchina AF_INET: client e server sono ovunque in Int ernet . Tipo: t ipo di com unicazione t ra server e client . I t ipi principali sono SOCK_STREAM: affidabile, preserva l'ordine di invio dei dat i, basat a su st ream di byt e di lunghezza variabile. Un socket viene creat o ed esiste durante una sessione in cui coppie di processi com unicano t ra loro. Alla fine della sessione il socket viene chiuso e, di fatto, rim osso dal sist em a. SOCK_DGRAM: inaffidabile, senza una connessione fissa, basat a su m essaggi di lunghezza variabile. Il socket viene creato per una singola com unicazione tra processi e non esist e nè prim a nè dopo. Una com unicazione ult eriore t ra gli 8 stessi processi richiede un nuovo socket. Socket : At t ribut i principali Prot ocollo: specifica i m ezzi di basso livello con cui il t ipo di socket è im plem ent at o. Ogni socket può adot t are prot ocolli diversi per la com unicazione prot ocolli st ream , com e TCP/IP, che assicurano la ricezione dei dat i spedit i preservando anche l'ordine di spedizione. prot ocolli dat agram , com e UDP, che non assicurano l'affidabilit à della com unicazione Tipicam ent e, le syst em call che richiedono un param et ro per la specifica del prot ocollo accet t ano 0 per indicare “ il prot ocollo più opport uno” . Noi vedrem o solo i socket SOCK_STREAM 9 Socket SOCK_STREAM Il server crea un socket anonim o con socket() gli assegna un indirizzo con bind() dichiara il num ero di richiest e di connessioni che possono essere accodat e su quel socket con listen() accet t a una connessione con accept() opera sul socket con read() e write() Il client crea un socket anonim o con socket() lo collega al socket del server con connect() opera sul socket con read() e write(). Sia il client che il server, una volt a t erm inat e le operazioni col socket , lo chiudono con close(). 10 File di int est azione Un program m a che usa socket deve includere sys/types.h sys/socket.h Inolt re, deve includere sys/un.h, se usa socket del dom inio AF_UNIX netinet/in.h, arpa/inet.h e netdb.h, se usa socket del dom inio AF_INET. 11 Assegnazione di un indirizzo: bind() int bind (int fd, const struct sockaddr *addr, int addrlen) Associa al socket anonim o riferit o dal descrit t ore fd l'indirizzo (locale o di ret e, a seconda del dom inio) m em orizzat o nella st rut t ura punt at a da addr. Tipo e valore dell'indirizzo dipendono dal dom inio del socket . Possono essere nom e di un file nel file syst em locale (per AF_UNIX) indirizzo IP e num ero di port a (per AF_INET). addrlen è la lunghezza della st rut t ura dat i che m em orizza l'indirizzo. Rest it uisce 0, se ha successo; -1, alt rim ent i. 12 Assegnazione di un indirizzo: bind() Il t ipo (struct sockaddr *) è struct sockaddr { unsigned short sa_family; /* address AF_xxxx char sa_data[14]; /* 14 byte address } family, */ protocol */ Le st rut t ure dat i indirizzo relat ive ai diversi dom ini devono essere convert it e in (struct sockaddr *) all'invocazione di bind(). 13 Assegnazione di un indirizzo: AF_UNIX In AF_UNIX gli indirizzi sono nom i di file. Qualsiasi file può essere ut ilizzat o, purché si abbiano i dirit t i di scrit t ura sulla direct ory che lo cont iene. Per connet t ersi ad un socket è sufficient e avere dirit t i di let t ura sul file relat ivo. La st rut t ura dat i che cont iene l'indirizzo (definit a in sys/un.h) è struct sockaddr_un { unsigned short sun_family; char sun_path[108]; } /* AF_UNIX */ /* pathname */ I cam pi dovrebbero assum ere i seguent i valori sun_family: AF_UNIX sun_path: il pat hnam e com plet o o relat ivo del socket . 14 Assegnazione di un indirizzo: AF_UNIX Se si t ent a un bind() con un nom e di file esist ent e si verifica un errore. Quindi è opport uno invocare prim a un unlink() di quel nom e oppure generare un nom e di file nuovo (tempnam(), ...) La lunghezza dell'indirizzo, ovvero il t erzo param et ro di bind(), è calcolat a con sizeof(). 15 Esem pio: Creazione e bind in AF_UNIX #include #include #include #include #include #include <stddef.h> <stdio.h> <errno.h> <stdlib.h> <sys/socket.h> <sys/un.h> /* For AF_UNIX sockets */ int make_named_socket (const char *filename) { struct sockaddr_un name; int sock; sock = socket (AF_UNIX, SOCK_STREAM, 0); if (sock < 0) { perror ("socket"); exit (EXIT_FAILURE); } name.sun_family = AF_UNIX; strcpy (name.sun_path, filename); if (bind (sock, (struct sockaddr *) &name, sizeof(name)) < 0) { perror ("bind"); exit (EXIT_FAILURE); } return sock; } 16 Connessione ad un indirizzo: connect () int connect (int fd, const struct sockaddr *addr, int addrlen) Tent a di connet t ere un socket anonim o creat o da un client , riferit o dal descrit t ore fd, ad un socket il cui indirizzo è nella st rut t ura punt at a da addr. Dom inio, t ipo e prot ocollo del socket del client devono concordare con quelli del socket del server. addrlen cont iene la lunghezza della st rut t ura dat i che m em orizza l'indirizzo. 17 Connessione ad un indirizzo: connect () Se connect() ha successo, fd può essere usat o per com unicare con il socket del server. La st rut t ura a cui punt a addr deve seguire le st esse regole vist e nel caso di bind(). connect() rest it uisce valore 0, se ha successo (la connessione è inst aurat a); -1 alt rim ent i (es. il socket del server non esist e, la sua coda è piena, ecc.) Quando ha successo, connect() si sincronizza con accept(). 18 Num ero di connessioni: list en() int listen (int fd, int queuelength) Specifica il num ero m assim o queuelength di richiest e di connessioni pendent i che possono essere accodat e sul socket corrispondent e al descrit t ore fd. Se un client t ent a una connessione ad un socket la cui coda è piena la connessione gli viene negat a (connect() fallisce) gli viene not ificat o l'errore ECONNREFUSED. 19 Accet t azione di connessione: accept () int accept (int fd, struct sockaddr *addr, int *adLen) Est rae la prim a richiest a di connessione dalla coda delle connessioni pendent i del socket riferit o da fd. Crea un nuovo socket con gli st essi at t ribut i di quello originario. Lo connet t e al socket del client e rest it uisce un descrit t ore di file corrispondent e, che perm et t e di com unicare con il client . Quindi il socket originario può essere usat o per accet t are alt re connessioni. 20 Accet t azione di connessione: accept () Norm alm ent e accept() blocca l'invocant e fino alla connessione. La st rut t ura punt at a da addr è riem pit a con l'indirizzo del client (usat a con connessioni Int ernet ). adLen punt a ad un int ero, il quale, dopo che la connessione è st abilit a, darà la lunghezza effet t iva, in byt e, della st rut t ura punt at a da addr. accept() rest it uisce un descrit t ore di file se ha successo; -1 alt rim ent i. 21 Operazioni su socket Una volt a st abilit a una connessione, il socket del client e quello del server possono essere ut ilizzat i in t ut t o e per t ut t o com e descrit t ori di file sui quali si opera m ediant e read() (bloccant e) e write(). Vedi anche send() e recv(). Una volt a concluse le operazioni su di un socket , il relat ivo descrit t ore può essere chiuso t ram it e una close(). 22 Esem pio di socket AF_UNIX: chef e cook Consist e di due program m i chef.c, il server, cook.c, il client Il server crea un socket recipe e at t ende la richiest a di una ricet t a da part e di un client Il client si connet t e al socket recipe e invia la richiest a (nella form a di un num ero) Il server fornisce la ricet t a richiest a (let t a da un file) sul socket recipe Il client legge la ricet t a fornit a dal server (sequenza di st ringhe di lunghezza variabile t erm inat e dal carat t ere '\0') e m an m ano che la legge la m ost ra sullo st andard out put , quindi t erm ina. 23