[Avanti]  [Indietro]  [Su]  

14.3.1 La struttura generica

Le strutture degli indirizzi vengono sempre passate alle varie funzioni attraverso puntatori (cioè by reference), ma le funzioni devono poter maneggiare puntatori a strutture relative a tutti gli indirizzi possibili nelle varie famiglie di protocolli; questo pone il problema di come passare questi puntatori, il C moderno risolve questo problema coi i puntatori generici (i void *), ma l'interfaccia dei socket è antecedente alla definizione dello standard ANSI C, e per questo nel 1982 fu scelto di definire una struttura generica per gli indirizzi dei socket, sockaddr, che si è riportata in fig. 14.1.


1: struct sockaddr { 
2:     sa_family_t  sa_family;     /* address family: AF_xxx */ 
3:     char         sa_data[14];   /* address (protocol-specific) */ 
4: }; 
Figura 14.1: La struttura generica degli indirizzi dei socket sockaddr.

Tutte le funzioni dei socket che usano gli indirizzi sono definite usando nel prototipo un puntatore a questa struttura; per questo motivo quando si invocano dette funzioni passando l'indirizzo di un protocollo specifico occorrerà eseguire una conversione del relativo puntatore.

I tipi di dati che compongono la struttura sono stabiliti dallo standard POSIX.1g e li abbiamo riassunti in tab. 14.3 con i rispettivi file di include in cui sono definiti; la struttura è invece definita nell'include file sys/socket.h.





Tipo
Descrizione
Header






int8_t intero a 8 bit con segno sys/types.h
uint8_t intero a 8 bit senza segno sys/types.h
int16_t intero a 16 bit con segno sys/types.h
uint16_t intero a 16 bit senza segno sys/types.h
int32_t intero a 32 bit con segno sys/types.h
uint32_t intero a 32 bit senza segno sys/types.h



sa_family_t famiglia degli indirizzi sys/socket.h
socklen_t lunghezza (uint32_t) dell'indirizzo di un socket sys/socket.h



in_addr_t indirizzo IPv4 (uint32_t) netinet/in.h
in_port_t porta TCP o UDP (uint16_t) netinet/in.h




Tabella 14.3: Tipi di dati usati nelle strutture degli indirizzi, secondo quanto stabilito dallo standard POSIX.1g.

In alcuni sistemi la struttura è leggermente diversa e prevede un primo membro aggiuntivo uint8_t sin_len (come riportato da R. Stevens in [?]). Questo campo non verrebbe usato direttamente dal programmatore e non è richiesto dallo standard POSIX.1g, in Linux pertanto non esiste. Il campo sa_family_t era storicamente un unsigned short.

Dal punto di vista del programmatore l'unico uso di questa struttura è quello di fare da riferimento per il casting, per il kernel le cose sono un po' diverse, in quanto esso usa il puntatore per recuperare il campo sa_family, comune a tutte le famiglie, con cui determinare il tipo di indirizzo; per questo motivo, anche se l'uso di un puntatore void * sarebbe più immediato per l'utente (che non dovrebbe più eseguire il casting), è stato mantenuto l'uso di questa struttura.


[Avanti]  [Indietro]  [Su]  
© 2000-2003 Simone Piccardi
Pubblicazione web curata da Mirko Maischberger