ASP.Net寫追捕方法
2024-07-10 12:55:52
供稿:網(wǎng)友
 
在寫程序之間,飛刀還是讓大家看看追捕是如何通過ip來判斷用戶的來源地的(恩恩,現(xiàn)在就要揭揭"追捕"的"老底"了,大家好好聽啦)。 
如果讓您去編寫追捕軟件的話,我想您首先想到的就是去收集一張ip分配表,并將他們存入數(shù)據(jù)庫以便讀取。在追捕軟件中,確實(shí)存在一張ip分配表,但是這張表在哪兒呢? 
呵呵,我們知道在追捕的下載包含兩個(gè)文件,其一為wry.exe,這是追捕的主程序,其二為wry.dll,注意啦這便是我們辛辛苦苦想找的ip分配表。但是哪種數(shù)據(jù)文件是以dll結(jié)尾呢?dll文件不是動(dòng)態(tài)鏈接庫嗎? 
不用急,我們接著分析,在使用追捕的過程中發(fā)現(xiàn),程序生成的數(shù)據(jù)庫多為dbf數(shù)據(jù)庫,那么這個(gè)wry.dll是否也是foxpro的數(shù)據(jù)庫? 
想到做到,馬上將wry.dll改為wry.dbf,然后用visual foxpro打開,如圖2,呵呵,果然是dbf數(shù)據(jù)庫。它主要包含四個(gè)字段startip(啟始ip),endip(結(jié)束ip),country(ip所在國家或省),local(用戶上網(wǎng)類型)。 
^&^ 知道了這些,程序就不難寫出來了,一句話,查詢數(shù)據(jù)庫。 
慢慢,在網(wǎng)絡(luò)上用mdf數(shù)據(jù)庫,是否有些...... 
不管三七二十一,將mdf轉(zhuǎn)換成sql server再說。 
什么!?不會(huì)將mdf轉(zhuǎn)換sql server?!呵呵,這本雜志是給程序員看的,這些基礎(chǔ)的東東,還是先看看其它的書吧,如果再講這些東東,流浪大哥會(huì)罵我騙稿費(fèi)的:( 
實(shí)現(xiàn)此功能時(shí),為了程序的可讀性,同樣使用一個(gè)函數(shù)來完成: 
public string getipfrom(string sip) 
{ 
...... 
} 
在前面程序中得到的ip通常為202.101.96.54這種格式,而在ip分配表中的格式是202.101.096.054,所以最先需要完成的就是對(duì)ip各段中不足三位的部分補(bǔ)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格式。 
緊接著,就是在數(shù)據(jù)庫中查找符合所取ip條件的ip段: 
string startip = nip.substring(0,11); 
string endip = nip.substring(12,3); 
string dbstartip,dbendip; 
double dblendip,dbldbstartip,dbldbendip; 
//查詢數(shù)據(jù)庫 
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(); 
在查詢數(shù)據(jù)庫時(shí),飛刀采用的方法是先查前三段匹配的記錄,如果沒有,再查找前二段匹配的記錄。 
程序很簡單,相信大家能看懂,這里需要意一下的就是,程序中飛刀使用了datareader而沒有使用功能更強(qiáng)大的dataset,是因?yàn)榇顺绦蛑袃H需要讀取數(shù)據(jù),而不需要對(duì)數(shù)據(jù)庫進(jìn)行修改,刪除,所以這時(shí)使用datareader比使用dataset節(jié)約系統(tǒng)資源。 
測試程序,在本地機(jī)上測試,如圖3。完了,我主機(jī)上的一點(diǎn)小秘密全讓大家知道了:( 
因?yàn)閍sp.net與visual c#、vc等共用一個(gè).net對(duì)象庫,也就是說,只要邏輯上存在可能,那么vc能做到的事情,asp.net同樣也能做到。也就是說我們這個(gè)程序,只要稍加修改,便能做成一個(gè)真正的追捕軟件,有興趣的朋友可以自已動(dòng)手喔。 
通過編寫這個(gè)程序,現(xiàn)在我想不會(huì)有人再說"asp.net與asp差不多了"吧。網(wǎng)站運(yùn)營seo文章大全提供全面的站長運(yùn)營經(jīng)驗(yàn)及seo技術(shù)!