%% tcpsock.tex
%%
-%% Copyright (C) 2000-2004 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2000-2005 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",
stabilisce la connessione.
% Una analogia citata da R. Stevens per la connessione TCP è quella con il
-% sistema del telefono. La funzione \texttt{socket} può essere considerata
-% l'equivalente di avere un telefono. La funzione \texttt{bind} è analoga al
-% dire alle altre persone qual'è il proprio numero di telefono perché possano
-% chiamare. La funzione \texttt{listen} è accendere il campanello del telefono
-% per sentire le chiamate in arrivo. La funzione \texttt{connect} richiede di
-% conoscere il numero di chi si vuole chiamare. La funzione \texttt{accept} è
+% sistema del telefono. La funzione \func{socket} può essere considerata
+% l'equivalente di avere un telefono. La funzione \func{bind} è analoga al
+% dire alle altre persone qual è il proprio numero di telefono perché possano
+% chiamare. La funzione \func{listen} è accendere il campanello del telefono
+% per sentire le chiamate in arrivo. La funzione \func{connect} richiede di
+% conoscere il numero di chi si vuole chiamare. La funzione \func{accept} è
% quando si risponde al telefono.
\begin{figure}[htb]
stato \texttt{LISTEN} in cui vengono accettate le connessioni.
Dallo stato \texttt{ESTABLISHED} si può uscire in due modi; se un'applicazione
-chiama la funzione \texttt{close} prima di aver ricevuto un
+chiama la funzione \func{close} prima di aver ricevuto un
\textit{end-of-file} (chiusura attiva) la transizione è verso lo stato
\texttt{FIN\_WAIT\_1}; se invece l'applicazione riceve un FIN nello stato
\texttt{ESTABLISHED} (chiusura passiva) la transizione è verso lo stato
La funzione \funcd{bind} assegna un indirizzo locale ad un
socket.\footnote{nel nostro caso la utilizzeremo per socket TCP, ma la
funzione è generica e deve essere usata per qualunque tipo di socket
- \texttt{SOCK\_STREAM} prima che questo possa accettare connessioni.} È usata
+ \const{SOCK\_STREAM} prima che questo possa accettare connessioni.} È usata
cioè per specificare la prima parte dalla socket pair. Viene usata sul lato
server per specificare la porta (e gli eventuali indirizzi locali) su cui poi
ci si porrà in ascolto. Il prototipo della funzione è il seguente:
La funzione \funcd{connect} è usata da un client TCP per stabilire la
connessione con un server TCP,\footnote{di nuovo la funzione è generica e
supporta vari tipi di socket, la differenza è che per socket senza
- connessione come quelli di tipo \texttt{SOCK\_DGRAM} la sua chiamata si
+ connessione come quelli di tipo \const{SOCK\_DGRAM} la sua chiamata si
limiterà ad impostare l'indirizzo dal quale e verso il quale saranno inviati
- e ricevuti i pacchetti, mentre per socket di tipo \texttt{SOCK\_STREAM} o
- \texttt{SOCK\_SEQPACKET}, essa attiverà la procedura di avvio (nel caso del
+ e ricevuti i pacchetti, mentre per socket di tipo \const{SOCK\_STREAM} o
+ \const{SOCK\_SEQPACKET}, essa attiverà la procedura di avvio (nel caso del
TCP il \index{\textit{three~way~handshake}}\textit{three way handshake})
della connessione.} il prototipo della funzione è il seguente:
\begin{prototype}{sys/socket.h}
La funzione \funcd{listen} serve ad usare un socket in modalità passiva, cioè,
come dice il nome, per metterlo in ascolto di eventuali
connessioni;\footnote{questa funzione può essere usata con socket che
- supportino le connessioni, cioè di tipo \texttt{SOCK\_STREAM} o
- \texttt{SOCK\_SEQPACKET}.} in sostanza l'effetto della funzione è di portare
+ supportino le connessioni, cioè di tipo \const{SOCK\_STREAM} o
+ \const{SOCK\_SEQPACKET}.} in sostanza l'effetto della funzione è di portare
il socket dallo stato \texttt{CLOSED} a quello \texttt{LISTEN}. In genere si
chiama la funzione in un server dopo le chiamate a \func{socket} e \func{bind}
e prima della chiamata ad \func{accept}. Il prototipo della funzione, come
\label{fig:TCP_listen_backlog}
\end{figure}
-Storicamente il valore del parametro \param{backlog} era corrispondente al
+Storicamente il valore dell'argomento \param{backlog} era corrispondente al
massimo valore della somma del numero di voci possibili per ciascuna delle due
code. Stevens in \cite{UNP1} riporta che BSD ha sempre applicato un fattore di
1.5 a detto valore, e fornisce una tabella con i risultati ottenuti con vari
La funzione \funcd{accept} è chiamata da un server per gestire la connessione
una volta che sia stato completato il \textit{three way
handshake},\footnote{la funzione è comunque generica ed è utilizzabile su
- socket di tipo \texttt{SOCK\_STREAM}, \texttt{SOCK\_SEQPACKET} e
- \texttt{SOCK\_RDM}.} la funzione restituisce un nuovo socket descriptor su
+ socket di tipo \const{SOCK\_STREAM}, \const{SOCK\_SEQPACKET} e
+ \const{SOCK\_RDM}.} la funzione restituisce un nuovo socket descriptor su
cui si potrà operare per effettuare la comunicazione. Se non ci sono
connessioni completate il processo viene messo in attesa. Il prototipo della
funzione è il seguente:
memoria l'immagine del programma eseguito, che a questo punto perde ogni
riferimento ai valori tornati da \func{accept}. Il socket descriptor però
resta aperto, e se si è seguita una opportuna convenzione per rendere noto al
-programma eseguito qual'è il socket connesso, \footnote{ad esempio il solito
+programma eseguito qual è il socket connesso, \footnote{ad esempio il solito
\cmd{inetd} fa sempre in modo che i file descriptor 0, 1 e 2 corrispondano
al socket connesso.} quest'ultimo potrà usare la funzione \func{getpeername}
per determinare l'indirizzo remoto del client.
Infine è da chiarire (si legga la pagina di manuale) che, come per
-\func{accept}, il terzo parametro, che è specificato dallo standard POSIX.1g
+\func{accept}, il terzo argomento, che è specificato dallo standard POSIX.1g
come di tipo \code{socklen\_t *} in realtà deve sempre corrispondere ad un
\ctyp{int *} come prima dello standard perché tutte le implementazioni dei
socket BSD fanno questa assunzione.
programma stesso.
Se abilitiamo il servizio \textit{daytime}\footnote{in genere questo viene
- fornito direttamente dal \textsl{superdemone} \texttt{inetd}, pertanto basta
+ fornito direttamente dal \textsl{superdemone} \cmd{inetd}, pertanto basta
assicurarsi che esso sia abilitato nel relativo file di configurazione.}
possiamo verificare il funzionamento del nostro client, avremo allora:
\begin{verbatim}
Il passo successivo (\texttt{\small 35--39}) è quello di mettere ``in
ascolto'' il socket; questo viene fatto (\texttt{\small 36}) con la funzione
\func{listen} che dice al kernel di accettare connessioni per il socket che
-abbiamo creato; la funzione indica inoltre, con il secondo parametro, il
+abbiamo creato; la funzione indica inoltre, con il secondo argomento, il
numero massimo di connessioni che il kernel accetterà di mettere in coda per
il suddetto socket. Di nuovo in caso di errore si stampa (\texttt{\small 37})
un messaggio, e si esce (\texttt{\small 38}) immediatamente.
automaticamente l'invio multiplo qualora una singola \func{write} non sia
sufficiente. I dati vengono riletti indietro (\texttt{\small 7}) con una
\func{read}\footnote{si è fatta l'assunzione implicita che i dati siano
- contenuti tutti in un solo segmento, così che la chiamata a \texttt{read} li
+ contenuti tutti in un solo segmento, così che la chiamata a \func{read} li
restituisca sempre tutti; avendo scelto una dimensione ridotta per il buffer
questo sarà sempre vero, vedremo più avanti come superare il problema di
rileggere indietro tutti e soli i dati disponibili, senza bloccarsi.} sul
definitiva della connessione anche nel client, dove non comparirà più
nell'output di \cmd{netstat}.
-Come abbiamo accennato in sez.~\ref{sec:TCP_conn_term} e come vedremo più avanti
-in sez.~\ref{sec:TCP_shutdown} la chiusura di un solo capo di un socket è
-una operazione lecita, per cui la nostra scrittura avrà comunque successo
+Come abbiamo accennato in sez.~\ref{sec:TCP_conn_term} e come vedremo più
+avanti in sez.~\ref{sec:TCP_shutdown} la chiusura di un solo capo di un socket
+è una operazione lecita, per cui la nostra scrittura avrà comunque successo
(come si può constatare lanciando usando \cmd{strace}\footnote{il comando
- \cmd{strace} è un comando di debug molto utile che prende come parametro un
+ \cmd{strace} è un comando di debug molto utile che prende come argomento un
altro comando e ne stampa a video tutte le invocazioni di una system call,
- coi relativi parametri e valori di ritorno, per cui usandolo in questo
+ coi relativi argomenti e valori di ritorno, per cui usandolo in questo
contesto potremo verificare che effettivamente la \func{write} ha scritto la
riga, che in effetti è stata pure trasmessa via rete.}), in quanto il nostro
programma non ha a questo punto alcun modo di sapere che dall'altra parte non