2013-12-18 10 views
8

Ich bin neu in der Netzwerkprogrammierung. Die folgenden Strukturdefinitionen sind für mich ziemlich verwirrend. Hier ist h_addr_list ein als String-Array definiert, aber es wird verwendet, um Array von in_addr Strukturen zu speichern. Warum hat es nicht definiert als struct in_addr **h_addr_list anstatt char **h_addr_list?Warum ist h_addr_list in struct hostent ein char ** anstelle von 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) */ 
}; 

Antwort

11

Die Strukturdefinition stammt aus der Zeit vor C unterstützt void * (oder void überhaupt, oder Prototypen). In diesen Tagen war char * der "universelle Zeiger". Dies ist für einige der Unheimlichkeiten der Netzwerkfunktionsschnittstellen verantwortlich.

Es stammt auch aus der Zeit, als es viele verschiedene Netzwerksysteme gab (IPX/SPX, SNA, TCP/IP, ...). Heutzutage ist TCP/IP dominant, aber selbst jetzt könnte ein IPv4-Array oder ein Array von IPv6-Adressen zurückgegeben werden, sodass die Angabe struct in_addr oder struct in6_addr Probleme verursachen würde.

Die Absicht war, dass Sie ein Array von Zeigern auf geeignete Strukturtypen haben. Heutzutage würde es void **h_addr_list geschrieben werden - ein Array von void *. Aber diese Option war nicht verfügbar, als die Strukturen zuerst definiert wurden, und der Rest ist eine Historie (Sie ändern eine Schnittstelle nicht, nachdem sie standardisiert wurde, wenn Sie sie vermeiden können).

2

Als die Struktur erstellt wurde, war der Ersteller nicht sicher, ob AF_INET der gewinnende Adresstyp sein würde.

Was ist, wenn etwas anderes als AF_INET ist? Dann wird h_addr_list Adressen enthalten, die nicht struct in_addr sind.

Jetzt, ein paar Jahrzehnte später, finden wir, dass IPV4-Adressen knapp werden. Bald wird struct inaddr mehr und mehr durch IPV6-Adressen ersetzt werden.