C# Получить активный сетевой адрес IPv4

У меня есть несколько сетевых карт на моем компьютере. (Из-за VMWare)

Как я могу найти IPv4-адрес активной карты. Я имею в виду, если я отправляю ping в терминале и перехватываю пакет в WireShark, я хочу адрес "Source".

Я думал о проверке каждого сетевого интерфейса и посмотреть, пусто ли GateWay или нет? Или, возможно, пинг 127.0.0.1 и получить IP-источник запроса пинга? Но не может реализовать это.

На данный момент у меня есть этот код, который я нашел на StackOverFlow

 public static string GetLocalIpAddress()
        {
            var host = Dns.GetHostEntry(Dns.GetHostName());
            return host.AddressList.First(h => h.AddressFamily == AddressFamily.InterNetwork).ToString();
        }

Но он получает IP-адрес карты VmWare. Но я не знаю, что еще это ".First()"Я мог бы использовать.

2 ответа

Решение

Наконец-то я нашел эффективный способ получить настоящий IP. По сути, он ищет все интерфейсы в IPv4, которые работают, и единственное, что заставляет его принимать решение, это то, что он принимает только интерфейс со шлюзом по умолчанию.

public static string GetLocalIpAddress() 
        {
            foreach (var netI in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (netI.NetworkInterfaceType != NetworkInterfaceType.Wireless80211 &&
                    (netI.NetworkInterfaceType != NetworkInterfaceType.Ethernet ||
                     netI.OperationalStatus != OperationalStatus.Up)) continue;
                foreach (var uniIpAddrInfo in netI.GetIPProperties().UnicastAddresses.Where(x => netI.GetIPProperties().GatewayAddresses.Count > 0))
                {

                    if (uniIpAddrInfo.Address.AddressFamily == AddressFamily.InterNetwork &&
                        uniIpAddrInfo.AddressPreferredLifetime != uint.MaxValue)
                        return uniIpAddrInfo.Address.ToString();
                }
            }
            Logger.Log("You local IPv4 address couldn't be found...");
            return null;
        }

Ну, мой друг, вы можете сделать следующее:

var nics = NetworkInterface.GetAllNetworkInterfaces();
foreach (var networkInterface in nics)
{
    if (networkInterface.OperationalStatus == OperationalStatus.Up)
    {
        var address = networkInterface.GetPhysicalAddress();
    }
}

переменная address дает вам доступ к PhysicalAddress текущего сетевого интерфейса Up

Другие вопросы по тегам