2012-09-04 7 views
6

Ich habe dieses einfache Client-Server-Anwendungspaar. Der Code ist ziemlich einfach, ich benutze nur neue, empfohlene Methoden wie getaddinfo etc und alles funktioniert gut für ipv4. Sogar für ipv6 loopback (:: 1) funktioniert es. Probleme beginnen, wenn es zu einigen anderen IPv6-Adressen kommt ... Ich habe zwei Maschinen in einem Netzwerk, alles funktioniert gut, wenn ich ihre IPV4-Adressen, aber wenn ich meine Client IPv6-Adresse gebe, bekomme ich einen Fehler bei der Verbindungsfunktion: ungültiges Argument . Hey, weiß ich das nicht schon? Ich mache! Als ich nach ping6 diese IPv6-Adresse versuchen, erhalte ich den gleichen Fehler:connect() gibt "ungültiges Argument" mit IPv6-Adresse zurück

connect: Invalid argument

Aber es gibt einen Weg, um diesen Block zu überwinden - man sollte eine Schnittstelle mit einem -I Schalter wählen und alles reibungslos läuft seit dann. Aber wie kann ich das Gleiche in meiner Client-App erreichen? Was soll ich machen? Mein Client-Code sieht wie folgt aus:

struct addrinfo hints; 
struct addrinfo *server; 

memset(&hints, 0, sizeof(hints)); 
hints.ai_family = AF_UNSPEC; 
hints.ai_socktype = SOCK_STREAM; 

int status; 
if((status = getaddrinfo(argv[1], argv[2], &hints, &server) != 0)) 
{ 
    perror("getaddrinfo error"); 
    return 1; 
} 

int sock_fd; 
struct addrinfo *ptr; 
for(ptr=server;ptr!=NULL;ptr=ptr->ai_next) 
{ 
    if((sock_fd = socket(ptr->ai_family,ptr->ai_socktype,ptr->ai_protocol)) == -1) 
    { 
     perror("socket error"); 
     continue; 
    } 
    if(connect(sock_fd, ptr->ai_addr,ptr->ai_addrlen) == -1) 
    { 
     perror("connect error"); 
     continue;  
    } 
    break; 
} 
+1

Was ist diese problematische Adresse, die Ping ablehnt? – Ariel

+0

Ich ping die andere Maschine in meinem Netzwerk, aber es funktioniert das gleiche für alle IPv6-Adressen - überprüfen Sie dies: http://lists.debian.org/debian-ipv6/2005/06/msg00044.html – flyjohny

+0

@flyjohny vielleicht Sie sollte überprüfen Sie Ihre Routen zu sehen, ob die Standard-Route ist ein ip6 route-Befehl: "route -A inet6" –

Antwort

5

Adressen beginnend mit ff... sind Multicast-Adressen. Das Verbinden eines Streams mit einer Multicast-Adresse funktioniert nicht.

Adressen, die mit fe80... beginnen, sind link-lokale Adressen, denen eine Schnittstellen-ID zugeordnet ist. Versuchen Sie, die sockaddr von getaddrinfo zurückgegeben, ist das scope Feld ausgefüllt?

+0

Es ist mit 0 gefüllt. Die Adresse beginnt in der Tat mit fe80 ... – flyjohny

+2

Dieses Feld sollte die Schnittstellennummer enthalten. Haben Sie den Bereich mit der% eth0 oder% 1 angegeben (wobei 1 die Schnittstellennummer ist, die Sie mit der ip-Tool-Notation nachschlagen können)? \ –

+0

Nein. Wenn ich das mache, ist dieses Bereich-Feld mit einem gewissen Wert gefüllt und es scheint zu funktionieren (obwohl ich meine spezifische FW konfigurieren muss, aber ich bekomme kein ungültiges Argument mehr). Aber ich scheine etwas zu verpassen und in allen Materialien mit ipv6 verbunden Ich habe gelesen, dass ich nicht über das - muss ich die Schnittstelle angeben, wenn ich Link-lokale Adresse verwenden? – flyjohny

0

Meine Empfehlung ist, dass Sie auf dem IP6-Protokoll in der Schnittstelle/Netzwerkverbindung aktivieren, zusätzlich das IP4 Protokoll werfen, wenn Sie immer noch den Fehler haben.

Auf meiner Linux-Box passierte das auch, als ich eine ip4-Schnittstelle aktiv hatte und meine Anwendung versuchte, die ip4-Schnittstelle mit ip6-Einstellungen zu verwenden. Dasselbe sollte auch für Windows gelten.

Wenn etwas nicht klar ist, fragen Sie.

+0

Ich weiß, dass ich faule Esel bin aber könnten Sie mir sagen, wie man das ip6-Protokoll in der Schnittstelle einschalten? Ich benutze eine Linux-Box. – flyjohny

+0

Überprüfen Sie zuerst diese Anleitung http://tldp.org/HOWTO/Linux+IPv6-HOWTO/x790.html danach versuchen Sie dies auf Ihrer spezifischen Schnittstelle: ping6 -I eth0 "füllen Sie die ip6addr hier" könnte es sein, dass Ihre Loopback-Schnittstelle hat ip6-Unterstützung aktiviert und daher der lokale Ping funktioniert ohne Probleme, können Sie uns vielleicht Ihre Linux-Distribution und die Kernel-Version? –

6

Sie müssen die Schnittstelle für IPv6 Ping (dh -I eth0) spezifizieren:

ping6 -I eth0 fe80::208:54ff:fe34:22ae 

Mit Link-lokalen Adressen für ein IPv6-Ping, es erfordert, welches Gerät zu definieren, muss das Paket senden/empfangen - Jedes Gerät hat eine link-lokale Adresse.

ohne diese Probieren, wird Fehlermeldung wie:

--> # ping6 fe80::208:54ff:fe34:22ae 
connect: Invalid argument 

In diesem Fall können Sie die Schnittstelle zusätzlich angeben müssen, wie hier gezeigt:

--> # ping6 -I eth0 fe80::208:54ff:fe34:22ae 
PING fe80::208:54ff:fe34:22ae(fe80::208:54ff:fe34:22ae) from fe80::208:54ff:fe34:22ae eth0: 56 data bytes 
64 bytes from fe80::208:54ff:fe34:22ae: icmp_seq=0 ttl=64 time=0.027 ms 
64 bytes from fe80::208:54ff:fe34:22ae: icmp_seq=1 ttl=64 time=0.030 ms 
64 bytes from fe80::208:54ff:fe34:22ae: icmp_seq=2 ttl=64 time=0.036 ms 

Einen ähnlichen Ansatz müssen Sie folgen in Ihrem Client APP ..

Verwandte Themen