带有IPv6地址的Socket.Connect会引发“不支持地址系列”错误

时间:2010-09-24 10:26:53

标签: c# sockets ipv6

我正在尝试执行Socket.Connect(),当我指定的IP地址为ipv6格式时,Socket.Connect()失败并显示错误消息:

Address family not supported by protocol family 使用了与所请求的协议不兼容的地址。所有套接字都使用关联的地址系列(即Internet协议的AF_INET)和通用协议类型(即SOCK_STREAM)创建。如果在套接字调用中显式请求了错误的协议,或者如果将错误的系列的地址用于套接字(例如,在sendto中),则会返回此错误。

但是,如果我取消注释下面代码段中的代码,那么ipv4地址将用于连接,现在调用成功;请注意,hostadd.AddressList [0]返回ipv6地址。 另请注意,我连接的Windows 7 64位计算机都启用了ipv4和ipv6;

为什么使用ipv6地址连接会抛出错误? Socket.Connect()方法documents

  

如果启用了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 个答案:

答案 0 :(得分:2)

看起来你在Socket()调用中指定了IPv4。您是否尝试使用InterNetworkV6代替InterNetwork?根据我的经验,(至少使用C套接字)IPv6套接字将支持IPv4和IPv6地址,但IPv4套接字仅支持IPv4。