获取 TcpListener 自动分配的本地 IP 地址
Get auto-asigned local IP address of TcpListener
这是我的代码:
TcpListener listener = new TcpListener(IPAddress.Any, 0);
listener.Start();
var v = (IPEndPoint)listener.LocalEndpoint;
If you do not care which local address is assigned, specify
IPAddress.Any for the localaddr parameter, and the underlying service
provider will assign the most appropriate network address. ...If you
use this approach, you can discover what local network address and
port number has been assigned by using the LocalEndpoint property.
不幸的是,地址始终是 0.0.0.0。
如何找到 TcpListener
的实际本地 IP 地址?
编辑
代码 对端口有效。 v
确实分配了一个 特定的 端口。
在 IPAddress.Any
的文档中,states:
Socket.Bind 方法使用 Any 字段指示 Socket 实例必须在所有网络接口上侦听客户端 activity。
通过简单地用这个 属性 创建一个 TCPListener
,你告诉框架你不关心它使用哪个接口,只要在连接时选择最好的 ,之前没有。
为了让框架选择最好的一个,它需要一个客户端连接到它。当某物连接时,它会在那个时间为那个实例选择最好的一个。
下一个连接的客户端可能会获得相同的界面,或者,它可能会获得不同的界面,因为您选择了 IPAddress.Any
您在问题中陈述:
如果不关心分配哪个本地地址,localaddr参数指定IPAddress.Any,底层服务提供者会分配最合适的网络地址。 ...如果您使用这种方法,您可以通过使用 LocalEndpoint 属性.[=17 来发现已分配的本地网络地址和端口号 =]
这是你不理解的地方:
上面强调的是通过接受连接创建的 *Socket*
的 LocalEndpoint
-- 而不是监听 TCPListener
.
当然,文档在这一点上可能会更清楚——但是一旦您了解了侦听器的工作原理,就应该明白这一点。
除了 Andy 所说的关于 LocalEndpoint 具有每个传入连接的本地地址的所有内容之外,这是正确的,文档中的这个陈述完全错误:
the underlying service provider will assign the most appropriate network address
实际上,LocalEndpoint
会给你客户端发送 TCP SYN 数据包的地址。它将是您的网络地址之一,如果在没有首先将传出套接字绑定到特定本地地址的情况下启动到该客户端地址的连接,它通常是本地路由 table 会选择的地址,但它不会不必如此。
客户端,而不是 TCP/IP 堆栈,选择 IP 地址。
FWIW,该本地地址最终可能是您通过 System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()
找到的任何一个地址。它不限于您可以通过 Dns.GetHostEntry(Dns.GetHostName())
看到的那些,尽管在 DNS 中注册的地址最有可能在更大的网络上有用。由于网络连接的建立和断开以及动态分配地址 (DHCP) 的变化,可能的地址列表可能会发生变化。
System.Net.NetworkInformation.NetworkChange
class 可用于查找本地地址列表何时更新。
这是我的代码:
TcpListener listener = new TcpListener(IPAddress.Any, 0);
listener.Start();
var v = (IPEndPoint)listener.LocalEndpoint;
If you do not care which local address is assigned, specify IPAddress.Any for the localaddr parameter, and the underlying service provider will assign the most appropriate network address. ...If you use this approach, you can discover what local network address and port number has been assigned by using the LocalEndpoint property.
不幸的是,地址始终是 0.0.0.0。
如何找到 TcpListener
的实际本地 IP 地址?
编辑
代码 对端口有效。 v
确实分配了一个 特定的 端口。
在 IPAddress.Any
的文档中,states:
Socket.Bind 方法使用 Any 字段指示 Socket 实例必须在所有网络接口上侦听客户端 activity。
通过简单地用这个 属性 创建一个 TCPListener
,你告诉框架你不关心它使用哪个接口,只要在连接时选择最好的 ,之前没有。
为了让框架选择最好的一个,它需要一个客户端连接到它。当某物连接时,它会在那个时间为那个实例选择最好的一个。
下一个连接的客户端可能会获得相同的界面,或者,它可能会获得不同的界面,因为您选择了 IPAddress.Any
您在问题中陈述:
如果不关心分配哪个本地地址,localaddr参数指定IPAddress.Any,底层服务提供者会分配最合适的网络地址。 ...如果您使用这种方法,您可以通过使用 LocalEndpoint 属性.[=17 来发现已分配的本地网络地址和端口号 =]
这是你不理解的地方: 上面强调的是通过接受连接创建的 当然,文档在这一点上可能会更清楚——但是一旦您了解了侦听器的工作原理,就应该明白这一点。*Socket*
的 LocalEndpoint
-- 而不是监听 TCPListener
.
除了 Andy 所说的关于 LocalEndpoint 具有每个传入连接的本地地址的所有内容之外,这是正确的,文档中的这个陈述完全错误:
the underlying service provider will assign the most appropriate network address
实际上,LocalEndpoint
会给你客户端发送 TCP SYN 数据包的地址。它将是您的网络地址之一,如果在没有首先将传出套接字绑定到特定本地地址的情况下启动到该客户端地址的连接,它通常是本地路由 table 会选择的地址,但它不会不必如此。
客户端,而不是 TCP/IP 堆栈,选择 IP 地址。
FWIW,该本地地址最终可能是您通过 System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()
找到的任何一个地址。它不限于您可以通过 Dns.GetHostEntry(Dns.GetHostName())
看到的那些,尽管在 DNS 中注册的地址最有可能在更大的网络上有用。由于网络连接的建立和断开以及动态分配地址 (DHCP) 的变化,可能的地址列表可能会发生变化。
System.Net.NetworkInformation.NetworkChange
class 可用于查找本地地址列表何时更新。