我正在尝试执行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);
答案 0 :(得分:2)
看起来你在Socket()调用中指定了IPv4。您是否尝试使用InterNetworkV6
代替InterNetwork
?根据我的经验,(至少使用C套接字)IPv6套接字将支持IPv4和IPv6地址,但IPv4套接字仅支持IPv4。