C#实现HMAC
作者:岸上的鱼 日期:2009-03-25
C#读取QQWry.Dat文件实现IP查询
作者:岸上的鱼 日期:2008-11-12
using System;
using System.IO;
using System.Collections;
using System.Text;
using System.Text.RegularExpressions;
namespace PPTech.WebSite.BusinessRules
{
/**//// <summary>
/// to scan the ip location from qqwry.dat
/// </summary>
public class IPScaner
{
私有成员#region 私有成员
private string dataPath;
private string ip;
private string country;
private string local;
private long firstStartIp=0;
private long lastStartIp=0;
private FileStream objfs = null;
private long startIp=0;
private long endIp=0;
private int countryFlag=0;
private long endIpOff=0;
private string errMsg=null;
#endregion
构造函数#region 构造函数
public IPScaner()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
#endregion
公共属性#region 公共属性
public string DataPath
{
set{dataPath=value;}
}
public string IP
{
set{ip=value;}
}
public string Country
{
get{return country;}
}
public string Local
{
get{return local;}
}
public string ErrMsg
{
get{return errMsg;}
}
#endregion
搜索匹配数据#region 搜索匹配数据
private int QQwry()
{
string pattern = @"(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))";
Regex objRe = new Regex(pattern);
Match objMa = objRe.Match(ip);
if(!objMa.Success)
{
this.errMsg="IP格式错误";
return 4;
}
long ip_Int = this.IpToInt(ip);
int nRet=0;
if(ip_Int>=IpToInt("127.0.0.0")&&ip_Int<=IpToInt("127.255.255.255"))
{
this.country="本机内部环回地址";
this.local="";
nRet=1;
}
else if((ip_Int>=IpToInt("0.0.0.0")&&ip_Int<=IpToInt("2.255.255.255"))||(ip_Int>=IpToInt("64.0.0.0")&&ip_Int<=IpToInt("126.255.255.255"))||(ip_Int>=IpToInt("58.0.0.0")&&ip_Int<=IpToInt("60.255.255.255")))
{
this.country="网络保留地址";
this.local="";
nRet=1;
}
objfs = new FileStream(this.dataPath, FileMode.Open, FileAccess.Read);
try
{
//objfs.Seek(0,SeekOrigin.Begin);
objfs.Position=0;
byte[] buff = new Byte[8] ;
objfs.Read(buff,0,8);
firstStartIp=buff[0]+buff[1]*256+buff[2]*256*256+buff[3]*256*256*256;
lastStartIp=buff[4]*1+buff[5]*256+buff[6]*256*256+buff[7]*256*256*256;
long recordCount=Convert.ToInt64((lastStartIp-firstStartIp)/7.0);
if(recordCount<=1)
{
country="FileDataError";
objfs.Close();
return 2;
}
long rangE=recordCount;
long rangB=0;
long recNO=0;
while(rangB<rangE-1)
{
recNO=(rangE+rangB)/2;
this.GetStartIp(recNO);
if(ip_Int==this.startIp)
{
rangB = recNO;
break;
}
if(ip_Int>this.startIp)
rangB=recNO;
else
rangE=recNO;
}
this.GetStartIp(rangB);
this.GetEndIp();
if(this.startIp<=ip_Int&&this.endIp>=ip_Int)
{
this.GetCountry();
this.local=this.local.Replace("(我们一定要解放台湾!!!)","");
}
else
{
nRet=3;
this.country="未知";
this.local="";
}
objfs.Close();
return nRet;
}
catch
{
return 1;
}
}
#endregion
IP地址转换成Int数据#region IP地址转换成Int数据
private long IpToInt(string ip)
{
char[] dot = new char[]{’.’};
string [] ipArr = ip.Split(dot);
if(ipArr.Length==3)
ip=ip+".0";
ipArr=ip.Split(dot);
long ip_Int=0;
long p1=long.Parse(ipArr[0])*256*256*256;
long p2=long.Parse(ipArr[1])*256*256;
long p3=long.Parse(ipArr[2])*256;
long p4=long.Parse(ipArr[3]);
ip_Int=p1+p2+p3+p4;
return ip_Int;
}
#endregion
int转换成IP#region int转换成IP
private string IntToIP(long ip_Int)
{
long seg1=(ip_Int&0xff000000)>>24;
if(seg1<0)
seg1+=0x100;
long seg2=(ip_Int&0x00ff0000)>>16;
if(seg2<0)
seg2+=0x100;
long seg3=(ip_Int&0x0000ff00)>>8;
if(seg3<0)
seg3+=0x100;
long seg4=(ip_Int&0x000000ff);
if(seg4<0)
seg4+=0x100;
string ip=seg1.ToString()+"."+seg2.ToString()+"."+seg3.ToString()+"."+seg4.ToString();
return ip;
}
#endregion
获取起始IP范围#region 获取起始IP范围
private long GetStartIp(long recNO)
{
long offSet = firstStartIp+recNO*7;
//objfs.Seek(offSet,SeekOrigin.Begin);
objfs.Position=offSet;
byte [] buff = new Byte[7];
objfs.Read(buff,0,7);
endIpOff=Convert.ToInt64(buff[4].ToString())+Convert.ToInt64(buff[5].ToString())*256+Convert.ToInt64(buff[6].ToString())*256*256;
startIp=Convert.ToInt64(buff[0].ToString())+Convert.ToInt64(buff[1].ToString())*256+Convert.ToInt64(buff[2].ToString())*256*256+Convert.ToInt64(buff[3].ToString())*256*256*256;
return startIp;
}
#endregion
获取结束IP#region 获取结束IP
private long GetEndIp()
{
//objfs.Seek(endIpOff,SeekOrigin.Begin);
objfs.Position=endIpOff;
byte [] buff = new Byte[5];
objfs.Read(buff,0,5);
this.endIp=Convert.ToInt64(buff[0].ToString())+Convert.ToInt64(buff[1].ToString())*256+Convert.ToInt64(buff[2].ToString())*256*256+Convert.ToInt64(buff[3].ToString())*256*256*256;
this.countryFlag=buff[4];
return this.endIp;
}
#endregion
获取国家/区域偏移量#region 获取国家/区域偏移量
private string GetCountry()
{
switch(this.countryFlag)
{
case 1:
case 2:
this.country=GetFlagStr(this.endIpOff+4);
this.local=( 1 == this.countryFlag )?" ":this.GetFlagStr(this.endIpOff+8);
break;
default:
this.country=this.GetFlagStr(this.endIpOff+4);
this.local=this.GetFlagStr(objfs.Position);
break;
}
return " ";
}
#endregion
获取国家/区域字符串#region 获取国家/区域字符串
private string GetFlagStr(long offSet)
{
int flag=0;
byte [] buff = new Byte[3];
while(1==1)
{
//objfs.Seek(offSet,SeekOrigin.Begin);
objfs.Position=offSet;
flag = objfs.ReadByte();
if(flag==1||flag==2)
{
objfs.Read(buff,0,3);
if(flag==2)
{
this.countryFlag=2;
this.endIpOff=offSet-4;
}
offSet=Convert.ToInt64(buff[0].ToString())+Convert.ToInt64(buff[1].ToString())*256+Convert.ToInt64(buff[2].ToString())*256*256;
}
else
{
break;
}
}
if(offSet<12)
return " ";
objfs.Position=offSet;
return GetStr();
}
#endregion
GetStr#region GetStr
private string GetStr()
{
byte lowC=0;
byte upC=0;
string str="";
byte[] buff = new byte[2];
while(1==1)
{
lowC= (Byte)objfs.ReadByte();
if(lowC==0)
break;
if(lowC>127)
{
upC=(byte)objfs.ReadByte();
buff[0]=lowC;
buff[1]=upC;
System.Text.Encoding enc = System.Text.Encoding.GetEncoding("GB2312");
str+=enc.GetString(buff);
}
else
{
str+=(char)lowC;
}
}
return str;
}
#endregion
获取IP地址#region 获取IP地址
public string IPLocation()
{
this.QQwry();
return this.country+this.local;
}
public string IPLocation(string dataPath,string ip)
{
this.dataPath=dataPath;
this.ip=ip;
this.QQwry();
return this.country+this.local;
}
#endregion
}
}
调用方式:
测试地址搜索#region 测试地址搜索
IPScaner objScan = new IPScaner();
string ip="221.224.205.13";
objScan.DataPath=@"E:\个人资料\IMTools\QQwryUpdate\QQWry.Dat";
objScan.IP=ip;
string addre=objScan.IPLocation();
string err=objScan.ErrMsg;
#endregion
在C#中编写多线程应用程序。
作者:岸上的鱼 日期:2008-04-12
以前在使用VB来实现多线程的时候,发现有一定的难度。虽然也有这样那样的方法,但都不尽人意,但在C#中,要编写多线程应用程序却相当的简单。这篇文章将作简要的介绍,以起到抛砖引玉的作用!
.NET将关于多线程的功能定义在System.Threading名字空间中。因此,要使用多线程,必须先声明引用此名字空间(using System.Threading;)。
即使你没有编写多线程应用程序的经验,也可能听说过“启动线程”“杀死线程”这些词,其实除了这两个外,涉及多线程方面的还有诸如“暂停线程”“优先级”“挂起线程”“恢复线程”等等。下面将一个一个的解释。
a.启动线程
顾名思义,“启动线程”就是新建并启动一个线程的意思,如下代码可实现:
Thread thread1 = new Thread(new ThreadStart( Count));
其中的 Count 是将要被新线程执行的函数。
b.杀死线程
“杀死线程”就是将一线程斩草除根,为了不白费力气,在杀死一个线程前最好先判断它是否还活着(通过 IsAlive 属性),然后就可以调用 Abort 方法来杀死此线程。
c.暂停线程
它的意思就是让一个正在运行的线程休眠一段时间。如 thread.Sleep(1000); 就是让线程休眠1秒钟。
d.优先级
这个用不着解释了。Thread类中有一个ThreadPriority属性,它用来设置优先级,但不能保证操作系统会接受该优先级。一个线程的优先级可分为5种:Normal, AboveNormal, BelowNormal, Highest, Lowest。具体实现例子如下:
thread.Priority = ThreadPriority.Highest;
e.挂起线程
Thread类的Suspend方法用来挂起线程,知道调用Resume,此线程才可以继续执行。如果线程已经挂起,那就不会起作用。
if (thread.ThreadState = ThreadState.Running)
{
thread.Suspend();
}
f.恢复线程
用来恢复已经挂起的线程,以让它继续执行,如果线程没挂起,也不会起作用。
if (thread.ThreadState = ThreadState.Suspended)
{
thread.Resume();
}
下面将列出一个例子,以说明简单的线程处理功能。此例子来自于帮助文档。
using System;
using System.Threading;
// Simple threading scenario: Start a static method running
// on a second thread.
public class ThreadExample {
// The ThreadProc method is called when the thread starts.
// It loops ten times, writing to the console and yielding
// the rest of its time slice each time, and then ends.
public static void ThreadProc() {
for (int i = 0; i < 10; i++) {
Console.WriteLine("ThreadProc: {0}", i);
// Yield the rest of the time slice.
Thread.Sleep(0);
}
}
public static void Main() {
Console.WriteLine("Main thread: Start a second thread.");
// The constructor for the Thread class requires a ThreadStart
// delegate that represents the method to be executed on the
// thread. C# simplifies the creation of this delegate.
Thread t = new Thread(new ThreadStart(ThreadProc));
// Start ThreadProc. On a uniprocessor, the thread does not get
// any processor time until the main thread yields. Uncomment
// the Thread.Sleep that follows t.Start() to see the difference.
t.Start();
//Thread.Sleep(0);
for (int i = 0; i < 4; i++) {
Console.WriteLine("Main thread: Do some work.");
Thread.Sleep(0);
}
Console.WriteLine("Main thread: Call Join(), to wait until ThreadProc ends.");
t.Join();
Console.WriteLine("Main thread: ThreadProc.Join has returned. Press Enter to end program.");
Console.ReadLine();
}
}
此代码产生的输出类似如下内容:
Main thread: Start a second thread. Main thread: Do some work. ThreadProc: 0 Main thread: Do some work. ThreadProc: 1 Main thread: Do some work. ThreadProc: 2 Main thread: Do some work. ThreadProc: 3 Main thread: Call Join(), to wait until ThreadProc ends. ThreadProc: 4 ThreadProc: 5 ThreadProc: 6 ThreadProc: 7 ThreadProc: 8 ThreadProc: 9 Main thread: ThreadProc.Join has returned. Press Enter to end program.