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?
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).
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.
Tags und Links c pointers struct network-programming