X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=sockctrl.tex;h=dbc5cd6df98868e2767a0d50e7758a7d7662dd8f;hb=49156052d42690566734c10c84651dd85bafe444;hp=9e91f2dd22a5a6afd625530ce6b74130e59c8864;hpb=b93afedb7d7b01ba1f0b5ea4caaa281f38cb8e6d;p=gapil.git diff --git a/sockctrl.tex b/sockctrl.tex index 9e91f2d..dbc5cd6 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -2091,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 @@ -2105,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}. @@ -2193,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 @@ -2233,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} @@ -2264,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}