2010-03-17 3 views

Antwort

10

Die IPv6 Link-lokale Adresse ist nicht eindeutig auf dem Knoten, sie ist nur für die NIC eindeutig, weshalb Sie die Scope-ID angeben müssen. Mit anderen Worten, es ist durchaus zulässig, mehrere Adapter mit genau der gleichen IPv6-Adresse zu haben.

Dies bedeutet, dass Sie die Scope-ID oder eine geeignete Textform (% eth0,% 1), die Sie an getaddrinfo() übergeben können, als Eingabe übernehmen.

Eine Methode besteht darin, eine IPv6-Link-lokale Adresse aufzunehmen, die Schnittstellen aufzulisten und wenn nur eine übereinstimmt, wenn mehr als eine Übereinstimmung dann mit einer Liste von Schnittstellen bail out und den Benutzer dazu bringen, den zu spezifizieren vollständige Form.

+0

Die Link-lokaler Adresse gebildet wird aus seinem Routing-Präfix bekommen und die MAC-Adresse der Schnittstelle. Wenn also mehrere Adapter auf demselben Host verfügbar sind, hat jeder Netzwerkadapter eine andere verbindungslokale Adresse. – zeekvfu

+1

@Zind Sie nehmen fälschlicherweise an, dass jede Schnittstelle eine eindeutige MAC-Adresse hat. Ein Gegenbeispiel finden Sie unter Sun-Hardware. –

3

Das Problem tritt nur auf, wenn Sie eine Link-lokale Adresse fest codieren, was keine praktische Lösung für eine nichttriviale App ist.

Andernfalls sollten Sie Ihre sockaddr bekommen von getifaddrs() zu binden, die den Umfang id ausfüllen wird für Sie (z. B. Sie Ihren Benutzerschnittstellennamen angeben lassen, dann durch die Liste von getifaddrs() zurück Suche zu finden die verbindungslokale Adresse, die dieser Schnittstelle zugeordnet ist).

3

Für IPv6-Link-Local-Adressen (fe80::/10 Präfix), das sin6_scope_id Mitglied in der Struktur ist die Schnittstellennummer und Sie diese Nummer von

if_nametoindex(const char *ifname); 
Verwandte Themen