Потому что он обрабатывает 1 и 3 как целые числа, поэтому округляет результат до 0, так что это целое число.
Чтобы получить результат, который вы ищете, прямо скажите java, что числа удваивается так:
double g = 1.0/3.0;
Попробуйте это:
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.) Вы могли просто читать http://myip.dnsomatic.com/
, Это - надежная передача OpenDNS, и я использую его для получения внешнего IP все время.
Попытайтесь проверить с помощью ping-запросов www.google.com в обоих интерфейсах.
Для быстрого взлома (который, конечно, станет порванным тщательно продуманные конфигурации LAN или IPv6), получите список всего дюйм/с, которого текущая машина имеет, и полоса все IP:s, которые соответствуют любому следующему:
10.* 127.* // <- Kudos to Brian for spotting the mistake 172.[16-31].* 192.168.*
Я уже ищу это, я нашел его в этом codeplex проекте http://www.codeplex.com/xedus . Это ни один, работающий, бесплатное программное обеспечение P2P, но существует класс, которые используют правильный API для получения, у ведьмы платы LAN есть Интернет ip
Вот статья, которая могла быть полезной:
, Как Получить "Сетевые интерфейсы" в C#
, следующий код используется для получения "сетевых интерфейсов" в C#. Можно распознать "сетевые интерфейсы" как "Сетевые и Коммутируемые соединения": можно получить доступ к ним при помощи, "Запускаются> Устанавливающий> Сетевые и Коммутируемые соединения". C# не обеспечивает простой способ получить этот список.
Не точных 100% (некоторые ISPs не дают Вам общедоступные IP-адреса), но можно проверить, находится ли IP-адрес на одном из диапазонов, зарезервированных для частных адресов. См. http://en.wikipedia.org/wiki/Classful_network
hacky путь состоит в том, чтобы выбрать и очистить одного из многих, 'Каков Мой IP' веб-сайты типа.
Интернет-соединение должно быть в той же сети IP как шлюз по умолчанию.
Там не является действительно надежным никакой способ сказать от IP-адреса, если можно достигнуть "Интернета" или нет. В основном можно общаться с собственной сетью IP. Все остальное должно перейти шлюз. Таким образом, если Вы не видите шлюз, Вы ограничены локальной сетью IP.
шлюз, однако, зависит от других шлюзов, поэтому даже если можно получить доступ к шлюзу, Вы не можете достигать некоторой другой сети. Это может произойти из-за, например, фильтрация или отсутствие маршрутов к желаемым сетям.
На самом деле, имеет мало смысла говорить об Интернете в этом смысле, поскольку Вы никогда не будете, вероятно, мочь достигнуть всего Интернета в любой данный момент. Поэтому узнайте то, что необходимо смочь достигнуть и проверить возможность соединения для той сети.
Я нашел решение:
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());
}
}
Я предлагаю этот простой код, поскольку 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;
}
Используйте tracert. Первый прыжок всегда должен находиться в той же подсети, что и ваш сетевой адаптер в Интернете.
пример из командной строки.
tracert google.com
первая строка - 10.0.0.254, а мой nic имеет ip 10.0.2.48. Затем это простое упражнение по синтаксическому анализу вывода tracert.
Это моя попытка получить адрес 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;
}
Альтернативное решение (которое, вероятно, более точное) - использовать команду 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];
}
}
}