Получите IPv4-адреса от Dns.GetHostEntry () - PullRequest
47 голосов
/ 29 июня 2009

У меня есть некоторый код, который отлично работает на машинах IPv4, но на нашем сервере сборки (IPv6) он не работает. В двух словах:

IPHostEntry ipHostEntry = Dns.GetHostEntry(string.Empty);

В документации по GetHostEntry говорится, что при передаче в string.Empty вы получите IPv4-адрес локального хоста. Это то, что я хочу. Проблема в том, что он возвращает строку «:: 1:» на нашей машине IPv6, которая, как я считаю, является адресом IPv6.

Проверка связи с любым другим IPv4-устройством дает хороший IPv4-адрес ... и "ping -4 machinename" из себя дает правильный IPv4-адрес .... но регулярно проверяет его с сам дает ":: 1:".

Как я могу получить IPv4 для этой машины от себя?

Ответы [ 7 ]

63 голосов
/ 29 июня 2009

Вы просматривали все адреса в ответе, отбрасываете адреса семейства InterNetworkV6 и сохраняете только адреса IPv4?

43 голосов
/ 15 апреля 2011

Чтобы найти все локальные адреса IPv4:

IPAddress[] ipv4Addresses = Array.FindAll(
    Dns.GetHostEntry(string.Empty).AddressList,
    a => a.AddressFamily == AddressFamily.InterNetwork);

или используйте Array.Find или Array.FindLast, если хотите.

9 голосов
/ 22 марта 2016
IPHostEntry ipHostInfo = Dns.GetHostEntry(serverName);
IPAddress ipAddress = ipHostInfo.AddressList
    .FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);
6 голосов
/ 15 октября 2010
    public Form1()
    {
        InitializeComponent();

        string myHost = System.Net.Dns.GetHostName();
        string myIP = null;

        for (int i = 0; i <= System.Net.Dns.GetHostEntry(myHost).AddressList.Length - 1; i++)
        {
            if (System.Net.Dns.GetHostEntry(myHost).AddressList[i].IsIPv6LinkLocal == false)
            {
                myIP = System.Net.Dns.GetHostEntry(myHost).AddressList[i].ToString();
            }
        }
    }

Объявите myIP и myHost в публичной переменной и использовать в любой функции вида.

2 голосов
/ 06 февраля 2015
    public static string GetIPAddress(string hostname)
    {
        IPHostEntry host;
        host = Dns.GetHostEntry(hostname);

        foreach (IPAddress ip in host.AddressList)
        {
            if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
            {
                //System.Diagnostics.Debug.WriteLine("LocalIPadress: " + ip);
                return ip.ToString();
            }
        }
        return string.Empty;
    }
0 голосов
/ 20 февраля 2015

IPv6

lblIP.Text = System.Net.Dns.GetHostEntry (System.Net.Dns.GetHostName) .AddressList (0) .ToString ()


IPv4

lblIP.Text = System.Net.Dns.GetHostEntry (System.Net.Dns.GetHostName) .AddressList (1) .ToString ()

0 голосов
/ 14 марта 2013

Чтобы найти весь действительный список адресов, это код, который я использовал

public static IEnumerable<string> GetAddresses()
{
      var host = Dns.GetHostEntry(Dns.GetHostName());
      return (from ip in host.AddressList where ip.AddressFamily == AddressFamily.lo select ip.ToString()).ToList();
}
...