6) Come si crea una socket? Come le si associa un indirizzo?
Creazione:
sd=socket(dominio,tipo,protocollo);
int sd,dominio,tipo,protocollo;
sd è il descrittore (-1 in caso di fallimento)
Dominio denota il particolare tipo di dominio di comunicazione. Un indirizzo di socket dipende infatti dal dominio.
Ad esempio:
AF_UNIX: comunicazione locale implementata tramite pipe
AF_INET: comunicazione mediante i protocolli internet (TCP/IP)
Tipo è il tipo di comunicazione:
SOCK_STREAM: trasferimento affidabile di sequenze di byte
SOCK_SEQPACKET: trasferimento affidabile di sequenze di pacchetti
SOCK_DGRAM: trasferimento non affidabile di messaggi di lunghezza variabile
SOCK_RAW: accesso diretto ai protocolli
Protocollo è uno dei protocolli supportati dal dominio (se zero, usa il protocollo di default)
Omogeneita con i file.
Binding, cioè associazione indirizzo ad una porta del nodo. Si realizza un’entità detta half-association:
error=bind(sd,&ind,lun);
int error,ad,lun;
struct sockaddr_in *ind;
l’indirizzo della socket sd è codificato nella struttura puntata da ind, di lunghezza lun
Formato indirizzo (struttura sockaddr_in):
dominio AF_UNIX:
struct sockaddr_un {
short sun_family; /*2B;=AF_UNIX in questo caso*/
u_char sun_path[92]; /*path name del file*/
dominio AF_INET:
struct sockaddr_in {
short sin_family; /*2B;=AF_INET in questo caso*/
u_short sin_port; /*2B;numero della porta*/
struct in_addr sin_addr; /*4B;indirizzo internet*/
char sin_zero[8];} /*8B;=0 è un pad*/
se un Server con porte multiple (e più indirizzi Internet) al posto dell’indirizzo sin_addr indica INADDR_ANY (wildcard address), realizza un server multiporta che attende richieste da qualunque potenziale cliente. Se un Client non fa il bind, il sistema assegna un porta tra quelle libere. Idem se sin_port=0.