Вопрос

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

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

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

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

Как я могу получить IPv4 для этого компьютера от самого себя?

Это было полезно?

Решение

Вы смотрели на все адреса в обратном случае выбросьте те из семейная сетевая работаv6 и сохранить только IPv4-адреса?

Другие советы

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

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

или использовать Array.Find или Array.FindLast если ты просто хочешь одного.

IPHostEntry ipHostInfo = Dns.GetHostEntry(serverName);
IPAddress ipAddress = ipHostInfo.AddressList
    .FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);
    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 в общедоступных переменных и используйте в любой функции формы.

    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;
    }

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

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();
}

IPv6

lblIP.Текст = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName).Список адресов(0).toString()


IPv4

lblIP.Текст = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName).Список адресов(1).toString()

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top