- nleft = count;
- while (nleft > 0) { /* repeat until no left */
- if ( (nread = read(fd, buf, nleft)) < 0) {
- if (errno == EINTR) { /* if interrupted by system call */
- continue; /* repeat the loop */
- } else {
- return(nread); /* otherwise exit */
- }
- } else if (nread == 0) { /* EOF */
- break; /* break loop here */
- }
- nleft -= nread; /* set left to read */
- buf +=nread; /* set pointer */
- }
- return (count - nleft);
-}
- \end{lstlisting}
- \caption{Funzione \texttt{SockRead}, legge $n$ bytes da un socket }
- \label{fig:sock_SockRead_code}
-\end{figure}
-
-Per questo motivo seguendo l'esempio di W. R. Stevens si sono definite due
-funzioni \texttt{SockRead} e \texttt{SockWrite} che eseguono la lettura da un
-socket tenendo conto di questa caratteristica, ed in grado di ritornare dopo
-avere letto o scritto esattamente il numero di bytes specificato; il sorgente
-è riportato in \curfig\ e \nfig\ ed è disponibile fra i sorgenti allegati alla
-guida nei files \texttt{SockRead.c} e \texttt{SockWrite.c}.
-
-\begin{figure}[htb]
- \centering
- \footnotesize
- \begin{lstlisting}{}
-#include <unistd.h>
-
-ssize_t SockWrite(int fd, const void *buf, size_t count)
-{
- size_t nleft;
- ssize_t nwritten;
-
- nleft = count;
- while (nleft > 0) { /* repeat until no left */
- if ( (nwritten = write(fd, buf, nleft)) < 0) {
- if (errno == EINTR) { /* if interrupted by system call */
- continue; /* repeat the loop */
- } else {
- return(nwritten); /* otherwise exit with error */
- }
- }
- nleft -= nwritten; /* set left to write */
- buf +=nwritten; /* set pointer */
- }
- return (count);
-}
- \end{lstlisting}
- \caption{Funzione \texttt{SockWrite}, scrive $n$ bytes su un socket }
- \label{fig:sock_SockWrite_code}
-\end{figure}
-
-Come si può notare le funzioni ripetono la lettura/scrittura in un loop fino
-all'esaurimento del numero di bytes richiesti, in caso di errore viene
-controllato se questo è \texttt{EINTR} (cioè un'interruzione della system call
-dovuta ad un segnale), nel qual caso l'accesso viene ripetuto, altrimenti
-l'errore viene ritornato interrompendo il loop.
-
-Nel caso della lettura se il numero di bytes letti è zero significa che è
-arrivati alla fine del file e pertanto si ritorna senza aver concluso la
-lettura di tutti i bytes richiesti.
-
-
-
-\chapter{Socket TCP elementari}
-\label{cha:elem_TCP_sock}
-
-In questo capitolo esamineremo i vari dettagli necessari per capire il
-funzionamento dei socket TCP, partendo dai due esempi elementari visti in
-precedenza (vedi \ref{sec:net_cli_sample} e \ref{sec:net_cli_server}), per
-arrivare a scrivere una semplice applicazione client/server completa
-(l'implementazione del servizio \texttt{time} su TCP).
-
-Tratteremo qui dunque il funzionamento delle varie funzioni che si sono usate
-nell'esempio precedente e daremo una descrizione delle principali
-caratteristiche del funzionamento di una connessione TCP.
-
-\section{Il funzionamento di una connessione TCP}
-\label{sec:TCPel_connession}
-
-Prima di entrare nei dettagli del funzionamento delle funzioni della
-interfaccia dei socket che operano con TCP (\texttt{connect}, \texttt{accept},
-\texttt{close}) è fondamentale capire alcune basi del funzionamento di una
-connessione TCP, in particolare su come la si stabilisce e come la si
-conclude e sul diagramma degli stati del TCP.
-
-\subsection{Creazione: il \textit{three way handshake}}
-\label{sec:TCPel_conn_cre}
-
-\subsection{Il significato delle opzioni del TCP}
-\label{sec:TCPel_TCP_opt}
-
-\subsection{La terminazione della connessione}
-\label{sec:TCPel_conn_term}
-
-\subsection{Il diagramma delle transizioni di stato}
-\label{sec:TCPel_trans_dia}
-
-\subsection{Lo stato \texttt{TIME\_WAIT}}
-\label{sec:TCPel_time_wait}
-
-
-\section{I numeri di porta}
-\label{sec:TCPel_ports}
-
-\section{Le funzioni dei socket TCP}
-\label{sec:TCPel_functions}
-
-\subsection{La funzione \texttt{connect}}
-\label{sec:TCPel_func_connect}
-
-\subsection{La funzione \texttt{bind}}
-\label{sec:TCPel_func_bind}
-
-\subsection{La funzione \texttt{listen}}
-\label{sec:TCPel_func_listen}
-
-\subsection{La funzione \texttt{connect}}
-\label{sec:TCPel_func_connect}
-
-\subsection{La funzione \texttt{accept}}
-\label{sec:TCPel_func_accept}
-
-
-\subsection{Le porte}
-
-
-
+ \bodydesc{La funzione restituisce un puntatore non nullo alla stringa
+ convertita in caso di successo e \val{NULL} in caso di fallimento, nel
+ qual caso \var{errno} assume i valori:
+ \begin{errlist}
+ \item[\errcode{ENOSPC}] le dimensioni della stringa con la conversione
+ dell'indirizzo eccedono la lunghezza specificata da \param{len}.
+ \item[\errcode{ENOAFSUPPORT}] la famiglia di indirizzi \param{af} non è
+ una valida.
+ \end{errlist}}
+\end{prototype}
+
+La funzione converte la struttura dell'indirizzo puntata da \param{addr\_ptr}
+in una stringa che viene copiata nel buffer puntato dall'indirizzo
+\param{dest}; questo deve essere preallocato dall'utente e la lunghezza deve
+essere almeno \const{INET\_ADDRSTRLEN} in caso di indirizzi IPv4 e
+\const{INET6\_ADDRSTRLEN} per indirizzi IPv6; la lunghezza del buffer deve
+comunque venire specificata attraverso il parametro \param{len}.
+
+Gli indirizzi vengono convertiti da/alle rispettive strutture di indirizzo
+(una struttura \struct{in\_addr} per IPv4, e una struttura \struct{in6\_addr}
+per IPv6), che devono essere precedentemente allocate e passate attraverso il
+puntatore \param{addr\_ptr}; l'argomento \param{dest} di \func{inet\_ntop} non
+può essere nullo e deve essere allocato precedentemente.
+
+Il formato usato per gli indirizzi in formato di presentazione è la notazione
+\textit{dotted decimal} per IPv4 e quello descritto in
+sez.~\ref{sec:IP_ipv6_notation} per IPv6.
+
+\index{socket!definizione|)}
+
+
+
+
+
+
+
+% LocalWords: socket sez cap BSD SVr XTI Transport Interface TCP stream UDP PF
+% LocalWords: datagram broadcast descriptor sys int domain type protocol errno
+% LocalWords: EPROTONOSUPPORT ENFILE kernel EMFILE EACCES EINVAL ENOBUFS raw
+% LocalWords: ENOMEM table family AF address name glibc UNSPEC LOCAL Local IPv
+% LocalWords: communication INET protocols ip AX Amateur IPX Novell APPLETALK
+% LocalWords: Appletalk ddp NETROM NetROM Multiprotocol ATMPVC Access to ATM
+% LocalWords: PVCs ITU ipv PLP DECnet Reserved for project NETBEUI LLC KEY key
+% LocalWords: SECURITY Security callback NETLINK interface device netlink Low
+% LocalWords: PACKET level packet ASH Ash ECONET Acorn Econet ATMSVC SVCs SNA
+% LocalWords: IRDA PPPOX PPPoX WANPIPE Wanpipe BLUETOOTH Bluetooth POSIX bits
+% LocalWords: dall'header tab SOCK capabilities capability styles DGRAM read
+% LocalWords: SEQPACKET RDM sockaddr reference void fig Header uint socklen at
+% LocalWords: addr netinet port len Stevens unsigned short casting nell'header
+% LocalWords: BIND SERVICE bind union order big endian flowinfo dell'header ll
+% LocalWords: multicast multicasting local socketpair sun path filesystem AARP
+% LocalWords: pathname AppleTalk netatalk personal Apple ATPROTO atalk sat if
+% LocalWords: ANYNET node ANYNODE ATADDR BCAST pcap IEEE linux ether ETH ALL
+% LocalWords: sll ifindex ethernet halen MAC hatype ARP arp pkttype HOST recv
+% LocalWords: OTHERHOST OUTGOING recvfrom recvmsg endianness little endtest Mac
+% LocalWords: Intel Digital Motorola IBM VME PowerPC l'Intel xABCD ptr htonl
+% LocalWords: htons ntohl ntohs long hostlong hostshort netlong
+% LocalWords: sort netshort host inet aton ntoa dotted decimal const char src
+% LocalWords: strptr struct dest addrptr INADDR NULL pton ntop presentation af
+% LocalWords: numeric EAFNOSUPPORT size ENOSPC ENOAFSUPPORT ADDRSTRLEN ROUTE
+% LocalWords: of tcpdump page
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "gapil"
+%%% End: