如何获取网络接口及其正确的IPv4地址?

86

我希望你能翻译如何获取所有网络接口的IPv4地址。 或者只需无线和以太网。

要获取所有网络接口的详细信息,我使用以下命令:

foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) {
    if(ni.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 ||
       ni.NetworkInterfaceType == NetworkInterfaceType.Ethernet) {

        Console.WriteLine(ni.Name);
    }
}

要获取计算机的所有托管IPv4地址:

IPAddress [] IPS = Dns.GetHostAddresses(Dns.GetHostName());
foreach (IPAddress ip in IPS) {
    if (ip.AddressFamily == AddressFamily.InterNetwork) {

        Console.WriteLine("IP address: " + ip);
    }
}

但是如何获取网络接口及其正确的IPv4地址?


1
请仔细阅读一下。请参阅GetIPProperties - John Saunders
@JohnSaunders 好的,我已经查看了你的链接并阅读了它。我也尝试了它,但是我没有得到IPV4地址,比如192.168.1.25! - Murhaf Sousli
3
好的,这个问题比我想象的要微妙一些。请查看 IPGlobalProperties.GetUnicastAddresses - John Saunders
4个回答

135
foreach(NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
{
   if(ni.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 || ni.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
   {
       Console.WriteLine(ni.Name);
       foreach (UnicastIPAddressInformation ip in ni.GetIPProperties().UnicastAddresses)
       {
           if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
           {
               Console.WriteLine(ip.Address.ToString());
           }
       }
   }  
}

这个代码应该可以帮你得到所需的结果。ip.Address 是一个 IPAddress,正是你所需要的。


@Joseph,你的链接已经失效了 :/ - Felk
3
谢谢,这是原始链接 https://gist.github.com/anonymous/ff82643c9a004281544a - Jose Rodriguez

9

使用Lambda的一行代码:

using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Net.NetworkInformation;

var ipV4s = NetworkInterface.GetAllNetworkInterfaces()
    .Select(i => i.GetIPProperties().UnicastAddresses)
    .SelectMany(u => u)
    .Where(u => u.Address.AddressFamily == AddressFamily.InterNetwork)
    .Select(i => i.Address);

3

这些答案让我朝着正确的方向前进 - 感谢之前的作者! 对于任何寻找即插即用方法的人,以下是对我有效的方法。

public System.Net.IPAddress GetIpAddress()
{
    return NetworkInterface
        .GetAllNetworkInterfaces()
        .Where(n => n.OperationalStatus == OperationalStatus.Up)
        .Where(n => n.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 || n.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
        .Where(n => n.Name == "Wi-Fi")
        .SelectMany(n => n.GetIPProperties()?.UnicastAddresses)
        .Where(n => n.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
        .Select(g => g?.Address)
        .Where(a => a != null)
        .FirstOrDefault();
}

public System.Net.IPAddress GetDefaultGateway()
{
    return NetworkInterface
        .GetAllNetworkInterfaces()
        .Where(n => n.OperationalStatus == OperationalStatus.Up)
        .Where(n => n.NetworkInterfaceType != NetworkInterfaceType.Loopback)
        .SelectMany(n => n.GetIPProperties()?.GatewayAddresses)
        .Select(g => g?.Address)
        .Where(a => a != null)
        .FirstOrDefault();
}

3

通过一些改进,这段代码可以将任何接口添加到一个组合中:

private void LanSetting_Load(object sender, EventArgs e)
{
    foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
    {
        if ((nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet) || (nic.NetworkInterfaceType == NetworkInterfaceType.Wireless80211)) //&& (nic.OperationalStatus == OperationalStatus.Up))
        {
            comboBoxLanInternet.Items.Add(nic.Description);
        }
    }
}

在选择其中一个时,此代码将返回接口的IP地址:

private void comboBoxLanInternet_SelectedIndexChanged(object sender, EventArgs e)
{
    foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
    {
        foreach (UnicastIPAddressInformation ip in nic.GetIPProperties().UnicastAddresses)
        {
            if (nic.Description == comboBoxLanInternet.SelectedItem.ToString())
            {
                if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                {
                    MessageBox.Show(ip.Address.ToString());
                }
            }
        }
    }
}

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