ARP扫描局域网主机ip和MACc#.docx

上传人:b****2 文档编号:4395 上传时间:2023-04-28 格式:DOCX 页数:14 大小:18.74KB
下载 相关 举报
ARP扫描局域网主机ip和MACc#.docx_第1页
第1页 / 共14页
ARP扫描局域网主机ip和MACc#.docx_第2页
第2页 / 共14页
ARP扫描局域网主机ip和MACc#.docx_第3页
第3页 / 共14页
ARP扫描局域网主机ip和MACc#.docx_第4页
第4页 / 共14页
ARP扫描局域网主机ip和MACc#.docx_第5页
第5页 / 共14页
ARP扫描局域网主机ip和MACc#.docx_第6页
第6页 / 共14页
ARP扫描局域网主机ip和MACc#.docx_第7页
第7页 / 共14页
ARP扫描局域网主机ip和MACc#.docx_第8页
第8页 / 共14页
ARP扫描局域网主机ip和MACc#.docx_第9页
第9页 / 共14页
ARP扫描局域网主机ip和MACc#.docx_第10页
第10页 / 共14页
ARP扫描局域网主机ip和MACc#.docx_第11页
第11页 / 共14页
ARP扫描局域网主机ip和MACc#.docx_第12页
第12页 / 共14页
ARP扫描局域网主机ip和MACc#.docx_第13页
第13页 / 共14页
ARP扫描局域网主机ip和MACc#.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

ARP扫描局域网主机ip和MACc#.docx

《ARP扫描局域网主机ip和MACc#.docx》由会员分享,可在线阅读,更多相关《ARP扫描局域网主机ip和MACc#.docx(14页珍藏版)》请在冰点文库上搜索。

ARP扫描局域网主机ip和MACc#.docx

ARP扫描局域网主机ip和MACc#

LANScannerProjectReport

ProjectNo.X

Version1.0

StudentID:

93520081202015StudentName:

银国徽

2010-10-26

CollegeofComputing,CUC

 

 

 

Ideclarethattheassignmentheresubmittedisoriginalexcept

forsourcematerialexplicitlyacknowledged.Ialsoacknowledge

thatIamawareofUniversitypolicyandregulationsonhonestyin

academicwork,andofthedisciplinaryguidelinesandprocedures

applicabletobreachesofsuchpolicyandregulations.

Name:

银国徽StudentID:

103520430112010

SectionIProblemSpecification

本次实验的任务是搜索局域网的所有主机,获取其MAC,并能时刻获取主机是否开机

的信息。

要求采用可视化界面进行设计。

 

SectionIISolutionMethodandDesign

第一步:

获取本机IP和本机所在局域网网段的子网掩码sub-mask;

第二步:

写一个算法,根据上一步的信息获取整个网段所有的IP,尽量避免进行简单

的与运算,因为当子网掩码为非255.255.255.0时,计算量非常大,为了使程序获得更快的

速度和稳定性,需要一个小技巧。

原理很简单:

一个网段的IP总是连续的。

利用这个原理

可以大大简化计算。

举例如下:

本机的IP是10.128.9.230,子网掩码为255.255.252.0;

那么本网段的可用IP范围是10.128.8.0---10.128.11.255。

这里面的规律是很有趣的,大

家可以算算看。

第三步:

利用上步所得的结果构造ARP包,获取相应的MAC;

第四步:

利用多线程技术,快速实现ARP的运行;

第五步:

将返回的结果利用委托技术显示到主窗口上。

 

SectionIIITestCasesandResultsAnalysis

SectionIVConclusion

通过本次实验,我对C#、多线程、委托、整个程序的运行次序有了更深入的理解,感

谢老师给予的指导,我会通过学习C#了解C++的运行方式,因为他们的模式太相似了。

SectionVReferences

C#多线程计算机扫描电脑爱好者

C#.net实训编程XX文库

C#如何理解多线程和委托XX文库

C#数据类型转换XX文库

C++和C#互调用DLL豆丁文档

C#rawsocket网络封包监视CSDN

SectionVIAppendix

usingSystem;

usingSystem.Management;

usingSystem.Collections.Generic;

usingSystem.ComponentModel;

usingSystem.Data;

usingSystem.Drawing;

usingSystem.Linq;

usingSystem.Text;

usingSystem.Windows.Forms;

usingSystem.Threading;//使用多线程的声明(准确的说是要在main主线程中建立新的线程时要进行的引

用说明)

usingSystem.Runtime.InteropServices;//使用DllImport的空间引用声明

usingSystem.Net;//对IP相关类的引用声明

namespacemytest

{

publicpartialclassForm1:

Form

{

[DllImport("Iphlpapi.dll")]

publicstaticexternuintSendARP(uintDestIP,uintSrcIP,refulongpMacAddr,refuint

PhyAddrLen);

publicstaticintNum=0;

byte[]submask={0,0,0,0};

byte[]localip={0,0,0,0};

byte[]netip={0,0,0,0};

int[]temp={0,0,0,0};

byte[]destip={0,0,0,0};

publicstaticstringIP;

publicstaticstringMac;

publicstaticstringItemFlag;

//Threadthread1;//在主线程中声明线程1

//Threadthread2;//在主线程中声明线程2

delegatevoiddaililist();//主线程之外的线程要调用main线程中建立的控件,需要使用委托

的方式,此处是委托的定义

publicdelegatevoidUpdateList(stringip,stringresult);

publicdelegatevoidUpdateLabel();

//daililistlist1;//委托实例化,即建立委托对应的事件

publicForm1()

{

InitializeComponent();

//list1=newdaililist(updatelist);//委托处理的方法,这里updatelist是一个方法,

这个句子的意思是把updatelist这个方法交给了list1这个委托实例

button2.Enabled=false;

button4.Enabled=false;

}

 

privatevoidbutton1_Click(objectsender,EventArgse)

{

/*thread1=newThread(numadd);

thread2=newThread(numadd);

thread1.Start();

thread2.Start();*/

//listBox1.Items.Add(GetMac("10.128.11.254"));

label6.Text="系统正在搜索,请等待......";

baseinfo(listBox1,listBox2);

GetDestIp(localip,submask,listBox3);

label5.Text="当前网段内可用的IP共"+listBox3.Items.Count.ToString()+"种!

";

button1.Enabled=false;

button4.Enabled=true;

label6.Text="系统搜索完毕!

";

}

publicvoidbaseinfo(ListBoxs1,ListBoxs2)//获取本机ip、子网掩码、本段网络号基本信

{

ManagementClassmc=newManagementClass("Win32_NetworkAdapterConfiguration");

ManagementObjectCollectionnics=mc.GetInstances();

foreach(ManagementObjectnicinnics)

{

if(Convert.ToBoolean(nic["ipEnabled"])==true)

{

s1.Items.Add((nic["IPAddress"]asString[])[0]);

s2.Items.Add((nic["IPSubnet"]asString[])[0]);

}

}

s1.SelectedIndex=0;//选中ip列表首选项

s2.SelectedIndex=0;//选中mask列表首选项

IPAddressip=IPAddress.Parse(s1.SelectedItem.ToString());//将ip字符串格式转换成

ip格式

localip=ip.GetAddressBytes();//将ip格式转换成字节数组,便于运算

ip=IPAddress.Parse(s2.SelectedItem.ToString());//将子网掩码

submask=ip.GetAddressBytes();

netip=NetIPDeal(localip,submask);

}

publicbyte[]NetIPDeal(byte[]localip,byte[]submask)//获取网络号

{

byte[]result={0,0,0,0};

int[]temp={0,0,0,0};

for(inti=0;i<4;i++)

{

temp[i]=(int)localip[i]&(int)submask[i];

result[i]=(byte)temp[i];

}

returnresult;

}

publicvoidGetDestIp(byte[]localip,byte[]submask,ListBoxResultShow)//获取网段IP,

只要给定本机IP和子网掩码,可以迅速确定网段所有IP

{

int[]interval={0,0,0,0};//存储本网段子网掩码和全掩码(255.255.255.255)的码距

byte[]top={0,0,0,0};//记录本网段可用IP的上限IP

byte[]bottom={0,0,0,0};//记录本网段可用IP的下限IP

byte[]netip={0,0,0,0};//存贮临时的网络号

for(inti=0;i<4;i++)//计算本网段子网掩码和全掩码(255.255.255.255)的码距

{

if(submask[i]!

=255)

interval[i]=255-(int)submask[i]+1;

}

netip=NetIPDeal(localip,submask);

bytetemp;

for(inti=0;i<4;i++)

{

temp=localip[i];

if(interval[i]!

=0)

{

inttemp_result;

temp_result=(int)temp&(int)(submask[i]);

if(interval[i]!

=256)

{

while(temp_result==(int)netip[i])

{

temp++;

temp_result=(int)temp&(int)(submask[i]);

}

top[i]=(byte)((int)temp-1);

bottom[i]=(byte)((int)top[i]-interval[i]+1);

}

else

{

top[i]=254;

bottom[i]=0;

}

}

else

{

top[i]=(byte)temp;

bottom[i]=top[i];

}

}

for(bytei=bottom[0];i<=top[0];i++)

{

for(bytej=bottom[1];j<=top[1];j++)

{

for(bytek=bottom[2];k<=top[2];k++)

{

for(bytet=bottom[3];t<=top[3];t++)

{

stringdest;

dest=i.ToString()+"."+j.ToString()+"."+k.ToString()

+"."+t.ToString();

ResultShow.Items.Add(dest);

}

}

}

}

}

/*publicvoidupdatelist()

{

listBox4.Items.Add(Num);

}*/

/*publicvoidnumadd()

{

Num++;

listBox4.Invoke(list1);//这是自己建立的线程要调用的方法,但是listbox1是main主线程

建立的控件,自定义的线程无法直接访问,上面已经定义了委托,此处应用listbox1的invoke

//方法把所有对listbox1的操作都交给委托list1去处理。

//到此我们理一下思路,建立线程thread1、thread2,这两个线程都指向了numadd这个方法,

首先都执行Num++,然后执行listBox1.Invoke(list1),意思是说将要对listbox1操作,

//但是具体操作在list1这个委托当中,然后这个委托指向了updatelist并执行,至此

thread1、thread2都完成了对listbox1的操作!

}*/

/*publicstaticstringGetMac(stringp_Id)

{

IPAddress_Address;

if(!

IPAddress.TryParse(p_Id,out_Address))return"";

uintDestIP=System.BitConverter.ToUInt32(_Address.GetAddressBytes(),0);

ulongpMacAddr=0;

uintPhyAddrLen=6;

uinterror_code=SendARP(DestIP,0,refpMacAddr,refPhyAddrLen);

byte[]_Bytes1=BitConverter.GetBytes(pMacAddr);

returnBitConverter.ToString(_Bytes1,0,6);

}

*/

voidUpdateMyLabel()

{

//label6.Text="系统正在搜索,请等待......";

}

voidUpdateMyList(stringip,stringresult)//委托入口程序

{

lock(listBox4)

{

if(result!

=ItemFlag)

listBox4.Items.Add(ip+"MAC"+result);

ItemFlag=result;

//progressBar1.Value++;

}

}

publicvoidGetMac()

{

IPAddress_Address;

if(!

IPAddress.TryParse(IP,out_Address))return;

uintDestIP=System.BitConverter.ToUInt32(_Address.GetAddressBytes(),0);

ulongpMacAddr=0;

uintPhyAddrLen=6;

UpdateListshowmac=newUpdateList(UpdateMyList);

UpdateLabelupmylabel=newUpdateLabel(UpdateMyLabel);

try//捕获程序异常

{

uinterror_code=SendARP(DestIP,0,refpMacAddr,refPhyAddrLen);//发送ARP

包,获取MAC

byte[]_Bytes1=BitConverter.GetBytes(pMacAddr);

Mac=BitConverter.ToString(_Bytes1,0,6);

}

catch

{

Mac="00-00-00-00-00-00";

}

if(showmac!

=null)

{

listBox4.Invoke(showmac,IP,Mac);//激活委托,执行委托入口程序

//label5.Invoke(upmylabel);

}

}

privatevoidbutton4_Click_1(objectsender,EventArgse)//扫描给定的IP

{

intcount;//获取IP总数,准备建立线程数

inti;

button4.Enabled=false;//禁用扫描按钮

count=listBox3.Items.Count;

label6.Text="系统正在扫描,请等待.....";

Thread[]myscan=newThread[count];//定义线程数

for(i=0;i

{

listBox3.SelectedIndex=i;

IP=listBox3.Text;

 

//ygh.showmac=newUpdateList(UpdateMyList);

myscan[i]=newThread(newThreadStart(GetMac));//建立线程入口

myscan[i].Start();//启动线程

}

label6.Text="系统扫描完毕!

";

button2.Enabled=true;

}

privatevoidbutton2_Click(objectsender,EventArgse)//清除四个列表信息

{

listBox1.Items.Clear();

listBox2.Items.Clear();

listBox3.Items.Clear();

listBox4.Items.Clear();

button1.Enabled=true;

button2.Enabled=false;

}

}

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2