首页 > 编程语言 >C#怎么获取本机的局域网IP_C#如何读取网络适配器【干货】

C#怎么获取本机的局域网IP_C#如何读取网络适配器【干货】

来源:互联网 2026-04-16 10:33:01

使用 NetworkInterface.GetAllNetworkInterfaces 遍历物理网卡获取局域网IP 获取本机局域网IP地址,一个更可靠的方法是调用 NetworkInterface.GetAllNetworkInterfaces() 方法。通过遍历所有网络接口,筛选出状态为启用(Op

使用 NetworkInterface.GetAllNetworkInterfaces 遍历物理网卡获取局域网IP

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

C#怎么获取本机的局域网IP_C#如何读取网络适配器【干货】

长期稳定更新的攒劲资源: >>>点此立即查看<<<

使用 Dns.GetHostAddresses 获取局域网IP的注意事项

直接使用 Dns.GetHostAddresses(Dns.GetHostName()) 看似直接,但存在一个常见问题:它可能返回 127.0.0.1 或IPv6回环地址,这些并非有效的局域网IP。更稳妥的做法是分两步:首先获取本机所有IP地址,然后从中过滤出符合IPv4协议、非回环地址、非未分配地址(0.0.0.0),并且位于私有地址段内的地址。

标准的私有地址段即以下三个:10.0.0.0/8172.16.0.0/12192.168.0.0/16,它们是局域网IP的有效范围。

在实际操作中,可以参考以下建议避免常见错误:

  • 避免过度依赖主机名解析,系统配置(如hosts文件)可能将其指向 127.0.0.1
  • 相比之下,NetworkInterface.GetAllNetworkInterfaces() 方法更为可靠,因为它能明确区分物理网卡、虚拟网卡以及已禁用的接口。
  • 筛选时,优先检查网卡的 OperationalStatus.Up 状态和 NetworkInterfaceType.EthernetWireless80211 类型,主动排除回环(Loopback)、隧道(Tunnel)或未知(Unknown)类型的接口。

通过 NetworkInterface 枚举适配器提取 IPv4 地址

这是目前最可控且精细的方法。核心流程是遍历所有启用的网络适配器,逐一检查其 UnicastAddresses 集合,并从中挑选出符合条件的IPv4地址。

整个流程包含几个关键判断条件:

  • 适配器的运行状态必须为 OperationalStatus.Up
  • 适配器类型应排除 LoopbackTunnelPpp 等通常不承载局域网流量的类型。
  • IP地址本身需满足:地址族为 AddressFamily.InterNetwork(即IPv4),并且通过自定义的 IsIPv4Private(address) 函数判断为私有地址。
  • 需要特别注意,虚拟网卡(如VMware、Docker、WSL2创建的)也会提供IPv4地址。是否排除它们取决于具体业务需求——例如,若只需物理有线或无线网卡的IP,则需进行额外过滤。

以下是一个判断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);
}

GetAllNetworkInterfaces 返回空IP列表的原因分析

有时代码逻辑正确却无法获取IP地址,问题通常出在运行环境或系统状态:

  • 在 .NET Core / .NET 5+ 跨平台运行时,Linux或macOS环境下需确保进程有读取网络接口信息的权限。虽然在Linux上通常无需特殊权限,但在Docker容器内运行时,若未使用 --network host 模式或未挂载 /sys/class/net 目录,则可能无法获取信息。
  • 在Windows系统上,若“网络连接”服务(Network Connections service)被禁用,NetworkInterface 相关API可能无法枚举到真实的网络适配器。
  • 某些精简版或嵌入式系统(如Windows Nano Server、IoT Core)可能不支持完整的网络接口API,调用后会返回空数组。
  • 对于WSL2用户,需注意其默认使用虚拟NAT网络。在Windows宿主机上看到的对应 vEthernet (WSL) 适配器,其IPv4地址是内部网络地址(如 172.x.x.x),并非宿主机的真实物理网卡IP。

生产环境如何选择正确的IP地址

一台机器同时拥有多个有效局域网IP的情况很常见,例如同时连接有线网络和Wi-Fi,或开启了移动热点。此时,若简单地取返回列表中的第一个IP,可靠性会很低。

  • 关于优先级,常见的经验是:有线网络(Ethernet)优先于无线网络(Wi-Fi),再优先于其他类型。可以通过检查 NetworkInterface.NetworkInterfaceTypeNetworkInterface.Description 属性(其中可能包含 “Ethernet”、“Realtek”、“Intel”、“Wi-Fi”、“Wireless” 等关键词)来辅助判断。
  • 若需绑定IP进行监听(例如使用 HttpListenerKestrel),更推荐使用 IPAddress.Any(即 0.0.0.0)来绑定所有可用接口,而非绑定到某个具体IP,这样可以避免因特定网卡不可用而导致的绑定失败。
  • 若必须选出一个“代表本机”的IP地址返回给外部调用方(例如在API响应中返回服务器地址),则务必记录日志并设计好回退(fallback)策略。例如,当无法查询到合适IP时,应返回null或抛出明确异常,而非硬性返回一个 127.0.0.1

获取IP地址本身往往并非最复杂的环节。真正的挑战在于获取后如何理解与解释它——同一个IP地址,在不同的网络拓扑和防火墙规则下,对客户端而言可能完全不可达。这一点恰恰是最容易被忽视的关键所在。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。