2010-09-24 39 views
1

我想做一個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); 

回答

2

看起來你是在爲你socket()調用指定的IPv4。您是否嘗試使用InterNetworkV6而不是InterNetwork?根據我的經驗(至少使用C套接字),IPv6套接字將支持IPv4和IPv6地址,但IPv4套接字將僅支持IPv4。