zoukankan      html  css  js  c++  java
  • 查询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;
            }



        }





    }


  • 相关阅读:
    Source InSight context 窗口丢失的解决办法
    [EffectiveC++]item41:了解隐式接口和编译器多态
    [EffectiveC++]item04:Make sure the objects are initialized before they're used
    [EffectiveC++]item3:尽可能使用const
    linux man指令问题
    解读ARM成功秘诀:薄利多销推广产品
    source insight设置问题 [问题点数:20分,结帖人leecapacity]
    totalcommander
    firefox
    处理SecureCRT中使用vim出现中文乱码问题
  • 原文地址:https://www.cnblogs.com/evlon/p/752038.html
Copyright © 2011-2022 走看看