IPv4-mapped-IPv6-Adressen
Ich versuche, eine IP-version-unabhängige client/server. Ich habe das Spiel mit dieser in C++ und kam mit etwas, das funktioniert mit der IN6ADDR_SETV4MAPPED
- makro (Microsoft so freundlich empfiehlt). Ich folgte dem code-Beispiel hier um dies zu erreichen; mein code wandelt die Adresse ist nicht anders als das Beispiel, und alles funktioniert. Ich kann eine Verbindung zu dem server von dem client, indem Sie in eine IPv4-und IPv6-Adresse (Anwendung muss die Zuordnung entsprechend).
Nun bin ich auf der Suche nach einer Lösung in C# zu aktualisieren, ist eine einfache chat-server, den ich gemacht, und ich habe nicht in der Lage zu finden keine Ressourcen zur Verwendung mapped Adressen. Ich habe nicht gefunden, eine Funktion, die das äquivalent von IN6ADDR_SETV4MAPPED
oder jede andere Einrichtung, in .net. Meine Frage ist: wie kann ich mich über die Verwendung einer IPv4-mapped IPv6-Adresse, die in C# (client-Seite)?
Was ich versucht habe:
- Voranstellen string
"::ffff:"
zu IPv4-gepunktete Schreibweise, rufen SieSocket.Connect
über diese Adresse. Resultierende Adresse string sieht wie::ffff:127.0.0.1
. - Voranstellen string
"::ffff:"
. Konvertieren Sie jedes octect von dotted-format in hex und getrennt mit Doppelpunkten, rufen SieSocket.Connect
. Resultierende Adresse string sieht wie::ffff:7f:0:0:1
.
Keiner dieser Ansätze gearbeitet haben, so weit.
Code-snippet für server:
this.m_endPoint = new IPEndPoint(IPAddress.IPv6Any, 1337);
this.m_server.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, 0);
this.m_server.Bind(this.m_endPoint);
this.m_server.Listen(10);
Code-snippet für den client:
public ClientNet(string host, short port)
{
IPAddress ip;
if(IPAddress.TryParse(host, out ip))
{
string[] octs = host.Split(new char[] { '.' });
host = "::ffff:";
for(int i = 0; i < octs.Length; ++i)
{
host += string.Format("{0:x}", int.Parse(octs[i]));
if(i + 1 != octs.Length)
{
host += ":";
}
}
}
else
{
throw new ClientCreateException("[in ClientNet.Constructor] Unable to create client; use IPv4 address");
}
Socket client = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
client.Connect(host, port);
. . . //More initialization
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kam zurück, um das heute zu denken, ich könnte in der Lage sein, um es herauszufinden. Und ich habe! Die Antwort ist ganz einfach und ich fühle mich wie ein idiot für nicht immer es für ein Jahr.
Zwei Dinge über den code, den ich gepostet:
Hätte
IPAddress.MaptoIPv6
(siehe MSDN-link) stattdessen albern, gekünstelt Schleife ich schrieb, ist anfälliger für Fehler.ein. Ich erkannte später, während der Arbeit in .NET 4.0, die den Komfort Funktionen, die ich in meinem Beispiel sind nicht verfügbar, bis .NET 4.5. Eine schnelle code-Beispiel warf ich zusammen an der Unterseite von diesem post, im Fall, jemand ist stecken geblieben in einer früheren version .NET.
Wirkliche Lösung: bitten mussten
client.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, 0);
vor dem Aufrufclient.Connect()
.Hier ist eine vollständige code-Beispiel für eine Beispielanwendung, die ich schrieb heute um es zu testen. Ich war in der Lage, eine Verbindung über die beiden ::1 und 127.0.0.1 als Adressen. Beachten Sie, dass der server
Socket
erstellt für IPv6, und dass dieSocketOptionName.IPv6Only
option auf 0 gesetzt ist auf sowohl der client und der server.Client-Ausgabe:
Server-Ausgabe:
Beispiel-Erweiterung-Methoden, die Bereitstellung der fehlende Komfort-Funktionen in früheren Versionen .NET: