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:

  1. Voranstellen string "::ffff:" zu IPv4-gepunktete Schreibweise, rufen Sie Socket.Connect über diese Adresse. Resultierende Adresse string sieht wie ::ffff:127.0.0.1.
  2. Voranstellen string "::ffff:". Konvertieren Sie jedes octect von dotted-format in hex und getrennt mit Doppelpunkten, rufen Sie Socket.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
}
InformationsquelleAutor E. Moffat | 2013-09-13
Schreibe einen Kommentar