C#获取局域网IP与公网IP的两种实现方式

顾言
顾言
发布时间:2026-10-14 | 2人浏览过
原创

在C#开发中,获取本机IP地址通常分为局域网IP(内网)和公网IP(外网)两种需求。前者可通过本地DNS解析实现,后者需请求外部服务接口。本文将提供获取这两种IP地址的核心代码片段及注意事项。

获取局域网IP地址

局域网IP是机器在当前本地网络中的标识。通过 Dns.GetHostEntry 方法可以获取主机对应的所有IP地址列表。需要注意的是,返回列表中可能包含IPv6地址或虚拟网卡地址,因此需要遍历判断是否为IPv4类型。

第1步:实现基础IP获取方法

该方法利用 Dns.Resolve 或 Dns.GetHostEntry 获取 IPAddress[] 数组,从中筛选出 IPv4 地址。以下代码展示了如何从列表中获取第一个有效的IPv4地址作为局域网IP:

using System;
using System.Net;
using System.Net.Sockets;

public string GetLocalIPAddress()
{
    IPHostEntry host;
    string localIP = "";
    
    host = Dns.GetHostEntry(Dns.GetHostName());
    
    foreach (IPAddress ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork)
        {
            localIP = ip.ToString();
            break;
        }
    }
    return localIP;
}

此方法依赖于本地配置,若有多块网卡(如WiFi、有线、虚拟机),结果可能取决于路由优先级或枚举顺序,通常第一个IPv4地址即为当前活跃的主局域网IP。

获取公网IP地址

公网IP是互联网上识别你设备的地址,通常由路由器NAT转换得出。由于本地系统无法直接获取此信息,必须通过访问支持返回客户端IP的第三方HTTP服务来实现。

第2步:请求第三方IP查询接口

可以使用 System.Net.HttpWebRequest 请求常见的IP查询网址(如 http://www.ip138.com/ip2city.asp 或 https://ip.seeip.org/)。服务器会返回纯文本或HTML格式的响应,其中包含用户的公网IP。

using System;
using System.IO;
using System.Net;
using System.Text;

public string GetPublicIPAddress()
{
    try
    {
        // 使用一个简单的文本类API,避免解析复杂HTML
        string url = "http://myexternalip.com/raw";
        WebRequest request = WebRequest.Create(url);
        using (WebResponse response = request.GetResponse())
        using (Stream stream = response.GetResponseStream())
        using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
        {
            string result = reader.ReadToEnd().Trim();
            // 验证是否为合法IP格式可进一步处理
            return result;
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"获取公网IP失败: {ex.Message}");
        return "";
    }
}

原文中使用的 ip138.com 接口返回格式为 HTML 片段(如 "您的IP地址是:[x.x.x.x]"),需要使用 IndexOf 和 Substring 配合正则或字符串替换进行清洗。但更稳定的做法是使用返回纯文本的 API(如上述 raw 路径),减少解析出错的风险。

完整调用与注意事项

将上述两个方法集成到项目中时,请注意以下几点:

  • 命名空间引入:确保文件头部包含 using System.Net; 和 using System.Net.Sockets;。
  • 异常处理:网络请求存在超时或不可达风险,务必使用 try-catch 包裹外部调用代码。
  • 防火墙设置:获取公网IP需要出站HTTP权限,企业内网防火墙可能会拦截此类请求。

第3步:组合使用与结果验证

在实际业务逻辑中,可以根据需求分别调用这两个函数。例如,在P2P连接或内网穿透场景中,可能需要同时记录局域网IP以便内网直连,以及公网IP以便向对端注册。

总结

C#中获取IP地址主要依赖 System.Net.Dns 类和 HTTP 请求能力。局域网IP通过本地主机名解析获得,速度快且无需网络连通性;公网IP需借助外部Web服务,稳定性取决于第三方接口的可用性。开发者应根据实际网络环境和安全性要求选择合适的实现方式。

以上就是C#获取本机局域网IP和公网IP地址的详细内容,更多关于C#网络编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表