SocketException:地址与请求的协议不兼容。

45

我尝试在Win7-64位机器上运行.Net套接字服务器代码,但一直收到以下错误:

System.Net.Sockets.SocketException: 使用的地址与请求协议不兼容。
错误代码: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;
}    

以上代码在Windows XP sp3中可以正常工作。

我已经查阅了MSDN上的错误码细节,但对我来说没有太多意义。

有人遇到过类似的问题吗?请帮个忙?


http://stackoverflow.com/a/36150831/2459296 - MD SHAHIDUL ISLAM
2个回答

91
在Windows Vista(和Windows 7)中,Dns.GetHostEntry也返回IPv6地址。在您的情况下,IPv6地址(::1)排在列表中的第一位。
您无法使用IPv4(InterNetwork)套接字连接到IPv6(InterNetworkV6)地址。
更改您的代码以创建套接字并使用指定IP地址的地址族。
Socket serverSocket =
    new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                        ↑

注意: 获取localhost的IP地址有一个捷径: 您可以简单地使用IPAddress.Loopback (127.0.0.1) 或 IPAddress.IPv6Loopback (::1)。


1
IP v4和v6有很多差异。自从Windows 7以后,你需要学习两者,因为它们对你的套接字编程产生了影响。 - Lex Li
有没有任何文件/链接列出了关于套接字编程的这些差异?它们会很有用。 - Amitd
1
这对于本地主机非常好,但当它不是本地主机时,它对我不起作用。有什么想法吗? - Tizz
当在Azure网站上从MVC调用一个部分时,出现这种错误怎么办?我不懂。 - Bart Calixto
1
那个小箭头(↑)非常有用。 - kevinarpe

2

编辑 C:\Windows\System32\drivers\etc\hosts 文件,并添加一行 "127.0.0.1 localhost"(如果没有,请勿包含引号)。


@LexLi,您能详细说明为什么不建议这样做吗? - Nikita Silverstruk
3
@NikitaSilverstruk,问题中的源代码不必要地假设它总是使用IPv4。Ata的答案有助于满足这个假设,所以我说它只是一个解决方法。最好的方法是遵循被接受的答案。 - Lex Li

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接