Я пытаюсь выполнить Socket.Connect (), и когда указанный IP-адрес имеет формат ipv6, Socket.Connect () завершается ошибкой с сообщением об ошибке:
Семейство адресов не поддерживается семейством протоколов . Использовался адрес, несовместимый с запрошенным протоколом.Все сокеты создаются со связанным семейством адресов (то есть AF_INET для интернет-протоколов) и общим типом протокола (то есть SOCK_STREAM).Эта ошибка возвращается, если в вызове сокета явно запрашивается неверный протокол, или если для сокета используется адрес неправильного семейства, например, в sendto.
Однако, если я раскомментирую код вниже фрагмента, тогда для соединения будет использоваться адрес ipv4, и теперь вызов будет успешным;Обратите внимание, что hostadd.AddressList [0] возвращает адрес ipv6.Также обратите внимание, что я подключаюсь между 64-битными машинами Windows 7, на которых включены ipv4 и ipv6;
Почему при подключении с использованием адреса ipv6 возникает ошибка?Метод Socket.Connect () документирует , что:
Если IPv6 включен и вызывается метод Connect (String, Int32) для подключения к хосту, который разрешает оба IPv6и IPv4-адреса, соединение с IPv6-адресом будет пытаться сначала до IPv4-адреса.Это может привести к задержке времени установления соединения, если хост не прослушивает IPv6-адрес. Не прослушивает IPv6-адрес.
IPHostEntry hostadd = Dns.GetHostEntry(TimeServer);
IPAddress ip4IP = hostadd.AddressList[0];
//foreach (IPAddress ipAddress in hostadd.AddressList) {
// if (ipAddress.AddressFamily == AddressFamily.InterNetwork) {
// ip4IP = ipAddress;
// break;
// }
//}
IPEndPoint EPhost = new IPEndPoint(ip4IP, 123);
Socket pSocket = new Socket(
AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
pSocket.ReceiveTimeout = 2000;
pSocket.SendTimeout = 2000;
pSocket.Connect(EPhost);