2016-05-13 26 views
1

Ich arbeite an der Migration von Code von IPv4 nur zu IPv6, und natürlich muss ich die Abwärtskompatibilität für IPv4 beibehalten.Funktionieren IPv6-Adressen im IPv4-Modus?

Ich habe einige Dokumente und Anleitungen zur Konvertierung meines Codes gelesen und habe gesehen, dass die Verwendung vieler der neueren APIs (wie inet_pton() anstelle von inet_addr()) sowohl in IPv4 als auch in IPv6 funktioniert.

In einigen Fällen ist es jedoch immer noch nicht klar, wann ich Code schreiben muss, um jedes Protokoll anders zu behandeln. Insbesondere weiß ich nicht, ob eine IPv6-Adresse (Familie AF_INET6 mit sockaddr_storage-Struktur) in einem lokalen Netzwerk funktionieren wird.

Also sagen wir zum Beispiel, dass ich eine solche Adresse mit der eingebauten Konstante in6addr_loopback erzeuge, und dann versuche ich, diese für einen Parameter zu einem bind() -Aufruf zu verwenden.

Funktioniert das sowohl in IPv4 als auch in IPv6, oder muss ich für jeden Fall den richtigen Adresstyp (AF_INET vs AF_INET6) erstellen? Ist es wichtig, ob ich eine Verbindung zu einem lokalen Socket (d. H. Dem Loopback wie in diesem Fall) herstelle, im Gegensatz zu einem Socket auf einem externen Gerät?

Mein Client-Code läuft auf iPhone/iPad-Hardware, falls es darauf ankommt.

Antwort

2

Jede Schnittstelle wird einen Link lokale IPv6-Adresse mit Mac-Adresse ableiten. Diese Adresse ist ausreichend für die Kommunikation innerhalb des lokalen Netzwerks. Bei der Erstellung von Sockets müssen Sie die Familie (AF_INET und AF_INET6) angeben und initialisieren und binden.

IPv4:

 struct sockaddr_in serv_addr, cli_addr; 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = INADDR_ANY; 
    serv_addr.sin_port = htons(portno); 

    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) 

IPv6:

 struct sockaddr_in6 serv_addr, cli_addr; 
    sockfd = socket(AF_INET6, SOCK_STREAM, 0); 
    serv_addr.sin6_family = AF_INET6; 
    serv_addr.sin6_addr = in6addr_any; 
    serv_addr.sin6_port = htons(portno); 

    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) 

hoffe, das hilft!

+0

Ich weiß, wie Sie beide Socket-Typen erstellen, aber meine Frage ist, dass ich immer einen IPv6-Typ für alle Szenarien erstellen. Funktioniert das für alle Netzwerktypen, einschließlich eines Nur-IPv4-Netzwerks? – Locksleyu

+0

Nein, Sie müssten beide Protokolle unterstützen, es sei denn, Ihr ipv6-Host führt ipv4-Tunneling für IPv4-Verbindungen durch. – Pramod

+0

Aber woher weiß ich, welches Protokoll zu verwenden ist? Um die Dinge einfach zu halten, nehmen wir an, dass ich nur Verbindungen zu einem lokalen Host-Server herstelle. – Locksleyu