Ich muss IPv6-Unterstützung zu einer vorhandenen socketbasierten Anwendung hinzufügen, die derzeit nur IPv4 unterstützt. Um das kommende Zeitalter von IPv6 in Angriff zu nehmen, hat mir jemand befohlen, eine IPv6-Schnittstelle für die App hinzuzufügen und die Außenwelt bei der Kommunikation mit der App entweder die IPv4-Schnittstelle oder die IPv6-Schnittstelle wählen zu lassen.
Meine Frage ist: Stimmt es, dass es für die Socket-Handling-API-Ebene unter Linux keinen Unterschied zwischen der Verarbeitung eines IPv4-basierten Sockets und IPv6-basierten Sockets gibt?
Außerdem, ist es möglich, einen Socket zwei IP-Adressen mit demselben Port abhören zu lassen? Wenn das wahr ist, dann ist die Umsetzung der Anforderung eine triviale Arbeit, denke ich.
Es ist nicht möglich, 2 verschiedene IP-Adressen mit 1 TCP-Socket abzurufen, wenn Sie jedoch alle Schnittstellen mit dem in6addr_any Adresse, das wird auch alle IPv4-Adressen einschließen (obwohl ich glaube, dass zB linux eine Kernel-Option hat, um diese Zuordnung zu deaktivieren).
Die (neuere Version von) Socket-API ist relativ transparent, ob Sie IPv4 oder IPv6 verwenden, aber es muss sehr sorgfältig darauf geachtet werden, wie eine IPv4-Anwendung normalerweise codiert wird.
z.B. Dieser IPv4-Code akzeptiert eine Verbindung und gibt die Adresse des Remote-Hosts aus:
%Vor%Müsste in folgendes konvertiert werden, das sowohl IPv4 als auch IPv6 behandelt.
%Vor% Obwohl ich glaube, Sie könnten es noch eleganter und transparenter mit getaddrinfo () Hier finden Sie weitere Hinweise zur IP-Layer-Unabhängigkeit:
Ссылка
Ссылка
Ein Großteil der Socket-Verarbeitung ist für IPv4 und IPv6 identisch. Auf dem Server funktionieren die Aufrufe von listen
, accept
, recv
und send
für IPv4- und IPv6-Verbindungen, sobald Sie Ihre Adresse gebunden haben.
Aber alle Funktionen, die mit Adressen wie connect
, bind
, getsockname
, getpeername
arbeiten, müssen geändert werden, da Sie sockaddr_in6
verwenden müssen. Außerdem müssen Sie die Funktionen ändern, die mit der Adresse arbeiten (z. B. müssen Aufrufe von inet_addr
in inet_pton
geändert werden).
Wenn Sie unter Linux an in6addr_any
binden, funktionieren sowohl IPv4- als auch IPv6-Verbindungen zu diesem Port (obwohl dies mehr als 2 Adressen hören könnte, da es auch auf die IPv4-Loopback 127.0.0.1
und IPv6 hört Loopback ::1
). Aber unter Windows war ich nie in der Lage, das zum Laufen zu bringen und muss auf einen Socket für IPv4 und einen anderen Socket für IPv6 warten.
Beej's Guide zur Netzwerkprogrammierung behandelt die Unterschiede in der Codierung für IPv4 und IPv6. Ссылка
Er hat einen Abschnitt eingerichtet, um Ihren bestehenden IPv4-Code für IPv6 zu ändern.
Er erklärt auch, wie man abstrakt auf der Socket-Ebene codiert, so dass man nicht wissen muss, ob es sich um eine IPv4-Adresse oder um eine IPv6 handelt.
Ich glaube, es gibt einen Unterschied, hauptsächlich wie IP-Adressen zugewiesen / angezeigt werden und Subnetzmasken.
Methoden, die die eingehende IPv4-Adresse annehmen, funktionieren nicht und lösen eine Ausnahme aus, wenn ihnen ein reines IPv6 gegeben wird. Daher müssen Ihre Methoden prüfen, welche Art von Verbindung initiiert wurde, abgesehen davon, dass ich das nicht glaube .
IPv6 ist 128bit Adressraum und bietet mehr Funktionen (zustandslos, Multicast, einfachere Verarbeitung für Router, um nur einen zu nennen Im Vergleich zu IPv4 (also 32bit) ist der Adressraum für IPv4 knapp, aber mit Hilfe von NAT / SNAT kann die Langlebigkeit des IPv4-Protokolls erhöhen. Die Verwendung von IPv6 hängt davon ab, ob das Betriebssystem das neue Protokoll unterstützen kann. Es ist sicherlich auf Windows 7, Linux verfügbar ... Die Hauptsache ist, dass IPv6 abwärtskompatibel zu IPv4 ist ...
Um Ihre Frage zu beantworten, hängt das von der API-Ebene ab, sofern das Betriebssystem den IPv6-Netzwerk-Stack unterstützt. Hier finden Sie ein Beispiel für IPv6-Sockets, wie es auf MSDN , für Linux , Verwendung von Sockets ist meistens gleich, mit der Ausnahme, dass Sie sockaddr_in6
...
Hoffe, das hilft, Freundliche Grüße, Tom.