Мне нужно получить фактический IP-адрес локальной сети компьютера (например, 192.168.0.220) из моей программы, используя С# и .NET 3.5. В этом случае я не могу использовать 127.0.0.1.
Какой лучший способ сделать это?
Мне нужно получить фактический IP-адрес локальной сети компьютера (например, 192.168.0.220) из моей программы, используя С# и .NET 3.5. В этом случае я не могу использовать 127.0.0.1.
Какой лучший способ сделать это?
Ссылка Там сказано, добавьте 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 ());
}
Если вы ищете информацию, которую может предоставить утилита командной строки 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);
}
}
}
Вероятно, вас больше всего интересуют UnicastAddresses.
Использование Dns требует, чтобы ваш компьютер был зарегистрирован на локальном DNS-сервере, что не обязательно верно, если вы находитесь в интрасети и даже менее вероятно, если вы дома с ISP. Для этого также необходима сетевая обратная связь - все, чтобы узнать информацию о вашем собственном компьютере.
Правильный способ:
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-июль-2015: Исправлены некоторые проблемы с кодом)
Или для тех, кому нравится только строка Linq:
NetworkInterface.GetAllNetworkInterfaces()
.SelectMany(adapter=> adapter.GetIPProperties().UnicastAddresses)
.Where(adr=>adr.Address.AddressFamily == AddressFamily.InterNetwork && adr.IsDnsEligible)
.Select (adr => adr.Address.ToString());
Поскольку у компьютера может быть несколько IP-адресов, правильный способ выяснить ваш IP-адрес, который вы собираетесь использовать для маршрутизации в общий Интернет, - это открыть сокет для хоста в Интернете, а затем проверить сокет, чтобы узнать, какой локальный адрес используется в этом соединении.
Проверяя соединение сокета, вы сможете учесть странные таблицы маршрутизации, несколько IP-адресов и удачное имя хоста. Трюк с указанным выше именем может работать, но я не считаю его полностью надежным.
Если вы знаете, что для вашего компьютера есть один или несколько адресов IPv4, это обеспечит один из них:
Dns.GetHostAddresses(Dns.GetHostName())
.First(a => a.AddressFamily == AddressFamily.InterNetwork).ToString()
GetHostAddresses
обычно блокирует вызывающий поток, когда он запрашивает DNS-сервер, и бросает SocketException
, если запрос терпит неудачу. Я не знаю, пропускает ли он сетевой вызов при поиске собственного имени хоста.
Dim pubIp As String = New System.Net.WebClient().DownloadString("https://api.ipify.org")