From: Simone Piccardi Date: Thu, 6 Jan 2005 17:25:20 +0000 (+0000) Subject: Aggiunto file che mi ero dimenticato e aggiunte sulle opzioni dei socket X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=e48c447e307bf5934b4a565e71db17c594329083;p=gapil.git Aggiunto file che mi ero dimenticato e aggiunte sulle opzioni dei socket --- diff --git a/listati/sockconn.c b/listati/sockconn.c new file mode 100644 index 0000000..8419e97 --- /dev/null +++ b/listati/sockconn.c @@ -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; +} diff --git a/sockctrl.tex b/sockctrl.tex index 9e91f2d..6333dbe 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -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}]