Получить публичный / внешний IP-адрес? - PullRequest
49 голосов
/ 15 июля 2010

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

Ответы [ 25 ]

1 голос
/ 13 сентября 2018

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

    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();
    }
}
1 голос
/ 08 июня 2015
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"; }
}

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

1 голос
/ 28 июля 2015

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

Часть Telnet

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

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

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

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

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

Например, способ заставить ваш маршрутизатор показывать IP WAN может быть следующей командой 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».)

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

Код для получения WAN IP

(Предполагается, что у вас есть метод 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;
}
0 голосов
/ 28 ноября 2014

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

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);
}
0 голосов
/ 15 июля 2010

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

...