C#扫描IP中关于IP地址合法性,数字字符互转函数
//引用空间
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;
}
}