在写程序之间,飞刀还是让大家看看追捕是如何通过IP来判断用户的来源地的(恩恩,现在就要揭揭"追捕"的"老底"了,大家好好听啦)。
如果让您去编写追捕软件的话,我想您首先想到的就是去收集一张IP分配表,并将他们存入数据库以便读取。在追捕软件中,确实存在一张IP分配表,但是这张表在哪儿呢?
呵呵,我们知道在追捕的下载包含两个文件,其一为wry.exe,这是追捕的主程序,其二为wry.dll,注意啦这便是我们辛辛苦苦想找的IP分配表。但是哪种数据文件是以dll结尾呢?dll文件不是动态链接库吗?
不用急,我们接着分析,在使用追捕的过程中发现,程序生成的数据库多为DBF数据库,那么这个wry.dll是否也是FoxPro的数据库?
想到做到,马上将wry.dll改为wry.dbf,然后用Visual FoxPro打开,如图2,呵呵,果然是DBF数据库。它主要包含四个字段Startip(启始IP),Endip(结束IP),Country(IP所在国家或省),Local(用户上网类型)。
^&^ 知道了这些,程序就不难写出来了,一句话,查询数据库。
慢慢,在网络上用MDF数据库,是否有些
不管三七二十一,将MDF转换成SQL Server再说。
什么!?不会将MDF转换SQL Server?!呵呵,这本杂志是给程序员看的,这些基础的东东,还是先看看其它的书吧,如果再讲这些东东,流浪大哥会骂我骗稿费的:(
实现此功能时,为了程序的可读性,同样使用一个函数来完成:
public string GetIPFrom(string sIP)
{
}
在前面程序中得到的IP通常为202.101.96.54这种格式,而在IP分配表中的格式是202.101.096.054,所以最先需要完成的就是对IP各段中不足三位的部分补0。
char de={''.''};
string aIP = sIP.Split(de);
string SingleIP;
StringBuilder nIPx = new StringBuilder();
int SIPLen;
string strResult = "查不出";
for(int i=0;i<4;i++)
{
SingleIP = aIP[i];
SIPLen = SingleIP.Length;
if(SIPLen<3)
{
for(int j=0;j<3-SIPLen;j++) SingleIP ="0"+SingleIP;
}
aIP[i] = SingleIP;
}
//重新组合成为新的IP
for(int i=0;i<aIP.Length;i++)
{
if(i!=aIP.Length-1)
{
nIPx.Append(aIP[i]+".");
}
else
{
nIPx.Append(aIP[i]);
}
}
string nIP = nIPx.ToString();
nIP便是我们的需要的IP格式。
紧接着,就是在数据库中查找符合所取IP条件的IP段:
string StartIP = nIP.Substring(0,11);
string EndIP = nIP.Substring(12,3);
string dbStartIP,dbEndIP;
Double dblEndIP,dbldbStartIP,dbldbEndIP;
//查询数据库
string strSel = "select * from wry where Left(STARTIP,11)=''"+StartIP+"''";
SQLConnection MyConn = new SQLConnection(strConn);
SQLCommand MyComm = new SQLCommand(strSel,MyConn);
MyConn.Open();
SQLDataReader dr;
MyComm.Execute(out dr);
if(dr.Read())
{
//能够查到三段以后的IP
do
{
dbStartIP = dr["STARTIP"].ToString();
dbEndIP = dr["ENDIP"].ToString();
dbStartIP = dbStartIP.Substring(12,3);
dbEndIP = dbEndIP.Substring(12,3);
dblEndIP = Double.Parse(EndIP);
dbldbStartIP = Double.Parse(dbStartIP);
dbldbEndIP = Double.Parse(dbEndIP);
strResult = dr["COUNTRY"].ToString()+dr["LOCAL"].ToString();
if((dbldbStartIPdblEndIP {
break;
}
}
while(dr.Read());
}
else
{
//三段后不存在,查二段
StartIP = nIP.Substring(0,7);
EndIP = nIP.Substring(9,3);
strSel = "select * from wry where Left(STARTIP,7)=''"+StartIP+"'' order by STARTIP desc";
SQLConnection CloneCo