Ist gethostbyname mit IPv4-Adressen zurück hostent Strukturen gewährleistet?
-
03-10-2019 - |
Frage
Ich kann nicht getaddrinfo(...)
verwenden für Host-Namen zu lösen und deshalb bleiben muss gethostbyname(...)
Ist die gethostbyname(...)
Funktion garantiert hostent Strukturen zurückzukehren, die nur IPv4 (AF_INET) Adressen auf Erfolg enthalten, so dass der folgende Code immer zu einer IPv4-Adresse führen würde:
int resolve(const char *name, struct in_addr *addr) {
struct hostent *he = gethostbyname(name);
if (!he)
return 1;
memcpy(addr,he->h_addr_list[0],4);
return 0;
}
Lösung
Nein, gethostbyname()
kann IPV4 zurückkehren (Standard dot) oder IPV6 (Standard Doppelpunkt, oder vielleicht dot) Notation zumindest unter Linux . Sie werden damit umgehen müssen. Ich denke, dass verschiedene Implementierungen davon zurückgeben nur IPV4 (zB PHP ), aber jeder C-Plattform, dass ich verwendet habe, kann und wird beide zurück.
Wenn Ihre App ist nur IPV4, es ist nicht allzu schwer, um herauszufinden, dass Sie mit IPV6 handeln und Fehler aus, wenn der Benutzer nicht eine geeignete Schnittstelle zu der Remote-Host zu verbinden hat. Selbst wenn Ihre App unterstützt sowohl, was hält die Benutzer Gateway-Support?
Mehr als drei .
oder das Vorhandensein von :
.. seine IPV6.
Bearbeiten
h_addr
ist ein Synonym für h_addrlist_[0]
, während h_length
die Länge aller Adressen ist.
Vielleicht bin ich nicht angemessen Ihre Frage verstehen?
Andere Tipps
h_addrtype sagt Ihnen, ob h_addr_list IPv4 oder IPv6 oder andere Arten von Adressen enthält. Sie können einen Schalter verwenden, um die Linie zu ändern: memcpy (Adr, He-> h_addr_list [0], 4); zu Memcpy (addr, He-> h_addr_list [0], N); wobei N die erforderliche Länge für den Adresstyp. Per MSDN-Dokumentation ist h_length die Länge der ‚jede‘ Adresse.