在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