X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=elemtcp.tex;h=f092de0e8549674655f9287c5535aa8320fa5ba6;hp=effafc390a905613132ba6fac9bc933a45a56072;hb=0c7fb286c2c1b480ed81f7ce8d506b179e5d291e;hpb=487b554b85cda92d10367d5af69a0355b9b2329d diff --git a/elemtcp.tex b/elemtcp.tex index effafc3..f092de0 100644 --- a/elemtcp.tex +++ b/elemtcp.tex @@ -640,17 +640,17 @@ ci si porr a \func{socket}, mentre il secondo e terzo argomento sono rispettivamente l'indirizzo (locale) del socket e la dimensione della struttura che lo contiene, secondo quanto già trattato in \secref{sec:sock_sockaddr}. - - La funzione restituisce zero in caso di successo e -1 per un errore; in caso - di errore la variabile \var{errno} viene settata secondo i seguenti - codici di errore: + + \bodydesc{La funzione restituisce zero in caso di successo e -1 per un + errore; in caso di errore la variabile \var{errno} viene settata secondo i + seguenti codici di errore: \begin{errlist} - \item \macro{EBADF} il file descriptor non è valido. - \item \macro{EINVAL} il socket ha già un indirizzo assegnato. - \item \macro{ENOTSOCK} il file descriptor non è associato ad un socket. - \item \macro{EACCESS} si è cercato di usare una porta riservata senza + \item[\macro{EBADF}] il file descriptor non è valido. + \item[\macro{EINVAL}] il socket ha già un indirizzo assegnato. + \item[\macro{ENOTSOCK}] il file descriptor non è associato ad un socket. + \item[\macro{EACCESS}] si è cercato di usare una porta riservata senza sufficienti privilegi. - \end{errlist} + \end{errlist}} \end{prototype} Con il TCP la chiamata \func{bind} permette di specificare l'indirizzo, la @@ -686,7 +686,7 @@ un'assegnazione immediata del tipo: \footnotesize \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{} - serv_add.sin_addr.s_addr = htonl(INADDR_ANY); /* connect from anywhere */ + serv_add.sin_addr.s_addr = htonl(INADDR_ANY); /* connect from anywhere */ \end{lstlisting} \normalsize @@ -706,9 +706,10 @@ Per questo nell'header \file{netinet/in.h} \type{in6addr\_any} (dichiarata come \type{extern}, ed inizializzata dal sistema al valore \macro{IN6ADRR\_ANY\_INIT}) che permette di effettuare una assegnazione del tipo: + \footnotesize \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{} - serv_add.sin6_addr = in6addr_any; /* connect from anywhere */ + serv_add.sin6_addr = in6addr_any; /* connect from anywhere */ \end{lstlisting} \normalsize @@ -725,30 +726,28 @@ connessione con un server TCP, il prototipo della funzione a \func{socket}, mentre il secondo e terzo argomento sono rispettivamente l'indirizzo e la dimensione della struttura che contiene l'indirizzo del socket, già descritta in \secref{sec:sock_sockaddr}. - - La funzione restituisce zero in caso di successo e -1 per un errore, in caso - di errore la variabile \var{errno} viene settata secondo i seguenti - codici di errore: + + \bodydesc{La funzione restituisce zero in caso di successo e -1 per un + errore, in caso di errore la variabile \var{errno} viene settata secondo i + seguenti codici di errore: \begin{errlist} - \item \macro{EISCONN} il socket è già connesso. - \item \macro{ECONNREFUSED} non c'è nessuno in ascolto sull'indirizzo remoto. - \item \macro{ETIMEDOUT} si è avuto timeout durante il tentativo di + \item[\macro{ECONNREFUSED}] non c'è nessuno in ascolto sull'indirizzo remoto. + \item[\macro{ETIMEDOUT}] si è avuto timeout durante il tentativo di connessione. - \item \macro{ENETUNREACH} la rete non è raggiungibile. - \item \macro{EADDRINUSE} l'indirizzo locale è in uso. - \item \macro{EINPROGRESS} il socket è non bloccante e la connessione non + \item[\macro{ENETUNREACH}] la rete non è raggiungibile. + \item[\macro{EINPROGRESS}] il socket è non bloccante e la connessione non può essere conclusa immediatamente. - \item \macro{EALREADY} il socket è non bloccante e un tentativo precedente + \item[\macro{EALREADY}] il socket è non bloccante e un tentativo precedente di connessione non si è ancora concluso. - \item \macro{EAGAIN} non ci sono più porte locali libere. - \item \macro{EAFNOSUPPORT} l'indirizzo non ha una famiglia di indirizzi + \item[\macro{EAGAIN}] non ci sono più porte locali libere. + \item[\macro{EAFNOSUPPORT}] l'indirizzo non ha una famiglia di indirizzi corretta nel relativo campo. - \item \macro{EACCESS, EPERM} si è tentato di eseguire una connessione ad un + \item[\macro{EACCESS, EPERM}] si è tentato di eseguire una connessione ad un indirizzo broadcast senza che il socket fosse stato abilitato per il broadcast. \end{errlist} altri errori possibili sono: \macro{EFAULT}, \macro{EBADF}, - \macro{ENOTSOCK}. + \macro{ENOTSOCK}, \macro{EISCONN} e \macro{EADDRINUSE}.} \end{prototype} La struttura dell'indirizzo deve essere inizializzata con l'indirizzo IP e il @@ -828,16 +827,16 @@ man page passiva e predispone una coda per le connessioni in arrivo di lunghezza pari a \var{backlog}. La funzione si può applicare solo a socket di tipo \macro{SOCK\_STREAM} o \macro{SOCK\_SEQPACKET}. - - La funzione restituisce 0 in caso di successo e -1 in caso di errore. I - codici di errore restituiti in \var{errno} sono i seguenti: + + \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di + errore. I codici di errore restituiti in \var{errno} sono i seguenti: \begin{errlist} - \item \macro{EBADF} l'argomento \var{sockfd} non è un file descriptor + \item[\macro{EBADF}] l'argomento \var{sockfd} non è un file descriptor valido. - \item \macro{ENOTSOCK} l'argomento \var{sockfd} non è un socket. - \item \macro{EOPNOTSUPP} il socket è di un tipo che non supporta questa + \item[\macro{ENOTSOCK}] l'argomento \var{sockfd} non è un socket. + \item[\macro{EOPNOTSUPP}] il socket è di un tipo che non supporta questa operazione. - \end{errlist} + \end{errlist}} \end{prototype} @@ -936,27 +935,27 @@ effettuare la comunicazione. Se non ci sono connessioni completate il processo viene messo in attesa. Il prototipo della funzione è il seguente: \begin{prototype}{sys/socket.h} {int accept(int sockfd, struct sockaddr *addr, socklen\_t *addrlen)} - La funzione estrae la prima connessione relativa al socket \var{sockfd} + Estrae la prima connessione relativa al socket \var{sockfd} in attesa sulla coda delle connessioni complete, che associa ad nuovo socket con le stesse caratteristiche di \var{sockfd} (restituito dalla funzione stessa). Il socket originale non viene toccato. Nella struttura \var{addr} e nella variabile \var{addrlen} vengono restituiti indirizzo e relativa lunghezza del client che si è connesso. - La funzione restituisce un numero di socket descriptor positivo in caso di - successo e -1 in caso di errore, nel qual caso la variabile \var{errno} - viene settata ai seguenti valori: + \bodydesc{La funzione restituisce un numero di socket descriptor positivo in + caso di successo e -1 in caso di errore, nel qual caso la variabile + \var{errno} viene settata ai seguenti valori: \begin{errlist} - \item \macro{EBADF} l'argomento \var{sockfd} non è un file descriptor + \item[\macro{EBADF}] l'argomento \var{sockfd} non è un file descriptor valido. - \item \macro{ENOTSOCK} l'argomento \var{sockfd} non è un socket. - \item \macro{EOPNOTSUPP} il socket è di un tipo che non supporta questa + \item[\macro{ENOTSOCK}] l'argomento \var{sockfd} non è un socket. + \item[\macro{EOPNOTSUPP}] il socket è di un tipo che non supporta questa operazione. - \item \macro{EAGAIN} o \macro{EWOULDBLOCK} il socket è stato settato come + \item[\macro{EAGAIN} o \macro{EWOULDBLOCK}] il socket è stato settato come non bloccante, e non ci sono connessioni in attesa di essere accettate. - \item \macro{EPERM} Le regole del firewall non consentono la connessione. - \item \macro{ENOBUFS, ENOMEM} . Questo spesso significa che l'allocazione + \item[\macro{EPERM}] Le regole del firewall non consentono la connessione. + \item[\macro{ENOBUFS, ENOMEM}] questo spesso significa che l'allocazione della memoria è limitata dai limiti sui buffer dei socket, non dalla memoria di sistema. \end{errlist} @@ -964,7 +963,7 @@ viene messo in attesa. Il prototipo della funzione socket come: \macro{EMFILE}, \macro{EINVAL}, \macro{ENOSR}, \macro{ENOBUFS}, \macro{EFAULT}, \macro{EPERM}, \macro{ECONNABORTED}, \macro{ESOCKTNOSUPPORT}, \macro{EPROTONOSUPPORT}, \macro{ETIMEDOUT}, - \macro{ERESTARTSYS}. + \macro{ERESTARTSYS}.} \end{prototype} La funzione può essere usata solo con socket che supportino la connessione @@ -1185,19 +1184,21 @@ certo socket; la prima restituisce l'indirizzo locale, la seconda quello remoto. \begin{prototype}{sys/socket.h} -{int getsockname(int sockfd, struct sockaddr * name, socklen\_t * namelen)} + {int getsockname(int sockfd, struct sockaddr * name, socklen\_t * namelen)} + Legge l'indirizzo locale del socket \param{sockfd} nella struttura + \param{name}. - La funzione restituisce 0 in caso di successo e -1 in caso di errore. I - codici di errore restituiti in \var{errno} sono i seguenti: +\bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di + errore. I codici di errore restituiti in \var{errno} sono i seguenti: \begin{errlist} - \item \macro{EBADF} l'argomento \var{sockfd} non è un file descriptor + \item[\macro{EBADF}] l'argomento \var{sockfd} non è un file descriptor valido. - \item \macro{ENOTSOCK} l'argomento \var{sockfd} non è un socket. - \item \macro{ENOBUFS} non ci sono risorse sufficienti nel sistema per + \item[\macro{ENOTSOCK}] l'argomento \var{sockfd} non è un socket. + \item[\macro{ENOBUFS}] non ci sono risorse sufficienti nel sistema per eseguire l'operazione. - \item \macro{EFAULT} l'argomento \var{name} punta al di fuori dello + \item[\macro{EFAULT}] l'argomento \var{name} punta al di fuori dello spazio di indirizzi del processo. - \end{errlist} + \end{errlist}} \end{prototype} La funzione \func{getsockname} si usa tutte le volte che si vuole avere @@ -1213,20 +1214,22 @@ chiamata dopo il completamento di una connessione sul socket restituito da quella connessione. \begin{prototype}{sys/socket.h} -{int getpeername(int sockfd, struct sockaddr * name, socklen\_t * namelen)} - - La funzione restituisce 0 in caso di successo e -1 in caso di errore. I - codici di errore restituiti in \var{errno} sono i seguenti: + {int getpeername(int sockfd, struct sockaddr * name, socklen\_t * namelen)} + Legge l'indirizzo remoto del socket \param{sockfd} nella struttura + \param{name}. + + \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di + errore. I codici di errore restituiti in \var{errno} sono i seguenti: \begin{errlist} - \item \macro{EBADF} l'argomento \var{sockfd} non è un file descriptor + \item[\macro{EBADF}] l'argomento \var{sockfd} non è un file descriptor valido. - \item \macro{ENOTSOCK} l'argomento \var{sockfd} non è un socket. - \item \macro{ENOTCONN} il socket non è connesso. - \item \macro{ENOBUFS} non ci sono risorse sufficienti nel sistema per + \item[\macro{ENOTSOCK}] l'argomento \var{sockfd} non è un socket. + \item[\macro{ENOTCONN}] il socket non è connesso. + \item[\macro{ENOBUFS}] non ci sono risorse sufficienti nel sistema per eseguire l'operazione. - \item \macro{EFAULT} l'argomento \var{name} punta al di fuori dello + \item[\macro{EFAULT}] l'argomento \var{name} punta al di fuori dello spazio di indirizzi del processo. - \end{errlist} + \end{errlist}} \end{prototype}