Есть один сетевой адаптер, мне нужно узнать его локальный IPv6, для отправки запросов с сокета (сокет в режиме DualMode) через этот IP.
Проблема вот в чем. При получении списка локальных IP через Dns.GetHostEntry(Dns.GetHostName()).AddressList выдается два! адреса IPv6. Один адрес как раз из свойств сетевой карты, а второй адрес из виртуального Microsoft 6 to 4 tunnel adapter.
Какой же адрес использовать для сокета, и для чего вообще этот адаптер нужен?
Update:
Попробовал направить запросы сокета через оба IPv6 локальных адреса. В итоге тот, который указан в настройках сетевого адаптера - нерабочий, а тот, который выдан Microsoft 6 to 4 tunnel adapter - рабочий.
Для проверки IPv6 (и заодно IPv4) пришлось писать такой метод:
private static bool CheckLocalIPv4_v6(string ip)
{
using (var socket = new Socket(SocketType.Dgram, ProtocolType.Unspecified))
{
try
{
var endPoint = new IPEndPoint(IPAddress.Parse(ip), 0);
var isIPv6 = (endPoint.AddressFamily == AddressFamily.InterNetworkV6) ? true : false;
if (isIPv6)
socket.DualMode = true;
socket.Bind(endPoint);
socket.Connect((isIPv6) ? "2001:4860:4860::8888" : "8.8.8.8", 53);
return socket.Connected;
}
catch { return false; }
}
}
p.s. работает только на .NET 4.5 и выше, пруф.
p.p.s. варианта лучше я не нашел, если есть что-то более хорошее - поделитесь =)
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости