导读:本期聚焦于小伙伴创作的《C#如何获取本机IP地址并判断IP是否在特定区间内》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#如何获取本机IP地址并判断IP是否在特定区间内》有用,将其分享出去将是对创作者最好的鼓励。

在C#开发中,获取本机IP地址以及判断某个IP是否处于指定区间是常见的网络处理需求,比如内网权限校验、区域设备识别等场景都会用到相关逻辑,下面会逐步讲解实现方法并给出完整示例代码。

C#如何获取本机IP地址并判断IP是否在特定区间内

获取本机IP地址的实现方法

获取本机IP地址需要借助System.Net.NetworkInformation命名空间下的NetworkInterface类,遍历所有网络接口过滤掉非活动、回环的接口,再提取对应的单播地址即可,具体代码如下:

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;

public class IpHelper
{
    /// <summary>
    /// 获取本机所有IPv4地址
    /// </summary>
    /// <returns>IPv4地址列表</returns>
    public static List<string> GetLocalIpv4Addresses()
    {
        List<string> ipList = new List<string>();
        // 获取所有网络接口
        NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
        foreach (NetworkInterface ni in interfaces)
        {
            // 过滤非活动、回环、隧道类型的接口
            if (ni.OperationalStatus != OperationalStatus.Up) continue;
            if (ni.NetworkInterfaceType == NetworkInterfaceType.Loopback) continue;
            if (ni.NetworkInterfaceType == NetworkInterfaceType.Tunnel) continue;

            // 获取接口的单播地址
            UnicastIPAddressInformationCollection ipCollection = ni.GetIPProperties().UnicastAddresses;
            foreach (UnicastIPAddressInformation ipInfo in ipCollection)
            {
                // 只取IPv4地址
                if (ipInfo.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                {
                    ipList.Add(ipInfo.Address.ToString());
                }
            }
        }
        return ipList;
    }
}

IP地址转整数的实现逻辑

要判断IP是否在区间内,不能直接用字符串比较,需要将IP地址转换为对应的整数,再比较整数的大小。IPv4地址是32位,每一段对应8位,转换逻辑如下:

/// <summary>
/// 将IPv4地址转换为整数
/// </summary>
/// <param name="ip">IPv4地址字符串</param>
/// <returns>对应的整数,转换失败返回-1</returns>
public static long IpToLong(string ip)
{
    if (string.IsNullOrEmpty(ip)) return -1;
    // 校验IP格式
    if (!IPAddress.TryParse(ip, out IPAddress ipAddr)) return -1;
    if (ipAddr.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork) return -1;

    byte[] bytes = ipAddr.GetAddressBytes();
    // 按高位到低位拼接成整数,避免字节序问题
    long result = (long)bytes[0] << 24 | (long)bytes[1] << 16 | (long)bytes[2] << 8 | bytes[3];
    return result;
}

判断IP是否在区间内的实现

有了IP转整数的方法后,只需要将待判断的IP、区间起始IP、区间结束IP都转为整数,比较大小即可完成判断,代码如下:

/// <summary>
/// 判断IP是否在指定区间内(包含边界)
/// </summary>
/// <param name="targetIp">待判断的IP地址</param>
/// <param name="startIp">区间起始IP</param>
/// <param name="endIp">区间结束IP</param>
/// <returns>在区间内返回true,否则返回false</returns>
public static bool IsIpInRange(string targetIp, string startIp, string endIp)
{
    long targetLong = IpToLong(targetIp);
    long startLong = IpToLong(startIp);
    long endLong = IpToLong(endIp);

    // 转换失败直接返回false
    if (targetLong == -1 || startLong == -1 || endLong == -1) return false;
    // 比较大小,包含边界
    return targetLong >= startLong && targetLong <= endLong;
}

完整调用示例

下面是调用上述方法的完整示例,展示如何获取本机IP并判断某个IP是否在区间内:

class Program
{
    static void Main(string[] args)
    {
        // 获取本机IPv4地址
        List<string> localIps = IpHelper.GetLocalIpv4Addresses();
        Console.WriteLine("本机IPv4地址列表:");
        foreach (string ip in localIps)
        {
            Console.WriteLine(ip);
        }

        // 判断IP是否在区间内
        string testIp = "192.168.1.100";
        string startIp = "192.168.1.1";
        string endIp = "192.168.1.255";
        bool isInRange = IpHelper.IsIpInRange(testIp, startIp, endIp);
        Console.WriteLine($"IP {testIp} 是否在 {startIp}-{endIp} 区间内:{isInRange}");
    }
}

注意事项

  • 获取本机IP时过滤了回环地址和非活动接口,避免获取到无用的地址,如果需要包含回环地址可以调整过滤条件。
  • IP转整数时使用左移运算拼接,避免不同系统字节序导致的问题,保证转换结果的一致性。
  • 判断区间前先校验IP格式,避免无效IP导致判断错误,实际使用时可以根据需求调整边界是否包含的逻辑。

C#IP地址获取IP区间判断NetworkInterfaceIPAddress修改时间:2026-06-07 01:19:01

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。