2013-12-18 10 views
8

Sono nuovo alla programmazione di rete. Le seguenti definizioni di struttura mi confondono molto. Qui h_addr_list è definito come array di stringhe, ma è utilizzato per archiviare le strutture in_addr. Perché non è stato definito come struct in_addr **h_addr_list anziché char **h_addr_list?Perché h_addr_list in struct hostent un char ** invece di struct in_addr **?

struct hostent 
{ 
    char *h_name;  /* Official domain name of host */ 
    char **h_aliases; /* Null-terminated array of domain names */ 
    int h_addrtype;  /* Host address type (AF_INET) */ 
    int h_length;  /* Length of an address, in bytes */ 
    char **h_addr_list;  /* Null-terminated array of in_addr structs */ 
}; 


struct in_addr 
{ 
    unsigned int s_addr; /* Network byte order (big-endian) */ 
}; 

risposta

11

La definizione della struttura risale all'era precedente a C supportata void * (o void o prototipi). A quei tempi, char * era il "puntatore universale". Ciò spiega alcune delle stranezze delle interfacce delle funzioni di rete.

Risale anche all'epoca in cui esistevano diversi sistemi di rete (IPX/SPX, SNA, TCP/IP, ...). Al giorno d'oggi, TCP/IP è dominante, ma anche ora, è possibile che venga restituito un array di IPv4 o un array di indirizzi IPv6, quindi specificare struct in_addr o struct in6_addr causerebbe problemi.

L'intenzione era quella di disporre di una serie di indicatori per i tipi di struttura appropriati. Al giorno d'oggi, sarebbe scritto void **h_addr_list - una matrice di void *. Ma questa opzione non era disponibile quando le strutture erano prima definite, e il resto è storico (non si cambia un'interfaccia dopo che è standardizzata se si può evitare).

2

Quando la struttura è stata creata, il creatore non era sicuro se AF_INET sarebbe stato il tipo di indirizzo vincente.

Cosa succede se h_addrtype è diverso da AF_INET? Quindi h_addr_list conterrà indirizzi che non sono struct in_addr.

Ora, un paio di decenni più tardi, troviamo che gli indirizzi IPV4 si stanno esaurendo. Presto, struct inaddr sarà sostituito sempre più dagli indirizzi IPV6.