我正在尝试执行一个Socket.Connect(),当我指定的IP地址是ipv6格式时,Socket.Connect()在错误消息中失败:
协议族不支持的地址族.使用了与请求的协议不兼容的地址。所有套接字都使用关联的地址系列(即因特网协议的AF_INET )和通用协议类型(即SOCK_STREAM)创建。如果在套接字调用中显式请求了不正确的协议,或者如果套接字使用了错误家族的地址(例如,在sendto中),则返回此错误。
但是,如果我在下面的代码段中取消注释,那么ipv4地址将用于连接,现在调用成功;注意,hostadd.AddressList返回一个ipv6地址。还请注意,我正在连接的Windows 7 64位计算机,这两者都启用了ipv4和ipv6;
为什么使用ipv6地址连接会引发错误?Socket.Connect()方法文档,用于:
如果启用了IPv6,并调用Connect(String,Int32)方法连接到解析为IPv6和IPv4地址的主机,则将在IPv4地址之前先尝试连接到IPv6地址。如果主机没有侦听IPv6 address.is,没有监听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);发布于 2011-02-06 04:09:19
看起来您在套接字()调用中指定了IPv4。你试过使用InterNetworkV6而不是InterNetwork吗?根据我的经验(至少使用C套接字),IPv6套接字将同时支持IPv4和IPv6地址,但IPv4套接字只支持IPv4。
https://stackoverflow.com/questions/3786130
复制相似问题