Beispielcode von Beej's Simple Client iteriert über alle IP-Adressen, die von getaddrinfo zurückgegeben werden (), bis es sich mit dem ersten verbinden kann. Siehe den folgenden Code.
Ist das immer notwendig oder ist es in Ordnung anzunehmen, dass wir nur versuchen müssen, eine Verbindung zur ersten Adresse herzustellen, die von getaddrinfo () zurückgegeben wird?
%Vor% Ja, Sie sollten über alle Adressen iterieren. Beachten Sie insbesondere den Fall, wenn auf dem Zielhost IPv6-Adressen aktiviert sind, der lokale Host jedoch nicht. getaddrinfo()
gibt AF_INET6
Familienadressen zurück, aber dann schlägt der Aufruf socket()
oder connect()
fehl.
Es ist auch eine Möglichkeit, dass Ihr Host mehrere Protokolle unterstützt, die SOCK_STREAM
(z. B. SCTP zusätzlich zu TCP) implementieren, und der Zielhost nicht - da Sie das ai_protocol
-Mitglied der Struktur der Hinweise nicht gesetzt haben Es werden alle Protokolle zurückgegeben, die SOCK_STREAM
sockets unterstützen.
Zusätzlich zu den anderen oben genannten Antworten sollten Sie den allgemeinen Fall berücksichtigen, dass für größere Websites usw. mehrere A-Datensätze zu Redundanzzwecken veröffentlicht werden. Wenn ein connect()
für die erste Adresse fehlschlägt, möchten Sie auch die anderen versuchen.
Sehen Sie sich diesen Weg an ... Der Server-Host, mit dem Sie sich verbinden wollen, kann mehrere Adressen haben, aber das eigentliche Server-Programm hört nur auf einer dieser Adressen zu. Wenn Ihr Client die genaue Adresse nicht kennt, die das Serverprogramm abgehört hat, müssen Sie alle Adressen versuchen, die der Host hat, bis Sie die richtige gefunden haben und eine Verbindung herstellen können.
Ja, Sie sollten alle durchlaufen - es gibt keine Garantie, dass die erste Adresse (oder was auch immer Sie auswählen) tatsächlich gültig ist. Deshalb ist es im Tutorial so gemacht.
Tags und Links c sockets network-programming getaddrinfo