Получение ip-адреса - PullRequest
       27

Получение ip-адреса

4 голосов
/ 23 июня 2009

В C #:

IPHostEntry IPHost = Dns.GetHostEntry(Dns.GetHostName());

for (int i = 0; i < IPHost.AddressList.Length; i++)
{
    textBox1.AppendText("My IP address is: " 
        + IPHost.AddressList[i].ToString() + "\r\n");
}

В этом коде переменная IPHostEntry содержит все IP-адреса компьютера. Теперь, насколько мне известно, Windows Vista возвращает несколько IP-адресов, некоторые в шестнадцатеричном формате, некоторые в десятичном формате и т. Д.

Проблема в том, что желаемая десятичная запись меняет свое местоположение в переменной IPHostEntry: она изначально была в последнем месте и поэтому может быть доступна с кодом:

string ipText = IPHost.AddressList[IPHost.AddressList.Length - 1].ToString();

Однако, после изменения IP-адреса компьютера, он теперь появляется во 2-м последнем месте и поэтому должен быть доступен с помощью кода:

string ipText = IPHost.AddressList[IPHost.AddressList.Length - 2].ToString();

Существует ли какой-либо код, который извлекает IP-адреса в десятичном формате независимо от его местоположения в переменной IPHostEntry ??

Ответы [ 3 ]

9 голосов
/ 23 июня 2009

Предполагая, что вам нужен только адрес IPv4, в настоящее время я использую этот код (немного измененный для публикации), который достаточно надежен для моего использования. Просто вызовите ToString для результата, чтобы получить адрес:

// return the first IPv4, non-dynamic/link-local, non-loopback address
public static IPAddress GetIPAddress()
{
    IPAddress[] hostAddresses = Dns.GetHostAddresses("");

    foreach (IPAddress hostAddress in hostAddresses)
    {
        if (hostAddress.AddressFamily == AddressFamily.InterNetwork &&
            !IPAddress.IsLoopback(hostAddress) &&  // ignore loopback addresses
            !hostAddress.ToString().StartsWith("169.254."))  // ignore link-local addresses
            return hostAddress;
    }
    return null; // or IPAddress.None if you prefer
}

Часть 169.254. * Может показаться хаком, но задокументирована в IETF RFC 3927 .

1 голос
/ 23 июня 2009

Ваши шестнадцатеричные адреса - IPv6, 4 десятичных числа - ipv4.

1 голос
/ 23 июня 2009

Я полагаю, что вы спрашиваете, можете ли вы различить адреса IPv4 и IPv6, полученные из вашего запроса DNS. Ответ - да. Проверьте свойство AddressFamily на IP-адресе и убедитесь, что оно возвращает InterNetwork .

...