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

4
假设一台计算机连接了多个网络(实际上不止一个)。
我可以获取包含计算机在所有网络中拥有的所有IP地址的列表,但是如何知道一个IP地址属于哪个网络?
1个回答

4

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

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

要查看IP地址属于哪个网络,需要计算网络地址。如果您以Byte[4]或UInt64的形式获取IP地址,并将其与子网掩码进行按位“and”运算,则很容易计算出网络地址。

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.x.x
            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地址),等等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接