2010-03-03 107 views
38

我試圖在Win7-64bit機器上運行.Net套接字服務器代碼。
我不斷收到以下錯誤:SocketException:與請求協議不兼容的地址

System.Net.Sockets.SocketException: An address incompatible with the requested protocol was used.
Error Code: 10047

的代碼片段是:

IPAddress ipAddress = Dns.GetHostEntry("localhost").AddressList[0]; 
IPEndPoint ip = new IPEndPoint(ipAddress, 9989); 
Socket serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); 
try 
{ 
    serverSocket.Bind(ip); 
    serverSocket.Listen(10); 
    serverSocket.BeginAccept(new AsyncCallback(AcceptConn), serverSocket);   
} 
catch (SocketException excep) 
{ 
    Log("Native code:"+excep.NativeErrorCode); 
// throw; 
}  

上面的代碼工作正常在Win-XP SP3。

我檢查了Error code details on MSDN,但它對我沒有多大意義。

任何人都遇到過類似的問題?任何幫助?

+0

http://stackoverflow.com/a/36150831/2459296 – Salim 2016-03-22 09:42:43

回答

83

在Windows Vista(和Windows 7),DNS .GetHostEntry也返回IPv6地址。在你的情況下,IPv6地址(:: 1)首先在列表中。

無法使用IPv4(InterNetwork)套接字連接到IPv6(InterNetworkV6)地址。

更改您的代碼來創建插座使用指定的IP地址的地址族:

Socket serverSocket = 
    new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
         ↑ 

注意:有一個捷徑獲得本地主機的IP地址:您可以簡單地使用IPAddress.Loopback(127.0.0.1)或IPAddress.IPv6Loopback(:: 1)。

+4

+1 ...或者你可以使用IPAddress中的地址族,當然...... – 2010-03-03 10:44:42

+1

IP v4和v6有很多不同之處。從Windows 7開始,您需要了解它們對套接字編程的影響。 – 2010-03-04 05:23:33

+0

列出了與插座編程有關的這些差異的任何文檔/鏈接?他們會派上用場 – Amitd 2010-03-04 06:48:17

2

編輯C:\ WINDOWS \ SYSTEM32 \ DRIVERS \等\主機,並添加行 「127.0.0.1 localhost」 的(如果它不存在,不包括引號)

+3

這是一種解決方法,但極不推薦。 – 2010-03-04 05:22:32

+0

@LexLi,你能否詳細說明爲什麼不推薦? – 2013-10-01 16:45:32

+3

@NikitaSilverstruk,這個問題中的源代碼做了不必要的假設,它總是會使用IPv4。 Ata的答案有助於實現這一假設,這就是爲什麼我說這只是一種解決方法。最好的方法是遵循公認的答案。 – 2013-10-02 00:07:03

相關問題