【问题标题】:How to get the IP address in C#?如何在 C# 中获取 IP 地址?
【发布时间】:2010-12-29 10:55:52
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net network-programming system.net


    【解决方案1】:

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

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

    要查看 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.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 地址)等。

    【讨论】:

      猜你喜欢
      • 2017-01-26
      • 1970-01-01
      • 2011-01-02
      • 2016-05-10
      • 2013-02-27
      • 2010-12-26
      • 2014-08-07
      • 2013-01-09
      相关资源
      最近更新 更多