ASP.Net寫追捕方法

 在寫程序之間,飛刀還是讓大家看看追捕是如何通過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節約系統資源。

綜合上面的程序代碼,一個WEB追捕做大功告成,本想將全部代碼也貼出來,But這樣似乎有騙稿費之嫌,所以還是請大家去我們的站點自行下載吧(http://www.aspcn.com/products/wry/wry.zip)。

測試程序,在本地機上測試,如圖3。完了,我主機上的一點小祕密全讓大家知道了:(

因爲ASP.Net與Visual C#、VC等共用一個.Net對象庫,也就是說,只要邏輯上存在可能,那麼VC能做到的事情,ASP.Net同樣也能做到。也就是說我們這個程序,只要稍加修改,便能做成一個真正的追捕軟件,有興趣的朋友可以自已動手喔。

通過編寫這個程序,現在我想不會有人再說"ASP.Net與ASP差不多了"吧。

來源:編程愛好者網站 作者:未知

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章