Получить общеansible / внешний IP-адрес?

Кажется, я не могу найти или найти информацию о поиске IP-адресов моих маршрутизаторов? Это потому, что это невозможно сделать таким образом и получить его с веб-сайта?

С C # вы можете использовать библиотеки веб-клиентов для получения whatismyip

 static void Main(string[] args) { HTTPGet req = new HTTPGet(); req.Request("http://checkip.dyndns.org"); string[] a = req.ResponseBody.Split(':'); string a2 = a[1].Substring(1); string[] a3=a2.Split('<'); string a4 = a3[0]; Console.WriteLine(a4); Console.ReadLine(); } 

Сделайте этот небольшой трюк с помощью Check IP DNS

Используйте class HTTPGet я нашел на Goldb-Httpget C #

Использование C #, с webclient его короткий.

 public static void Main(string[] args) { string externalip = new WebClient().DownloadString("http://icanhazip.com"); Console.WriteLine(externalip); } 

Командная строка (работает как в Linux, так и в Windows)

 wget -qO- http://bot.whatismyipaddress.com 

ИЛИ

 curl http://ipinfo.io/ip 

С .Net WebRequest:

  public static string GetPublicIP() { string url = "http://checkip.dyndns.org"; System.Net.WebRequest req = System.Net.WebRequest.Create(url); System.Net.WebResponse resp = req.GetResponse(); System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream()); string response = sr.ReadToEnd().Trim(); string[] a = response.Split(':'); string a2 = a[1].Substring(1); string[] a3 = a2.Split('<'); string a4 = a3[0]; return a4; } 
 string pubIp = new System.Net.WebClient().DownloadString("https://api.ipify.org"); 

Похожие услуги

 private string GetPublicIpAddress() { var request = (HttpWebRequest)WebRequest.Create("http://ifconfig.me"); request.UserAgent = "curl"; // this simulate curl linux command string publicIPAddress; request.Method = "GET"; using (WebResponse response = request.GetResponse()) { using (var reader = new StreamReader(response.GetResponseStream())) { publicIPAddress = reader.ReadToEnd(); } } return publicIPAddress.Replace("\n", ""); } 

Теоретически ваш маршрутизатор должен быть в состоянии сообщить вам общеansible IP-адрес сети, но способ сделать это обязательно будет непоследовательным / непростым, даже если это возможно с некоторыми маршрутизаторными устройствами.

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

http://checkip.dyndns.org/

То, что возвращается, является чрезвычайно простым / коротким HTML-документом, содержащим текст Current IP Address: 157.221.82.39 (поддельный IP), который тривиально извлекать из ответа HTTP.

Быстрый способ получить внешний ip без какого-либо подключения. Actualy не требует никакого подключения Http для этого.

сначала вы должны добавить NATUPNPLib.dll в ссылку и выбрать его из ссылок и проверить из windows свойств. Вставить Interop Type в False

 using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using NATUPNPLib; // Add this dll from referance and chande Embed Interop Interop to false from properties panel on visual studio using System.Net; namespace Client { class NATTRAVERSAL { //This is code for get external ip private void NAT_TRAVERSAL_ACT() { UPnPNATClass uPnP = new UPnPNATClass(); IStaticPortMappingCollection map = uPnP.StaticPortMappingCollection; foreach (IStaticPortMapping item in map) { Debug.Print(item.ExternalIPAddress); //This line will give you external ip as string break; } } } } 

Расширяя этот ответ @ suneel ranga :

 static System.Net.IPAddress GetPublicIp(string serviceUrl = "https://ipinfo.io/ip") { return System.Net.IPAddress.Parse(new System.Net.WebClient().DownloadString(serviceUrl)); } 

Где вы будете использовать службу с System.Net.WebClient которая просто показывает IP-адрес в виде строки и использует объект System.Net.IPAddress . Вот несколько таких услуг *:

* Некоторые услуги были упомянуты в этом вопросе и из этих ответов с сайта суперпользователя .

С помощью нескольких строк кода вы можете написать свой собственный Http-сервер для этого.

 HttpListener listener = new HttpListener(); listener.Prefixes.Add("http://+/PublicIP/"); listener.Start(); while (true) { HttpListenerContext context = listener.GetContext(); string clientIP = context.Request.RemoteEndPoint.Address.ToString(); using (Stream response = context.Response.OutputStream) using (StreamWriter writer = new StreamWriter(response)) writer.Write(clientIP); context.Response.Close(); } 

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

 WebClient client = new WebClient(); string ip = client.DownloadString("http://serverIp/PublicIP"); 

checkip.dyndns.org не всегда работает правильно. Например, для моей машины он показывает внутренний адрес после NAT:

 Current IP Address: 192.168.1.120 

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

Кроме того, http – это тяжелый и ориентированный на текст протокол TCP, поэтому он не очень подходит для быстрого и эффективного регулярного запроса на внешний IP-адрес. Я предлагаю использовать бинарный STUN на основе UDP, специально предназначенный для этих целей:

http://en.wikipedia.org/wiki/STUN

STUN-сервер похож на «UDP-зеркало». Вы смотрите на него и смотрите «как я выгляжу».

Существует много публичных STUN-серверов по всему миру, где вы можете запросить внешний IP-адрес. Например, см. Здесь:

http://www.voip-info.org/wiki/view/STUN

Вы можете загрузить любую STUN-клиентскую библиотеку из Интернета, например, здесь:

http://www.codeproject.com/Articles/18492/STUN-Client

И используйте его.

Я использую HttpClient из System.Net.Http :

 public static string PublicIPAddress() { string uri = "http://checkip.dyndns.org/"; string ip = String.Empty; using (var client = new HttpClient()) { var result = client.GetAsync(uri).Result.Content.ReadAsStringAsync().Result; ip = result.Split(':')[1].Split('<')[0]; } return ip; } 
 public static string GetPublicIP() { return new System.Net.WebClient().DownloadString("https://ipinfo.io/ip").Replace("\n",""); } 

Когда я отлаживаю, я использую следующий код для создания URL, вызываемого извне, но вы можете просто использовать первые 2 строки, чтобы получить свой общеansible IP-адрес:

 public static string ExternalAction(this UrlHelper helper, string actionName, string controllerName = null, RouteValueDictionary routeValues = null, string protocol = null) { #if DEBUG var client = new HttpClient(); var ipAddress = client.GetStringAsync("http://ipecho.net/plain").Result; // above 2 lines should do it.. var route = UrlHelper.GenerateUrl(null, actionName, controllerName, routeValues, helper.RouteCollection, helper.RequestContext, true); if (route == null) { return route; } if (string.IsNullOrEmpty(protocol) && string.IsNullOrEmpty(ipAddress)) { return route; } var url = HttpContext.Current.Request.Url; protocol = !string.IsNullOrWhiteSpace(protocol) ? protocol : Uri.UriSchemeHttp; return string.Concat(protocol, Uri.SchemeDelimiter, ipAddress, route); #else helper.Action(action, null, null, HttpContext.Current.Request.Url.Scheme) #endif } 

Я обнаружил, что http://checkip.dyndns.org/ давал мне tags html, которые мне приходилось обрабатывать, но https://icanhazip.com/ просто давал мне простую строку. К сожалению, https://icanhazip.com/ дает мне адрес ip6, и мне нужен ip4. К счастью, есть 2 поддомена, которые вы можете выбрать, ipv4.icanhazip.com и ipv6.icanhazip.com.

  string externalip = new WebClient().DownloadString("https://ipv4.icanhazip.com/"); Console.WriteLine(externalip); Console.WriteLine(externalip.TrimEnd()); 

Лучший ответ, который я нашел

Чтобы получить удаленный IP-адрес, вы можете как можно быстрее. Вы должны использовать загрузчик или создать сервер на своем компьютере.

Недостатки использования этого простого кода: (что рекомендуется) заключается в том, что для получения удаленного IP-адреса потребуется 3-5 секунд, потому что WebClient при инициализации всегда занимает 3-5 секунд, чтобы проверить настройки прокси-сервера.

  public static string GetIP() { string externalIP = ""; externalIP = new WebClient().DownloadString("http://checkip.dyndns.org/"); externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")) .Matches(externalIP)[0].ToString(); return externalIP; } 

Вот как я его исправил .. (первый раз по-прежнему занимает 3-5 секунд), но после этого он всегда будет получать ваш удаленный IP-адрес за 0-2 секунды в зависимости от вашего подключения.

 public static WebClient webclient = new WebClient(); public static string GetIP() { string externalIP = ""; externalIP = webclient.DownloadString("http://checkip.dyndns.org/"); externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")) .Matches(externalIP)[0].ToString(); return externalIP; } 

Большинство ответов упомянули http://checkip.dyndns.org в решении. Для нас это не получилось. Мы очень долго сталкивались с Timemouts. Его действительно беспокоит, зависит ли ваша программа от обнаружения IP.

В качестве решения мы используем следующий метод в одном из наших настольных приложений:

  // Returns external/public ip protected string GetExternalIP() { try { using (MyWebClient client = new MyWebClient()) { client.Headers["User-Agent"] = "Mozilla/4.0 (Compatible; Windows NT 5.1; MSIE 6.0) " + "(compatible; MSIE 6.0; Windows NT 5.1; " + ".NET CLR 1.1.4322; .NET CLR 2.0.50727)"; try { byte[] arr = client.DownloadData("http://checkip.amazonaws.com/"); string response = System.Text.Encoding.UTF8.GetString(arr); return response.Trim(); } catch (WebException ex) { // Reproduce timeout: http://checkip.amazonaws.com:81/ // trying with another site try { byte[] arr = client.DownloadData("http://icanhazip.com/"); string response = System.Text.Encoding.UTF8.GetString(arr); return response.Trim(); } catch (WebException exc) { return "Undefined"; } } } } catch (Exception ex) { // TODO: Log trace return "Undefined"; } } 

Хорошая часть, оба сайта возвращают IP в обычном формате. Таким образом, операции со строками исключаются.

Чтобы проверить свою логику в разделе catch , вы можете воспроизвести Timeout, нажав не ansible порт. например: http://checkip.amazonaws.com:81/

В основном я предпочитаю использовать некоторые дополнительные резервные копии в случае, если один из IP недоступен. Поэтому я использую этот метод.

  public static string GetExternalIPAddress() { string result = string.Empty; try { using (var client = new WebClient()) { client.Headers["User-Agent"] = "Mozilla/4.0 (Compatible; Windows NT 5.1; MSIE 6.0) " + "(compatible; MSIE 6.0; Windows NT 5.1; " + ".NET CLR 1.1.4322; .NET CLR 2.0.50727)"; try { byte[] arr = client.DownloadData("http://checkip.amazonaws.com/"); string response = System.Text.Encoding.UTF8.GetString(arr); result = response.Trim(); } catch (WebException) { } } } catch { } if (string.IsNullOrEmpty(result)) { try { result = new WebClient().DownloadString("https://ipinfo.io/ip").Replace("\n", ""); } catch { } } if (string.IsNullOrEmpty(result)) { try { result = new WebClient().DownloadString("https://api.ipify.org").Replace("\n", ""); } catch { } } if (string.IsNullOrEmpty(result)) { try { result = new WebClient().DownloadString("https://icanhazip.com").Replace("\n", ""); } catch { } } if (string.IsNullOrEmpty(result)) { try { result = new WebClient().DownloadString("https://wtfismyip.com/text").Replace("\n", ""); } catch { } } if (string.IsNullOrEmpty(result)) { try { result = new WebClient().DownloadString("http://bot.whatismyipaddress.com/").Replace("\n", ""); } catch { } } if (string.IsNullOrEmpty(result)) { try { string url = "http://checkip.dyndns.org"; System.Net.WebRequest req = System.Net.WebRequest.Create(url); System.Net.WebResponse resp = req.GetResponse(); System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream()); string response = sr.ReadToEnd().Trim(); string[] a = response.Split(':'); string a2 = a[1].Substring(1); string[] a3 = a2.Split('<'); result = a3[0]; } catch (Exception) { } } return result; } 

Чтобы обновить GUI-элемент управления (WPF, .NET 4.5), например, некоторые ярлыки я использую этот код

  void GetPublicIPAddress() { Task.Factory.StartNew(() => { var ipAddress = SystemHelper.GetExternalIPAddress(); Action bindData = () => { if (!string.IsNullOrEmpty(ipAddress)) labelMainContent.Content = "IP External: " + ipAddress; else labelMainContent.Content = "IP External: "; labelMainContent.Visibility = Visibility.Visible; }; this.Dispatcher.InvokeAsync(bindData); }); } 

Надеюсь, это полезно.

Вот пример приложения, которое будет включать этот код.

 public string GetClientIp() { var ipAddress = string.Empty; if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null) { ipAddress = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); } else if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_CLIENT_IP"] != null && System.Web.HttpContext.Current.Request.ServerVariables["HTTP_CLIENT_IP"].Length != 0) { ipAddress = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_CLIENT_IP"]; } else if (System.Web.HttpContext.Current.Request.UserHostAddress.Length != 0) { ipAddress = System.Web.HttpContext.Current.Request.UserHostName; } return ipAddress; } 

отлично работает

 using System.Net; private string GetWorldIP() { String url = "http://bot.whatismyipaddress.com/"; String result = null; try { WebClient client = new WebClient(); result = client.DownloadString(url); return result; } catch (Exception ex) { return "127.0.0.1"; } } 

Используемый шлейф как запасной, так что вещи не смертельно ломаются.

Вы можете использовать Telnet для программного запроса вашего маршрутизатора для WAN IP.

Часть Telnet

Часть Telnet может быть выполнена с использованием, например, этого минималистичного кода Telnet в качестве API для отправки команды Telnet вашему маршрутизатору и получения ответа маршрутизатора. Остальная часть этого ответа предполагает, что вы настроены так или иначе, чтобы отправить команду Telnet и вернуть ответ в свой код.

Ограничения подхода

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

Пример команды маршрутизатора и ответа

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

Например, способ получить ваш маршрутизатор для отображения WAN IP может быть следующей командой Telnet:

 connection list 

Вывод может состоять из списка строк текста, по одному на соединение, с IP-адресом со смещением 39. Линия для соединения WAN может быть идентифицирована из слова «Интернет» где-то в строке:

  RESP: 3947 17.110.226. 13:443 146.200.253. 16:60642 [R..A] Internet 6 tcp 128 <------------------ 39 -------------><-- WAN IP --> 

Выходной сигнал может помещать каждый сегмент IP-адреса на три символа с пробелами, которые вам нужно удалить. (То есть, в приведенном выше примере вам нужно включить «146.200.253. 16» в «146.200.253.16».)

По экспериментальной или консультационной справочной документации для вашего маршрутизатора вы можете установить команду для использования для вашего конкретного маршрутизатора и как интерпретировать ответ маршрутизатора.

Код для получения IP-адреса WAN

(Предполагается, что у вас есть метод sendRouterCommand для части Telnet – см. Выше. )

Используя описанный выше пример маршрутизатора, следующий код получает IP-адрес WAN:

 private bool getWanIp(ref string wanIP) { string routerResponse = sendRouterCommand("connection list"); return (getWanIpFromRouterResponse(routerResponse, out wanIP)); } private bool getWanIpFromRouterResponse(string routerResponse, out string ipResult) { ipResult = null; string[] responseLines = routerResponse.Split(new char[] { '\n' }); // RESP: 3947 17.110.226. 13:443 146.200.253. 16:60642 [R..A] Internet 6 tcp 128 //<------------------ 39 -------------><--- 15 ---> const int offset = 39, length = 15; foreach (string line in responseLines) { if (line.Length > (offset + length) && line.Contains("Internet")) { ipResult = line.Substring(39, 15).Replace(" ", ""); return true; } } return false; } 

API IPIFY хорош, так как он может отвечать в сыром тексте и JSON. Он также может выполнять обратные вызовы и т. Д. Единственная проблема заключается в том, что он отвечает на IPv4, а не на 6.

Или это, он работает достаточно хорошо, я думаю, что мне нужно. Это отсюда .

 public IPAddress GetExternalIP() { WebClient lol = new WebClient(); string str = lol.DownloadString("http://www.ip-adress.com/"); string pattern = "

My IP address is: (.+)

" MatchCollection matches1 = Regex.Matches(str, pattern); string ip = matches1(0).ToString; ip = ip.Remove(0, 21); ip = ip.Replace(" ", ""); ip = ip.Replace(" ", ""); return IPAddress.Parse(ip); }
Давайте будем гением компьютера.