Socket.Connect с IPv6-адресом выдает ошибку «Семейство адресов не поддерживается» - PullRequest
1 голос
/ 24 сентября 2010

Я пытаюсь выполнить 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);

1 Ответ

2 голосов
/ 06 февраля 2011

Похоже, вы указываете IPv4 в вызове Socket (). Вы пытались использовать InterNetworkV6 вместо InterNetwork? По моему опыту (по крайней мере с сокетами C) сокеты IPv6 будут поддерживать адреса как IPv4, так и IPv6, но сокеты IPv4 будут поддерживать только IPv4.

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