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

use*_*800 2 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);
}
Run Code Online (Sandbox Code Playgroud)

ant*_*duh 5

这很可能ipEntry.AddressList[0]永远都不是正确的做法。一台机器可能配置了几个 IP 地址,其中一些是自动配置的,通常不会被应用程序使用。可能有 IPv4 地址、IPv6 地址、链接范围的地址、站点范围的地址,然后在某个地方,也许最后是全局范围的地址(可以在公共互联网上使用的地址)。

例如,这是我当前的机器所拥有的:

在此处输入图片说明

您会注意到该列表似乎更喜欢对 IPv6 地址进行排序以降低索引。您的机器上很可能会发生同样的情况。

您使用AddressFamily.InterNetwork指示 IPv4 的来创建套接字,但随后您绑定了一个很可能是 IPv6 的地址:

new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP)
sock.Bind(ipEnd);
Run Code Online (Sandbox Code Playgroud)

如果您想让代码“工作”并进行少量更改,请在创建套接字时提供要绑定到的地址的地址族,如下所示:

new Socket(ipEnd.AddressFamily, SocketType.Stream, ProtocolType.IP)
sock.Bind(ipEnd);
Run Code Online (Sandbox Code Playgroud)

但是,使用ipEntry.AddressList[0]可能是错误的做法,因为您永远不知道将获得哪个地址。那么如何获取地址呢?嗯,这取决于你。如果您只想环回进行测试或进行一些 IPC,请使用127.0.0.1; 如果您想在任何地址上发送和接收,请绑定到0.0.0.0,这意味着此特定上下文中的“任何”地址。否则,通常会从用户那里获取这种配置,尤其是在用户知道他希望它收听哪个界面的情况下。就我而言,没有一个好的界面可以自动选择,我肯定希望你问我。