X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=sockctrl.tex;h=8f6e63426e0d2b8315e55254a127d735e033e96b;hp=a6eabcd8cbecd2a044d681b8967645505480269d;hb=4c6bdffb5a1a4746b241d8323faaf3a49a4633a9;hpb=a3e1645556c933f9c430c507db629e31027c4dd9 diff --git a/sockctrl.tex b/sockctrl.tex index a6eabcd..8f6e634 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -705,20 +705,20 @@ suoi risultati. \begin{figure}[!htb] \footnotesize \centering \begin{minipage}[c]{15cm} - \includecodesample{listati/myhost.c} + \includecodesample{listati/mygethost.c} \end{minipage} \normalsize \caption{Esempio di codice per la risoluzione di un indirizzo.} - \label{fig:myhost_example} + \label{fig:mygethost_example} \end{figure} Vediamo allora un primo esempio dell'uso delle funzioni di risoluzione, in -fig.~\ref{fig:myhost_example} è riportato un estratto del codice di un +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{myhost.c} dei sorgenti -allegati alla guida. +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 @@ -1419,14 +1419,34 @@ corrispondente \label{tab:addrinfo_error_code} \end{table} +Come per i codici di errore di \func{gethostbyname} anche in questo caso è +fornita una apposita funzione, analoga di \func{strerror}, che consente di +utilizzarli direttamente per stampare a video un messaggio esplicativo; la +funzione è \func{gai\_strerror} ed il suo prototipo è: +\begin{functions} + \headdecl{netdb.h} + + \funcdecl{const char *gai\_strerror(int errcode)} -Dato che più di un indirizzo possono corrispondere ad un certo nome a dominio, -e più di un servizio possono essere associati ad un certo nome (in genere su -due protocolli diversi) è assolutamente normale ricevere come risposta una -lista di più strutture \struct{addrinfo}, a meno di non avere usato una -selezione specifica. Ad esempio se si richiede la risoluzione del servizio -\textit{echo} si avrà come risposta la lista illustrata in -fig.~\ref{fig:sock_addrinfo_list}. + Fornisce il messaggio corrispondente ad un errore di \func{getaddrinfo}. + + \bodydesc{La funzione restituisce il puntatore alla stringa contenente il + messaggio di errore.} +\end{functions} + +La funzione restituisce un puntatore alla stringa contenente il messaggio +corrispondente dal codice di errore \param{errcode} ottenuto come valore di +ritorno di \func{getaddrinfo}. La stringa è allocata staticamente, ma essendo +costante, ed accessibile in sola lettura, questo non comporta nessun problema +di rientranza della funzione. + +Dato che ad un certo nome a dominio possono corrispondere più indirizzi IP +(sia IPv4 che IPv6), e che un certo servizio può essere fornito su protocolli +e tipi di socket diversi, in generale, a meno di non aver eseguito una +selezione specifica attraverso l'uso di \param{hints}, si otterrà una diversa +struttura \struct{addrinfo} per ciascuna possibilità. Ad esempio se si +richiede la risoluzione del servizio \textit{echo} si avrà come risposta la +lista illustrata in fig.~\ref{fig:sock_addrinfo_list}. \begin{figure}[!htb] \centering @@ -1436,6 +1456,23 @@ fig.~\ref{fig:sock_addrinfo_list}. \label{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.. Il codice +del programma è nel file \texttt{mygetaddr.c}, dei sorgenti allegati alla +guida. + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \includecodesample{listati/mygetaddr.c} + \end{minipage} + \normalsize + \caption{Esempio di codice per la risoluzione di un indirizzo.} + \label{fig:mygethost_example} +\end{figure} + + Una volta estratti i risultati dalla \textit{linked list} puntata da \param{res} si dovrà avere cura di disallocare opportunamente tutta la