ASP.Net写追捕方法
2024-07-10 12:55:52
供稿:网友
在写程序之间,飞刀还是让大家看看追捕是如何通过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 cloneconn =(sqlconnection) myconn.clone();
sqlcommand ocomm = new sqlcommand(strsel,cloneconn);
cloneconn.open();
sqldatareader odr;
ocomm.execute(out odr);
if(odr.read())
{
dbstartip = odr["startip"].tostring();
dbstartip = dbstartip.substring(9,3);
dbldbstartip = double.parse(dbstartip);
dblendip = double.parse(endip);
do
{
strresult=odr["country"].tostring()+odr["local"].tostring();
if(dbldbstartip {
break;
}
}
while(odr.read());
}
odr.close();
cloneconn.close();
}
dr.close();
myconn.close();
在查询数据库时,飞刀采用的方法是先查前三段匹配的记录,如果没有,再查找前二段匹配的记录。
程序很简单,相信大家能看懂,这里需要意一下的就是,程序中飞刀使用了datareader而没有使用功能更强大的dataset,是因为此程序中仅需要读取数据,而不需要对数据库进行修改,删除,所以这时使用datareader比使用dataset节约系统资源。
测试程序,在本地机上测试,如图3。完了,我主机上的一点小秘密全让大家知道了:(
因为asp.net与visual c#、vc等共用一个.net对象库,也就是说,只要逻辑上存在可能,那么vc能做到的事情,asp.net同样也能做到。也就是说我们这个程序,只要稍加修改,便能做成一个真正的追捕软件,有兴趣的朋友可以自已动手喔。
通过编写这个程序,现在我想不会有人再说"asp.net与asp差不多了"吧。网站运营seo文章大全提供全面的站长运营经验及seo技术!