如果我的服务器分配了多个IP地址,并且我想要监听其中一些(或全部),我该怎么做?
我需要为每个IP地址创建一个新的套接字并进行绑定吗?我能够将多个IP地址绑定到单个套接字上吗?IPAddress.Any是否会监听所有IP地址?MSDN库对此事非常不清楚。
我需要为每个IP地址创建一个新的套接字并进行绑定吗?我能够将多个IP地址绑定到单个套接字上吗?IPAddress.Any是否会监听所有IP地址?MSDN库对此事非常不清楚。
一个单独的socket不能绑定到多个端点,如果你第二次调用Bind()
来给特定的socket绑定端点,则会导致SocketException
(无效参数错误)。
正如其他人所说,你可以使用IPAddress.Any
来监听本地机器上的IPv4地址。但是,如果你只想监听可用IP地址的子集,则必须创建单独的sockets。
从技术上讲,您的服务器从未分配任何IP地址。
相反,可以为每个网络接口分配IP地址。通常,每个NIC都会获得一个IP地址,但这只是最常见的情况。
如果您想控制哪些接口在所选端口上侦听传入连接,则需要为每个接口创建单独的套接字。
var listener = new TcpListener(IPAddress.IPv6Any, port);
listener.Server.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false);
IPv6Any
表示Windows将侦听IPv6堆栈。将套接字选项设置为false表示Windows不限制自己只侦听IPv6堆栈,而是还要侦听IPv4堆栈。默认设置是仅在明确指定的堆栈上侦听。
我曾经尝试过使用IPAddress.Any,但这不是正确的方法,它会绑定到任何适合的IP地址。在我的情况下,我有两张网卡,而且我无法解决问题。后来我尝试添加
System.Net.IPAddress ipAddress = IPAddress.Parse("xxx.xxx.xxx.xxx");
listener = new TcpListener(ipAddress, portNum);
它运行良好。
是的,IPAddress.Any会在所有接口上监听。
http://msdn.microsoft.com/en-us/library/system.net.ipaddress.any.aspx