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