Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Ответ 2

Использование С#, с 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

Ответ 3

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();
}

Сделайте этот небольшой трюк с Проверить IP-DNS

Используйте HTTPGet класс i, найденный на Goldb-Httpget С#

Ответ 4

С .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;
    }

Ответ 5

string pubIp =  new System.Net.WebClient().DownloadString("https://api.ipify.org");

Ответ 6

Используя отличный аналогичный сервис

private string GetPublicIpAddress()
{
    var request = (HttpWebRequest)WebRequest.Create("http://ifconfig.me");

    request.UserAgent = "curl"; // this will tell the server to return the information as if the request was made by the linux "curl" 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", "");
}

Ответ 7

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

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

http://checkip.dyndns.org/

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

Ответ 8

Расширяя этот ответ @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. Вот несколько таких услуг *:

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

Ответ 9

Я обнаружил, что http://checkip.dyndns.org/ давал мне 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());

Ответ 10

С помощью нескольких строк кода вы можете написать свой собственный 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");

Ответ 11

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

сначала вы должны добавить NATUPNPLib.dll в ссылку И выберите его из ссылок и проверьте из окна свойств. Вставьте 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;
            }
        }
    }
}

Ответ 12

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

И использовать это.

Ответ 13

Я использую 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;
}

Ответ 14

public static string GetPublicIP()
{
    return new System.Net.WebClient().DownloadString("https://ipinfo.io/ip").Replace("\n","");
}

Ответ 15

В основном я предпочитаю использовать некоторые дополнительные резервные копии в случае, если один из 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);
            });

 }

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

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

Ответ 16

Когда я отлаживаю, я использую следующий код для создания URL, вызываемого извне, но вы можете просто использовать первые 2 строки, чтобы получить свой общедоступный 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
}

Ответ 17

Я изменил ответ @Academy of Programmer на более короткий код и изменил его так, чтобы он совпадал только с https:// URLs:

    public static string GetExternalIPAddress()
    {
        string result = string.Empty;

        string[] checkIPUrl =
        {
            "https://ipinfo.io/ip",
            "https://checkip.amazonaws.com/",
            "https://api.ipify.org",
            "https://icanhazip.com",
            "https://wtfismyip.com/text"
        };

        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)";

            foreach (var url in checkIPUrl)
            {
                try
                {
                    result = client.DownloadString(url);
                }
                catch
                {
                }

                if (!string.IsNullOrEmpty(result))
                    break;
            }
        }

        return result.Replace("\n", "").Trim();
    }
}

Ответ 18

Ответы, основанные на использовании внешних веб-сервисов, не совсем верны, потому что они на самом деле не отвечают на поставленный вопрос:

... информация о нахождении моего роутера публичного IP


объяснение

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

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

Вот как проверить, есть ли у маршрутизатора внешний IP:

trace route to web server behind ISP

Согласно статье в Википедии, IP-адреса диапазонов 10.0.0.0 – 10.255.255.255, 172.16.0.0 – 172.31.255.255 и 192.168.0.0 – 192.168.255.255 используются для частных, то есть локальных сетей.

Посмотрите, что происходит, когда вы отслеживаете маршрут к некоторому удаленному хосту с маршрутизатором, которому назначен внешний IP-адрес:

trace route to web server with external IP address

Попался! Первый прыжок начинается с 31.*. Это явно означает, что между вашим роутером и интернетом ничего нет.


Решение

  1. Сделайте Ping по какому-либо адресу с Ttl = 2
  2. Оцените, откуда приходит ответ.

TTL = 2 должно быть недостаточно для достижения удаленного хоста. Хост № 1 отправит сообщение "Reply from <ip address>: TTL expired in transit." раскрывая свой IP-адрес.

Реализация

try
{
    using (var ping = new Ping())
    {
        var pingResult = ping.Send("google.com");
        if (pingResult?.Status == IPStatus.Success)
        {
            pingResult = ping.Send(pingResult.Address, 3000, "ping".ToAsciiBytes(), new PingOptions { Ttl = 2 });

            var isRealIp = !Helpers.IsLocalIp(pingResult?.Address);

            Console.WriteLine(pingResult?.Address == null
                ? $"Has {(isRealIp ? string.Empty : "no ")}real IP, status: {pingResult?.Status}"
                : $"Has {(isRealIp ? string.Empty : "no ")}real IP, response from: {pingResult.Address}, status: {pingResult.Status}");

            Console.WriteLine($"ISP assigned REAL EXTERNAL IP to your router, response from: {pingResult?.Address}, status: {pingResult?.Status}");
        }
        else
        {
            Console.WriteLine($"Your router appears to be behind ISP networks, response from: {pingResult?.Address}, status: {pingResult?.Status}");
        }
    }
}
catch (Exception exc)
{
    Console.WriteLine("Failed to resolve external ip address by ping");
}

Маленький помощник используется для проверки, принадлежит ли IP частной или общедоступной сети:

public static bool IsLocalIp(IPAddress ip) {
    var ipParts = ip.ToString().Split(new [] { "." }, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();

    return (ipParts[0] == 192 && ipParts[1] == 168) 
        || (ipParts[0] == 172 && ipParts[1] >= 16 && ipParts[1] <= 31) 
        ||  ipParts[0] == 10;
}

Ответ 19

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

Чтобы получить удаленный 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;
}

Ответ 20

Большинство ответов упомянули 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, нажав не доступный порт. например: http://checkip.amazonaws.com:81/

Ответ 21

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

Ответ 22

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;
} 

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

Ответ 23

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"; }
}

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

Ответ 24

Вы можете использовать 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;
}

Ответ 25

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

public IPAddress GetExternalIP()
{
    WebClient lol = new WebClient();
    string str = lol.DownloadString("http://www.ip-adress.com/");
    string pattern = "<h2>My IP address is: (.+)</h2>"
    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);
}