26) Quali primitive permettono la gestione avanzata delle socket?
Le primitive getsockopt e setsockopt permettono di leggere e fissare le modalità di utilizzo della socket.
ret=getsockopt(s,level,optname,optval,optlen);
int ret,s,level,optname,*optval,*optlen;
ret=setsockopt(s,level,optname,optval,optlen);
int ret,level,optname,*optval,optlen;
Parametri:
ret ritorna 0 in caso di successo e -1 in caso di errore
s è il socket descriptor
level è il livello di protocollo (=SOL_SOCKET)
optname è il nome dell’opzione selezionata
optval e optlen(=sizeof(optval)) servono per accedere al valore delle opzioni
Alcune opzioni disponibili:
SO_REUSEADDR: permette di utilizzare più volte un indirizzo locale senza controllarne l’unicità di associazione. Ad esempio, un daemon in ascolto su INADDR_ANY e una porta determinata può accettare una connessione su tale porta. Se il daemon termina e va riavviato, se la connessione accettata in precedenza è ancora attiva, il bind() può dare errore. Occorre quindi usare questa opzione.
SO_KEEPALIVE: abilita l’invio di messaggi di controllo su una connessione. Se dopo un certo numero di tentativi non c’è successo, la connessione viene considerata caduta. I processi di chi invia ricevono un SIG_PIPE, quelli di chi riceve un EOF.
SO_DONTROUTE: i messaggi scavalcano i servizi di routing e sono diretti all’interfaccia di rete per trovare il cammino.
SO_SNDBUF, SO_RCVBUF permettono di variare la dimensione del buffer
SO_LINGER controlla le azioni in caso di close (ma non di shutdown) con messaggi non ancora spediti. A tal fine viene utilizzata la struttura
struct linger {
int l_onoff /* abilitato o meno */
int_l_linger} /* tempo d’attesa in secondi */
Se l_onoff=0 allora graceful close senza attesa
Se l_onoff=1 e l_linger=0 allora hard close senza attesa
Se l_onoff=1 e l_linger>0 allora graceful close con attesa
SO_LOOPBACK fa sì che IP usi il loopback locale per i dati
SO_OOBLINE permette di ricevere messaggi out-of-band nel normale stream di ricezione
SO_TYPE analizza il tipo della socket (solo get)
SO_ERROR analizza gli errori su una socket (solo get)
SO_BROADCAST permette di indicare nel socket address un indirizzo internet che consenta un indirizzo multicast. In tal caso come indirizzo si usano o INADDR_ANY o INADDR_BROADCAST (per l’invio a tutti i nodi della rete locale; in genere ridefinito in netinet/in.h per tenere conto delle sottoreti)