c#SocketサービスでIPv 6をサポート

6134 ワード

インターネットがますます普及し、モノのインターネットが盛んになるにつれて、IPv 4アドレスがはるかに足りなくなり、IPv 6の普及は避けられない傾向にある.以前は、ほとんどのsocketプログラムがIPv 4向けに開発されていましたが、アップグレード再構築を行わないと、IPv 6アドレスを使用するクライアントはサービス側が提供するサービスを使用できません.どうすれば
ESFramework
同様に、サービス側とクライアントがIPv 6を同時にサポートできるようになりましたか?P 2 PホールもIPv 6対応になりましたか?次はポイントを一つ一つ出します.
まず、2つの最も基礎的な事実を理解します.
(1)通信の双方は,サービス側とクライアント間,あるいはクライアントとクライアント間のP 2 P通信にかかわらず,同じプロトコルバージョンを用いなければならない--いずれもIPv 4であるか,IPv 6である.
(2)添付ファイルが特にインストールされていない場合、あるOSはIPv 4のみをサポートしている可能性があり、あるOSはIPv 6のみをサポートしている可能性があり、あるものはIPv 4もIPv 6をサポートしている可能性がある.SocketクラスのOSSupportsIPv 6とOSSupportsIPv 4属性で判断できます.
一.TCPサービス
サーバのOSがIPv 4もIPv 6もサポートしていることを前提として、TCPサービス側でIPv 4アドレスのクライアントからのリクエストを受信できるようにする.デフォルトでは、windows 2003サーバはIPv 4のみをサポートしており、インストールプロトコルによってIPv 6をサポートすることができます.
その後、サービス・エンド・プログラムを書く場合は、ネイティブIPv 4アドレスとIPv 6アドレスを同時に傍受し、両方のアドレスを傍受する同じポートである必要があります.たとえば、次のようにします.
 int port = 9900;
 TcpListener tcpListenerV4 = new TcpListener(IPAddress.Any, port);
 TcpListener tcpListenerV6 = new TcpListener(IPAddress.IPv6Any, port);

このように、クライアントは、IPv 4を使用してもIPv 6を使用しても、サービス側に接続要求を開始すると、サービス側に受け入れられる.
二.TCPクライアント
サービス側プログラムはIPv 6と互換性があり、サービスを提供するIPv 4アドレスは192.168.0.104、IPv 6アドレスはfe 80::14 d 8:a 209:89 e 6:c 162%14であると仮定します.
では、TCPクライアントは、サービス側と接続を確立する前に、IPv 4およびIPv 6に対するローカルOSのサポート状況を見ます.
(1)ローカルOSがIPv 4のみをサポートしている場合、またはIPv 4とIPv 6を同時にサポートしている場合は、簡単にサーバのIPv 4アドレスに接続させる.サンプルコードは次のとおりです.
 TcpClient client = new TcpClient(AddressFamily.InterNetwork);
 client.Connect("192.168.0.104", 9900);

(2)ローカルOSがIPv 6のみをサポートしている場合は,サーバのIPv 6アドレスに接続させる.サンプルコードは次のとおりです.
 TcpClient client = new TcpClient(AddressFamily.InterNetworkV6);
 client.Connect("fe80::14d8:a209:89e6:c162%14", 9900); 

三.UDP
UDPの場合、サービス側とクライアントはまったく同じモデルを採用することができる.UDPベースのアプリケーションをIPv 6と互換化するには、少し複雑です.
(1)IPv 4用とIPv 6用の2つのUdpClientインスタンスを作成する必要がある.サンプルコードは次のとおりです.
 int port = 9800;
 UdpClient udpClient4 = new UdpClient(port, AddressFamily.InterNetwork);
 UdpClient udpClient6 = new UdpClient(port ,AddressFamily.InterNetworkV6);

(2)受信データを受信するために、2つのUdpClientインスタンス上で受信データを呼び出す方法が必要である.(3)データを送信する場合は,宛先アドレスがIPv 4であるかIPv 6であるかに応じて,正しいUdpClientインスタンスを選択して送信する必要がある.サンプルコードは次のとおりです.
    public void Send(byte[] data, IPEndPoint endPoint)
    {
        if (endPoint.AddressFamily == AddressFamily.InterNetwork)
        {
            this.udpClient4.Send(data, data.Length, endPoint);
        }
        else
        {
            this.udpClient6.Send(data, data.Length, endPoint);
        }
    }

上記の例では、現在のOSがIPv 4とIPv 6を同時にサポートしていると仮定し、そのうちの1つだけをサポートしている場合は、udpClient 4またはudpClient 6の1つのインスタンスのみを作成する必要があります.
四.P 2 PとIPv 6
TCPクライアントおよびUDPが上記のように再構成されてアップグレードされている場合、TCPベースのP 2 PホールでもUDPベースのP 2 Pホールでも、論理コードは修正する必要がなく、IPv 6と完全に互換性があります.
この文書では、IPv 6をサポートするためにSocketアプリケーションを再構築してアップグレードするポイントを示しています.実際の実装では、現実的な複雑な環境で正常に動作するために、多くの詳細を処理する必要があります.ここでは余計なことは言わないで、疑問のある友达は伝言を残して討論することができます.ありがとうございます.