今天开始进入扫描网络计算机的编程,暂时先写根据IP扫描计算机名的代码。为提高速度,引入了多线程编程的方式,但是有一个奇怪的问题,经常会放生没有将对象引用设置到对象实例的错误,但有时就是正常的,奇怪!现在将所有代码写在下面:
public class ping
{
public UpdataList ul;
public string sIP;//接收传递过来的IP地址
public string sHostName;//向主进程传递计算机名
public string sMac;//向主进程传递远程主机MAC地址
public string sUser;//向主进程传递远程主机当前用户
public string sHDsize;//硬盘容量
public string sHDuse;//已用空间
public string sHDfree;//剩余空间
public void scan()
{
IPAddress myIP=IPAddress.Parse(sIP);
try
{
IPHostEntry myHost=Dns.GetHostByAddress(myIP);//根据IP获得主机名
sHostName=myHost.HostName.ToString();
}
catch
{
sHostName="";
}
if (ul !=null)
ul(sIP,sHostName);
}
}
private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
if (e.Node.Text.ToString()=="扫描10网段")
{
dataTable.Clear();
listBox1.Items.Clear();
//创建多个Thread实例
int min=1;
int max=255;
string Mask="192.168.10.";
int ThreadNum=max-min+1;
Thread[] myThread=new Thread[ThreadNum];
for (int i=min;i<=max;i++)
{
int k=max-i;
ping HostPing=new ping();//创建一个ping的实例
HostPing.sIP=Mask+i.ToString();//获得一个IP
HostPing.ul=new UpdataList(UpDataMyList);//向主线程传送IP地址
myThread[k]=new Thread(new ThreadStart(HostPing.scan));//初始化一个线程的实例
myThread[k].Start();
}
void UpDataMyList(string sIP,string sHostName)
{
//写入扫描数据
if (sHostName !="")
{
lock(dataTable)
{
DataRow dataRow=dataTable.NewRow();
dataRow["cComputerName"]=sHostName;
dataRow["cIpAddress"]=sIP;
dataRow["cMac"]="";
dataRow["cUser"]="";
dataRow["cOther"]="";
dataRow["V"]="";
dataTable.Rows.Add(dataRow);
listBox1.Items.Add("扫描"+sIP+"完成");
}
}
else
{
listBox1.Items.Add(sIP+"不在线");
}
}