Получить локальный IP-адрес - PullRequest
245 голосов
/ 24 июля 2011

В интернете есть несколько мест, которые показывают вам, как получить IP-адрес. И многие из них выглядят так:

String strHostName = string.Empty;
// Getting Ip address of local machine...
// First get the host name of local machine.
strHostName = Dns.GetHostName();
Console.WriteLine("Local Machine's Host Name: " + strHostName);
// Then using host name, get the IP address list..
IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);
IPAddress[] addr = ipEntry.AddressList;

for (int i = 0; i < addr.Length; i++)
{
    Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString());
}
Console.ReadLine();

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

Если я не подключен к сети и подключен к Интернету напрямую через модем без маршрутизатора, то я хотел бы получить ошибку. Как я могу узнать, подключен ли мой компьютер к сети с C #, и если это так, то получить IP-адрес локальной сети.

Ответы [ 20 ]

3 голосов
/ 28 мая 2017

Другой способ получить IP с помощью выражения linq:

public static List<string> GetAllLocalIPv4(NetworkInterfaceType type)
{
    return NetworkInterface.GetAllNetworkInterfaces()
                   .Where(x => x.NetworkInterfaceType == type && x.OperationalStatus == OperationalStatus.Up)
                   .SelectMany(x => x.GetIPProperties().UnicastAddresses)
                   .Where(x => x.Address.AddressFamily == AddressFamily.InterNetwork)
                   .Select(x => x.Address.ToString())
                   .ToList();
}
2 голосов
/ 17 мая 2016

Предварительные условия: необходимо добавить ссылку System.Data.Linq и сослаться на нее

using System.Linq;
string ipAddress ="";
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
ipAddress = Convert.ToString(ipHostInfo.AddressList.FirstOrDefault(address => address.AddressFamily == AddressFamily.InterNetwork));
1 голос
/ 01 июля 2015

Имейте в виду, что в общем случае у вас может быть несколько трансляций NAT и несколько серверов DNS, каждый из которых работает на разных уровнях трансляции NAT.

Что если у вас есть операторский класс NAT и вы хотите общаться с другими клиентами того же оператора? В общем случае вы точно не знаете, потому что вы можете появляться с разными именами хостов при каждом преобразовании NAT.

1 голос
/ 05 июня 2018

Я тоже боролся с получением правильного IP.

Я испробовал множество решений здесь, но ни одно из них не дало мне желаемого эффекта. Почти все предоставленные условные тесты не привели к использованию адреса.

Это то, что сработало для меня, надеюсь, это поможет ...

var firstAddress = (from address in NetworkInterface.GetAllNetworkInterfaces().Select(x => x.GetIPProperties()).SelectMany(x => x.UnicastAddresses).Select(x => x.Address)
                    where !IPAddress.IsLoopback(address) && address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork
                    select address).FirstOrDefault();

Console.WriteLine(firstAddress);
1 голос
/ 26 февраля 2018

Обновив ответ Mrchief с помощью Linq, мы получим:

public static IPAddress GetLocalIPAddress()
{
   var host = Dns.GetHostEntry(Dns.GetHostName());
   var ipAddress= host.AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);
   return ipAddress;
}
1 голос
/ 23 декабря 2017

Устаревшие ушли, это работает для меня

public static IPAddress GetIPAddress()
{ 
 IPAddress ip = Dns.GetHostAddresses(Dns.GetHostName()).Where(address => 
 address.AddressFamily == AddressFamily.InterNetwork).First();
 return ip;
}
1 голос
/ 21 сентября 2015

Просто моя обновленная версия с использованием LINQ:

/// <summary>
/// Gets the local Ipv4.
/// </summary>
/// <returns>The local Ipv4.</returns>
/// <param name="networkInterfaceType">Network interface type.</param>
IPAddress GetLocalIPv4(NetworkInterfaceType networkInterfaceType)
{
    var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces().Where(i => i.NetworkInterfaceType == networkInterfaceType && i.OperationalStatus == OperationalStatus.Up);

    foreach (var networkInterface in networkInterfaces)
    {
        var adapterProperties = networkInterface.GetIPProperties();

        if (adapterProperties.GatewayAddresses.FirstOrDefault() == null)
                continue;
        foreach (var ip in networkInterface.GetIPProperties().UnicastAddresses)
        {
            if (ip.Address.AddressFamily != AddressFamily.InterNetwork)
                    continue;

            return ip.Address;
        }
    }

    return null;
}
1 голос
/ 23 июня 2014
string str="";

System.Net.Dns.GetHostName();

IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(str);

IPAddress[] addr = ipEntry.AddressList;

string IP="Your Ip Address Is :->"+ addr[addr.Length - 1].ToString();
0 голосов
/ 19 февраля 2014
Dns.GetHostEntry(Dns.GetHostName()).AddressList[1]

одна строка кода: D

0 голосов
/ 14 ноября 2014

Если у вас есть виртуальные машины или дополнительные сетевые карты, в списке адресов могут быть другие значения.Мое предложение состоит в том, чтобы проверить записи списка адресов и распечатать, что подходит.В моем случае запись 3 была IPv4-адресом моей машины

IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName());
IPAddress ipAddr = ipHost.AddressList[3];
string ip = ipAddr.ToString();

Не забудьте добавить using System.Net;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...