Преобразование IPv6 в IPv4 в C # - PullRequest
5 голосов
/ 25 августа 2010

У меня есть список IP-адресов в формате IPv4, которые я собрал из предыдущих объектов HttpRequest, полученных моим веб-сервером. У меня есть Java-апплет, который дает IP-адреса в формате Ipv6 (Java-апплет возвращает кучу данных вместе с IP-адресом). Мне нужно проверить, соответствует ли IP, возвращаемый апплетом, какому-либо элементу из списка.

Как выполнять взаимное преобразование форматов IPv6 и IPv4?

Мое веб-приложение построено на ASP.Net C #

EDIT

вот проблема, с которой я сталкиваюсь. Апплет Java возвращает клиенту несколько IP-адресов, которые, как я полагаю, зависят от количества сетевых карт на клиентском компьютере.

Наряду с этим я получаю IP-адрес от объекта ASP.Net HTTPRequest. Мне нужно выяснить, какой IP-адрес фактически использовался для подключения к моему веб-сайту, и выполнить некоторые задачи.

Иногда проблема заключается в том, что я получаю только один IP-адрес из javaapplet в формате IPv6, где в качестве IP-адреса, получаемого от объекта HTTPRequest, используется формат IPv4, поэтому сравнение не удается.

Ответы [ 3 ]

4 голосов
/ 25 августа 2010

Вы говорите о сопоставлении IPv4-IPv6 или встраивании адресов IPv4.

Внедрение IPv4-адреса используется для создания взаимосвязи между IPv4-адресом и IPv6-адресом для облегчения перехода от IPv4 к IPv6.Один тип, IPv4-совместимый адрес IPv6, используется для устройств, совместимых как с IPv4, так и с IPv6;это начинается с 96 нулевых битов.Другой, сопоставленный с IPv4 адрес, используется для сопоставления устройств IPv4, которые не совместимы с IPv6, в адресное пространство IPv6;оно начинается с 80 нулей, за которыми следуют 16.

..

Разница между этими двумя типами адресов невелика, но важна.Первые 80 бит всегда равны нулю, поэтому, когда это видно, вы знаете, что это какой-то встроенный IPv4-адрес.IPv4-совместимые IPv6-адреса используются только для устройств, которые действительно поддерживают IPv6;IPv4-совместимый адрес является дополнением к обычному IPv6-адресу.Напротив, если «FFFF» виден для 16 бит после начальных 80, это обозначает обычные устройства IPv4, чей адрес IPv4 был преобразован в формат IPv6.Это не устройство с поддержкой IPv6.

Итак, суть в том, что если они не сопоставлены, вы не сможете преобразовать в / из.Вам понадобится переводчик .

3 голосов
/ 01 сентября 2010

0A0D, похоже, уже ответил на это, но я попробую:

Если первые 10 байтов (80 бит) вашего адреса IPv6 равны нулю, то вы можете сравнить последние 4 байта с 4 байтами адреса IPv4.

bool AreEquivalent(IPAddress ip6addr, IPAddress ip4addr)
{
  byte[] ip6bytes = ip6addr.GetBytes();
  byte[] ip4bytes = ip4addr.GetBytes();
  for (int i = 0; i < 10; i++)
  {
     if (ip6bytes[i] != 0)
       return false;
  }
  for (int i = 0; i < 4; i++)
  {
     if (ip6bytes[i + 12] != ip4bytes[i])
        return false;
  }
  return true;
}

Предполагается, что вы уже знаете, что такое ipv6 и ipv4. При необходимости добавьте дополнительную логику, если вам нужно сравнить произвольные адреса.

2 голосов
/ 25 августа 2010

Предположим, вы работаете с какой-либо беспроводной платформой или имеете возможность использовать беспроводную связь.IPV6 имеет отношение к улучшению мобильной сети АКА «Беспроводная связь».Преобразование IPV6 в IPV4 - это не то, что вы ищете.IPV6 - это реальный адрес.Это новый усовершенствованный стандарт для IP-адресов в наши дни.Взгляните Здесь и решите сами.Вы также можете сделать это вручную здесь .Предполагается, что IPV6 маскирует ваш IPV4.

Надеюсь, это поможет.

...