Aggiunto file che mi ero dimenticato e aggiunte sulle opzioni dei socket
authorSimone Piccardi <piccardi@gnulinux.it>
Thu, 6 Jan 2005 17:25:20 +0000 (17:25 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Thu, 6 Jan 2005 17:25:20 +0000 (17:25 +0000)
listati/sockconn.c [new file with mode: 0644]
sockctrl.tex

diff --git a/listati/sockconn.c b/listati/sockconn.c
new file mode 100644 (file)
index 0000000..8419e97
--- /dev/null
@@ -0,0 +1,43 @@
+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;
+}
index 9e91f2dd22a5a6afd625530ce6b74130e59c8864..6333dbe233df8eff9ef3c60fb28df65cdd305c19 100644 (file)
@@ -2091,13 +2091,13 @@ allora il seguente:
 
   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
@@ -2105,25 +2105,24 @@ allora il seguente:
     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}.
 
 
 
@@ -2194,13 +2193,13 @@ allora il seguente:
   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
@@ -2237,16 +2236,31 @@ allora il seguente:
     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}]