我在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);
}
答案 0 :(得分:4)
ipEntry.AddressList[0]
很可能永远不是正确的事情。单个计算机可能配置了一些IP地址,其中一些是自动配置的,并且通常不会被应用程序使用。可能有IPv4地址,IPv6地址,链接范围的地址,站点范围的地址,然后在某处,可能最终是一个全局范围的地址(可以在公共互联网上使用)。
例如,这就是我目前的机器:
您会注意到该列表似乎更倾向于将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
,这意味着“任何”地址在这个特定的背景下解决。否则,从用户那里采取这种配置是典型的,特别是在用户知道他希望它监听什么接口的情况下。就我而言,没有一个好的界面可以自动选择,我当然希望你问我。