Ist es notwendig, eine Verbindung zu allen von getaddrinfo () zurückgegebenen Adressen herzustellen?

8

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%     
Phillip Ngan 20.07.2012, 04:18
quelle

5 Antworten

9

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.

    
caf 20.07.2012, 06:14
quelle
4

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.

    
LeoNerd 20.07.2012 12:31
quelle
2

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.

    
Some programmer dude 20.07.2012 05:54
quelle
1

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.

    
user529758 20.07.2012 06:16
quelle
0

Angenommen, Sie sind zu diesem Zeitpunkt neu im Socket. Ja, das ist wichtig, weil Sie nach der Verwendung von getaddrinfo eine Adressinformation für die weitere Validierung abrufen können.

    
Ryan Fung 20.07.2012 04:27
quelle