如何监听多个IP地址?

如果我的服务器分配了多个IP地址,并且我想听一些(或全部)它们,我该怎么做呢?

我是否需要为每个IP地址创建一个新套接字并绑定它? 我可以将多个IP地址绑定到一个套接字吗? IPAddress.Any会监听所有IP地址吗? MSDN库在这个问题上非常不清楚。

您不能将单个套接字绑定到多个端点。 第二次为给定套接字调用Bind()时会发生SocketException (无效参数错误)。

正如其他人所说,您可以使用IPAddress.Any来侦听本地计算机上的IPv4地址。 但是,如果您只想侦听可用IP地址的子集,则必须创建单独的套接字。

从技术上讲,您的服务器永远不会分配任何IP地址。

相反,可以为各个网络接口分配IP地址。 通常,每个NIC都有一个IP地址,但这只是最常见的情况。

如果要控制哪些接口正在侦听所选端口上的传入连接,则需要为每个接口创建单独的套接字。

我已经研究过它,IPAddress.Any不是正确的方法,它将绑定任何合适的IP地址。 在我的情况下,我有2个NIC,我不能麻烦拍摄问题。 当我添加

 System.Net.IPAddress ipAddress = IPAddress.Parse("xxx.xxx.xxx.xxx"); listener = new TcpListener(ipAddress, portNum); 

它工作正常。

如果要侦听所有IPv4和IPv6地址,请使用以下代码:

 var listener = new TcpListener(IPAddress.IPv6Any, port); listener.Server.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false); 

IPv6Any告诉Windows监听IPv6堆栈。 将套接字选项设置为false会告诉Windows不要将自己限制为IPv6堆栈,而是要监听IPv4堆栈。 默认设置是仅侦听显式指定的堆栈。

是的,IPAddress.Any将监听所有接口。

http://msdn.microsoft.com/en-us/library/system.net.ipaddress.any.aspx

关于IPAddress.Any,MSDN库似乎有些矛盾。 绑定文档

http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.bind.aspx

说选择了“最合适的”地址,但IPAddress.Any doc

http://msdn.microsoft.com/en-us/library/system.net.ipaddress.any.aspx

说通过这个常量,套接字必须监听所有接口上的活动。

但是,我被告知这是正确的IPAddress.Any文档。

(添加此作为答案,因为我没有足够的代表留下评论)。