Как добраться *Интернет* IP?

Потому что он обрабатывает 1 и 3 как целые числа, поэтому округляет результат до 0, так что это целое число.

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

double g = 1.0/3.0;
15
задан Lukas Šalkauskas 5 February 2009 в 11:02
поделиться

14 ответов

Попробуйте это:

static IPAddress getInternetIPAddress()
{
    try
    {
        IPAddress[] addresses = Dns.GetHostAddresses(Dns.GetHostName());
        IPAddress gateway = IPAddress.Parse(getInternetGateway());
        return findMatch(addresses, gateway);
    }
    catch (FormatException e) { return null; }
}

static string getInternetGateway()
{
    using (Process tracert = new Process())
    {
        ProcessStartInfo startInfo = tracert.StartInfo;
        startInfo.FileName = "tracert.exe";
        startInfo.Arguments = "-h 1 208.77.188.166"; // www.example.com
        startInfo.UseShellExecute = false;
        startInfo.RedirectStandardOutput = true;
        tracert.Start();

        using (StreamReader reader = tracert.StandardOutput)
        {
            string line = "";
            for (int i = 0; i < 9; ++i)
                line = reader.ReadLine();
            line = line.Trim();
            return line.Substring(line.LastIndexOf(' ') + 1);
        }
    }
}

static IPAddress findMatch(IPAddress[] addresses, IPAddress gateway)
{
    byte[] gatewayBytes = gateway.GetAddressBytes();
    foreach (IPAddress ip in addresses)
    {
        byte[] ipBytes = ip.GetAddressBytes();
        if (ipBytes[0] == gatewayBytes[0]
            && ipBytes[1] == gatewayBytes[1]
            && ipBytes[2] == gatewayBytes[2])
        {
            return ip;
        }
    }
    return null;
}

Примечание, что эта реализация findMatch() полагается на соответствие класса C. Если Вы хотите поддерживать соответствие класса B, просто опустите проверку на ipBytes[2] == gatewayBytes[2].

История Редактирования:

  • Обновленный для использования www.example.com.
  • Обновленный, чтобы включать getInternetIPAddress(), показать, как использовать другие методы.
  • Обновленный для ловли FormatException, если getInternetGateway() не удался проанализировать IP шлюза. (Это может произойти, если маршрутизатор шлюза настроен таким образом, что он не отвечает запросы traceroute.)
  • комментарий Процитированного Brian Rasmussen.
  • Обновленный для использования IP для www.example.com, так, чтобы это работало, даже когда сервер DNS снижается.
13
ответ дан 1 December 2019 в 00:54
поделиться

Вы могли просто читать http://myip.dnsomatic.com/

, Это - надежная передача OpenDNS, и я использую его для получения внешнего IP все время.

-1
ответ дан 1 December 2019 в 00:54
поделиться

Попытайтесь проверить с помощью ping-запросов www.google.com в обоих интерфейсах.

-1
ответ дан 1 December 2019 в 00:54
поделиться

Для быстрого взлома (который, конечно, станет порванным тщательно продуманные конфигурации LAN или IPv6), получите список всего дюйм/с, которого текущая машина имеет, и полоса все IP:s, которые соответствуют любому следующему:

10.*
127.*          // <- Kudos to Brian for spotting the mistake
172.[16-31].*
192.168.*
0
ответ дан 1 December 2019 в 00:54
поделиться

Я уже ищу это, я нашел его в этом codeplex проекте http://www.codeplex.com/xedus . Это ни один, работающий, бесплатное программное обеспечение P2P, но существует класс, которые используют правильный API для получения, у ведьмы платы LAN есть Интернет ip

0
ответ дан 1 December 2019 в 00:54
поделиться

Вот статья, которая могла быть полезной:

, Как Получить "Сетевые интерфейсы" в C#

, следующий код используется для получения "сетевых интерфейсов" в C#. Можно распознать "сетевые интерфейсы" как "Сетевые и Коммутируемые соединения": можно получить доступ к ним при помощи, "Запускаются> Устанавливающий> Сетевые и Коммутируемые соединения". C# не обеспечивает простой способ получить этот список.

1
ответ дан 1 December 2019 в 00:54
поделиться

Не точных 100% (некоторые ISPs не дают Вам общедоступные IP-адреса), но можно проверить, находится ли IP-адрес на одном из диапазонов, зарезервированных для частных адресов. См. http://en.wikipedia.org/wiki/Classful_network

2
ответ дан 1 December 2019 в 00:54
поделиться

hacky путь состоит в том, чтобы выбрать и очистить одного из многих, 'Каков Мой IP' веб-сайты типа.

2
ответ дан 1 December 2019 в 00:54
поделиться

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

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

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

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

9
ответ дан 1 December 2019 в 00:54
поделиться

Я нашел решение:

IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties();
Console.WriteLine(ipProperties.HostName);

        foreach (NetworkInterface networkCard in NetworkInterface.GetAllNetworkInterfaces())
        {
            foreach (GatewayIPAddressInformation gatewayAddr in networkCard.GetIPProperties().GatewayAddresses)
            {
                Console.WriteLine("Information: ");
                Console.WriteLine("Interface type: {0}", networkCard.NetworkInterfaceType.ToString());
                Console.WriteLine("Name: {0}", networkCard.Name);
                Console.WriteLine("Id: {0}", networkCard.Id);
                Console.WriteLine("Description: {0}", networkCard.Description);
                Console.WriteLine("Gateway address: {0}", gatewayAddr.Address.ToString());
                Console.WriteLine("IP: {0}", System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName()).AddressList[0].ToString());
                Console.WriteLine("Speed: {0}", networkCard.Speed);
                Console.WriteLine("MAC: {0}", networkCard.GetPhysicalAddress().ToString());
            }
        }
1
ответ дан 1 December 2019 в 00:54
поделиться

Я предлагаю этот простой код, поскольку tracert не всегда эффективен, а сайт whatsmyip.com специально не предназначен для этой цели:

private void GetIP()
{
    WebClient wc = new WebClient();
    string strIP = wc.DownloadString("http://checkip.dyndns.org");
    strIP = (new Regex(@"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b")).Match(strIP).Value;
    wc.Dispose();
    return strIP;
}
9
ответ дан 1 December 2019 в 00:54
поделиться

Используйте tracert. Первый прыжок всегда должен находиться в той же подсети, что и ваш сетевой адаптер в Интернете.

пример из командной строки.

tracert google.com

первая строка - 10.0.0.254, а мой nic имеет ip 10.0.2.48. Затем это простое упражнение по синтаксическому анализу вывода tracert.

0
ответ дан 1 December 2019 в 00:54
поделиться

Это моя попытка получить адрес IPv4 по умолчанию, не прибегая к DNS или вызовам внешних процессов для таких команд, как ipconfig и route. Надеюсь, следующая версия .Net предоставит доступ к таблице маршрутизации Windows.

public static IPAddress GetDefaultIPv4Address()
{
    var adapters = from adapter in NetworkInterface.GetAllNetworkInterfaces()
                   where adapter.OperationalStatus == OperationalStatus.Up &&
                    adapter.Supports(NetworkInterfaceComponent.IPv4)
                    && adapter.GetIPProperties().GatewayAddresses.Count > 0 &&
                    adapter.GetIPProperties().GatewayAddresses[0].Address.ToString() != "0.0.0.0"
                   select adapter;

     if (adapters.Count() > 1)
     {
          throw new ApplicationException("The default IPv4 address could not be determined as there are two interfaces with gateways.");
     }
     else
     {
         UnicastIPAddressInformationCollection localIPs = adapters.First().GetIPProperties().UnicastAddresses;
         foreach (UnicastIPAddressInformation localIP in localIPs)
         {
            if (localIP.Address.AddressFamily == AddressFamily.InterNetwork &&
                !localIP.Address.ToString().StartsWith(LINK_LOCAL_BLOCK_PREFIX) &&
                !IPAddress.IsLoopback(localIP.Address))
            {
                return localIP.Address;
            }
        }
    }

    return null;
}
6
ответ дан 1 December 2019 в 00:54
поделиться

Альтернативное решение (которое, вероятно, более точное) - использовать команду Windows route . Вот код, который у меня работает в Windows Vista:

static string getInternetConnectionIP()
{
    using (Process route = new Process())
    {
        ProcessStartInfo startInfo = route.StartInfo;
        startInfo.FileName = "route.exe";
        startInfo.Arguments = "print 0.0.0.0";
        startInfo.UseShellExecute = false;
        startInfo.RedirectStandardOutput = true;
        route.Start();

        using (StreamReader reader = route.StandardOutput)
        {
            string line;
            do
            {
                line = reader.ReadLine();
            } while (!line.StartsWith("          0.0.0.0"));

            // the interface is the fourth entry in the line
            return line.Split(new char[] { ' ' },
                              StringSplitOptions.RemoveEmptyEntries)[3];
        }
    }
}
0
ответ дан 1 December 2019 в 00:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: