X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=sockctrl.tex;h=dbc5cd6df98868e2767a0d50e7758a7d7662dd8f;hb=3c347867e99daab5f2d89b04b5a1500ed6a3bcb8;hp=af35bcaef16ee548ebcefd799a9bb10d59433696;hpb=8e5a44367b043bfbebc67fb39a89d523076953af;p=gapil.git diff --git a/sockctrl.tex b/sockctrl.tex index af35bca..dbc5cd6 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -34,6 +34,7 @@ porte o altre propriet \subsection{La struttura del \textit{resolver}} \label{sec:sock_resolver} +\index{\textit{resolver}|(} La risoluzione dei nomi è associata tradizionalmente al servizio del \textit{Domain Name Service} che permette di identificare le macchine su internet invece che per numero IP attraverso il relativo \textsl{nome a @@ -607,6 +608,7 @@ Restituisce una stringa corrispondente ad un errore di risoluzione. \noindent che, come l'analoga \func{strerror}, restituisce una stringa con un messaggio di errore già formattato, corrispondente al codice passato come argomento (che si presume sia dato da \var{h\_errno}). +\index{\textit{resolver}|)} @@ -614,11 +616,12 @@ argomento (che si presume sia dato da \var{h\_errno}). \subsection{La risoluzione dei nomi a dominio} \label{sec:sock_name_services} -La principale funzionalità del \textit{resolver} resta quella di risolvere i -nomi a dominio in indirizzi IP, per cui non ci dedicheremo oltre alle funzioni -di richiesta generica ed esamineremo invece le funzioni a questo dedicate. La -prima funzione è \funcd{gethostbyname} il cui scopo è ottenere l'indirizzo di -una stazione noto il suo nome a dominio, il suo prototipo è: +La principale funzionalità del \index{\textit{resolver}}\textit{resolver} +resta quella di risolvere i nomi a dominio in indirizzi IP, per cui non ci +dedicheremo oltre alle funzioni di richiesta generica ed esamineremo invece le +funzioni a questo dedicate. La prima funzione è \funcd{gethostbyname} il cui +scopo è ottenere l'indirizzo di una stazione noto il suo nome a dominio, il +suo prototipo è: \begin{prototype}{netdb.h} {struct hostent *gethostbyname(const char *name)} @@ -678,10 +681,10 @@ Con l'uso di \func{gethostbyname} normalmente si ottengono solo gli indirizzi IPv4, se si vogliono ottenere degli indirizzi IPv6 occorrerà prima impostare l'opzione \const{RES\_USE\_INET6} nel campo \texttt{\_res.options} e poi chiamare \func{res\_init} (vedi sez.~\ref{sec:sock_resolver_functions}) per -modificare le opzioni del resolver; dato che questo non è molto comodo è stata -definita\footnote{questa è una estensione fornita dalle \acr{glibc}, - disponibile anche in altri sistemi unix-like.} un'altra funzione, -\funcd{gethostbyname2}, il cui prototipo è: +modificare le opzioni del \index{\textit{resolver}}\textit{resolver}; dato che +questo non è molto comodo è stata definita\footnote{questa è una estensione + fornita dalle \acr{glibc}, disponibile anche in altri sistemi unix-like.} +un'altra funzione, \funcd{gethostbyname2}, il cui prototipo è: \begin{functions} \headdecl{netdb.h} \headdecl{sys/socket.h} @@ -714,11 +717,11 @@ suoi risultati. Vediamo allora un primo esempio dell'uso delle funzioni di risoluzione, in fig.~\ref{fig:mygethost_example} è riportato un estratto del codice di un -programma che esegue una semplice interrogazione al \textit{resolver} usando -\func{gethostbyname} e poi ne stampa a video i risultati. Al solito il -sorgente completo, che comprende il trattamento delle opzioni ed una funzione -per stampare un messaggio di aiuto, è nel file \texttt{mygethost.c} dei -sorgenti allegati alla guida. +programma che esegue una semplice interrogazione al +\index{\textit{resolver}}\textit{resolver} usando \func{gethostbyname} e poi +ne stampa a video i risultati. Al solito il sorgente completo, che comprende +il trattamento delle opzioni ed una funzione per stampare un messaggio di +aiuto, è nel file \texttt{mygethost.c} dei sorgenti allegati alla guida. Il programma richiede un solo argomento che specifichi il nome da cercare, senza il quale (\texttt{\small 12--15}) esce con un errore. Dopo di che @@ -1462,12 +1465,13 @@ lista illustrata in fig.~\ref{fig:sock_addrinfo_list}. \end{figure} Come primo esempio di uso di \func{getaddrinfo} vediamo un programma -elementare di interrogazione del resolver basato questa funzione, il cui corpo -principale è riportato in fig.~\ref{fig:mygetaddr_example}. Il codice completo -del programma, compresa la gestione delle opzioni in cui è gestita l'eventuale -inizializzazione dell'argomento \var{hints} per restringere le ricerche su -protocolli, tipi di socket o famiglie di indirizzi, è disponibile nel file -\texttt{mygetaddr.c} dei sorgenti allegati alla guida. +elementare di interrogazione del \index{\textit{resolver}}\textit{resolver} +basato questa funzione, il cui corpo principale è riportato in +fig.~\ref{fig:mygetaddr_example}. Il codice completo del programma, compresa +la gestione delle opzioni in cui è gestita l'eventuale inizializzazione +dell'argomento \var{hints} per restringere le ricerche su protocolli, tipi di +socket o famiglie di indirizzi, è disponibile nel file \texttt{mygetaddr.c} +dei sorgenti allegati alla guida. \begin{figure}[!htb] \footnotesize \centering @@ -2087,13 +2091,13 @@ allora il seguente: In caso di problemi invece si possono avere i due casi già illustrati in sez.~\ref{sec:TCP_conn_crash} per il caso di terminazione prococe del - server: il primo è quello in cui la macchina remota non riconosce più la - connessione, ad esempio perché ha avuto un crollo ed è stata - riavviata,\footnote{si ricordi che un normale riavvio non ha questo effetto, - in quanto si passa per la chiusura del processo che invia un segmento FIN - all'altro capo della connessione.} per cui si otterrà come risposta un - RST. In tal caso il socket viene chiuso dopo aver impostato un errore - \errcode{ECONNRESET}. + server: il primo è quello in cui la macchina remota è caduta ed è stata + riavviata, per cui dopo il riavvio la connessione non viene più + riconosciuta,\footnote{si ricordi che un normale riavvio non ha questo + effetto, in quanto si passa per la chiusura del processo che chiude anche + il socket inviando un segmento FIN all'altro capo della connessione.} e si + otterrà come risposta un RST. In tal caso il socket viene chiuso dopo aver + impostato un errore \errcode{ECONNRESET}. Se invece non viene ricevuta nessuna risposta (indice che la macchina non è più raggiungibile) l'emissione dei messaggi viene ripetuta ad intervalli di @@ -2101,25 +2105,24 @@ allora il seguente: essere opportunamente modificati con gli opportuni parametri illustrati in sez.~\ref{sec:sock_sysctl}, si tenga presente che però questo vale a livello di kernel ed i valori saranno applicati a \textsl{tutti} i - socket.} (per un totale di 11 minuti e 15 secondi) dopo di che se non si è - ricevuta nessuna risposta il socket viene chiuso dopo aver impostato un + socket.} (per un totale di 11 minuti e 15 secondi) dopo di che, se non si + è ricevuta nessuna risposta, il socket viene chiuso dopo aver impostato un errore di \errcode{ETIMEDOUT}. Se invece si riceve in risposta ad uno di - questi messaggi un pacchetto ICMP di destinazione irraggiungibile verrà + questi messaggi un pacchetto ICMP di destinazione irraggiungibile, verrà restituito l'errore corrispondente. - In generale questa opzione serve per individuare un crash della macchina - all'altro capo della connessione,\footnote{il crash di un processo di nuovo - comporta la chiusura di tutti i file che aveva aperti e la relativa - emissione degli opportuni segmenti FIN nel caso dei socket.} e viene usata - sui server per evitare di mantenere impegnate le risorse dedicate a trattare - delle connessioni in realtà terminate; abilitandola le connessioni - effettivamente terminate vengono chiuse ed una \func{select} potrà rilevare - la conclusione delle stesse e ricevere il relativo errore. Si tenga però - presente che non si ha la certezza assoluta che un errore di - \errcode{ETIMEDOUT} corrisponda ad una reale conclusione della connessione, - il problema potrebbe essere dovuto ad un problema di routing che perduri per - un tempo maggiore di quello impiegato nei vari tentativi di ritrasmissione - del \textit{keep-alive}. + In generale questa opzione serve per individuare una caduta della + connessione,\footnote{il crash di un processo di nuovo comporta la chiusura + di tutti i file che aveva aperti e la relativa emissione degli opportuni + segmenti FIN nel caso dei socket.} e viene usata sui server per evitare di + mantenere impegnate le risorse dedicate a trattare delle connessioni in + realtà terminate. Abilitandola le connessioni effettivamente terminate + vengono chiuse ed una \func{select} potrà rilevare la conclusione delle + stesse e ricevere il relativo errore. Si tenga però presente che non si ha + la certezza assoluta che un errore di \errcode{ETIMEDOUT} corrisponda ad una + reale conclusione della connessione, il problema potrebbe essere dovuto ad + un problema di routing che perduri per un tempo maggiore di quello impiegato + nei vari tentativi di ritrasmissione del \textit{keep-alive}. @@ -2189,14 +2192,14 @@ allora il seguente: state rimosse con il passaggio al 2.2; è consigliato correggere i programmi piuttosto che usare questa funzione. -\item[\const{SO\_PASSCRED}] questa opzione abilita la ricezione dei messaggi - di controllo di tipo \const{SCM\_CREDENTIALS} dei socket unix-domain. Prende - per \param{optval} un intero usato come valore logico. +\item[\const{SO\_PASSCRED}] questa opzione abilita sui socket unix-domain la + ricezione dei messaggi di controllo di tipo \const{SCM\_CREDENTIALS}. Prende + come \param{optval} un intero usato come valore logico. \item[\const{SO\_PEERCRED}] questa opzione restituisce le credenziali del processo remoto connesso al socket; l'opzione è disponibile solo per socket - unix-domain e può essere usata solo con \func{getsockopt}. Prende come - valore per \param{optval} una apposita struttura \struct{ucred} (vedi + unix-domain e può essere usata solo con \func{getsockopt}. Utilizza per + \param{optval} una apposita struttura \struct{ucred} (vedi sez.~\ref{sec:unix_socket_xxx}). \item[\const{SO\_BINDTODEVICE}] questa opzione permette di \textsl{legare} il @@ -2229,25 +2232,50 @@ allora il seguente: abilitata una serie di messaggi con le informazioni di debug vengono inviati direttamente al sistema del kernel log.\footnote{si tenga presente che il comportamento è diverso da quanto avviene con BSD, dove l'opzione opera - solo sui socket TCP causando la scrittura di tutti i pacchetti inviati + solo sui socket TCP, causando la scrittura di tutti i pacchetti inviati sulla rete su un buffer circolare che viene letto da un apposito programma, \cmd{trpt}.} -\item[\const{SO\_REUSEADDR}] +\item[\const{SO\_REUSEADDR}] questa opzione permette di eseguire la funzione + \func{bind} su indirizzi locali che siano già in uso; l'opzione utilizza per + \param{optval} un intero usato come valore logico. + + Questa opzione modifica il comportamento normale dell'interfaccia dei socket + che fa fallire l'esecuzione della funzione \func{bind} con un errore di + \errcode{EADDRINUSE} quando l'indirizzo + + \item[\const{SO\_TYPE}] questa opzione permette di leggere il tipo di socket su cui si opera; funziona solo con \func{getsockopt}, ed utilizza per - \param{optval} un valore intero in cui verrà restituto il valore numerico - che lo identifica (ad esempio \const{SOCK\_STREAM}). + \param{optval} un intero in cui verrà restituto il valore numerico che lo + identifica (ad esempio \const{SOCK\_STREAM}). + +\item[\const{SO\_ACCEPTCONN}] questa opzione permette di rilevare se il socket + su cui opera è stato posto in modalità di ricezione di eventuali connessioni + con una chiamata a \func{listen}. L'opzione può essere usata soltanto con + \func{getsockopt} e utilizza per \param{optval} un intero in cui viene + restituito 1 se il socket è in ascolto e 0 altrimenti. + +\item[\const{SO\_DONTROUTE}] questa opzione forza l'invio diretto dei + pacchetti del socket, saltando ogni processo relativo all'uso della tabella + di routing del kernel. Prende come \param{optval} un intero usato come + valore logico. -\item[\const{SO\_ACCEPTCONN}] -\item[\const{SO\_DONTROUTE}] \item[\const{SO\_BROADCAST}] + + \item[\const{SO\_SNDBUF}] + + \item[\const{SO\_RCVBUF}] + + \item[\const{SO\_LINGER}] \item[\const{SO\_PRIORITY}] -\item[\const{SO\_ERROR}] + +\item[\const{SO\_ERROR}] + \end{basedescript} @@ -2260,7 +2288,7 @@ Bench attraverso le due funzioni \func{setsockopt} e \func{getsockopt}, alcune funzionalità possono essere impostate attraverso quelle che sono le funzioni classiche per il controllo delle proprietà dei file, cioè \func{fcntl} e -\func{ioctl}. +\func{ioctl}. \subsection{L'uso di \func{fcntl} per i socket}