--- /dev/null
+int sockconn(char *host, char *serv, int prot, int type)
+{
+ struct addrinfo hint, *addr, *save;
+ int res;
+ int sock;
+ memset(&hint, 0, sizeof(struct addrinfo));
+ hint.ai_family = PF_UNSPEC; /* generic address (IPv4 or IPv6) */
+ hint.ai_protocol = prot; /* protocol */
+ hint.ai_socktype = type; /* socket type */
+ res = getaddrinfo(host, serv, &hint, &addr); /* calling getaddrinfo */
+ if (res != 0) { /* on error exit */
+ fprintf(stderr, "sockconn: resolution failed:");
+ fprintf(stderr, " %s\n", gai_strerror(res));
+ errno = 0; /* clear errno */
+ return -1;
+ }
+ save = addr;
+ while (addr != NULL) { /* loop on possible addresses */
+ sock = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
+ if (sock < 0) { /* on error */
+ if (addr->ai_next != NULL) { /* if other addresses */
+ addr=addr->ai_next; /* take next */
+ continue; /* restart cycle */
+ } else { /* else stop */
+ perror("sockconn: cannot create socket");
+ return sock;
+ }
+ }
+ if ( (res = connect(sock, addr->ai_addr, addr->ai_addrlen) < 0)) {
+ if (addr->ai_next != NULL) { /* if other addresses */
+ addr=addr->ai_next; /* take next */
+ close(sock); /* close socket */
+ continue; /* restart cycle */
+ } else { /* else stop */
+ perror("sockconn: cannot connect");
+ close(sock);
+ return res;
+ }
+ } else break; /* ok, we are connected! */
+ }
+ freeaddrinfo(save); /* done, release memory */
+ return sock;
+}
In caso di problemi invece si possono avere i due casi già illustrati in
sez.~\ref{sec:TCP_conn_crash} per il caso di terminazione prococe del
- server: il primo è quello in cui la macchina remota non riconosce più la
- connessione, ad esempio perché ha avuto un crollo ed è stata
- riavviata,\footnote{si ricordi che un normale riavvio non ha questo effetto,
- in quanto si passa per la chiusura del processo che invia un segmento FIN
- all'altro capo della connessione.} per cui si otterrà come risposta un
- RST. In tal caso il socket viene chiuso dopo aver impostato un errore
- \errcode{ECONNRESET}.
+ server: il primo è quello in cui la macchina remota è caduta ed è stata
+ riavviata, per cui dopo il riavvio la connessione non viene più
+ riconosciuta,\footnote{si ricordi che un normale riavvio non ha questo
+ effetto, in quanto si passa per la chiusura del processo che chiude anche
+ il socket inviando un segmento FIN all'altro capo della connessione.} e si
+ otterrà come risposta un RST. In tal caso il socket viene chiuso dopo aver
+ impostato un errore \errcode{ECONNRESET}.
Se invece non viene ricevuta nessuna risposta (indice che la macchina non è
più raggiungibile) l'emissione dei messaggi viene ripetuta ad intervalli di
essere opportunamente modificati con gli opportuni parametri illustrati in
sez.~\ref{sec:sock_sysctl}, si tenga presente che però questo vale a
livello di kernel ed i valori saranno applicati a \textsl{tutti} i
- socket.} (per un totale di 11 minuti e 15 secondi) dopo di che se non si è
- ricevuta nessuna risposta il socket viene chiuso dopo aver impostato un
+ socket.} (per un totale di 11 minuti e 15 secondi) dopo di che, se non si
+ è ricevuta nessuna risposta, il socket viene chiuso dopo aver impostato un
errore di \errcode{ETIMEDOUT}. Se invece si riceve in risposta ad uno di
- questi messaggi un pacchetto ICMP di destinazione irraggiungibile verrà
+ questi messaggi un pacchetto ICMP di destinazione irraggiungibile, verrà
restituito l'errore corrispondente.
- In generale questa opzione serve per individuare un crash della macchina
- all'altro capo della connessione,\footnote{il crash di un processo di nuovo
- comporta la chiusura di tutti i file che aveva aperti e la relativa
- emissione degli opportuni segmenti FIN nel caso dei socket.} e viene usata
- sui server per evitare di mantenere impegnate le risorse dedicate a trattare
- delle connessioni in realtà terminate; abilitandola le connessioni
- effettivamente terminate vengono chiuse ed una \func{select} potrà rilevare
- la conclusione delle stesse e ricevere il relativo errore. Si tenga però
- presente che non si ha la certezza assoluta che un errore di
- \errcode{ETIMEDOUT} corrisponda ad una reale conclusione della connessione,
- il problema potrebbe essere dovuto ad un problema di routing che perduri per
- un tempo maggiore di quello impiegato nei vari tentativi di ritrasmissione
- del \textit{keep-alive}.
+ In generale questa opzione serve per individuare una caduta della
+ connessione,\footnote{il crash di un processo di nuovo comporta la chiusura
+ di tutti i file che aveva aperti e la relativa emissione degli opportuni
+ segmenti FIN nel caso dei socket.} e viene usata sui server per evitare di
+ mantenere impegnate le risorse dedicate a trattare delle connessioni in
+ realtà terminate. Abilitandola le connessioni effettivamente terminate
+ vengono chiuse ed una \func{select} potrà rilevare la conclusione delle
+ stesse e ricevere il relativo errore. Si tenga però presente che non si ha
+ la certezza assoluta che un errore di \errcode{ETIMEDOUT} corrisponda ad una
+ reale conclusione della connessione, il problema potrebbe essere dovuto ad
+ un problema di routing che perduri per un tempo maggiore di quello impiegato
+ nei vari tentativi di ritrasmissione del \textit{keep-alive}.
piuttosto che usare questa funzione.
\item[\const{SO\_PASSCRED}] questa opzione abilita la ricezione dei messaggi
- di controllo di tipo \const{SCM\_CREDENTIALS} dei socket unix-domain. Prende
- per \param{optval} un intero usato come valore logico.
+ di controllo di tipo \const{SCM\_CREDENTIALS} sui socket unix-domain. Prende
+ come \param{optval} un intero usato come valore logico.
\item[\const{SO\_PEERCRED}] questa opzione restituisce le credenziali del
processo remoto connesso al socket; l'opzione è disponibile solo per socket
- unix-domain e può essere usata solo con \func{getsockopt}. Prende come
- valore per \param{optval} una apposita struttura \struct{ucred} (vedi
+ unix-domain e può essere usata solo con \func{getsockopt}. Utilizza per
+ \param{optval} una apposita struttura \struct{ucred} (vedi
sez.~\ref{sec:unix_socket_xxx}).
\item[\const{SO\_BINDTODEVICE}] questa opzione permette di \textsl{legare} il
sulla rete su un buffer circolare che viene letto da un apposito
programma, \cmd{trpt}.}
-\item[\const{SO\_REUSEADDR}]
+\item[\const{SO\_REUSEADDR}] questa opzione permette di eseguire la funzione
+ \func{bind} su indirizzi locali che siano già in uso; l'opzione utilizza per
+ \param{optval} un intero usato come valore logico.
+
+
\item[\const{SO\_TYPE}] questa opzione permette di leggere il tipo di socket
su cui si opera; funziona solo con \func{getsockopt}, ed utilizza per
- \param{optval} un valore intero in cui verrà restituto il valore numerico
- che lo identifica (ad esempio \const{SOCK\_STREAM}).
+ \param{optval} un intero in cui verrà restituto il valore numerico che lo
+ identifica (ad esempio \const{SOCK\_STREAM}).
+
+\item[\const{SO\_ACCEPTCONN}] questa opzione permette di rilevare se il socket
+ su cui opera è stato posto in modalità di ricezione di eventuali connessioni
+ con una chiamata a \func{listen}. L'opzione può essere usata soltanto con
+ \func{getsockopt} e utilizza per \param{optval} un intero in cui viene
+ restituito 1 se il socket è in ascolto e 0 altrimenti.
+
+\item[\const{SO\_DONTROUTE}] questa opzione forza l'invio diretto dei
+ pacchetti del socket, saltando ogni processo relativo all'uso della tabella
+ di routing del kernel. Prende come \param{optval} un intero usato come
+ valore logico.
-\item[\const{SO\_ACCEPTCONN}]
-\item[\const{SO\_DONTROUTE}]
\item[\const{SO\_BROADCAST}]
+
+
\item[\const{SO\_SNDBUF}]
\item[\const{SO\_RCVBUF}]
\item[\const{SO\_LINGER}]