2010-03-03 26 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

相关问题