【发布时间】:2009-11-22 02:30:51
【问题描述】:
如果我的服务器分配了多个 IP 地址,并且我想收听其中的一些(或全部),我该怎么做?
是否需要为每个 IP 地址创建一个新的套接字并绑定它?我可以将多个 IP 地址绑定到单个套接字吗? IPAddress.Any 是否监听所有 IP 地址? MSDN 库在这个问题上非常不清楚。
【问题讨论】:
标签: c# networking sockets
如果我的服务器分配了多个 IP 地址,并且我想收听其中的一些(或全部),我该怎么做?
是否需要为每个 IP 地址创建一个新的套接字并绑定它?我可以将多个 IP 地址绑定到单个套接字吗? IPAddress.Any 是否监听所有 IP 地址? MSDN 库在这个问题上非常不清楚。
【问题讨论】:
标签: c# networking sockets
您不能将单个套接字绑定到多个端点。 SocketException(无效参数错误)在您第二次为给定套接字调用 Bind() 时发生。
正如其他人所说,您可以使用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 堆栈。将 socket 选项设置为 false 会告诉 Windows 不将自身限制在 IPv6 堆栈上,而是还要侦听 IPv4 堆栈。默认是只监听明确指定的栈。
【讨论】:
是的,IPAddress.Any 将侦听所有接口。
http://msdn.microsoft.com/en-us/library/system.net.ipaddress.any.aspx
【讨论】:
MSDN 库在 IPAddress.Any 方面似乎确实矛盾。绑定文档
http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.bind.aspx
表示选择了“最合适”的地址,但 IPAddress.Any 文档
http://msdn.microsoft.com/en-us/library/system.net.ipaddress.any.aspx
表示使用此常量,套接字必须侦听所有接口上的活动。
但是,有人告诉我这是 IPAddress。任何文档都是正确的。
(添加这个作为答案,因为我没有足够的代表离开 cmets)。
【讨论】: