X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=sockctrl.tex;h=594e608642fe5c383f1e9e121dd54749fc3e0837;hp=872f7b7f133babcf6be70ee733ddfe65a0d218a2;hb=866f3cf8f2fe10ea9c7b5c4b10faf37fce74b1aa;hpb=5a12d423b85ac5decb966bc3c3a797b3ad9a7a3f diff --git a/sockctrl.tex b/sockctrl.tex index 872f7b7..594e608 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -1666,12 +1666,12 @@ finora, quello in cui si specifica nel client un indirizzo remoto per la connessione al server, e quello in cui si specifica nel server un indirizzo locale su cui porsi in ascolto. -La prima funzione è allora \func{sockconn} che restituisce un socket connesso -all'indirizzo ed al servizio specificati come argomenti; la funzione prende -poi altri due argomenti aggiuntivi per indicare il protocollo da usare ed il -tipo di socket. Il corpo della funzione è riportato in -fig.~\ref{fig:sockconn_code}, ed il codice completo è nel file -\file{sockconn.c} nei sorgenti allegati alla guida. +La prima funzione della nostra intefaccia semplificata è \func{sockconn} che +permette di ottenere un socket, connesso all'indirizzo ed al servizio +specificati. Il corpo della funzione è riportato in +fig.~\ref{fig:sockconn_code}, il codice completo è nel file \file{SockUtil.c} +dei sorgenti allegati alla guida, che contiene varie funzioni di utilità per +l'uso dei socket. \begin{figure}[!htb] \footnotesize \centering @@ -1684,26 +1684,54 @@ fig.~\ref{fig:sockconn_code}, ed il codice completo \end{figure} La funzione prende quattro argomenti, i primi due sono le stringhe che -indicano il nome della macchina a cui collegarsi ed il relativo servizio; -seguono il protocollo da usare (in forma numerica) ed il tipo di socket (al -solito specificato con i valori illustrati in sez.~\ref{sec:sock_type}). La -funzione ritorna il filde descriptor associato al socket in caso di successo, -o -1 in caso di errore. Come si vede la funzione prevede anche ad alcune -stampe in maniera diretta (il che la rende non utilizzabile all'interno di un -demone). +indicano il nome della macchina a cui collegarsi ed il relativo servizio su +cui sarà effettuata la risoluzione; seguono il protocollo da usare (da +specificare con il valore numerico di \file{/etc/protocols}) ed il tipo di +socket (al solito specificato con i valori illustrati in +sez.~\ref{sec:sock_type}). + +La funzione ritorna il valore del file descriptor (un numero positivo) +associato al socket in caso di successo, o -1 in caso di errore. Per risolvere +il problema di non poter passare indietro i valori di ritorno di +\func{getaddrinfo} con i codici di errore\footnote{non si può avere nessuna + certezza che detti valori siano negativi, è questo è invece nessario per + evitare ogni possibile ambiguità nei confronti del valore di ritorno in caso + di successo.} si è provvisto a stampare direttamente all'interno della +funzione i rispettivi errori, si potrà riconoscere questo caso ottenendo -1 +per il valore di ritorno, ma un valore nullo di \var{errno}. Una volta definite le variabili necessarie (\texttt{\small 3--5}) la funzione -prima (\texttt{\small 7}) azzera il contenuto della struttura \var{hint} e poi -provvede (\texttt{\small 8--10}) ad inizializzarne i valori necessari per la -chiamata (\texttt{\small 11}) a \func{getaddrinfo}. Di quest'ultima si -controlla (\texttt{\small 12}) il codice di ritorno, in modo da stampare -(\texttt{\small 13--15}) un avviso di errore ed uscire in caso di errore. Se -la risoluzioen del nome ha successo si provvede (\texttt{\small 18--22}) ad -aprire il socket, ed a connettersi ad esso (\texttt{\small 24--28}); in -entrambi casi si gestisce il caso di errore. Infine prima di ritornare -(\texttt{\small 30}) il file descriptor del socket si provvede (\texttt{\small - 29}) a liberare le strutture \struct{addrinfo} allocate da -\func{getaddrinfo}. +prima (\texttt{\small 6}) azzera il contenuto della struttura \var{hint} e poi +provvede (\texttt{\small 7--9}) ad inizializzarne i valori necessari per la +chiamata (\texttt{\small 10}) a \func{getaddrinfo}. Di quest'ultima si +controlla (\texttt{\small 12-16}) il codice di ritorno, in modo da stampare un +avviso di errore, azzerare \var{errno} ed uscire in caso di errore. Dato che +ad una macchina possono corrispondere più indirizzi IP, e di tipo diverso (sia +IPv4 che IPv6), ed il servizio può essere in ascolto soltanto su uno solo di +questi, si provvede a tentare la connessione per ciascun indirizzo restituito +all'interno di un ciclo (\texttt{\small 18-40}) di scansione della lista +restituita da \func{getaddrinfo}, ma prima (\texttt{\small 17}) si salva il +valore del puntatore per poterlo riutilizzare alla fine per disallocare la +lista. + +Il ciclo viene ripetuto fintanto che si hanno indirizzi validi, ed inizia +(\texttt{\small 19}) con l'apertura del socket; se questa fallisce si +controlla (\texttt{\small 20}) se sono disponibili altri indirizzi, nel qual +caso si passa al successivo (\texttt{\small 21}) ricominciando il ciclo +(\texttt{\small 22}), se non ve ne sono si stampa l'errore ritornado +immediatamente (\texttt{\small 24-27}). Se la creazione del socket ha avuto +successo si procede (\texttt{\small 29}) con la connessione + + + + + +Se la risoluzione del nome ha successo si provvede (\texttt{\small 19--23}) ad +aprire il socket, ed a connettersi ad esso (\texttt{\small 25--29}); in +entrambi casi si gestisce il caso di errore, con una stampa ed il ritorno del +valore -1. Infine prima di ritornare (\texttt{\small 31}) il valore del file +descriptor del socket si provvede (\texttt{\small 30}) a liberare le strutture +\struct{addrinfo} allocate da \func{getaddrinfo}. Si noti come la funzione si limiti ad usare i valori contenuti nella prima struttura \struct{addrinfo} ritornata da \func{getaddrinfo}, non eseguendo @@ -1752,7 +1780,7 @@ una macchina. Se non si vuole che la funzione esegua \func{bind} su un indirizzo specifico, ma utilizzi l'indirizzo generico, occorrerà avere cura di passare un valore -\const{NULL} come valore per l'argomento \var{host}, l'uso del valore +\const{NULL} come valore per l'argomento \var{host}; l'uso del valore \const{AI\_PASSIVE} serve ad ottenere il valore generico nella rispettiva struttura degli indirizzi. @@ -1766,7 +1794,6 @@ struttura degli indirizzi. \label{fig:sockbind_code} \end{figure} - Come già detto la funzione è analoga a \func{sockconn} ed inizia azzerando ed inizializzando (\texttt{\small 6-11}) opportunamente la struttura \var{hint} con i valori ricevuti come argomenti, soltanto che in questo caso si è usata @@ -1778,8 +1805,8 @@ sostituita (\texttt{\small 25--29}) la chiamata a \func{connect} con una chiamata a \func{bind}. La conclusione (\texttt{\small 30--31}) della funzione è identica. Si noti come anche in questo caso si siano inserite le stampe degli errori sullo standard output, nonostante la funzione possa essere -invocata da un demone. In realtà questo non è un problema in quanto se la -funzione non ha successo il programma deve uscire immediatamente prima di +invocata da un demone. Nel nostro caso questo non è un problema in quanto se +la funzione non ha successo il programma deve uscire immediatamente prima di essere posto in background, e può quindi scrivere gli errori direttamente sullo standard output.