如何监听多个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文档。
(添加此作为答案,因为我没有足够的代表留下评论)。