¿Por qué es h_addr_list en struct hostent a char ** en lugar de struct in_addr **?

Soy nuevo en la progtwigción de red. Las siguientes definiciones de estructuras son bastante confusas para mí. Aquí h_addr_list se define como matriz de cadenas, pero se utiliza para almacenar matrices de estructuras in_addr . ¿Por qué no se definió como struct in_addr **h_addr_list lugar de char **h_addr_list ?

 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) */ }; 

La definición de la estructura se remonta a la era anterior a C admitido void * (o void en absoluto, o prototipos). En aquellos días, char * era el ‘puntero universal’. Esto explica algunas de las rarezas de las interfaces de la función de red.

También se remonta a la época en que había muchos sistemas de redes diferentes (IPX / SPX, SNA, TCP / IP, …). En estos días, TCP / IP es dominante, pero incluso ahora, puede tener una matriz de IPv4 o una matriz de direcciones IPv6 que se devuelven, por lo que la especificación de struct in_addr o struct in6_addr podría causar problemas.

La intención era tener una serie de punteros a los tipos de estructura apropiados. Hoy en día, se escribiría void **h_addr_list – una matriz de void * . Pero esta opción no estaba disponible cuando las estructuras se definieron por primera vez, y el rest es historial (no se puede cambiar una interfaz después de que se haya estandarizado, si se puede evitar).

Cuando se creó la estructura, el creador no estaba seguro de si AF_INET iba a ser el tipo de dirección ganadora.

¿Qué pasa si h_addrtype es algo distinto de AF_INET? Entonces h_addr_list contendrá direcciones que no son struct in_addr .

Ahora, un par de décadas más tarde, encontramos que las direcciones IPV4 se están agotando. Pronto, la struct inaddr será reemplazada cada vez más por direcciones IPV6.