В интернете есть несколько мест, которые показывают вам, как получить 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-адрес локальной сети?
c#
networking
Тоно Нам
источник
источник
If I am not connected to a network and I am connected to the internet
Это утверждение кажется противоречивым. Вы пытаетесь выяснить, подключен ли ваш компьютер к частной локальной сети или Интернету?Ответы:
Чтобы получить локальный IP-адрес:
Чтобы проверить, подключены вы или нет:
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
источник
Существует более точный способ, когда на локальном компьютере доступны несколько IP-адресов.
Connect
UDP-сокет и считайте его локальную конечную точку:Connect
на UDP-сокете имеет следующий эффект: он устанавливает пункт назначения дляSend
/Recv
, отбрасывает все пакеты с других адресов и - что мы и используем - переводит сокет в «подключенное» состояние, устанавливает соответствующие поля. Это включает в себя проверку наличия маршрута к пункту назначения в соответствии с таблицей маршрутизации системы и соответствующей настройкой локальной конечной точки. Последняя часть, кажется, официально не документирована, но выглядит как неотъемлемая черта API сокетов Беркли (побочный эффект состояния UDP «подключен»), который надежно работает как в Windows, так и в Linux в разных версиях и дистрибутивах.Таким образом, этот метод даст локальный адрес, который будет использоваться для подключения к указанному удаленному хосту. Реальное соединение не установлено, поэтому указанный удаленный IP-адрес может быть недоступен.
источник
Рефакторинг кода Mrcheif для использования Linq (т.е. .Net 3.0+). ,
:)
источник
Я знаю, что это может ударить мертвую лошадь, но, возможно, это может кому-то помочь. Я искал повсюду способ найти свой локальный IP-адрес, но везде, где я нахожу, написано:
Мне это совсем не нравится, потому что он просто получает все адреса, назначенные вашему компьютеру. Если у вас есть несколько сетевых интерфейсов (что почти все компьютеры делают в настоящее время), вы не знаете, какой адрес соответствует какому сетевому интерфейсу. Проведя кучу исследований, я создал функцию для использования класса NetworkInterface и извлечения из него информации. Таким образом, я могу сказать, какой это тип интерфейса (Ethernet, беспроводной, шлейфовый, туннельный и т. Д.), Активен он или нет, и SOOO гораздо больше.
Теперь, чтобы получить IPv4-адрес вашего сетевого интерфейса вызова:
Или ваш беспроводной интерфейс:
Если вы попытаетесь получить IPv4-адрес для беспроводного интерфейса, но на вашем компьютере не установлена беспроводная карта, он просто вернет пустую строку. То же самое с интерфейсом Ethernet.
Надеюсь, это поможет кому-то! :-)
РЕДАКТИРОВАТЬ:
Было отмечено (спасибо @NasBanov), что даже несмотря на то, что эта функция позволяет извлекать IP-адрес гораздо лучше, чем
Dns.GetHostEntry(Dns.GetHostName())
его использование, она не очень хорошо справляется с поддержкой нескольких интерфейсов одного типа или нескольких IP-адресов на одном интерфейсе. , Он вернет только один IP-адрес, когда может быть назначено несколько адресов. Чтобы вернуть ВСЕ из этих назначенных адресов, вы можете просто манипулировать исходной функцией, чтобы всегда возвращать массив вместо одной строки. Например:Теперь эта функция будет возвращать ВСЕ назначенные адреса для определенного типа интерфейса. Теперь, чтобы получить только одну строку, вы можете использовать
.FirstOrDefault()
расширение, чтобы вернуть первый элемент в массиве, или, если оно пустое, вернуть пустую строку.источник
item.OperationalStatus
всегда возвращаетсяUnknown
.Вот модифицированная версия (от Compman2408), которая работала для меня:
Вы можете вызвать этот метод, например, как:
Изменение: я получаю IP-адрес от адаптера, которому назначен IP-адрес шлюза. Второе изменение: я добавил строки документации и оператор break, чтобы сделать этот метод более эффективным.
источник
break
в самом внутреннемif
илиreturn
в подвале.Это лучший код, который я нашел для получения текущего IP-адреса, избегая получения хоста VMWare или другого неверного IP-адреса.
источник
Я думаю, что использовать LinQ проще:
источник
Для смеха подумал, что я попытаюсь получить один оператор LINQ, используя новый условный оператор C # 6. Выглядит довольно сумасшедшим и, вероятно, ужасно неэффективно, но это работает.
Логика предоставлена
Gerardo H
(и по ссылкеcompman2408
).источник
Другой способ получить IP используя выражение linq:
источник
@mrcheif Я нашел этот ответ сегодня, и он был очень полезен, хотя он возвращал неправильный IP-адрес (не из-за неработающего кода), но он выдал неправильный IP-адрес межсетевого взаимодействия, когда у вас работают такие вещи, как Himachi.
источник
192.0.0.0/8
не правильный тест для частного IP-адреса (есть 3 диапазона, все отличные от этого), это вполне может быть диапазон корпоративной сети, поэтому не такой уж «локальный».Протестировано с одной или несколькими сетевыми картами и виртуальными машинами
источник
Просто моя обновленная версия с использованием LINQ:
источник
Предварительные условия: необходимо добавить ссылку на System.Data.Linq и сослаться на нее
источник
Я также боролся с получением правильного IP.
Я попробовал различные решения здесь, но ни одно из них не дало мне желаемого эффекта. Почти все предоставленные условные тесты не привели к использованию адреса.
Это то, что сработало для меня, надеюсь, это поможет ...
источник
источник
Имейте в виду, что в общем случае у вас может быть несколько трансляций NAT и несколько серверов DNS, каждый из которых работает на разных уровнях трансляции NAT.
Что если у вас есть операторский класс NAT и вы хотите общаться с другими клиентами того же оператора? В общем случае вы точно не знаете, потому что вы можете появляться с разными именами хостов при каждом преобразовании NAT.
источник
Устаревший ушел, это работает для меня
источник
Обновив ответ Mrchief с помощью Linq, мы получим:
источник
Это возвращает адреса от любых интерфейсов, которые имеют адреса шлюза и адреса одноадресной рассылки в двух отдельных списках, IPV4 и IPV6.
источник
Ответов уже много, но я все еще добавляю свой:
Один лайнер:
примечание: выполняйте поиск с последнего, потому что он все еще работал после добавления в устройство некоторых интерфейсов, таких как MobileHotspot, VPN или других модных виртуальных адаптеров.
источник
Кроме того, просто код для получения Client Ip:
Надеюсь, это поможет вам.
источник
источник
Модифицированный код compman2408 для возможности перебора каждого из них
NetworkInterfaceType
.И вы можете назвать это так:
источник
Ниже того же действия
Функция LocalIP ()
Dim Host As String = Dns.GetHostEntry (Dns.GetHostName) .AddressList (1) .MapToIPv4.ToString
txtIP.Text = Host
Верните Истину
Конечная функция
источник
одна строка кода: D
источник
Если у вас есть виртуальные машины или дополнительные сетевые карты, в списке адресов могут быть и другие значения. Мое предложение состоит в том, чтобы проверить записи списка адресов и распечатать, что подходит. В моем случае запись 3 была IPv4 адрес моей машины
Не забудьте добавить
using System.Net;
источник