首页 游戏 软件 资讯 排行榜 专题
首页
编程语言
C#怎么获取本机的局域网IP_C#如何读取网络适配器【干货】

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

热心网友
76
转载
2026-05-05

如何通过 NetworkInterface.GetAllNetworkInterfaces() 精准获取本机局域网 IP 地址

在 C# 开发中,准确获取本机局域网 IP 地址是一项常见需求。最可靠的方法是调用 NetworkInterface.GetAllNetworkInterfaces() 方法,遍历所有网络接口。我们需要筛选出状态为启用(OperationalStatus.Up)且类型为有线以太网(Ethernet)或无线局域网(Wireless80211)的物理网卡。随后,从这些网卡中提取 IPv4 单播地址,并使用一个私有地址判断函数(IsIPv4Private)来验证其是否属于标准的私有 IP 地址段,即 10.0.0.0/8172.16.0.0/12192.168.0.0/16。这种方法能有效排除虚拟网卡和无效连接。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

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

使用 Dns.GetHostAddresses 获取本机 IP 的注意事项与局限

许多开发者会尝试使用 Dns.GetHostAddresses(Dns.GetHostName()) 来获取本机 IP。这个方法看似直接,但存在一个典型陷阱:它很可能返回 127.0.0.1 这样的回环地址或 IPv6 地址,而这些并非我们需要的局域网 IP。正确的实践应分为两步:首先获取本机所有 IP 地址列表,然后进行精细过滤。过滤条件包括:协议为 IPv4(AddressFamily.InterNetwork)、非回环地址、非未指定地址(0.0.0.0),并且最终落在上述三大私有地址段内。

这三个私有地址段是局域网通信的基础:10.0.0.0/8172.16.0.0/12192.168.0.0/16。为确保获取成功,请注意以下要点:

  • 避免过度依赖主机名解析,因为系统 hosts 文件或 DNS 配置可能将其指向本地回环地址。
  • 相比之下,NetworkInterface.GetAllNetworkInterfaces() 方法更为可靠,它能明确区分物理网卡、虚拟网卡以及已禁用的网络接口。
  • 在筛选时,务必检查网卡的运行状态(OperationalStatus.Up)和类型,优先选择 EthernetWireless80211,并主动排除回环接口(Loopback)、隧道接口(Tunnel)等不承载真实局域网流量的类型。

详解使用 NetworkInterface 枚举适配器并提取有效 IPv4 地址

这是目前最推荐、控制粒度最细的 C# 获取本机 IP 方案。其核心流程是遍历所有网络适配器,逐一检查其单播地址集合(UnicastAddresses),并提取出符合条件的 IPv4 地址。

整个流程包含几个不可或缺的关键判断步骤:

  • 首先,适配器的运行状态必须为 OperationalStatus.Up,确保其为活动连接。
  • 其次,适配器类型需排除 LoopbackTunnelPpp 等通常不用于局域网通信的类型。
  • 对于每个 IP 地址,需满足两个条件:地址族为 AddressFamily.InterNetwork(即 IPv4),并且通过自定义的 IsIPv4Private(address) 函数验证为私有地址。
  • 需要特别注意,虚拟机(如 VMware、VirtualBox)、容器(如 Docker)或 WSL2 创建的虚拟网卡也会分配私有 IP。是否排除它们取决于具体应用场景——若只需物理网卡地址,则需进行额外过滤。

以下是一个高效的判断 IPv4 地址是否为私有地址的 C# 函数示例:

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 上运行时,需确保进程有权限读取网络接口信息。在 Docker 容器内运行时,若未使用 --network host 模式或未挂载必要的系统目录(如 /sys/class/net),也可能导致无法获取信息。
  • 在 Windows 系统上,如果“网络连接”服务(Network Connections service)未启动或被禁用,NetworkInterface API 可能无法枚举到真实的网络适配器。
  • 某些精简版或嵌入式操作系统(如 Windows Nano Server、IoT Core)可能未提供完整的网络接口 API 支持,调用后会返回空数组。
  • 对于 WSL2 用户,其默认使用虚拟 NAT 网络。在 Windows 宿主机上看到的 vEthernet (WSL) 适配器 IP 是内部网络地址,并非宿主机的物理网卡 IP,需要注意区分。

生产环境下的 IP 地址选择策略与最佳实践

在生产环境中,一台机器往往拥有多个有效的局域网 IP(例如同时连接有线网络和 Wi-Fi)。此时,简单地选取返回列表中的第一个 IP 是极不可靠的。

  • 优先级策略:一个通用的经验是,有线网络(Ethernet)的优先级通常高于无线网络(Wi-Fi),再高于其他类型。可以通过检查 NetworkInterfaceTypeDescription 属性(可能包含 “Ethernet”、“Realtek”、“Intel”、“Wi-Fi” 等关键词)来辅助决策。
  • 服务绑定场景:如果需要绑定 IP 地址进行监听(例如使用 HttpListener 或 Kestrel 服务器),强烈建议使用 IPAddress.Any0.0.0.0)来绑定所有可用接口,而非绑定到某个具体 IP,这样可以避免因特定网卡故障而导致服务不可用。
  • 对外提供 IP 地址:如果必须选出一个“代表本机”的 IP 地址返回给外部调用方(例如在微服务注册或 API 响应中),务必记录详细的日志,并设计健壮的回退(fallback)机制。例如,当无法找到合适 IP 时,应返回 null 或抛出明确的异常,而不是错误地返回 127.0.0.1

总而言之,获取 IP 地址本身的技术实现并不复杂。真正的难点在于获取之后如何根据复杂的网络拓扑和防火墙规则来正确解释和使用它。一个在服务器端可用的 IP,对客户端而言未必可达,这一点在分布式系统设计中至关重要,也是最容易被忽视的关键细节。

来源:https://www.php.cn/faq/2312597.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

c#如何绘制图形_c#绘制图形的正确用法与注意事项
编程语言
c#如何绘制图形_c#绘制图形的正确用法与注意事项

C 绘图避坑指南:从Graphics来源到DPI适配的实战要点 在C 中进行图形绘制,一个看似简单的DrawRectangle背后,往往藏着好几个“坑”。Graphics对象不能直接new,否则要么直接报错,要么静默失败——所有绘图操作都必须基于合法的来源。这可以说是入门绘图的第一条铁律。 Grap

热心网友
05.05
VSCode怎么搭建Unity 3D的C#脚本编写环境并解决找不到引用的问题
编程语言
VSCode怎么搭建Unity 3D的C#脚本编写环境并解决找不到引用的问题

VSCode怎么搭建Unity 3D的C 脚本编写环境并解决找不到引用的问题 在Unity开发中,用VSCode写C 脚本时遇到“找不到引用”的红色波浪线,这事儿确实挺让人头疼的。别急,这通常不是代码逻辑问题,而是开发环境之间的“沟通”出了岔子。下面咱们就来逐一拆解最常见的几个原因和对应的解决方案。

热心网友
05.04
C#如何使用Record类型_C#不可变数据模型特性解析【极简】
编程语言
C#如何使用Record类型_C#不可变数据模型特性解析【极简】

C Record类型:不可变数据容器的正确打开方式 先明确一个核心认知:C 中的Record类型,本质上是一个“省心”的不可变数据容器。它不是什么更高级的class,而是编译器帮你自动生成值相等性、ToString、GetHashCode以及with表达式的语法糖。用对了,它能帮你省掉80%的数据

热心网友
05.03
C#如何获取硬件信息_C# WMI读取CPU与硬盘序列号【进阶】
编程语言
C#如何获取硬件信息_C# WMI读取CPU与硬盘序列号【进阶】

WMI无法稳定读取现代CPU与NVMe硬盘序列号?问题不在代码,而在硬件与系统本身 一个常见的开发误区是:用WMI读取CPU和硬盘序列号,结果发现拿不到、拿不准或者拿到一堆乱码。问题往往不在于你的代码写错了,而是系统或固件层面,压根就没把这个“身份证号”暴露给你。 为什么 Win32_Process

热心网友
05.02
C#怎么防止UI线程假死_C#耗时操作放入后台线程更新UI【核心】
编程语言
C#怎么防止UI线程假死_C#耗时操作放入后台线程更新UI【核心】

C 怎么防止UI线程假死_C 耗时操作放入后台线程更新UI【核心】 耗时操作必须离开 UI 线程,否则假死不可避免 —— 这不是优化建议,而是 WinForms WPF 的运行铁律。 为什么直接在 Button_Click 里调用 Thread Sleep 就卡死? 道理其实很简单:UI 线程身兼数

热心网友
05.01

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

怎样用telnet管理网络设备
编程语言
怎样用telnet管理网络设备

使用Telnet管理网络设备:一份实用指南 在网络设备管理的众多工具中,Telnet堪称一位“资深元老”。它以简洁、直接的方式,让管理员能够从远程便捷地登录路由器或交换机的命令行界面。然而,必须首先明确一个关键点:Telnet协议本身缺乏安全保障,其传输的所有数据,包括用户名和密码,均以明文形式进行

热心网友
05.05
如何用telnet调试网络应用
编程语言
如何用telnet调试网络应用

使用Telnet调试网络应用:快速定位连接与协议问题 在网络应用开发与日常运维中,高效排查故障是必备技能。Telnet作为经典的网络协议工具,凭借其简洁的命令行交互方式,至今仍是测试端口连通性、验证服务响应及手动调试文本协议的实用选择。它无需图形界面,直接通过命令行揭示网络层的真实状态,是工程师手中

热心网友
05.05
如何利用cpustat进行系统监控
编程语言
如何利用cpustat进行系统监控

全面掌握系统性能:使用 cpustat 工具进行专业级 CPU 监控 在 Linux 系统性能优化与故障诊断过程中,CPU 使用率是至关重要的核心指标。作为 sysstat 工具集的重要组成部分,cpustat 命令为系统管理员和开发者提供了一种直接、高效且深入的 CPU 监控解决方案。本文将详细介

热心网友
05.05
cpustat如何辅助进行性能调优
编程语言
cpustat如何辅助进行性能调优

掌握cpustat:Linux系统性能监控与CPU调优的必备工具 在Linux服务器性能优化与故障排查过程中,CPU资源的使用状况通常是首要分析目标。除了广为人知的top和htop命令,cpustat是一款同样强大却常被忽略的专业级CPU监控利器。作为sysstat工具集的核心组件之一,它能够实时采

热心网友
05.05
如何用cpustat查看进程CPU使用情况
编程语言
如何用cpustat查看进程CPU使用情况

使用 cpustat 监控进程 CPU 使用情况 在 Linux 系统性能调优与故障排查过程中,精准监控 CPU 使用率是至关重要的基础技能。cpustat 作为 sysstat 工具集的核心组件之一,专门为深入洞察 CPU 资源分配与消耗而设计。它提供了超越常规系统监控命令的、聚焦于处理器性能的详

热心网友
05.05