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;
}
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top