Как получить сетевой интерфейс и его правильный IPv4-адрес?

Мне нужно знать, как получить все сетевые интерфейсы с их IPv4-адресами. Или только беспроводная связь и Ethernet.

Чтобы получить все сведения о сетевых интерфейсах, я использую это:

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?


person Murhaf Sousli    schedule 24.03.2012    source источник
comment
Пожалуйста, прочитайте немного внимательнее. См. раздел GetIPProperties.   -  person John Saunders    schedule 25.03.2012
comment
@JohnSaunders хорошо, я проверил вашу ссылку, прочитал ее .. и попробовал .. но я не получил адрес IPV4 !! вроде 192.168.1.25!!   -  person Murhaf Sousli    schedule 25.03.2012
comment
Хорошо, это немного тоньше, чем я думал. См. раздел IPGlobalProperties.GetUnicastAddresses.   -  person John Saunders    schedule 25.03.2012


Ответы (3)


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 — это IP-адрес, который вам нужен.

person bwall    schedule 08.04.2012
comment
@Джозеф, твоя ссылка не работает :/ - person Felk; 28.09.2017
comment
@Felk спасибо, это исходный URL gist.github.com/anonymous/ff82643c9a004281544a - person Joseph; 28.09.2017

С некоторым улучшением этот код добавляет в комбинацию любой интерфейс:

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());
                }
            }
        }
    }
}
person Hady Mahmoodi    schedule 14.12.2013

Одна строка с Lamda:

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);
person Mc_Topaz    schedule 06.02.2020