Как программно получить IP-адрес локальной сети компьютера? - PullRequest
25 голосов
/ 30 сентября 2008

Мне нужно получить фактический IP-адрес локальной сети компьютера (например, 192.168.0.220) из моей программы с использованием C # и .NET 3.5. Я не могу просто использовать 127.0.0.1 в этом случае.

Какой лучший способ сделать это?

Ответы [ 5 ]

36 голосов
/ 30 сентября 2008

Если вы ищете информацию, которую может предоставить утилита командной строки ipconfig, вам, вероятно, следует использовать пространство имен System.Net.NetworkInformation.

Этот пример кода перечислит все сетевые интерфейсы и выведет адреса, известные для каждого адаптера.

using System;
using System.Net;
using System.Net.NetworkInformation;

class Program
{
    static void Main(string[] args)
    {
        foreach ( NetworkInterface netif in NetworkInterface.GetAllNetworkInterfaces() )
        {
            Console.WriteLine("Network Interface: {0}", netif.Name);
            IPInterfaceProperties properties = netif.GetIPProperties();
            foreach ( IPAddress dns in properties.DnsAddresses )
                Console.WriteLine("\tDNS: {0}", dns);
            foreach ( IPAddressInformation anycast in properties.AnycastAddresses )
                Console.WriteLine("\tAnyCast: {0}", anycast.Address);
            foreach ( IPAddressInformation multicast in properties.MulticastAddresses )
                Console.WriteLine("\tMultiCast: {0}", multicast.Address);
            foreach ( IPAddressInformation unicast in properties.UnicastAddresses )
                Console.WriteLine("\tUniCast: {0}", unicast.Address);
        }
    }
}

Вы, вероятно, больше всего заинтересованы в адресах Unicast.

25 голосов
/ 30 сентября 2008

Для использования DNS необходимо, чтобы ваш компьютер был зарегистрирован на локальном DNS-сервере, что не всегда верно, если вы находитесь в интрасети, и еще менее вероятно, если вы дома с провайдером. Это также требует сетевого обхода - все, чтобы узнать информацию о вашем собственном компьютере.

Правильный путь:

NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
foreach(NetworkInterface  adapter in  nics)
{
    foreach(var x in adapter.GetIPProperties().UnicastAddresses)
    {
        if (x.Address.AddressFamily == AddressFamily.InterNetwork  && x.IsDnsEligible)
        {
                    Console.WriteLine(" IPAddress ........ : {0:x}", x.Address.ToString());
        }
    }
}

(ОБНОВЛЕНИЕ 31-Jul-2015: Исправлены некоторые проблемы с кодом)

Или для тех, кто любит просто линейку Linq:

NetworkInterface.GetAllNetworkInterfaces()
    .SelectMany(adapter=> adapter.GetIPProperties().UnicastAddresses)
    .Where(adr=>adr.Address.AddressFamily == AddressFamily.InterNetwork  && adr.IsDnsEligible)
    .Select (adr => adr.Address.ToString());
24 голосов
/ 30 сентября 2008

Ссылка Там написано, добавьте System.net и используйте следующее

    //To get the local IP address 
string sHostName = Dns.GetHostName (); 
IPHostEntry ipE = Dns.GetHostByName (sHostName); 
IPAddress [] IpA = ipE.AddressList; 
for (int i = 0; i < IpA.Length; i++) 
{ 
    Console.WriteLine ("IP Address {0}: {1} ", i, IpA[i].ToString ()); 
}
11 голосов
/ 30 сентября 2008

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

Осмотрев сокетное соединение, вы сможете учесть странные таблицы маршрутизации, множественные ip-адреса и причудливые имена хостов. Трюк с указанным выше именем хоста может сработать, но я не считаю его полностью надежным.

1 голос
/ 17 октября 2013

Если вы знаете, что для вашего компьютера есть один или несколько IPv4-адресов, это обеспечит один из них:

Dns.GetHostAddresses(Dns.GetHostName())
    .First(a => a.AddressFamily == AddressFamily.InterNetwork).ToString()

GetHostAddresses обычно блокирует вызывающий поток, когда он запрашивает DNS-сервер, и выдает SocketException в случае сбоя запроса. Я не знаю, пропускает ли он сетевой вызов при поиске собственного имени хоста.

...