Я использую сервер и хочу показать свой собственный IP-адрес.
Каков синтаксис для получения собственного (если возможно, внешнего) IP-адреса компьютера?
Кто-то написал следующий код.
IPHostEntry host;
string localIP = "?";
host = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress ip in host.AddressList)
{
if (ip.AddressFamily.ToString() == "InterNetwork")
{
localIP = ip.ToString();
}
}
return localIP;
Однако я вообще не доверяю автору и не понимаю этот код. Есть ли лучший способ сделать это?
c#
ip-address
Nefzen
источник
источник
Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(o => o.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).First().ToString()
Ответы:
Нет, это в значительной степени лучший способ сделать это. Поскольку у машины может быть несколько IP-адресов, вам нужно выполнить итерацию их коллекции, чтобы найти правильный.
Изменить: Единственное, что я хотел бы изменить, это изменить это:
к этому:
Нет нужды в
ToString
перечислении для сравнения.источник
break
заявление после того, как был найден IP, чтобы избежать излишней итерации по всей коллекции (в этом случае я сомневаюсь, что влияние на производительность когда-либо будет иметь значение, но я хотел бы подчеркнуть в целом хорошие привычки кодирования)Единственный способ узнать ваш общедоступный IP-адрес - попросить кого-то еще рассказать вам; этот код может помочь вам:
источник
Чище и все в одном решении: D
источник
Если вы не можете рассчитывать на получение своего IP-адреса от DNS-сервера (что случилось со мной), вы можете использовать следующий подход:
Пространство имен System.Net.NetworkInformation содержит класс NetworkInterface , который имеет статический метод GetAllNetworkInterfaces .
Этот метод вернет все «сетевые интерфейсы» на вашем компьютере, и их, как правило, довольно много, даже если на вашем компьютере установлено только адаптер беспроводной сети и / или адаптер Ethernet. Все эти сетевые интерфейсы имеют действительные IP-адреса для вашего локального компьютера, хотя, вероятно, вам нужен только один.
Если вы ищете один IP-адрес, вам нужно будет отфильтровать список, пока вы не сможете определить правильный адрес. Возможно, вам нужно будет поэкспериментировать, но у меня был успех при следующем подходе:
OperationalStatus == OperationalStatus.Up
. Это исключит ваш физический адаптер Ethernet, например, если у вас не подключен сетевой кабель.Для каждого NetworkInterface вы можете получить объект IPInterfaceProperties, используя метод GetIPProperties , а из объекта IPInterfaceProperties вы можете получить доступ к свойству UnicastAddresses для списка объектов UnicastIPAddressInformation .
DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred
AddressPreferredLifetime != UInt32.MaxValue
.В этот момент я беру адрес первого (если есть) одноадресного адреса, который соответствует всем этим фильтрам.
РЕДАКТИРОВАТЬ:
[пересмотренный код от 16 мая 2018 года, включающий условия, упомянутые в тексте выше, для состояния обнаружения дублированного адреса и предпочтительного времени жизни]
В приведенном ниже примере демонстрируется фильтрация на основе рабочего состояния, семейства адресов, за исключением адреса обратной связи (127.0.0.1), состояния обнаружения дублированного адреса и предпочтительного времени жизни.
источник
источник
Только что проверил это на моей машине, и это работает.
источник
Если вы хотите избежать использования DNS:
источник
Не полагайтесь на InterNetwork все время, потому что вы можете иметь более одного устройства, которое также использует IP4, что может испортить результаты при получении вашего IP. Теперь, если вы хотите, вы можете просто скопировать это и, пожалуйста, просмотрите его или обновите его так, как считаете нужным.
Сначала я получаю адрес маршрутизатора (шлюза). Если возвращается, что я подключен к шлюзу (что означает, что он не подключен напрямую к беспроводной модеме или нет), тогда у нас есть адрес нашего шлюза в качестве IP-адреса, иначе мы указываем нулевой указатель на IP-адрес. ,
Затем нам нужно получить список IP-адресов компьютера. Здесь все не так сложно, потому что маршрутизаторы (все маршрутизаторы) используют 4 байта (...). Первые три являются наиболее важными, потому что любой компьютер, подключенный к нему, будет иметь IP-адрес, соответствующий первым трем байтам. Пример: 192.168.0.1 является стандартным для IP-адреса маршрутизатора по умолчанию, если он не был изменен его администратором. «192.168.0» или что бы они ни были, это то, что нам нужно, чтобы соответствовать. И это все, что я сделал в функции IsAddressOfGateway. Причина соответствия длины заключается в том, что не все адреса (которые предназначены только для компьютера) имеют длину 4 байта. Если вы введете netstat в cmd, вы обнаружите, что это правда. Так что у вас есть это. Да, для того, чтобы действительно получить то, что вы ищете, требуется немного больше работы. Процесс устранения. И ради бога, не находите адрес, отправляя эхо-запрос, что занимает много времени, потому что сначала вы отправляете эхо-запрос на адрес, а затем необходимо отправить результат обратно. Нет, работайте напрямую с классами .Net, которые имеют отношение к вашей системной среде, и вы получите ответы, которые вы ищете, когда это касается исключительно вашего компьютера.
Теперь, если вы напрямую подключены к своему модему, процесс почти такой же, потому что модем является вашим шлюзом, но подмаски не то же самое, потому что вы получаете информацию непосредственно с вашего DNS-сервера через модем и не маскируетесь маршрутизатором, обслуживающим Интернет, хотя вы все еще можете использовать тот же код, потому что последний байт IP-адреса, назначенного модему, равен 1. Таким образом, если IP-адрес, отправленный с модема, который изменился, равен 111.111.111.1 ', то вы получите 111.111.111. (Некоторые значение байта). Имейте в виду, что нам нужно найти информацию о шлюзе, потому что есть больше устройств, которые имеют подключение к Интернету, чем ваш маршрутизатор и модем.
Теперь вы понимаете, почему вы НЕ меняете первые два байта своего маршрутизатора 192 и 168. Они строго различаются только для маршрутизаторов, а не для использования в Интернете, иначе у нас возникнет серьезная проблема с протоколом IP и двойным пингом, что приведет к сбоям в работе компьютера. Представьте, что ваш назначенный IP-адрес маршрутизатора - 192.168.44.103, и вы также щелкаете по сайту с таким IP-адресом. О, МОЙ БОГ! Ваш компьютер не будет знать, что пинговать. Сбой прямо там. Чтобы избежать этой проблемы, назначаются только маршрутизаторы, а не для использования в Интернете. Поэтому оставьте первые два байта маршрутизатора в покое.
источник
255.255.255.0
, и это будет происходить довольно сложным способом IMO.Я просто подумал, что добавлю свою собственную, однострочную (хотя уже есть много других полезных ответов).
string ipAddress = new WebClient().DownloadString("http://icanhazip.com");
источник
Для получения текущего общедоступного IP-адреса все, что вам нужно сделать, это создать страницу ASPX со следующей строкой в событии загрузки страницы:
источник
Если вы работаете в интрасети, вы сможете получить IP-адрес локального компьютера, а если нет, вы получите внешний IP-адрес с этим: Web:
Рабочий стол:
источник
Смотрите здесь для деталей.
Вы должны помнить, что ваш компьютер может иметь более одного IP-адреса (на самом деле это всегда так), поэтому какой вам нужен.
источник
Попробуй это:
источник
Может быть, по внешнему IP вы можете рассмотреть (если вы находитесь в контексте веб-сервера), используя это
Я задавал тот же вопрос, что и вы, и нашел его в этой статье stackoverflow.
Это сработало для меня.
источник
источник
источник
Простая строка кода, которая возвращает первый внутренний IPV4-адрес или ноль, если таковых нет. Добавлен в качестве комментария выше, но может быть кому-то полезен (некоторые решения выше возвращают несколько адресов, которые требуют дальнейшей фильтрации).
Также легко вернуть loopback вместо null, я думаю, с помощью:
источник
IPAddress.Loopback
? :)Чтобы найти список IP-адресов, я использовал это решение
Но мне лично нравится ниже решение, чтобы получить локальный действительный IP-адрес
источник
Решение LINQ:
источник
Вот как я это решил. я знаю, если у вас есть несколько физических интерфейсов, это может не выбрать именно то, что вы хотите.
источник
Вопрос не говорит ASP.NET MVC, но я все равно оставляю это здесь:
источник
Получить все IP-адреса в виде строк, используя LINQ:
ФИЛЬТРОВАТЬ ЧАСТНЫХ ...
Сначала определите метод расширения
IsPrivate()
:... а затем использовать его для фильтрации частных IP-адресов:
источник
Это работает для меня ... и должно быть быстрее в большинстве случаев (если не во всех), чем запросы к DNS-серверу. Благодаря ученику доктора Уайли ( здесь ).
Так же, как ссылка, это полный код класса, где я его определил:
источник
Еще один способ получить ваш публичный IP-адрес - использовать
resolve1.opendns.com
сервер OpenDNS сmyip.opendns.com
запросом.В командной строке это:
Или в C #, используя DNSClient nuget:
Это немного чище, чем попадание на конечные точки http и анализ ответов.
источник
И это для получения всех локальных IP-адресов в формате CSV в VB.NET
источник
Чтобы получить удаленный IP-адрес как можно быстрее. Вы должны использовать загрузчик или создать сервер на вашем компьютере.
Недостатки использования этого простого кода: (что рекомендуется) заключается в том, что для получения удаленного IP-адреса потребуется 3-5 секунд, поскольку при инициализации WebClient всегда требуется 3-5 секунд для проверки настроек прокси-сервера.
Вот как я это исправил .. (первый раз все еще занимает 3-5 секунд), но после этого он всегда получит ваш удаленный IP-адрес через 0-2 секунды, в зависимости от вашего соединения.
источник