2013-05-17 6 views
3

На входящие соединения через IPv4 на IPAddress находится в ipv6 нотации, такие как ::ffff:1.2.3.4Сравнить ipv4 адреса ipv6 нотации

Я хочу сравнить эти адреса к IPAddress я получаю от других, которая находится в ipv4 обозначения: 1.2.3.4

По обозначению: ipv4.GetAddressBytes() возвращает 4 байта, тогда как ipv6.GetAddressBytes() возвращает 16 байт.

Есть ли простой способ конвертировать ipv4 IPAddress в обозначение ipv6?

Я думаю, что знаю, как это сделать byte by byte, но я мог бы пропустить что-то и предпочел бы использовать существующую функцию, если она есть.

+1

Можете ли вы взять часть IPv4 из своего источника v6 и сравнить с другим «родным» IPv4? например ':: ffff: 1.2.3.4' => ** 1.2.3.4 ** – Jason

+0

Да в любом случае работает, так как я собираюсь их сравнить. – hultqvist

ответ

2

Instantate ваш IP-адрес в качестве экземпляров System.Net.IPAddress. Взгляд на следующие методы:

  • IPAddress.Equals()
  • IPAddress.MapToIPv4()
  • IPAddress.MapToIPv6()

Вы, вероятно, хотите добавить специальную обработку для специальных адресов (например, адаптер TCP/IP петлевой: Это единственный IPv6-адрес, ::1, а для IPv4, хотя наиболее часто используемый адрес для этой цели - 127.0.0.1, IETF зарезервировал всего 127/8 блок (127.0.0.0127.255.255.255 включительно) для этой цели. Как вы определяете равенство (или даже эквивалентность), является спорным.

Поскольку IPv4 и IPv6 являются совершенно разными и независимыми схемами адресации, можно обоснованно утверждать, что единственным истинным способом определения эквивалентности является то, что оба они сопоставляются с одной и той же конечной точкой (MAC-адрес/сетевой адаптер).

+1

'.MapToIPvX()' был именно тем, что я искал. В моем случае сетевые адаптеры не являются проблемой, так как я сравниваю входящие соединения с DNS-записью. Вы можете добавить, что методы карты доступны только в рамке 4.5. – hultqvist

0

захватить IPv4 часть из вашего «источника» и сравните ваше «пункт назначения» IPv4, как показано ниже образец

IPAddress ipv6 = null; 
IPAddress ipv4 = null; 
IPAddress testIp = null; 

IPAddress.TryParse("::ffff:1.2.3.4", out ipv6); 
IPAddress.TryParse("1.2.3.4", out ipv4); 

string ipString = ipv6.ToString(); 
IPAddress.TryParse(ipString.Substring(ipString.LastIndexOf(":") + 1), out testIp); 
// this will return false 
Console.WriteLine("ipv4 == ipv6 : " + (ipv4.Equals(ipv6)).ToString()); 
// this will return true 
Console.WriteLine("ipv4 == testIp : " + (ipv4.Equals(testIp)).ToString()); 
Смежные вопросы