·一周点击排行
·热点推荐
使用C#编写查询IP段功能的程序
发布时间:2008-1-28 16:21:00 浏览次数: 766
本文将通过一个实例来向大家讲解如何使用C#来编写一个具备查询IP段功能的小程序。
主要功能:查询一个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;
/**////
/// IP段名称
///
public string Name
{
get { return _Name; }
set { _Name = value; }
}
/**////
/// ?始IP
///
public ulong BeginIP
{
get { return _BeginIP; }
set { _BeginIP = value; }
}
/**////
/// ?束IP
///
public ulong EndIP
{
get { return _EndIP; }
set { _EndIP = value; }
}
/**////
/// 此IP段的范?
///
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.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;
}
}
}
设计模式不是什么很高深的东西,有了这些知识大胆地学习吧。很多人说,看了很多设计模式的文章,为什么就是看不懂呢?我觉得原因可能有两个,第一就是你没有花时间认真看,第二就是看的文章不适合作为切入点。不管学习什么,切入点非常重要,如果切入点不是那么平易近人的话很可能会把你拒之门外,对于初学者来说从实例切入最合适。最好是能碰到自己做过的项目的实例作为切入点,这样你一比较就知道为什么设计模式好了。
如果要把设计模式的学习境界分一下级的话,我这么分:
l 第一重:能看懂设计模式的文章
l 第二重:能自己写一个设计模式的骨架
l 第三重:能自己编一个新的运用设计模式的例子
l 第四重:能在写代码的时候想到似乎有设计模式适合,在翻阅资料后找到了这种设计模式
l 第五重:在理解项目的需求后就能意识到哪里可以使用哪种设计模式进行优化
l 第六重:完全掌握了设计模式的精髓,灵活使用各种设计模式以及其变种
不管怎么样,多看多做多替换才是学习的办法,别人举例十个都不及自己做一个例子,被动十个原则都不及自己体会出一个原则。每一种设计模式虽然都有一个骨架,但是也不必过于强调这个形式,很多时候根据自己的需求简化一点,改变一点,或者混杂一些其它的设计模式,只要能实现目的了,也是一个不错的选择。
很多人会觉得这么多种设计模式没有几种能用得上。我觉得这不是什么问题,用不上那就用不上,这些设计模式是大师经历无数大型项目后的精华,如果能在自己做的一个小项目中用上两三个就很不错了,用上二三十个的项目绝对是怪胎。用不上千万别强求,否则既不利于项目的可维护性又增加了工作量。
还有很多人会觉得这些设计模式很多都是相似的。而且每个人的感觉还不一样,有人觉得A和B很相似,有人却觉得A和B很好区分,但是B和C却很相似啊。感觉很好区分,说明你看准设计模式的着重点的,感觉一样说明你看到的还是它的形。双胞胎虽然形一样,但是神肯定不一样的,只要认准设计模式解决的问题,就不会看错。
关于本系列文章
本来这些内容都是用来进行公司内部每周知识分享活动的,既然有一些内容了,想想不妨就整理一下贴出来吧。也正由于这个原因,文章中的一些例子都基于团队内部成员所能理解的一些项目,可能这些项目对大家来说比较陌生,不过好处是例子相对比较贴近实际一点。本系列一共有20篇左右,除了介绍23种GOF设计模式中常用的一部分之外(一些设计模式的思想在C#语言中有了更简单的实现,一些设计模式不是很常用)还可能会介绍一些其它有用的设计模式。在这些文章中,我不会过多去说一些理论上的东西,也不会有结构图(这些内容网上到处都是),所有的内容都是围绕相对实际例子展开。我想,只有这样才能更快的吸收设计模式的神而不是其形。在看文章的时候建议你结合《设计模式》一书以及博客园的其它设计模式相关文章一起看,这样才能对设计模式理解的全面和充分一点。
每一篇文章都会有以下部分:
l 意图:抄设计模式一书的,因为意图实在是太重要,所以不得不首先列出。
l 场景:以一个实际的场景来说明为什么要引入设计模式。
讨论此主题请进>>: 使用C#编写查询IP段功能的程序