使用 NetworkInterface.GetAllNetworkInterfaces 遍历物理网卡获取局域网IP 获取本机局域网IP地址,一个更可靠的方法是调用 NetworkInterface.GetAllNetworkInterfaces() 方法。通过遍历所有网络接口,筛选出状态为启用(Op
获取本机局域网IP地址,一个更可靠的方法是调用 NetworkInterface.GetAllNetworkInterfaces() 方法。通过遍历所有网络接口,筛选出状态为启用(OperationalStatus.Up)且类型为有线以太网(Ethernet)或无线网络(Wireless80211)的物理网卡。随后,从这些网卡中提取其IPv4单播地址,并使用一个私有地址判断函数(IsIPv4Private)来验证该地址是否属于 10.0.0.0/8、172.16.0.0/12 或 192.168.0.0/16 这三个标准的私有地址段。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
直接使用 Dns.GetHostAddresses(Dns.GetHostName()) 看似直接,但存在一个常见问题:它可能返回 127.0.0.1 或IPv6回环地址,这些并非有效的局域网IP。更稳妥的做法是分两步:首先获取本机所有IP地址,然后从中过滤出符合IPv4协议、非回环地址、非未分配地址(0.0.0.0),并且位于私有地址段内的地址。
标准的私有地址段即以下三个:10.0.0.0/8、172.16.0.0/12、192.168.0.0/16,它们是局域网IP的有效范围。
在实际操作中,可以参考以下建议避免常见错误:
127.0.0.1。NetworkInterface.GetAllNetworkInterfaces() 方法更为可靠,因为它能明确区分物理网卡、虚拟网卡以及已禁用的接口。OperationalStatus.Up 状态和 NetworkInterfaceType.Ethernet 或 Wireless80211 类型,主动排除回环(Loopback)、隧道(Tunnel)或未知(Unknown)类型的接口。这是目前最可控且精细的方法。核心流程是遍历所有启用的网络适配器,逐一检查其 UnicastAddresses 集合,并从中挑选出符合条件的IPv4地址。
整个流程包含几个关键判断条件:
OperationalStatus.Up。Loopback、Tunnel、Ppp 等通常不承载局域网流量的类型。AddressFamily.InterNetwork(即IPv4),并且通过自定义的 IsIPv4Private(address) 函数判断为私有地址。以下是一个判断IPv4地址是否为私有地址的示例函数:
static bool IsIPv4Private(IPAddress addr)
{
var bytes = addr.GetAddressBytes();
return bytes[0] == 10 ||
(bytes[0] == 172 && bytes[1] >= 16 && bytes[1] <= 31) ||
(bytes[0] == 192 && bytes[1] == 168);
}
有时代码逻辑正确却无法获取IP地址,问题通常出在运行环境或系统状态:
--network host 模式或未挂载 /sys/class/net 目录,则可能无法获取信息。NetworkInterface 相关API可能无法枚举到真实的网络适配器。vEthernet (WSL) 适配器,其IPv4地址是内部网络地址(如 172.x.x.x),并非宿主机的真实物理网卡IP。一台机器同时拥有多个有效局域网IP的情况很常见,例如同时连接有线网络和Wi-Fi,或开启了移动热点。此时,若简单地取返回列表中的第一个IP,可靠性会很低。
NetworkInterface.NetworkInterfaceType 和 NetworkInterface.Description 属性(其中可能包含 “Ethernet”、“Realtek”、“Intel”、“Wi-Fi”、“Wireless” 等关键词)来辅助判断。HttpListener 或 Kestrel),更推荐使用 IPAddress.Any(即 0.0.0.0)来绑定所有可用接口,而非绑定到某个具体IP,这样可以避免因特定网卡不可用而导致的绑定失败。127.0.0.1。获取IP地址本身往往并非最复杂的环节。真正的挑战在于获取后如何理解与解释它——同一个IP地址,在不同的网络拓扑和防火墙规则下,对客户端而言可能完全不可达。这一点恰恰是最容易被忽视的关键所在。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述