Как получить IP-адрес сетевого адаптера - PullRequest
1 голос
/ 19 января 2012

Я использую этот код для получения доступных адресов IPv4:

static void Main(string[] args)
    {
        string host = System.Net.Dns.GetHostName();
        System.Net.IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(host);
        System.Net.IPAddress[] ipAddr = ipEntry.AddressList;
        for (int i = 0; i < ipAddr.Length; i++)
        {
            if (ipAddr[i].AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                Console.WriteLine( ipAddr[i]);

        }
    }

Для моей машины это в настоящее время дает:

192.168.1.11

192.168.240.1

192.168.182.1

10.1.1.121

, тогда как 192.168.1.11 - это мой сетевой адаптер, следующие два - от VMware Network, а 10.1.1.121 - от активного в данный момент соединения OpenVPN.

Как надежно определить только IPv4-адрес 192.168.1.11 (= сетевой адаптер)?Я думаю, это просто случайно на первом месте.

Спасибо, Роберт

Ответы [ 4 ]

8 голосов
/ 19 января 2012

Ответ, который вы получили, не совсем верен, поскольку все четыре адреса IPv4 в вашем примере принадлежат сетевому адаптеру, даже если они могут быть только виртуальными.

Чтобы получить больше информации о ваших сетевых интерфейсах, вы должны проверить NetworkInterface Class или WMI. Вы можете отфильтровать по типу, чтобы удалить петлевые и туннельные интерфейсы, например.

Какой сетевой адаптер на самом деле используется, насколько я знаю, зависит от адреса назначения пакета, который вы хотите отправить. Сетевые адаптеры используют протокол разрешения адресов, чтобы проверить, могут ли они достичь IP-адрес назначения и MAC-адрес шлюза.

такой короткий ответ; Сетевой адаптер по умолчанию отсутствует.

2 голосов
/ 10 июня 2014

Это код, который я использовал:

private string getLocalIP()
{
    string Localip = "?";
    foreach (NetworkInterface netInterface in NetworkInterface.GetAllNetworkInterfaces())
    {

        var defaultGateway =  from nics in NetworkInterface.GetAllNetworkInterfaces()


from props in nics.GetIPProperties().GatewayAddresses
   where nics.OperationalStatus == OperationalStatus.Up
   select props.Address.ToString(); // this sets the default gateway in a variable

        GatewayIPAddressInformationCollection prop = netInterface.GetIPProperties().GatewayAddresses;

        if(defaultGateway.First() != null){

        IPInterfaceProperties ipProps = netInterface.GetIPProperties();

        foreach (UnicastIPAddressInformation addr in ipProps.UnicastAddresses)
        {

            if (addr.Address.ToString().Contains(defaultGateway.First().Remove(defaultGateway.First().LastIndexOf(".")))) // The IP address of the computer is always a bit equal to the default gateway except for the last group of numbers. This splits it and checks if the ip without the last group matches the default gateway
            {

                if (Localip == "?") // check if the string has been changed before
                {
                    Localip = addr.Address.ToString(); // put the ip address in a string that you can use.
                }
            }

        }

        }

    }
   return Localip;
}
0 голосов
/ 19 марта 2014

Как @Nappy упоминает, использование NetworkInterface - более хороший подход.Быстрый образец ниже.

    private IEnumerable<IPAddress> GetIpsForNetworkAdapters()
    {

        var nics = from i in NetworkInterface.GetAllNetworkInterfaces()
                    where i.OperationalStatus == OperationalStatus.Up
                    select new { name = i.Name, ip = GetIpFromUnicastAddresses(i) };

        return nics.Select(x => x.ip);
    }

    private IPAddress GetIpFromUnicastAddresses(NetworkInterface i)
    {
        return (from ip in i.GetIPProperties().UnicastAddresses
                where ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork
                select ip.Address).SingleOrDefault();
    }
0 голосов
/ 19 января 2012

Попробуйте это

System.Net.Dns.GetHostByName(Environment.MachineName).AddressList[0].ToString();
...