【问题标题】:SocketException: address incompatible with requested protocolSocketException:地址与请求的协议不兼容
【发布时间】:2011-01-23 03:29:47
【问题描述】:

我试图在 Win7-64 位机器上运行 .Net 套接字服务器代码。
我不断收到以下错误:

System.Net.Sockets.SocketException:地址与请求的协议不兼容 被使用了。
错误代码:10047

代码sn-p是:

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,但对我来说没有多大意义。

有人遇到过类似的问题吗?有什么帮助吗?

【问题讨论】:

标签: c# .net sockets


【解决方案1】:

在 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) )。

【讨论】:

  • IP v4 和 v6 有很多不同之处。从 Windows 7 开始,您需要同时学习这两者,因为它们会对您的套接字编程产生影响。
  • 列出了与套接字编程有关的这些差异的任何文档/链接?他们会派上用场
  • 这对于 localhost 来说非常有用,但是当它不是本地主机时它对我不起作用。有什么想法吗?
  • 在 azure 网站上从 mvc 调用部分时出现此错误怎么办? ??我不明白
  • 那个小箭头 (↑) 很有帮助。
【解决方案2】:

编辑 C:\Windows\System32\drivers\etc\hosts 并添加“127.0.0.1 localhost”行(如果不存在,不包括引号)

【讨论】:

  • @LexLi,你能详细说明为什么不推荐它吗?
  • @NikitaSilverstruk,问题中的源代码不必要地假设它将始终使用 IPv4。 Ata 的回答有助于实现这一假设,这就是为什么我说这只是一种解决方法。最好的方法是遵循公认的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 2022-12-12
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
相关资源
最近更新 更多