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
\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
\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
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
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}
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}
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
toccato dalla funzione.
Se non ci sono connessioni pendenti da accettare la funzione mette in attesa
il processo\footnote{a meno che non si sia settato il socket per essere
- non-bloccante, nel qual caso ritorna con l'errore \func{EAGAIN},
+ non-bloccante, nel qual caso ritorna con l'errore \macro{EAGAIN},
torneremo su questa modalità di operazione in \secref{sec:xxx_sock_noblock}}
fintanto che non ne arriva una.
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
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}