我想做一個Socket.Connect(),當我指定的IP地址是ipv6格式,Socket.Connect()失敗與錯誤消息:Socket.Connect與IPv6地址拋出一個「地址家庭不支持」錯誤
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和 連接(字符串,Int32)方法被調用來連接到主機 解析爲IPv6和IPv4地址 中,將在 IPv4地址之前首先嚐試連接到IPv6 地址。如果主機 沒有監聽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);