Tag: C#预览模式: 普通 | 列表

C#实现HMAC


using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;

查看更多...

Tags: C# .NET HMAC

分类:Programer | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 3545

C#读取QQWry.Dat文件实现IP查询

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  

Tags: C# .NET

分类:Programer | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 3321

在C#中编写多线程应用程序。

以前在使用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.

Tags: C# 多线程

分类:Programer | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 3313