7.6.4 I socket

Un meccanismo di comunicazione tra processi, analogo alle pipe, ma che non presenta il problema della unidirezionalità del flusso dei dati, è rappresentato dai socket42.

Il concetto di socket, nato a partire da BSD 4.2, è stato sviluppato per una comunicazione tra processi locali, cioè che sono in esecuzione sullo stesso sistema, e per questo si parla di Unix domain socket, cioè socket di dominio Unix (il nome corretto secondo lo standard POSIX sarebbe POSIX Local IPC Sockets). Tale meccanismo di comunicazione è stato successivamente esteso anche per la comunicazione tra processi in esecuzione anche su sistemi differenti (anche con sistema operativo diverso), ma collegati tra loro in rete. Questi socket sono detti Internet domain socket (socket di dominio Internet) e costituiscono la principale interfaccia per la programmazione di rete utilizzata su tutti i sistemi operativi (v. cap. 18).

Un socket è caratterizzato da un dominio o protocol family, da un tipo o style e da uno specifico protocollo di comunicazione. Il dominio identifica un’insieme di protocolli (o stack di protocolli), come il TCP/IP (v. sez. 16.6), il tipo indica il comportamento nella comunicazione (sfruttamento del canale, affidabilità, ...) ed il protocollo è il formato dei pacchetti da inviare e le relative regole per la comunicazione.

Un processo che vuol permettere di utilizzare un canale di comunicazione per mezzo dei socket, deve innanzitutto aprire un socket sul quale rimanere in ascolto per eventuali richieste che possono giungere da altri processi. Tale processo è detto server, cioè servente. Un processo che desidera inoltrare richieste ad un server è detto client, cioè cliente, e deve a sua volta aprire un altro socket sul quale rimanere in ascolto delle risposte del server. Quindi il client può inviare le richieste al server utilizzando il socket di quest’ultimo.

L’apertura di uno Unix domain socket è qualcosa di analogo all’apertura di un descrittore di file, che per un processo server viene generalmente associato ad un nome di file sul filesystem, in maniera tale che il client possa usare quel nome di file come riferimento del socket del server. Il client, invece, non ha la necessità di associare il proprio socket ad un nome di file.

Va sottolineato comunque il fatto che questo tipo di comunicazione permette di avere un messaggio di lunghezza variabile e di inserire nel messaggio stesso tutta una serie di informazioni addizionali relative al mittente ed al destinatario del messaggio.