查询IP所在区段

编程语言:C#
类    别:(网络应用,实用算法)
主要功能:查询一个IP所有的IP段.
关键:从Byte数组到ulong的转换出来的数字和 IPAddress.Address 返回值的是不一样的.

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Net;

namespace  IPUtility
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            IPRangeManage irm 
= new IPRangeManage();
            irm.Add(
new IPRange("石家庄""219.148.24.0""219.148.63.255"));
            irm.Add(
new IPRange("石家庄""222.222.0.0""222.222.63.255"));
            irm.Add(
new IPRange("唐山""219.148.64.0""219.148.79.255"));
            irm.Add(
new IPRange("保定""219.148.20.0""219.148.23.255"));

            Console.WriteLine(irm.Search(
"219.148.56.3").Name);

            Console.ReadLine();

        }



    }


    
public class IPRange 
    
{
        
private string _Name = string.Empty;

        
private ulong _BeginIP = 0;

        
private ulong _EndIP = Int32.MaxValue;

        
/// <summary>
        
/// IP段名称
        
/// </summary>

        public string Name
        
{
            
get return _Name; }
            
set { _Name = value; }
        }


        
/// <summary>
        
/// 开始IP
        
/// </summary>

        public ulong BeginIP
        
{
            
get return _BeginIP; }
            
set { _BeginIP = value; }
        }


        
/// <summary>
        
/// 结束IP
        
/// </summary>

        public ulong EndIP
        
{
            
get return _EndIP; }
            
set { _EndIP = value; }
        }



        
/// <summary>
        
/// 此IP段的范围
        
/// </summary>

        public ulong Range
        
{
            
get
            
{
                
return EndIP - BeginIP;
            }

        }


        
public IPRange(string name, string ipBegin, string ipEnd)
        
{
            
this.Name = name;
            
this.BeginIP = IP2A(ipBegin);
            
this.EndIP = IP2A(ipEnd);
        }



        
public static ulong IP2A(string ip)
        
{
            
byte[] bytes = IPAddress.Parse(ip).GetAddressBytes();
            
ulong ret = 0;

            
foreach (byte b in bytes)
            
{
                ret 
<<= 8;
                ret 
|= b;
            }


            
return ret;

        }



        
public static int Compare(IPRange x, IPRange y)
        
{
            
if(x.Range == y.Range)
                
return 0;
            
else if(x.Range > y.Range)
                
return 1;
            
else return -1;
        }


    }


    
public class IPRangeManage
    
{
        
public IPRangeManage()
        
{ }

        
private List< IPRange> _IPRangeList = new List< IPRange>();
        
private bool _NeedSort = true;

        
public void Add(IPRange ipRange)
        
{
            _IPRangeList.Add(ipRange);
            _NeedSort 
= true;
        }


        
private void Sort()
        
{
            
if (_NeedSort)
            
{
                _IPRangeList.Sort(
new Comparison<IPRange>(IPRange.Compare));
            }

        }


        
public IPRange Search(string ipString)
        
{
            
ulong ip = IPRange.IP2A(ipString);

            
this.Sort();

            
foreach (IPRange ir in _IPRangeList)
            
{
                
if (ir.BeginIP <= ip && ir.EndIP >= ip)
                
{
                    
return ir;
                }

            }


            
return null;
        }



    }





}

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值