65.9K
CodeProject 正在变化。 阅读更多。
Home

C# .NET 中的 IPv6 客户端服务器网络应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.76/5 (32投票s)

2003 年 1 月 30 日

7分钟阅读

viewsIcon

225521

downloadIcon

2409

C# .NET 1.1 环境下的 IPv6 编程

C# .NET 中的 IPv6 客户端服务器网络应用程序

在继续阅读之前,值得一提的是,这需要 .NET Framework 版本 1.1。本文展示了一个简单的基于 TCP 的 IPv6 应用程序,以及如何配置您的计算机以启用 IPv6 .NET 开发。

IP 简介

许多人听说过 IPv6 及其取代当前 IPv4 地址分配系统的必要性。

接下来的两个部分将简要介绍 IPv4 和 IPv6,您可以跳过这两部分,直接阅读“C# .NET 1.1 中的 IPv6 客户端服务器应用程序”部分。

IPv4 简介

IPv4 是当前用于为系统分配 IP 地址的系统,直接连接到 Internet 的每台计算机都有一个唯一的 IP(v4) 地址。IP 地址以人类可读的十进制形式显示为 xxx.xxx.xxx.xxx,其中每个部分最多可以存储十进制数 255 或十六进制 FF(8 位)。这意味着 IPv4 地址长度为 32 位,允许 4,294,967,296 (232) 个唯一值。根据联合国的估计,目前世界人口约为 60 亿,每年全球人口增加约 7900 万(PRB01)。尽管目前并非世界上的每个人都使用 Internet,但这个数字远高于可寻址的 IPv4 地址数量。事实上,根据 IETF(互联网工程任务组)的说法,未分配的 IPv4 地址供应短缺,IPv4 地址将在 2008 年(±3 年)内耗尽。

幸运的是,已经设计了绕过 IPv4 问题的方法。NAT(网络地址转换)允许私有网络中的 N 台计算机共享一个公共 IP 地址。在这种设置下,私有网络中的计算机将从 Internet 请求数据;NAT 会将用户的本地 IP 地址转换为公共 IP 地址,并添加有关请求来源的信息。当来自 Internet 的回复回来时,NAT 机会将此信息发送回私有计算机。这意味着 NAT 私有侧的计算机无法与 Internet 上的计算机真正进行双向通信,因为私有计算机的 IP 地址在公共网络上无效。这严重限制了该计算机可以执行的操作,例如,该计算机将无法完全参与 GnuTella 等分布式网络,因为它无法充当该系统的服务器端。设置 MSN Messenger 等应用程序的文件传输也成为一个问题,因为无法建立计算机之间的直接连接,特别是当尝试通信的两台计算机都位于 NAT 网关之后时。

IPv6 简介

IPv4 简介中提到的问题并未被互联网界忽视。1992 年,IETF 开始着手寻找下一代互联网协议。两年后的提案被采纳,1995 年,它被命名为互联网协议版本 6 (IPv6)。IPv6 地址以人类可读的十六进制形式显示为 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx,其中每个分割位最多可存储十进制数 65535 或十六进制 FFFF(16 位)。这意味着 IPv6 地址长度为 128 位,允许 3.4 x 1038 (2128) 个唯一值。 “如果将 IPv4 的地址空间比作 1 毫米,那么 IPv6 的地址空间将是银河系直径的 80 倍”(WIDE01)。IPv6 还有许多其他功能,包括对 IPSec 的支持,“集群地址”字段,用于识别拓扑区域,以及用于更精确地控制路由的源路由(IPv4 目前需要大量的路由开销)。

C# .NET 1.1 中的 IPv6 客户端和服务器应用程序

在您的计算机上编写和测试 IPv6 应用程序之前,需要进行一些设置。根据您的操作系统,您需要使用不同的方法来安装 IPv6。Windows 2000 用户应查看 http://research.microsoft.com/msripv6/,而 Windows XP 用户应阅读 http://www.microsoft.com/windowsxp/pro/techinfo/administration/ipv6/default.asp 以获取更多信息。由于 .NET Framework 最终将在所有操作系统上运行,其他操作系统的用户应访问 http://www.hs247.com/ 获取更多信息。本文档的其余部分将假定您正在运行 Windows XP SP1。

准备系统以运行 IPv6 代码

我在我的计算机上安装了 Microsoft 回环设备,因为我没有永久的网络连接,但是您可以使用您本地系统的回环设备进行此示例(::1,它在 IPv4 中等同于 127.0.0.1)。要安装 Microsoft 回环设备,请参阅 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcepb40/htm/pbtskinstallingmicrosoftloopbackadapter.asp

启动命令提示符窗口并键入 ipv6 install。短时间后,您的计算机将启用 IPv6。您可以通过在命令提示符下键入 ipconfig 来检查这一点。您应该会看到类似以下的输出

Windows IP Configuration

Ethernet adapter Microsoft Loopback:

        Connection-specific DNS Suffix  . :
        IP Address. . . . . . . . . . . . : 192.168.1.10
        Subnet Mask . . . . . . . . . . . : 255.255.255.0
        IP Address. . . . . . . . . . . . : fe80::4cff:fe4f:4f50%4
        Default Gateway . . . . . . . . . :

Tunnel adapter Teredo Tunneling Pseudo-Interface:

        Connection-specific DNS Suffix  . :
        IP Address. . . . . . . . . . . . : fe80::54ff:fe55:4e01%6
        Default Gateway . . . . . . . . . :

Tunnel adapter Automatic Tunneling Pseudo-Interface:

        Connection-specific DNS Suffix  . :
        IP Address. . . . . . . . . . . . : fe80::5efe:192.168.1.10%2
        Default Gateway . . . . . . . . . :

地址 fe80::4cff:fe4f:4f50 已分配给 Microsoft 回环设备。您应该能够使用 ping6 命令 ping 此地址(将其更改为您计算机分配的地址)。

C:\Documents and Settings\Gary>ping6 fe80::4cff:fe4f:4f50

Pinging fe80::4cff:fe4f:4f50
from fe80::4cff:fe4f:4f50%4 with 32 bytes of data:

Reply from fe80::4cff:fe4f:4f50%4: bytes=32 time<1ms
Reply from fe80::4cff:fe4f:4f50%4: bytes=32 time<1ms

这是将在代码示例中使用的 IPv6 地址,您也可以将其更改为您系统的回环设备 ::1

准备 .NET SDK Framework 1.1 以用于 IPv6 应用程序

打开位于 .NET Framework CONFIG 目录下的 machine.config 文件(在 Windows XP 上,它位于 C:\Windows\Microsoft.NET\Framework\v1.1.XXXX\CONFIG)。更改 XML 标记

<!-- <ipv6 enabled="false"/> --> 

to

<ipv6 enabled="true"/> 

这使得框架能够解析和处理 IPv6 地址。我们稍后将在代码中进行测试,以确保其正常工作。

服务器实现

构建 IPv4 TCP 服务器和 IPv6 TCP 服务器之间有许多相似之处。这对希望升级当前 IPv4 应用程序到 IPv6 的开发人员来说是个好消息,无论使用何种语言。

首先,需要导入以下命名空间

using System.Net.Sockets;
using System.Net;
using System;

其次,请确保系统支持 IPv6,这可以通过使用 Socket.SupportsIPv6 布尔值来完成。

const int PORT=1979;

if(!Socket.SupportsIPv6) {
    Console.Error.WriteLine("Your system does not support IPv6\r\n" +
        "Check you have IPv6 enabled and have changed machine.config");
    return;
}

然后,我们创建一个初始监听套接字。

Socket listener = new Socket(
    AddressFamily.InterNetworkV6,
    SocketType.Stream,
    ProtocolType.Tcp);

AddressFamily 设置为 InterNetworkV6(而不是 IPv4 的 InterNetwork)。

listener.Bind(new IPEndPoint(IPAddress.IPv6Any, PORT));
listener.Listen(0);

然后,我们绑定到 IP 地址 IPv6Any – 这意味着应用程序将在系统上的所有 NIC 地址上监听。然后,我们在套接字上调用 listener.Listen(0)。这将阻塞,直到在端口 1979 上建立连接。您可以通过在命令提示符下键入 netstat –a 来检查您是否正确监听端口。您应该在输出中看到类似以下的一行

TCP    yourmachinename:1979   [::]:0          LISTENING       0

然后,我们处理进入端口的任何内容并将其显示在屏幕上,最后关闭所有套接字并退出应用程序

Socket socket = listener.Accept();
listener.Close();

byte[] b = new byte[11];
int len;
while((len = socket.Receive(b)) != 0) {
    System.Console.WriteLine("RX: " +
        System.Text.ASCIIEncoding.ASCII.GetString(b, 0, len));
    b = new byte[11];
}
socket.Close();

套接字接受 11 字节的数据,然后在客户端断开连接时关闭所有套接字。

客户端应用程序

同样,IPv6 客户端应用程序与 IPv4 应用程序非常相似。

首先,导入以下命名空间

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;

System.Threading 已包含在内,用于示例目的,以便在发送信息到服务器时引入延迟。

const int PORT = 1979;
const string IPv6_ADDR = "fe80::4cff:fe4f:4f50";

if(!Socket.SupportsIPv6) {
    Console.Error.WriteLine("Your system does not support IPv6\r\n" +
        "Check you have IPv6 enabled and have changed machine.config");
    return;
}

我们将 IPv6_ADDR 字符串设置为 ipconfig 返回的 IPv6 地址,将其更改为您计算机的 IPv6 地址或您系统的回环设备的 ::1

IPAddress ipa = IPAddress.Parse(IPv6_ADDR);
IPEndPoint ipeh = new IPEndPoint(ipa, PORT);
Socket connection = new Socket(
    AddressFamily.InterNetworkV6,
    SocketType.Stream,
    ProtocolType.Tcp);

Dns.Resolve 方法目前不返回 IPv6_ADDR 中指定的 IPv6 地址。套接字使用 InternetNetworkV6 的地址族创建,与服务器代码中显示的完全相同。

connection.Connect(ipeh);

byte[] b = System.Text.ASCIIEncoding.ASCII.GetBytes("hello world");
for(int x=0; x<10; x++) {
    Console.WriteLine("TX: " + System.Text.ASCIIEncoding.ASCII.GetString(b));
    connection.Send(b);
    
    Thread.Sleep(1000);
}

connection.Close();

应用程序然后连接到 IPv6_ADDR 地址的端口 1979,并每秒发送 10 次 ASCII 字符串 ‘hello world’。然后关闭套接字。这会终止两个应用程序。请记住,在执行客户端代码之前,请先运行服务器应用程序代码。

延伸阅读

互联网上有大量关于 IPv6 的信息。以下是一些非常有用的链接:

Microsoft 的 IPv6 门户 http://www.microsoft.com/ipv6/
英国 IPv6 资源中心 http://www.cs-ipv6.lancs.ac.uk/ipv6/
6Bone.Net http://www.6bone.net/
IPv6 新闻和链接 http://www.hs247.com/
WIDE 项目 http://www.v6.wide.ad.jp/
IPv6 信息 http://www.ipv6.org/

您也可以尝试在 http://www.google.com/ 上搜索“IPv6”。

参考文献

历史

  • 2003/01/30:初版

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

IPv6 客户端服务器网络应用程序(C# .NET)- CodeProject - 代码之家
© . All rights reserved.