[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [translators] [docinfo] [indice analitico] [volume] [parte]
All'interno di un sistema Unix, i metodi a disposizione dei programmi per comunicare tra loro sono diversi; quelli più evoluti fanno uso di «prese», ovvero di socket, a cui «attaccarsi».
Questi socket possono distinguersi generalmente in due categorie, in base alla modalità attraverso la quale avviene in pratica il collegamento tra i programmi: può trattarsi di una connessione locale, attraverso qualcosa che assomiglia a una pipe con nome (un file FIFO), oppure una connessione attraverso la rete. Nel primo caso si parla di socket di dominio Unix (Unix domain socket); nel secondo, si tratta di solito di socket di dominio Internet.
Quando si utilizzano i socket si distingue tra un programma che apre un socket, restando in ascolto di questo, e un programma che apre un socket per poi chiamare un altro programma che è in ascolto presso un certo indirizzo (definito in base al tipo di connessione). Si intende che per ottenere la connessione tra i due programmi, uno deve rimanere in ascolto, mentre l'altro deve attivare il suo sistema di ascolto prima di cercare di contattare il primo.
Una volta instaurata la comunicazione, i due programmi la possono usare la connessione quasi come fosse l'accesso a un file, dove la lettura da una parte corrisponde alla scrittura dall'altra.
|
Ognuna delle due parti può chiudere la comunicazione quando vuole, chiudendo il descrittore che vi fa riferimento, come avviene con i file; dall'altro lato, si manifesterà un errore di lettura o di scrittura, a seconda del tipo di operazione che si stava svolgendo. Inoltre, va considerato il fatto che il programma che apre un socket per poi rimanere in attesa di chiamate, può mettere in coda le chiamate a cui non può rispondere perché già impegnato in una comunicazione. Naturalmente, si fissa un tetto massimo oltre il quale le chiamate vengono rifiutate.
Quando si definisce un socket, oltre a stabilirne il tipo di indirizzamento, deve essere specificato il modo in cui i dati vengono trasferiti. Le tipologie più comuni sono il flusso continuo (stream) e la trasmissione a pacchetti senza controllo (datagrammi): nel primo caso il sistema verifica e garantisce che quanto viene trasmesso arrivi effettivamente (rispettando anche l'ordine di trasmissione), mentre nel secondo caso le trasmissioni sono a blocchi e non c'è un sistema di verifica.
La comunicazione tra programmi, attraverso socket di dominio Unix, utilizza un file speciale, di tipo socket. Utilizzando ls, con l'opzione -l, il file viene evidenziato da una lettera s all'inizio della stringa che descrive i permessi:
srwxrwxr-x 1 tizio tizio 0 set 20 14:44 orb-8085020182096096758 |
Questo file rappresenta generalmente il riferimento «visibile» usato dal programma che rimane in ascolto, mentre il programma chiamante si può limitare ad aprire un inode, senza che a questo sia abbinato un nome. Il file visibile diventa l'indirizzo a cui il programma chiamante fa riferimento per contattare la sua controparte.
Si può fare un controllo dello stato dei socket di dominio Unix con l'aiuto di Netstat, come nell'esempio seguente:
$
netstat --unix -p -a
[Invio]
Active UNIX domain sockets (servers and established) Proto RefCnt Flags Type State I-Node PID/Program name Path unix 2 [ ACC ] STREAM LISTENING 3234 - /tmp/.X11-unix/X0 unix 7 [ ] DGRAM 1573 - /dev/log unix 2 [ ACC ] STREAM LISTENING 2421 - /dev/printer unix 2 [ ACC ] STREAM LISTENING 2424 - /dev/gpmctl unix 3 [ ] STREAM CONNECTED 3254 - /tmp/.X11-unix/X0 unix 3 [ ] STREAM CONNECTED 3253 750/xfig unix 3 [ ] STREAM CONNECTED 3252 - /tmp/.X11-unix/X0 unix 3 [ ] STREAM CONNECTED 3251 746/twm unix 3 [ ] STREAM CONNECTED 3250 - /tmp/.X11-unix/X0 unix 3 [ ] STREAM CONNECTED 3249 748/xclock unix 3 [ ] STREAM CONNECTED 3244 - /tmp/.X11-unix/X0 unix 3 [ ] STREAM CONNECTED 3236 740/xinit unix 3 [ ] STREAM CONNECTED 3160 - /dev/gpmctl unix 3 [ ] STREAM CONNECTED 3159 656/mc unix 2 [ ] DGRAM 2909 - unix 2 [ ] DGRAM 2803 - unix 2 [ ] DGRAM 2702 - unix 2 [ ] DGRAM 2352 - unix 2 [ ] DGRAM 1667 - |
Da un listato come questo si può intuire, per quanto possibile, il legame tra i processi. Per esempio, il programma mc, in funzione con il numero PID 656, ha aperto un inode (3 159) che risulta connesso; nella riga precedente, appare un altro inode (3 160), anche questo connesso e associato al nome /dev/gpmctl
. Conoscendo a cosa può riferirsi il file /dev/gpmctl
, si intende che si tratti del collegamento che c'è tra mc (Midnight Commander) e il demone che si occupa di controllare il movimento del mouse (gpm).
Come si può osservare dalla colonna Type del listato, anche nei socket di dominio Unix si può distinguere tra connessioni continue, evidenziate dalla parola chiave STREAM, e connessioni a datagramma, come suggerisce la parola chiave DGRAM.
Le connessioni attraverso socket di dominio Internet si differenziano perché, invece di usare il riferimento a file speciali, utilizzano un indirizzo IP assieme a una porta (TCP o UDP). In tal modo si possono realizzare connessioni che vanno anche al di fuori dell'elaboratore locale.
Si può fare un controllo dello stato dei socket di dominio Internet con l'aiuto di Netstat, come nell'esempio seguente:
$
netstat --inet -p -a -n
[Invio]
Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN 357/rpc.statd tcp 0 0 0.0.0.0:32769 0.0.0.0:* LISTEN 558/rpc.mountd tcp 0 0 0.0.0.0:515 0.0.0.0:* LISTEN 519/lpd tcp 0 0 0.0.0.0:847 0.0.0.0:* LISTEN 245/rpc.ugidd tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 240/portmap tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 505/boa tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 349/named tcp 0 0 192.168.1.1:32773 192.168.1.2:22 ESTABLISHED 938/ssh udp 0 0 0.0.0.0:32768 0.0.0.0:* 357/rpc.statd udp 0 0 0.0.0.0:2049 0.0.0.0:* - udp 0 0 0.0.0.0:32769 0.0.0.0:* 349/named udp 0 0 0.0.0.0:32771 0.0.0.0:* - udp 0 0 0.0.0.0:32772 0.0.0.0:* 558/rpc.mountd udp 0 0 192.168.1.1:53 0.0.0.0:* 349/named udp 0 0 127.0.0.1:53 0.0.0.0:* 349/named udp 0 0 0.0.0.0:111 0.0.0.0:* 240/portmap |
Il listato di esempio è ridotto rispetto a quanto potrebbe essere riportato realmente. In questo caso si può osservare la presenza di una sola connessione, che utilizza presso l'elaboratore remoto la porta 22 (protocollo SECSH). Dal momento che si tratta di connessioni TCP/IP, invece si indicare una colonna con il tipo di flusso di dati, appare il protocollo, TCP o UDP, dove il primo costituisce in pratica una connessione continua e controllata, mentre il secondo consente solo l'invio di datagrammi.
Jim Frost, BSD sockets: a quick and dirty primer
D. J. Bernstein, UNIX Client-Server Program Interface, UCSPI-1996, 1996
daniele @ swlibero.org
Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome introduzione_ai_socket.html
[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [translators] [docinfo] [indice analitico]