</font>
</a>
</td>
+ <td align="center" bgcolor="#dddddd">
+ <a target="_parent" href="stato.html">
+ <font face="sans-serif">
+ <b>Stato</b>
+ </font>
+ </a>
+ </td>
<td align="center" bgcolor="#dddddd">
<a target="_parent" href="stampa.html">
<font face="sans-serif">
</p>
</td>
</tr>
- <tr>
- <td width="130" valign="top">
- <b>
- <font color="#0000aa">
- Disponibilità
- </font>
- </b>
- </td>
- <td bgcolor="lightblue">
-
- <b>GaPiL</b> nasce come libro e come tale la versione di
- riferimento è quella in PDF, accessibile nella sezione <a
- href="stampa.html"> <font face="sans-serif"> <b>Download</b>
- </font></a>. Grazie all'opera di Mirko Maischberger abbiamo
- anche una bellissima versione HTML, accessibile nella sezione <a
- href="http://www.lilik.it/~mirko/gapil/gapil.html"> <font
- face="sans-serif"> <b>online</b></font></a>, finalmente
- all'altezza della versione stampabile.
- </td>
- </tr>
- <tr>
- <td width="130" valign="top">
- <b>
- <font color="#0000aa">
- Stato
- </font>
- </b>
- </td>
- <td bgcolor="lightblue"> <b>GaPiL</b> è in continua evoluzione ma
- alcune parti hanno raggiunto una "stabilità" sufficiente (nel
- senso che le ho riviste, le ritengo abbastanza complete, e non
- sono stato capace di accorgermi degli errori che ci ho lasciato)
- altre sono da rivedere, altre sono solo parzialmente accennate. La
- situazione attuale è la seguente:
- <table width="600" cellspacing="5">
- <tbody>
- <tr>
- <td valign="top"> <b> Cap. 1 </b> </td>
- <td valign="top"> Introduzione </td>
- <td valign="top"> quasi completo e parzialmente revisionato
- </td>
- </tr>
- <tr>
- <td valign="top"> <b> Cap. 2-3 </b> </td>
- <td valign="top"> Gestione dei processi </td>
- <td valign="top"> quasi completi e parzialmente revisionati
- </td>
- </tr>
- <tr>
- <td valign="top"> <b> Cap. 4-7 </b> </td>
- <td valign="top"> Gestione base dei file </td>
- <td valign="top"> quasi completi e parzialmente revisionati
- </td>
- </tr>
- <tr>
- <td valign="top"> <b> Cap. 8 </b> </td>
- <td valign="top"> Sistema, parametri, errori</td>
- <td valign="top"> quasi completo, da revisionare</td>
- </tr>
- <tr>
- <td valign="top"> <b> Cap. 9 </b> </td>
- <td valign="top"> Segnali</td>
- <td valign="top"> quasi completo, da revisionare </td>
- </tr>
- <tr>
- <td valign="top"> <b> Cap. 10 </b> </td>
- <td valign="top"> Sessioni e terminali</td>
- <td valign="top"> sessioni complete, da revisionare,
- terminali quasi completi. </td>
- </tr>
- <tr>
- <td valign="top"> <b> Cap. 11 </b> </td>
- <td valign="top"> Gestione avanzata dei file</td>
- <td valign="top">
- I/O non bloccante, asincrono, memory
- mapped completo, da revisionare, file locking
- completo, da revisionare.
- </td>
- </tr>
- <tr>
- <td valign="top"> <b> Cap. 12 </b> </td>
- <td valign="top"> IPC </td>
- <td valign="top"> pipe, fifo e code, semafori,
- memoria condivisa, tecniche alternative completi, da
- revisionare, IPC POSIX quasi completo.
- </td>
- </tr>
- <tr>
- <td valign="top"> <b> Cap. 13 </b> </td>
- <td valign="top"> Introduzione alla rete</td>
- <td valign="top"> completo, da revisionare </td>
- </tr>
- <tr>
- <td valign="top"> <b> Cap. 14 </b> </td>
- <td valign="top"> I socket</td>
- <td valign="top"> completo, da revisionare. Manca la
- trattazione di eventuali ulteriori famiglie. </td>
- </tr>
- <tr>
- <td valign="top"> <b> Cap. 15-16 </b> </td>
- <td valign="top"> I socket TCP </td>
- <td valign="top"> socket TCP elementari completo, da
- revisionare. Socket TCP avanzati appena iniziato,
- in fase di stesura.
-
- </td>
- </tr>
- <tr>
- <td valign="top"> <b> Appendici </b> </td>
- <td valign="top"> I protocolli, gli errori, ecc.</td>
- <td valign="top"> Materiale messo insieme alla
- rinfusa, e da rivedere da zero.
- </td>
- </tr>
- </tbody>
- </table>
- <p>
- <b> Versione corrente:</b> 499 pagine.
- </p>
- </td>
- </tr>
<tr>
<td width="130" valign="top">
<b>
</font>
</a>
</td>
+ <td align="center" bgcolor="#dddddd">
+ <a target="_parent" href="stato.html">
+ <font face="sans-serif">
+ <b>Stato</b>
+ </font>
+ </a>
+ </td>
<td align="center" bgcolor="#dddddd">
<a target="_parent" href="stampa.html">
<font face="sans-serif">
--- /dev/null
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+"DTD/xhtml1-strict.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="it">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <title>GaPiL -- Guida alla Programmazione in Linux</title>
+ <meta name="author" content="Simone Piccardi" />
+ <meta name="title" content="Guida alla Programmazione in Linux" />
+ <meta name="description" content="Un manuale di programmazione avanzata in
+ Linux" />
+ <meta name="keywords" content="programmazione, programmazione linux,
+ POSIX, programmazione avanzata "/>
+ <style type="text/css">
+<!--
+ a {text-decoration: none;}
+ td {font-family: sans-serif}
+-->
+ </style>
+ </head>
+ <body link="mediumslateblue" vlink="mediumblue" alink="red" bgcolor="white">
+
+ <table cellspacing="0" cellpadding="0" border="0" width="800">
+ <tbody>
+ <tr>
+ <td width="170" align="center">
+ <img src="gapil.png" width="160" border="0" />
+ </td>
+ <td valign="bottom" align="left" bgcolor="white">
+ <table cellspacing="0">
+ <tr>
+ <td>
+ <font face="sans-serif" size="+4"
+ color="darkred" style="font-size: 22pt">
+ <b>Guida alla Programmazione in Linux</b>
+ <br />
+ <font color="midnightblue">
+ <b>Simone Piccardi</b>
+ </font>
+ </font>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+
+ <table width="790" cellspacing="0" cellpadding="3" border="0">
+ <tbody>
+ <tr>
+ <td width="164" align="center" >
+ </td>
+ <td align="center" bgcolor="#dddddd">
+ <a target="_parent" href="index.html">
+ <font face="sans-serif">
+ <b>Home</b>
+ </font>
+ </a>
+ </td>
+ <td align="center" bgcolor="#dddddd">
+ <a target="_parent" href="stato.html">
+ <font face="sans-serif">
+ <b>Stato</b>
+ </font>
+ </a>
+ </td>
+ <td align="center" bgcolor="#dddddd">
+ <a target="_parent" href="stampa.html">
+ <font face="sans-serif">
+ <b>Download</b>
+ </font>
+ </a>
+ </td>
+ <td align="center" bgcolor="#dddddd">
+ <a target="_parent"
+ href="http://www.lilik.it/~mirko/gapil/gapil.html">
+ <font face="sans-serif" color="darkred">
+ <b>Versione online</b>
+ </font>
+ </a>
+ </td>
+ <td align="center" bgcolor="#dddddd">
+ <a target="_parent"
+ href="http://cvs.firenze.linux.it/cgi-bin/viewcvs.cgi/gapil/?cvsroot=misc">
+ <font face="sans-serif">
+ <b>CVS</b>
+ </font>
+ </a>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+
+<!-- CUT HERE -->
+ <table width="800" cellspacing="10" cellpadding="10" border="0">
+ <tbody>
+ <tr>
+ <td width="130" valign="top">
+ <b>
+ <font color="#0000aa">
+ Disponibilità
+ </font>
+ </b>
+ </td>
+ <td bgcolor="lightblue">
+
+ <b>GaPiL</b> nasce come libro e come tale la versione di
+ riferimento è quella in PDF, accessibile nella sezione <a
+ href="stampa.html"> <font face="sans-serif"> <b>Download</b>
+ </font></a>. Grazie all'opera di Mirko Maischberger abbiamo
+ anche una bellissima versione HTML, accessibile nella sezione <a
+ href="http://www.lilik.it/~mirko/gapil/gapil.html"> <font
+ face="sans-serif"> <b>online</b></font></a>, finalmente
+ all'altezza della versione stampabile.
+ </td>
+ </tr>
+ <tr>
+ <td width="130" valign="top">
+ <b>
+ <font color="#0000aa">
+ Stato
+ </font>
+ </b>
+ </td>
+ <td bgcolor="lightblue"> <b>GaPiL</b> è in continua evoluzione ma
+ alcune parti hanno raggiunto una "stabilità" sufficiente (nel
+ senso che le ho riviste, le ritengo abbastanza complete, e non
+ sono stato capace di accorgermi degli errori che ci ho lasciato)
+ altre sono da rivedere, altre sono solo parzialmente accennate. La
+ situazione attuale è la seguente:
+ <table width="600" cellspacing="5">
+ <tbody>
+ <tr>
+ <td valign="top"> <b> Cap. 1 </b> </td>
+ <td valign="top"> Introduzione </td>
+ <td valign="top"> quasi completo e parzialmente revisionato
+ </td>
+ </tr>
+ <tr>
+ <td valign="top"> <b> Cap. 2-3 </b> </td>
+ <td valign="top"> Gestione dei processi </td>
+ <td valign="top"> quasi completi e parzialmente revisionati
+ </td>
+ </tr>
+ <tr>
+ <td valign="top"> <b> Cap. 4-7 </b> </td>
+ <td valign="top"> Gestione base dei file </td>
+ <td valign="top"> quasi completi e parzialmente revisionati
+ </td>
+ </tr>
+ <tr>
+ <td valign="top"> <b> Cap. 8 </b> </td>
+ <td valign="top"> Sistema, parametri, errori</td>
+ <td valign="top"> quasi completo, da revisionare</td>
+ </tr>
+ <tr>
+ <td valign="top"> <b> Cap. 9 </b> </td>
+ <td valign="top"> Segnali</td>
+ <td valign="top"> quasi completo, da revisionare </td>
+ </tr>
+ <tr>
+ <td valign="top"> <b> Cap. 10 </b> </td>
+ <td valign="top"> Sessioni e terminali</td>
+ <td valign="top"> sessioni complete, da revisionare,
+ terminali quasi completi. </td>
+ </tr>
+ <tr>
+ <td valign="top"> <b> Cap. 11 </b> </td>
+ <td valign="top"> Gestione avanzata dei file</td>
+ <td valign="top">
+ I/O multiplexing e I/O non bloccante parzialmente rivisti,
+ I/O asincrono da aggiornare, memory
+ mapped completo, da revisionare, file locking
+ completo, da revisionare.
+ </td>
+ </tr>
+ <tr>
+ <td valign="top"> <b> Cap. 12 </b> </td>
+ <td valign="top"> IPC </td>
+ <td valign="top"> pipe, fifo e code, semafori,
+ memoria condivisa, tecniche alternative completi, da
+ revisionare, code di messaggi e memoria condivisa POSIX
+ quasi completi, semafori POSIX da fare.
+ </td>
+ </tr>
+ <tr>
+ <td valign="top"> <b> Cap. 13 </b> </td>
+ <td valign="top"> Introduzione alla rete</td>
+ <td valign="top"> completo, da revisionare </td>
+ </tr>
+ <tr>
+ <td valign="top"> <b> Cap. 14 </b> </td>
+ <td valign="top"> I socket</td>
+ <td valign="top"> completo, da revisionare. Manca la
+ trattazione di eventuali ulteriori famiglie di socket.
+ </td>
+ </tr>
+ <tr>
+ <td valign="top"> <b> Cap. 15 </b> </td>
+ <td valign="top"> I socket TCP </td>
+ <td valign="top"> Completo, da
+ revisionare.
+ </td>
+ </tr>
+ <tr>
+ <td valign="top"> <b> Cap. 16 </b> </td>
+ <td valign="top"> Altri socket </td>
+ <td valign="top"> Due placeholder per socket UDP ed unix
+ domain, completamente da fare.
+ </td>
+ </tr>
+ <tr>
+ <td valign="top"> <b> Cap. 17 </b> </td>
+ <td valign="top"> Gestione dei socket </td>
+ <td valign="top"> Due placeholder per la gestione degli
+ indirizzi e le opzioni dei socket, completamente da fare.
+ </td>
+ </tr>
+ <tr>
+ <td valign="top"> <b> Cap. 18 </b> </td>
+ <td valign="top"> Socket avanzati </td>
+ <td valign="top"> Due placeholder per socket TCP e UDP
+ avanzati, completamente da fare.
+ </td>
+ </tr>
+ <tr>
+ <td valign="top"> <b> Appendici </b> </td>
+ <td valign="top"> I protocolli, gli errori, ecc.</td>
+ <td valign="top"> Materiale messo insieme alla
+ rinfusa, e da rivedere totalmente.
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <p>
+ <b> Versione corrente:</b> 507 pagine.
+ </p>
+ </td>
+ </tr>
+ </tr>
+ </tbody>
+ </table>
+<!-- CUT HERE -->
+ </body>
+</html>
\section{I socket UDP}
\label{sec:UDP_socket}
-Dopo i socket TCP i socket più utilizzati sono i socket UDP.
+Dopo i socket TCP i socket più utilizzati nella programmazione di rete sono i
+socket UDP; protocolli diffusi come NFS o il DNS usano principalmente questo
+tipo di socket. Tratteremo in questa sezione le loro caratteristiche
+principali e le modalità per il loro utilizzo.
+
+
+\subsection{Le caratteristiche di un socket UDP}
+\label{sec:UDP_characteristics}
+
+Come illustrato in \secref{sec:net_udp} UDP è un protocollo molto semplice che
+non supporta le connessioni e non è affidabile: i dati vengono inviati in
+forma di pacchetti, e non ne è assicurata né la effettiva ricezione né
+l'odinamento.
+
+Questo significa che a differenza dei socket TCP i socket UDP non supportano
+una comunicazione di tipo \textit{stream} in cui si ha a disposizione un
+flusso continuo di dati che può essere letto un po' alla volta, ma di tipo
+\textit{datagram}, in cui i dati arrivano in singoli blocchi che devono essere
+letti integralmente.
+
+Questo diverso comportamento significa anche che i socket UDP, pur restando
+nella famiglia \const{PF\_INET}\footnote{o \const{PF\_INET6} qualora si usasse
+ invece il protocollo IPv6.} devono essere aperti quando si usa la funzione
+\func{socket} (si riveda quanto illustrato a suo tempo in
+\tabref{tab:sock_sock_valid_combinations}) utilizzando come valore per il tipo
+di socket \const{SOCK\_DGRAM}.
+
+Questa differenza comporta ovviamente il fatto che anche le modalità con cui
+si usano i socket UDP sono completamente diverse rispetto ai socket TCP, ed in
+particolare non esistendo il concetto di connessione non esiste il meccanismo
+del \textit{three way handshake} nè quello di stati del protocollo, in realtà
+tutto quello che avviene nella comunicazione attraverso dei socket UDP è la
+trasmissione di un pacchetto da un client ad un server o viceversa, secondo lo
+schema illustrato in \figref{fig:UDP_packet-exchange}.
+
+\begin{figure}[htb]
+ \centering
+ \includegraphics[width=10cm]{img/udp_connection}
+ \caption{Lo schema di interscambio dei pacchetti per una comunicazione via
+ UDP.}
+ \label{fig:UDP_packet-exchange}
+\end{figure}
+
+Anche se UDP è completamente diverso rispetto a TCP resta identica
+
+
+
+\subsection{Le funzioni \func{sendto} e \func{recvfrom}}
+\label{sec:UDP_sendto_recvfrom}
+
+Come accennato le due funzioni principali usate per la trasmissione di dati
+attraverso i socket UDP, ma in generale attraverso qualunque socket che
+preveda una comunicazione a pacchetti, sono \func{sendto} e \func{recvfrom}.
\section{I socket \textit{Unix domain}}
altro socket. I dati vengono ricevuti e trasmessi come un flusso continuo di
byte (da cui il nome \textit{stream}).
\item[\const{SOCK\_DGRAM}] Viene usato per trasmettere pacchetti di dati
- (\textit{datagram}) di lunghezza massima fissata indirizzati singolarmente,
- Non esiste una connessione e la trasmissione è effettuata in maniera non
- affidabile.
+ (\textit{datagram}) di lunghezza massima prefissata, indirizzati
+ singolarmente. Non esiste una connessione e la trasmissione è effettuata in
+ maniera non affidabile.
\item[\const{SOCK\_SEQPACKET}] Provvede un canale di trasmissione di dati
bidirezionale, sequenziale e affidabile. Opera su una connessione con un
altro socket. I dati possono vengono trasmessi per pacchetti di dimensione
\chapter{I socket TCP}
\label{cha:TCP_socket}
-In questo capitolo iniziamo ad approfondire la conoscenza dei socket TCP,
-iniziando con una descrizione delle principali caratteristiche del
-funzionamento di una connessione TCP. Tratteremo poi le varie funzioni che
-servono alla creazione di una connessione fra un server elementare ed il suo
-client, fornendo poi alcuni esempi di applicazione elementare, e finiremo
-prendendo in esame l'uso dell'I/O multiplexing.
-
+In questo capitolo tratteremo le basi dei socket TCP, iniziando con una
+descrizione delle principali caratteristiche del funzionamento di una
+connessione TCP; vedremo poi le varie funzioni che servono alla creazione di
+una connessione fra client e server, fornendo alcuni esempi elementari, e
+finiremo prendendo in esame l'uso dell'I/O multiplexing.
\section{Il funzionamento di una connessione TCP}