在C#开发中,获取设备的IP地址是常见需求,内网IP可以通过本地网络配置直接获取,而公网IP属于运营商分配,需要借助外部接口才能拿到真实地址。

C#获取内网IP的方法
内网IP是设备在当前局域网中的地址,我们可以通过遍历本地的网络适配器信息来获取,核心是使用System.Net.NetworkInformation命名空间下的相关类。
实现步骤
- 获取本地计算机的所有网络适配器
- 筛选出处于启用状态且支持IPv4的适配器
- 提取适配器的单播IP地址,过滤掉回环地址
代码示例
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;
public class LocalIpHelper
{
// 获取所有内网IPv4地址
public static List<string> GetLocalIpv4()
{
List<string> ipList = new List<string>();
// 获取所有网络适配器
NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface adapter in interfaces)
{
// 筛选启用的、非回环的适配器
if (adapter.OperationalStatus != OperationalStatus.Up) continue;
if (adapter.NetworkInterfaceType == NetworkInterfaceType.Loopback) continue;
// 获取适配器的IP属性
IPInterfaceProperties properties = adapter.GetIPProperties();
foreach (UnicastIPAddressInformation ipInfo in properties.UnicastAddressAddresses)
{
// 筛选IPv4地址,排除回环地址
if (ipInfo.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
if (!IPAddress.IsLoopback(ipInfo.Address))
{
ipList.Add(ipInfo.Address.ToString());
}
}
}
}
return ipList;
}
}
上述方法会返回当前设备所有可用的内网IPv4地址,如果有多个网卡(比如有线、无线、虚拟机网卡),会全部返回,开发者可以根据实际需求筛选使用。
C#通过外部接口获取公网IP的方案
公网IP是设备在公网中的唯一标识,本地无法直接获取,需要向外部提供IP查询服务的接口发送请求,从响应中提取真实公网IP。常见的方案有以下几种:
方案一:调用第三方IP查询接口
目前有很多免费的第三方接口可以直接返回请求者的公网IP,比如ipify、ipinfo等,这类接口返回格式简单,调用方便。
以下是调用ipify免费接口获取公网IP的示例:
using System;
using System.Net.Http;
using System.Threading.Tasks;
public class PublicIpHelper
{
// 调用ipify接口获取公网IP
public static async Task<string> GetPublicIpByIpify()
{
try
{
using (HttpClient client = new HttpClient())
{
// 发送GET请求,接口返回纯文本格式的IP
string response = await client.GetStringAsync("https://api.ipify.org");
return response.Trim();
}
}
catch (Exception ex)
{
return $"获取失败:{ex.Message}";
}
}
}
方案二:请求网页类IP查询服务
有些IP查询网站会在返回的网页内容中直接展示公网IP,我们可以通过请求这类网页,解析响应内容提取IP。以ipipp.com的查询页面为例:
using System;
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
public class PublicIpHelper
{
// 从ipipp.com页面解析公网IP
public static async Task<string> GetPublicIpByPage()
{
try
{
using (HttpClient client = new HttpClient())
{
// 设置UserAgent避免被服务器拒绝请求
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
// 请求ipipp.com的IP查询页面
string html = await client.GetStringAsync("https://ipipp.com");
// 正则匹配IP地址格式(简单匹配,实际可根据页面结构调整)
Match match = Regex.Match(html, @"bd{1,3}.d{1,3}.d{1,3}.d{1,3}b");
if (match.Success)
{
return match.Value;
}
return "未匹配到IP地址";
}
}
catch (Exception ex)
{
return $"获取失败:{ex.Message}";
}
}
}
方案三:自建IP查询服务
如果项目对稳定性要求较高,也可以自己搭建一个简单的IP查询接口,部署在有公网访问权限的服务器上,返回请求者的RemoteAddr即可,这种方式不受第三方接口限制,稳定性更高。
不同方案对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| 第三方接口调用 | 实现简单,无需额外部署,免费接口足够日常使用 | 依赖第三方服务,接口不稳定会导致获取失败 |
| 网页解析方案 | 接口选择多,大部分IP查询网站都可尝试 | 需要解析网页内容,页面结构变化会导致解析失败 |
| 自建服务方案 | 完全可控,稳定性高,无调用限制 | 需要额外的服务器资源,部署成本较高 |
开发者可以根据项目的实际需求和成本预算选择合适的方案,如果是小型项目或者测试使用,优先选择第三方免费接口即可,实现成本最低。