[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [translators] [docinfo] [indice analitico] [volume] [parte]


Capitolo 124.   Introduzione ai socket

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.

124.1   Principio di funzionamento

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.

Figura 124.1. Comunicazione tra due programmi che usano i socket.

zone

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.

124.2   socket di dominio Unix

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.

124.3   Socket di dominio Internet

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.

124.4   Riferimenti

Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- 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]