局域网中通过抓ARP包的方式获取网络设备和冲突的设备列表
网络中通过ping的方式获取网络设备列表,缺点是不稳定,每次获取到的设备列表可能不一致,ping有timeout,设备可能因为某些原因未在规定时间内响应。
下面展示一些 内联代码片
。
for (int i = PingIndex; i < EndIndex; i++)
{
Ping myPing;
myPing = new Ping();
myPing.PingCompleted += new PingCompletedEventHandler(myPing_PingCompleted);
//string pingIP = "192.168." + n.ToString() + "." + i.ToString();
string pingIP = n1.ToString() + "." + n2.ToString() + "." + n3.ToString() + "." + i.ToString();
myPing.SendAsync(pingIP, 1000, null);
}
ping的方式获取无法获取IP冲突设备的列表。
因为工作的原因,需要侦测网络中的设备,且需要获取IP冲突设备的列表。
使用了抓取ARP包的方式
操作步骤:
1 系统需要安装 WinPcap_4_1_3
2 需要引用 SharpPcap.dll
3 需要引用 PacketDotNet.dll
我把这个抓ARP包的功能做成了一个类,需要请下载。
下面展示使用这个类的代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CapturePackage
{
/*
说明 1
需要引用的 dll在debug文件夹内
PacketDotNet;
SharpPcap;
说明 2
系统需要安装的文件 WinPcap_4_1_3
在debug\抓包驱动文件夹内
需要注意的是,最终程序运行的电脑上 也需要安装这个驱动,或者将程序制作成安装包
安装包内 包含此驱动
*/
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private List<IpCfgPackage> ipPackage;
private bool isGetLocalIP = false;
private string localIP;
private string localMac;
private string description = "";
private int index;
private CapturePkg cpPkg = new CapturePkg();
private List<ClsComboBoxItem> netWorkCardList = new List<ClsComboBoxItem>();
private void button1_Click(object sender, EventArgs e)
{
//找到所有网卡
netWorkCardList = CapturePkg.FindNetworkCard();
foreach (var item in netWorkCardList)
{
Console.WriteLine(item.Text);
Console.WriteLine(item.Value);
}
// 需要操作的 网卡是?
ipPackage = new List<IpCfgPackage>();
ipPackage = IpMac.GetIpPackage2();
for (int i = 0; i < ipPackage.Count; i++)
{
foreach (var item in ipPackage[i].lipv4)
{
string[] _ipPart = item.Split('.');
//填写需要操作网段 例如10.9.31.X
if (_ipPart[0] == "10" && _ipPart[1] == "9" && _ipPart[2] == "31")
{
isGetLocalIP = true;
//有时一个网卡可以配置多个IP
localIP = item;
//网卡的描述信息
description = ipPackage[i].description;
//网卡的mac
localMac = ipPackage[i].mac;
label1.Text = "监测到本机IP " + localIP;
break;
}
}
}
//如果 发现本地网卡 设定IP 返回
if (!isGetLocalIP)
{
MessageBox.Show("网卡的IP设置与程序中的不一致\n 请填写与网卡设定一致的网段\r\n_ipPart[0] == \"10\" && _ipPart[1] == \"9\" && _ipPart[2] == \"35\"");
return;
}
//找到使用网卡的序号 index
for (int i = 0; i < netWorkCardList.Count; i++)
{
//int _a;
//_a = netWorkCardList[i].Text.IndexOf(description);
//if (_a != -1)
//{
string _temp = netWorkCardList[i].Value.ToString();
int _b;
_b = _temp.IndexOf(localMac.Replace("-", "").ToUpper());
if (_b != -1)
{
//这个是关键,主要是 找到 使用的网卡
index = i;
Console.WriteLine("发现了 " + i.ToString() + "" + localMac);
}
//}
}
//开始抓包
MacIpPair _temp2;
//这个必须有 也必须正确 有时候网卡可能配置多个IP 主要是过滤ARP包用
_temp2.IpAddress = localIP;
_temp2.MacAddress = localMac;
//如果是多网段侦测,每次都需要 new CapturePkg(); 否则混乱
cpPkg = new CapturePkg();
cpPkg.SelfMacIP = _temp2;
cpPkg.StartCapture(netWorkCardList[index].Value);
cpPkg.FinishedCapPkg += cpPkg_FinishedCapPkg;
}
private void cpPkg_FinishedCapPkg(object sender, EventArgs e)
{
try
{
FinishedCapPkgEventArgs _fe = e as FinishedCapPkgEventArgs;
Console.WriteLine("结果出来了 (●'◡'●)");
Console.WriteLine("设备列表 如下");
if (_fe.DeviceList.Count > 0)
{
foreach (var item in _fe.DeviceList)
{
Console.WriteLine(item.IpAddress);
Console.WriteLine(item.MacAddress);
}
}
Console.WriteLine("冲突设备列表 如下");
if (_fe.IpConflictList.Count > 0)
{
foreach (var item in _fe.IpConflictList)
{
Console.WriteLine(item.IpAddress);
Console.WriteLine(item.MacAddress);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
private void button2_Click(object sender, EventArgs e)
{
cpPkg.StopCapture();
}
}
}
源码下载网址 https://download.csdn.net/download/mhmpro/12948456