ASP.Net寫追捕方法
來源:互聯網
上載者:User
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節約系統資源。
測試程式,在本地機上測試,如圖3。完了,我主機上的一點小秘密全讓大家知道了:(
因為ASP.Net與Visual C#、VC等共用一個.Net物件程式庫,也就是說,只要邏輯上存在可能,那麼VC能做到的事情,ASP.Net同樣也能做到。也就是說我們這個程式,只要稍加修改,便能做成一個真正的追捕軟體,有興趣的朋友可以自已動手喔。
通過編寫這個程式,現在我想不會有人再說"ASP.Net與ASP差不多了"吧。