我有一个HashSet,其中包含与当前计算机关联的IP地址。如何确定每个IP地址的版本?

时间:2017-11-20 04:31:55

标签: c# ipv6 hashset ipv4

    //Returns an IP Address based on version requested
    private string GetIPAddress(int version)
    {
        string address = null;

        var IPAddressHashSet = new HashSet<IPAddress>(Dns.GetHostAddresses(GetHostName()));


        switch (version)
        {
            case 4:
                //Assign ipv4 address as string to "address"
                break;
            case 6:
                //Assign ipv4 address as string to "address"
                break;
            default:
                address = null;
                break;
        }

        return address;

    }

正如您所看到的,我创建了一个名为&#34; IPAddressHashSet&#34;

的HashSet

根据请求的IP版本,我想返回本地ipv4或ipv6地址。

我认为我可以通过在HashSet中获取每个IP地址并进行比较来查看它是否适合某个帧(即&#34; {0:###。###。###。 ###}&#34;)但即便如此,也无法确定该地址是本地地址,外部地址,网络设备等。

在这种情况下,我只是在寻找一个基本的&#34; 192.168.0。###&#34;,但即使这样也行不通,因为并非所有默认网关都以192.168开头。

是否有任何.NET类对此有用? 基本上我想确定IP地址的版本,并在其默认网关上返回当前机器的本地地址。

1 个答案:

答案 0 :(得分:1)

您可以使用IPAddress.Family。它的IPv4为InterNetwork,IPv6为InterNetworkV6。如果要过滤掉外部ips - 请使用示例代码检查此answer,说明如何检测ip是否属于私有范围。示例代码:

private IPAddress GetFirstPrivateIp(bool ipV4) {
    var interfaces = NetworkInterface.GetAllNetworkInterfaces();
    return interfaces
        .SelectMany(c => c.GetIPProperties().UnicastAddresses)
        .Where(c => 
            !IPAddress.IsLoopback(c.Address)
            && c.Address.AddressFamily == (ipV4 ? AddressFamily.InterNetwork : AddressFamily.InterNetworkV6)
            && (!ipV4 || IpIsPrivate(c.Address))) // IpIsPrivate - refer to question linked above
        .Select(c => c.Address)
        .FirstOrDefault();
}