Warum ist h_addr_list in struct hostent ein char ** anstelle von struct in_addr **?

8

Ich bin neu in der Netzwerkprogrammierung. Die folgenden Strukturdefinitionen sind für mich ziemlich verwirrend. Hier ist h_addr_list ein definiertes String-Array, aber es wird verwendet, um ein Array von in_addr -Strukturen zu speichern. Warum hat es nicht als struct in_addr **h_addr_list und nicht als char **h_addr_list definiert?

%Vor%     
noufal 18.12.2013, 13:00
quelle

2 Antworten

11

Die Strukturdefinition stammt aus der Zeit vor C, unterstützt von 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 Array von IPv4 oder ein Array von IPv6-Adressen zurückgegeben werden, sodass die Angabe von struct in_addr oder struct in6_addr zu Problemen führen würde.

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

    
Jonathan Leffler 18.12.2013, 13:34
quelle
2

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

Was ist, wenn h_addrtype etwas anderes als AF_INET ist? Dann enthält h_addr_list Adressen, die nicht struct in_addr sind.

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

    
Klas Lindbäck 18.12.2013 13:18
quelle