Проблема преобразования ipv6 в ipv4 - PullRequest
8 голосов
/ 11 января 2010

У меня есть некоторый код в приложении asp.net, который должен получить ipv4-адрес клиентского компьютера (все пользователи находятся в нашей собственной сети). Недавно мы обновили сервер, на котором приложение работает, до сервера Windows 2008. Теперь код Request.UserHostAddress возвращает ipv4, когда клиент установлен на более старой ОС, и ipv6, если он на более новой ОС (Vista и выше). Таким образом, функция, которая полагается на это, работает для некоторых клиентов, а не для других.

Я добавил код, который должен конвертировать из ipv6 в ipv4, чтобы попытаться решить эту проблему. Это из этого онлайн-урока: http://www.4guysfromrolla.com/articles/071807-1.aspx. Я использую dsn.GetHostAddress, а затем перебираю возвращенные IP-адреса, ища тот, который является "InterNetwork"

foreach (IPAddress IPA in Dns.GetHostAddresses(HttpContext.Current.Request.UserHostAddress))
{
    if (IPA.AddressFamily.ToString() == "InterNetwork")
    {
        IP4Address = IPA.ToString();
        break;
    }
}

if (IP4Address != String.Empty)
{
    return IP4Address;
}


foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName()))
{
    if (IPA.AddressFamily.ToString() == "InterNetwork")
    {
        IP4Address = IPA.ToString();
        break;
    }
}

return IP4Address;

Проблема в том, что это не работает для меня. Клиенты, подключающиеся из ipv4, продолжают возвращать правильный IP-адрес ipv4 клиентского компьютера, но клиенты, подключающиеся из Vista и Windows 7, возвращают IP-адрес ipv4 компьютера SERVER , а не клиентского компьютера.

Ответы [ 3 ]

7 голосов
/ 17 февраля 2010

Простой ответ. Отключите IPV6 на сервере или удалите IPV6-адрес сервера из записи DNS.

Нет волшебного конвертера IPV4 <-> IPV6. Это совершенно разные протоколы, и адреса в одном не переводятся в другой. Если вы хотите надежно получить IPV4-адрес клиента, вам необходимо убедиться, что клиент подключается через IPV4.

6 голосов
/ 29 августа 2013

Я также скопировал код примера, и коллега указал, что он явно глючит. Эта строка использует имя хоста сервера, следовательно, неверный результат:

foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName()))

Я исправил код в моем проекте следующим образом:

/// <summary>
/// Returns the IPv4 address of the specified host name or IP address.
/// </summary>
/// <param name="sHostNameOrAddress">The host name or IP address to resolve.</param>
/// <returns>The first IPv4 address associated with the specified host name, or null.</returns>
public static string GetIPv4Address(string sHostNameOrAddress)
{
  try
  {
    // Get the list of IP addresses for the specified host
    IPAddress[] aIPHostAddresses = Dns.GetHostAddresses(sHostNameOrAddress);

    // First try to find a real IPV4 address in the list
    foreach (IPAddress ipHost in aIPHostAddresses)
      if (ipHost.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
        return ipHost.ToString();

    // If that didn't work, try to lookup the IPV4 addresses for IPV6 addresses in the list
   foreach (IPAddress ipHost in aIPHostAddresses)
     if (ipHost.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6)
      {
        IPHostEntry ihe = Dns.GetHostEntry(ipHost);
        foreach (IPAddress ipEntry in ihe.AddressList)
          if (ipEntry.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
            return ipEntry.ToString();
      }
  }
  catch (Exception ex)
  {
    System.Diagnostics.Trace.WriteLine(ex);
  }
  return null;
}

Приведенный выше код работает в ASP.Net 2.0 в Windows 7 / Server 2008. Надеюсь, это поможет.

1 голос
/ 14 марта 2013

если вы используете .Net 4.5 Framework, то есть метод, обеспечивающий преобразование IP6 в IP4

public IPAddress MapToIPv4()

Подробности вы можете найти здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...