使用了与所请求的协议不兼容的地址

时间:2014-07-21 16:41:12

标签: c#

我在Visual Studio 2012中运行与网络相关的Windows项目,而操作系统是Windows 7.我收到以下错误:

  

使用了与所请求协议不兼容的地址

我的代码是:

public DestCode()
{
   IPHostEntry ipEntry = Dns.GetHostEntry(Environment.MachineName);
   IPAddress IpAddr = ipEntry.AddressList[0];
   ipEnd = new IPEndPoint(IpAddr, 5001);
   sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
   sock.Bind(ipEnd);
}

1 个答案:

答案 0 :(得分:4)

ipEntry.AddressList[0]很可能永远不是正确的事情。单个计算机可能配置了一些IP地址,其中一些是自动配置的,并且通常不会被应用程序使用。可能有IPv4地址,IPv6地址,链接范围的地址,站点范围的地址,然后在某处,可能最终是一个全局范围的地址(可以在公共互联网上使用)。

例如,这就是我目前的机器:

enter image description here

您会注意到该列表似乎更倾向于将IPv6地址排序为较低的索引。您的机器上很可能发生同样的情况。

使用AddressFamily.InterNetwork创建套接字,表示IPv4,但是你绑定的地址很可能是IPv6:

new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP)
sock.Bind(ipEnd);

如果您想让代码“正常工作”。使用尽可能少的更改,然后在创建套接字时提供要绑定到的地址的地址族,如下所示:

new Socket(ipEnd.AddressFamily, SocketType.Stream, ProtocolType.IP)
sock.Bind(ipEnd);

然而,使用ipEntry.AddressList[0]可能是错误的做法,因为您永远不会知道您将获得哪个地址。那你怎么得到你的地址?嗯,这取决于你。如果您想循环测试或做一些IPC,请使用127.0.0.1;如果您想在任何地址发送和接收,请绑定到0.0.0.0,这意味着“任何”地址在这个特定的背景下解决。否则,从用户那里采取这种配置是典型的,特别是在用户知道他希望它监听什么接口的情况下。就我而言,没有一个好的界面可以自动选择,我当然希望你问我。