From: Simone Piccardi Date: Wed, 30 Aug 2006 11:31:32 +0000 (+0000) Subject: Altre note sulle {{{ioctl}}} per socket TCP. X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=95c8a10330d9001419045dddb1fe5a6f821ce919;p=gapil.git Altre note sulle {{{ioctl}}} per socket TCP. --- diff --git a/sockadv.tex b/sockadv.tex index e5b7ff1..25ca699 100644 --- a/sockadv.tex +++ b/sockadv.tex @@ -65,6 +65,29 @@ fig.~\ref{fig:sock_extended_err_struct}. \itindbeg{out-of-band} Una caratteristica speciale dei socket TCP è quella della presenza dei cosiddetti dati \textit{out-of-band} ... + + + +Le modalità di lettura dei dati urgenti sono due, la prima e più comune +prevede l'uso di \func{recvmsg} con + + +% TODO aggiungere pezzo di codice per inviare dati urgenti all'echo server + +La seconda modalità di lettura prevede invece l'uso dell'opzione dei socket +\const{SO\_OOBINLINE} (vedi sez.~\ref{sec:sock_generic_options}) che consente +di ricevere i dati urgenti direttamente nel flusso dei dati del socket; in tal +caso però si pone il problema di come distinguere i dati normali da quelli +urgenti. Come già accennato in sez.~\ref{sec:sock_ioctl_IP} a questo scopo si +può usare \func{ioctl} con l'operazione \const{SIOCATMARK}, che consente di +sapere se si è arrivati o meno all'\textit{urgent mark}. + +La procedura allora prevede che, una volta che si sia rilevata la presenza di +dati urgenti, si ripeta la lettura ordinaria dal socket fintanto che +\const{SIOCATMARK} non restituisce un valore diverso da zero; la successiva +lettura restituirà i dati urgenti. + + \itindend{out-of-band} diff --git a/sockctrl.tex b/sockctrl.tex index 9dad3b3..7b04408 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -3090,13 +3090,27 @@ essere sempre il puntatore ad una variabile di tipo \ctyp{int}: presenti nel buffer di ricezione; il socket non deve essere in stato \texttt{LISTEN}, altrimenti si avrà un errore di \errval{EINVAL}. \item[\const{SIOCATMARK}] ritorna un intero non nullo, da intendere come - valore logico, se il flusso di dati è arrivato sulla posizione in cui sono - stati ricevuti \itindex{out-of-band} dati urgenti. Come vedremo in maggior - dettaglio in sez.~\ref{sec:TCP_urgent_data} una delle caratteristiche di TCP - è quella relativa alla capacità di trasmettere i cosiddetti dati urgenti o - \itindex{out-of-band} \textit{out-of-band}. Come già accennato in - sez.~\ref{sec:sock_setsockopt} l'opzione \const{SO\_OOBINLINE} -\item[\const{SIOCOUTQ}] + valore logico, se il flusso di dati letti sul socket è arrivato sulla + posizione (detta anche \textit{urgent mark}) in cui sono stati ricevuti + \itindex{out-of-band} dati urgenti (vedi sez.~\ref{sec:TCP_urgent_data}). + Una operazione di lettura da un socket non attraversa mai questa posizione, + per cui è possibile controllare se la si è raggiunta o meno con questa + operazione. + + Questo è utile quando si attiva l'opzione \const{SO\_OOBINLINE} (vedi + sez.~\ref{sec:sock_generic_options}) per ricevere i dati urgenti all'interno + del flusso dei dati ordinari del socket;\footnote{vedremo in + sez.~\ref{sec:TCP_urgent_data} che in genere i dati urgenti presenti su un + socket si leggono \textit{out-of-band} usando un opportuno flag per + \func{recvmsg}.} in tal caso quando \const{SIOCATMARK} restituisce un + valore non nullo si saprà che la successiva lettura dal socket restituirà i + dati urgenti e non il normale traffico; torneremo su questo in maggior + dettaglio in sez.~\ref{sec:TCP_urgent_data}. + +\item[\const{SIOCOUTQ}] restituisce la quantità di dati non ancora inviati + presenti nel buffer di spedizione; come per \const{SIOCINQ} il socket non + deve essere in stato \texttt{LISTEN}, altrimenti si avrà un errore di + \errval{EINVAL}. \end{basedescript}