X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=socket.tex;h=b01ff3aa67a6f224db9e52899f7397e46daa406e;hp=dc9f501a51abfda4d49dcda5cb0afc9ebbc8a403;hb=26f7a8bb19c6cb198c213757a97b6ac79e40db4b;hpb=7e19b798d0cc09960daad695d8f3b242170bb3b4 diff --git a/socket.tex b/socket.tex index dc9f501..b01ff3a 100644 --- a/socket.tex +++ b/socket.tex @@ -1,6 +1,6 @@ %% socket.tex %% -%% Copyright (C) 2000-2018 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2019 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free %% Documentation License, Version 1.1 or any later version published by the %% Free Software Foundation; with the Invariant Sections being "Un preambolo", @@ -186,12 +186,12 @@ A ciascun tipo di dominio corrisponde un analogo nome simbolico, anch'esso associato ad una costante, che inizia invece per \texttt{AF\_} (da \textit{address family}) che identifica il formato degli indirizzi usati in quel dominio. Le pagine di manuale di Linux si riferiscono a questi indirizzi -anche come \textit{name space}, (nome che invece il manuale delle \acr{glibc} +anche come \textit{name space}, (nome che invece il manuale della \acr{glibc} riserva a quello che noi abbiamo chiamato domini) dato che identificano il formato degli indirizzi usati in quel dominio per identificare i capi della comunicazione. -\begin{table}[htb] +\begin{table}[!htb] \footnotesize \centering \begin{tabular}[c]{|l|l|l|l|} @@ -222,13 +222,29 @@ comunicazione. \constd{AF\_ASH} &18& Ash & \\ \constd{AF\_ECONET} &19& Acorn Econet & \\ \constd{AF\_ATMSVC} &20& ATM SVCs & \\ + \constd{AF\_RDS} &21& RDS Sockets & \\ \constd{AF\_SNA} &22& Linux SNA Project & \\ - \constd{AF\_IRDA} &23& IRDA socket (infrarossi) & \\ + \constd{AF\_IRDA} &23& IRDA socket (infrarossi) & irda(7) \\ \constd{AF\_PPPOX} &24& PPPoX socket & \\ \constd{AF\_WANPIPE} &25& Wanpipe API socket & \\ \constd{AF\_LLC} &26& Linux LLC & \\ + \constd{AF\_IB} &27& Native InfiniBand address & \\ + \constd{AF\_MPLS} &28& MPSL & \\ \constd{AF\_CAN} &29& Controller Are Network & \\ + \constd{AF\_TIPC} &30& TIPC sockets & \\ \constd{AF\_BLUETOOTH}&31& Bluetooth socket & \\ + \constd{AF\_IUCV} &32& IUCV sockets & \\ + \constd{AF\_RXRPC} &33& RxRPC sockets & \\ + \constd{AF\_ISDN} &34& mISDN sockets & \\ + \constd{AF\_PHONET} &35& Phonet sockets & \\ + \constd{AF\_IEEE802154}&36& IEEE802154 sockets & \\ + \constd{AF\_CAIF} &37& CAIF sockets & \\ + \constd{AF\_ALG} &38& Algorithm sockets & \\ + \constd{AF\_NFC} &39& NFC sockets & \\ + \constd{AF\_VSOCK} &40& vSockets & \\ + \constd{AF\_KCM} &41& Kernel Connection Multiplexor & \\ + \constd{AF\_QIPCRTR} &42& Qualcomm IPC Router & \\ + \constd{AF\_SMC} &43& smc sockets & \\ \hline \end{tabular} \caption{Famiglie di protocolli definiti in Linux.} @@ -250,12 +266,12 @@ seguendo la convenzione usata nelle pagine di manuale. I domini (e i relativi nomi simbolici), così come i nomi delle famiglie di indirizzi, sono definiti dall'\textit{header file} \headfiled{socket.h}. Un -elenco delle famiglie di protocolli disponibili in Linux è riportato in -tab.~\ref{tab:net_pf_names}. L'elenco indica tutti i protocolli definiti; fra -questi però saranno utilizzabili solo quelli per i quali si è compilato il -supporto nel kernel (o si sono caricati gli opportuni moduli), viene definita -anche una costante \constd{AF\_MAX} che indica il valore massimo associabile -ad un dominio. +elenco, aggiornato alla versione 4.15, delle famiglie di protocolli +disponibili in Linux è riportato in tab.~\ref{tab:net_pf_names}. L'elenco +indica tutti i protocolli definiti; fra questi però saranno utilizzabili solo +quelli per i quali si è compilato il supporto nel kernel (o si sono caricati +gli opportuni moduli), viene definita anche una costante \constd{AF\_MAX} che +indica il valore massimo associabile ad un dominio. Si tenga presente che non tutte le famiglie di protocolli sono utilizzabili dall'utente generico, ad esempio in generale tutti i socket di tipo @@ -278,7 +294,7 @@ seguenti costanti:\footnote{le pagine di manuale POSIX riportano solo i primi tre tipi, Linux supporta anche gli altri, come si può verificare nel file \texttt{include/linux/net.h} dei sorgenti del kernel.} -\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} +\begin{basedescript}{\desclabelwidth{2.0cm}\desclabelstyle{\nextlinelabel}} \item[\constd{SOCK\_STREAM}] Provvede un canale di trasmissione dati bidirezionale, sequenziale e affidabile. Opera su una connessione con un altro socket. I dati vengono ricevuti e trasmessi come un flusso continuo di @@ -309,7 +325,7 @@ impostare dei flag relativi alle caratteristiche generali del \textit{socket} non strettamente attinenti all'indicazione del tipo secondo i valori appena illustrati. Essi infatti possono essere combinati con un OR aritmetico delle ulteriori costanti: -\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} +\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}} \item[\constd{SOCK\_CLOEXEC}] imposta il flag di \textit{close-on-exec} sul file descriptor del socket, ottenendo lo stesso effetto del flag \const{O\_CLOEXEC} di \func{open} (vedi tab.~\ref{tab:open_operation_flag}), @@ -322,7 +338,6 @@ ulteriori costanti: tab.~\ref{tab:open_operation_flag}). \end{basedescript} - Si tenga presente inoltre che non tutte le combinazioni fra una famiglia di protocolli e un tipo di socket sono valide, in quanto non è detto che in una famiglia esista un protocollo per ciascuno dei diversi stili di comunicazione @@ -348,20 +363,32 @@ appena elencati. \hline \const{AF\_INET6} & TCP & UDP & IPv6 & -- & -- \\ \hline - \const{AF\_IPX} & -- & -- & -- & -- & -- \\ + \const{AF\_IPX} & -- & si & -- & -- & -- \\ \hline \const{AF\_NETLINK} & -- & si & si & -- & -- \\ \hline \const{AF\_X25} & -- & -- & -- & -- & si \\ \hline - \const{AF\_AX25} & -- & -- & -- & -- & -- \\ - \hline - \const{AF\_ATMPVC} & -- & -- & -- & -- & -- \\ + \const{AF\_AX25} & -- & si & si & -- & si \\ \hline +% \const{AF\_ATMPVC} & -- & -- & -- & -- & -- \\ +% \hline \const{AF\_APPLETALK} & -- & si & si & -- & -- \\ \hline \const{AF\_PACKET} & -- & si & si & -- & -- \\ \hline + \const{AF\_KEY} & -- & -- & si & -- & -- \\ + \hline + \const{AF\_IRDA} & si & si & si & -- & si \\ + \hline + \const{AF\_NETROM} & -- & -- & -- & -- & si \\ + \hline + \const{AF\_ROSE} & -- & -- & -- & -- & si \\ + \hline + \const{AF\_RDS} & -- & -- & -- & -- & si \\ + \hline + \const{AF\_ECONET} & -- & si & -- & -- & -- \\ + \hline \end{tabular} \caption{Combinazioni valide di dominio e tipo di protocollo per la funzione \func{socket}.} @@ -467,16 +494,6 @@ aggiuntivo \code{uint8\_t sin\_len} (come riportato da R. Stevens in non è richiesto dallo standard POSIX.1g, in Linux pertanto non esiste. Il campo \type{sa\_family\_t} era storicamente un \ctyp{unsigned short}. -\begin{figure}[!htb] - \footnotesize \centering - \begin{minipage}[c]{0.80\textwidth} - \includestruct{listati/sockaddr.h} - \end{minipage} - \caption{La struttura generica degli indirizzi dei socket - \structd{sockaddr}.} - \label{fig:sock_sa_gen_struct} -\end{figure} - Dal punto di vista del programmatore l'unico uso di questa struttura è quello di fare da riferimento per il casting, per il kernel le cose sono un po' diverse, in quanto esso usa il puntatore per recuperare il campo @@ -495,7 +512,7 @@ sufficiente. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{0.90\textwidth} + \begin{minipage}[c]{0.95\textwidth} \includestruct{listati/sockaddr_storage.h} \end{minipage} \caption{La struttura generica degli indirizzi dei socket @@ -718,8 +735,8 @@ I \textit{packet socket}, identificati dal dominio \const{AF\_PACKET}, sono un'interfaccia specifica di Linux per inviare e ricevere pacchetti direttamente su un'interfaccia di rete, senza passare per le funzioni di gestione dei protocolli di livello superiore. In questo modo è possibile -implementare dei protocolli in user space, agendo direttamente sul livello -fisico. In genere comunque si preferisce usare la libreria +implementare dei protocolli in \textit{user space}, agendo direttamente sul +livello fisico. In genere comunque si preferisce usare la libreria \file{pcap},\footnote{la libreria è mantenuta insieme al comando \cmd{tcpdump}, informazioni e documentazione si possono trovare sul sito del progetto \url{http://www.tcpdump.org/}.} che assicura la portabilità su