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

C# 使用了与请求的协议不兼容的地址,c#,C#,我正在Visual Studio 2012中运行与网络相关的Windows项目,操作系统是Windows 7。我得到以下错误: 使用了与请求的协议不兼容的地址 我的代码是: public DestCode() { IPHostEntry ipEntry = Dns.GetHostEntry(Environment.MachineName); IPAddress IpAddr = ipEntry.AddressList[0]; ipEnd = new IPEndPoint(IpA

我正在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);
}

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

例如,这就是我当前机器的功能:

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

您可以使用表示IPv4的
AddressFamily.InterNetwork
创建套接字,但随后绑定的地址很可能是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
,这意味着在此特定上下文中的“any”地址。否则,通常会从用户那里获取这种配置,特别是在用户知道他想要它监听什么界面的情况下。在我的情况下,没有一个好的界面可以自动选择,我当然希望您问我。

iEntry.AddressList[0]的值是多少?您从哪里“获取错误”?编译器?运行时?你的应用程序?并告诉我们
IpAddr
的值。我在运行时遇到错误。当我单击“开始调试”时,输出屏幕未显示coming@user3767800-此外,在发布“为什么此代码不起作用”问题时,良好的堆栈溢出礼仪是发布最小的、完整的、不起作用的示例以及输入值。否则,人们不得不猜测您的代码或方法有什么问题。见: