C# IPAddress类

IPAddress 类代表 IP 地址。使用 GetAddressBytes 属性可以把地址本身作为字节数组,并使用 ToString() 方法转换为用小数点隔开的十进制格式。此外,IPAddress 类也实现静态的 Parse() 和 TryParse 方法,这两个方法的作用与 ToString() 方法正好相反,把小数点隔开的十进制字符串转换为 IPAddress。代码示例也访问 AddressFamily 属性,并将一个 IPv4 地址转换成 IPv6,反之亦然:.

public static void IPAddressSample(string ipAddressString)
{
  IPAddress address;
  if (!IPAddress.TryParse(ipAddressString, out address))
  {
    Console.WriteLine($"cannot parse {ipAddressString}"); 
    return;
  }
  byte[] bytes = address.GetAddressBytes(); 
  for (int i = 0; i < bytes.Length; i++)
  {
    Console.WriteLine($"byte {i}: {bytes[i]:X}");
  }
  Console.WriteLine($"family: {address.AddressFamily}, " +
    $"map to ipv6: {address.MapToIPv6()}, map to ipv4: {address.MapToIPv4()}");
  //...

给方法传递地址 65.52.128.33,输出结果如下:

byte 0: 41 

byte 1: 34 

byte 2: 80 

byte 3: 21

family: InterNetwork, map to ipv6: ::ffff:65.52.128.33, map to ipv4: 65.52.128.33

IPAddress 类也定义了静态属性,来创建特殊的地址,如 loopback、broadcast和anycast:

public static void IPAddressSample(string ipAddressString)
{
  //...
  Console.WriteLine($"IPv4 loopback address: {IPAddress.Loopback}");
  Console.WriteLine($"IPv6 loopback address: {IPAddress.IPv6Loopback}"); 
  Console.WriteLine($"IPv4 broadcast address: {IPAddress.Broadcast}"); 
  Console.WriteLine($"IPv4 any address: {IPAddress.Any}");
  Console.WriteLine($"IPv6 any address: {IPAddress.IPv6Any}");
}

通过 loopback 地址,可以绕过网络硬件。这个 IP 地址代表主机名 localhost。

每个 broadcast 地址都在本地网络中寻址每个节点。这类地址不能用于 IPv6,因为这个概念不用于互联网协议的更新版本。最初定义 IPv4 后,给 IPv6 添加了多播。通过多播,寻址一组节点,而不是所有节点。在 IPv6 中,多播完全取代广播。

通过 anycast,也使用一对多路由,但数据流只传送到网络上最近的节点。这对负载平衡很有用。对于 IPv4, Border Gateway Protocol(BGP) 路由协议用来发现网络中的最短路径:对于 IPv6,这个功能是内置的。

运行应用程序时,可以看到下面的 IPv4 和 IPv6 地址:

IPv4 loopback address: 127.0.0.1 

IPv6 loopback address: ::1

IPv4 broadcast address: 255.255.255.255 

IPv4 any address: 0.0.0.0

IPv6 any address: ::