如何在C#中获取IP地址?

假设计算机连接到许多网络(实际上不止一个)。

我可以获得一个IP地址列表,其中包括计算机在网络中的所有IP地址,但我怎么知道IP地址属于哪个网络?

首先,您需要了解一些术语。 这些示例数字假设IPv4网络。

  • IP地址(192.168.1.1)
  • 子网掩码(255.255.255.0)
  • 网络地址(192.168.1.0)
  • 网络接口卡,网卡(一个硬件卡可能有几个)

要查看IP地址所属的网络,您需要计算网络地址。 如果您使用IP地址(作为字节[4]或UInt64),并使用子网掩码按位“和”,这很容易。

using System; using System.Linq; using System.Net; using System.Net.NetworkInformation; using System.Net.Sockets; namespace ConsoleApplication { public static class ConsoleApp { public static void Main() { var nics = NetworkInterface.GetAllNetworkInterfaces(); foreach (var nic in nics) { var ipProps = nic.GetIPProperties(); // We're only interested in IPv4 addresses for this example. var ipv4Addrs = ipProps.UnicastAddresses .Where(addr => addr.Address.AddressFamily == AddressFamily.InterNetwork); foreach (var addr in ipv4Addrs) { var network = CalculateNetwork(addr); if (network != null) Console.WriteLine("Addr: {0} Mask: {1} Network: {2}", addr.Address, addr.IPv4Mask, network); } } } private static IPAddress CalculateNetwork(UnicastIPAddressInformation addr) { // The mask will be null in some scenarios, like a dhcp address 169.254.xx if (addr.IPv4Mask == null) return null; var ip = addr.Address.GetAddressBytes(); var mask = addr.IPv4Mask.GetAddressBytes(); var result = new Byte[4]; for (int i = 0; i < 4; ++i) { result[i] = (Byte)(ip[i] & mask[i]); } return new IPAddress(result); } } } 

请注意,您可以在同一网络上拥有多个IP地址, VPN连接可能具有255.255.255.255的子掩码(因此网络地址== IP地址)等。