//引用空間
using System.Net;
using System.Threading;
private void button1_Click(object sender, System.EventArgs e)
{
//Thread 類: 建立並控制線程
Thread thScan = new Thread(new ThreadStart(ScanTarget));
//Thread.Start 方法:啟動線程
thScan.Start();
}
private void ScanTarget()
{
string strStartIPAddress=this.textBox1.Text+"."+textBox2.Text+"."+textBox3.Text+"."+textBox4.Text;
string strEndIPAddress=this.textBox5.Text+"."+textBox6.Text+"."+textBox7.Text+"."+textBox8.Text;
if(IsValidIP(strStartIPAddress) && IsValidIP(strEndIPAddress) )
{
int intStartIPAddress=ConvertIPAddressToNumber(strStartIPAddress);
int intEndIPAddress=ConvertIPAddressToNumber(strEndIPAddress);
//掃描IP地址總數
int TotalScanNumber = intEndIPAddress-intStartIPAddress;
//掃描的操作
for(int i=0;i<=TotalScanNumber;i++)
{
int intCurrentScanIP=i+intStartIPAddress;
string strCurrentScanIP =ConvertNumberToIPAddress(intCurrentScanIP);
//轉換成IP地址
IPAddress myScanIP = IPAddress.Parse(strCurrentScanIP);
try
{
// Dns.GetHostByAddress 方法: 根據IP地址擷取 DNS 主機資訊。
IPHostEntry myScanHost = Dns.GetHostByAddress(myScanIP);
//擷取主機的名
string strHostName =myScanHost.HostName.ToString();
richTextBox1.AppendText("掃描IP:"+strCurrentScanIP+"對應主機:"+strHostName+"/r");
}
catch(Exception error)
{
richTextBox1.AppendText("掃描IP:"+strCurrentScanIP+"失敗::"+error.Message+"/r");
}
}
}
else
{
richTextBox1.AppendText("掃描失敗:輸入IP地址不合法"+"/r");
}
}
private int CountIPNumber(string startIPAddress,string endIPAddress)
{
//判斷兩個IP地址之間的IP數量
if( IsValidIP(startIPAddress) && IsValidIP(endIPAddress))
{
//IP轉換為數字進行比較
string[] maxip_ary=endIPAddress.Split('.');
int tmp_maxip=Convert.ToInt32(maxip_ary[0])*256*256*256+Convert.ToInt32(maxip_ary[1])*256*256+Convert.ToInt32(maxip_ary[2])*256+Convert.ToInt32(maxip_ary[3]);
string[] minip_ary=startIPAddress.Split('.');
int tmp_minip=Convert.ToInt32(minip_ary[0])*256*256*256+Convert.ToInt32(minip_ary[1])*256*256+Convert.ToInt32(minip_ary[2])*256+Convert.ToInt32(minip_ary[3]);
return tmp_maxip - tmp_minip;
}
else
{
return 0;
}
}
private int ConvertIPAddressToNumber(string strIPAddress)
{
//將目標IP地址字串strIPAddress轉換為數字
string[] arrayIP=strIPAddress.Split('.');
int sip1=Int32.Parse(arrayIP[0]);
int sip2=Int32.Parse(arrayIP[1]);
int sip3=Int32.Parse(arrayIP[2]);
int sip4=Int32.Parse(arrayIP[3]);
int tmpIpNumber;
tmpIpNumber=sip1*256*256*256+sip2*256*256+sip3*256+sip4;
return tmpIpNumber;//返回IP地址轉換後的數字
}
private string ConvertNumberToIPAddress(int intIPAddress)
{
//將目標整形數字intIPAddress轉換為IP地址字串
//-1062731518 192.168.1.2
//-1062731517 192.168.1.3
int tempIPAddress=intIPAddress+1;
int s1=tempIPAddress/256/256/256;
int s21=s1*256*256*256;
int s2=(tempIPAddress-s21)/256/256;
int s31=s2*256*256+s21;
int s3=(tempIPAddress-s31)/256;
int s4=tempIPAddress-s3*256-s31;
if(s1<0)
{
s1=255+s1;
s2=255+s2;
s3=255+s3;
s4=255+s4;
}
string strIPAddress=s1.ToString()+"."+s2.ToString()+"."+s3.ToString()+"."+s4.ToString();
return strIPAddress;//返回IP地址字串
}
//下面的函數是錯誤的,比如192.168.1.249得出來一個負數
private bool IsValidIP(string strIPAddress)
{
//需要驗證的IP地址:strIPAddress
string IPmax = "255.255.255.255"; //允許的最大IP位址範圍
string IPmin = "0.0.0.0"; //允許的最小IP位址範圍
//IP轉換為數字進行比較
string[] arrayIP=strIPAddress.Split('.');
int tmp_userip=Convert.ToInt32(arrayIP[0])*256*256*256+Convert.ToInt32(arrayIP[1])*256*256+Convert.ToInt32(arrayIP[2])*256+Convert.ToInt32(arrayIP[3]);
string[] maxip_ary=IPmax.Split('.');
int tmp_maxip=Convert.ToInt32(maxip_ary[0])*256*256*256+Convert.ToInt32(maxip_ary[1])*256*256+Convert.ToInt32(maxip_ary[2])*256+Convert.ToInt32(maxip_ary[3]);
string[] minip_ary=IPmin.Split('.');
int tmp_minip=Convert.ToInt32(minip_ary[0])*256*256*256+Convert.ToInt32(minip_ary[1])*256*256+Convert.ToInt32(minip_ary[2])*256+Convert.ToInt32(minip_ary[3]);
if(tmp_userip <= tmp_maxip && tmp_userip >= tmp_minip)
{
return true;//IP地址是合法的
}
else
{
return false;//IP地址是非法的
}
}
//修正函數為
private static bool IsValidIP(string ip)
{
string[] parts = ip.Split('.');
if (parts.Length != 4) return false;
try
{
if (Byte.Parse(parts[0]) == 0x00)
return false;
foreach (string part in parts)
if (Byte.Parse(part) > 0xFF)
return false;
}
catch(Exception) { return false; }
return true;
}
//校正連接埠數字合法性
private static bool IsValidPort(string strPort)
{
//需要驗證的IP地址:strIPAddress
int maxPort =65535; //允許的最大連接埠數字
int minPort =0; //允許的最小的連接埠數字
try
{
int tempPort=Int32.Parse(strPort);
if(tempPort <= maxPort && tempPort >= minPort)
{
return true;//IP地址是合法的
}
else
{
return false;//IP地址是非法的
}
}
catch
{
return false;
}
}