在监控摄像机安装后,往往需要设置IP等信息,在IP不知道的情况下,IP搜索是一个很常见也必须的功能。

考虑到设备IP和当前局域网可能不在同一个网段,ARP是一个不错的选择。

首先安装WinPcap软件

使用C#开发还需要以下dll

SharpPcap.dll

PacketDotNet.dll

请自己百度下载。

设计逻辑:

用户电脑开始搜索IP时,首先发送一个arp请求然后用户电脑开始监听,监控摄像机等设备监听到后发送一个arp包,包含ip等信息回复,用户电脑监听到后解析

首先要获取当前计算机的网卡及ip和mac物理地址

  1. ManagementObjectSearcher ms = new ManagementObjectSearcher(@"SELECT DeviceID FROM Win32_NetworkAdapter WHERE ((MACAddress Is Not NULL) AND (Manufacturer <> 'Microsoft'))");//WHERE PNPDeviceID LIKE 'PCI%'
  2. if (ms.Get().Count < )
  3. {
  4. MessageBox.Show("不存在真实网卡");
  5. return;
  6. }
  7.  
  8. devices1 = LibPcapLiveDeviceList.Instance;
  9. if (devices1.Count < )
  10. {
  11. MessageBox.Show("无法获取网卡");
  12. return;
  13. }
  14.  
  15. PhysicalAddress pmac = PhysicalAddress.Parse("FF-FF-FF-FF-FF-FF");
  16. destinationIP = IPAddress.Broadcast;
  17. //遍历网卡
  18. foreach (var device in devices1)
  19. {
  20. if (!device.Description.ToLower().Contains("vmware") && !device.Description.ToLower().Contains("virtual"))//排除虚拟机网卡
  21. {
  22. DeviceNoticeThread = new Thread(new ThreadStart(() =>
  23. {
  24. if (device.Addresses.Count > )
  25. {
  26. foreach (var address in device.Addresses)
  27. {
  28. if (address.Addr.type == SharpPcap.LibPcap.Sockaddr.AddressTypes.AF_INET_AF_INET6)
  29. {
  30. if (address.Addr.ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
  31. {
  32. localIP = address.Addr.ipAddress;
  33. break;
  34. }
  35. }
  36. }
  37. }
  38.  
  39. foreach (var address in device.Addresses)
  40. {
  41. if (address.Addr.type == SharpPcap.LibPcap.Sockaddr.AddressTypes.HARDWARE)
  42. {
  43. localMAC = address.Addr.hardwareAddress;
  44. }
  45. }
  46. var ethernetPacket = new EthernetPacket(localMAC, pmac, EthernetPacketType.Arp);
  47. var arpPacket = new ARPPacket(getBas("FFFFFFFFFFFF"));
  48. ethernetPacket.PayloadPacket = arpPacket;
  49. device.Open();
  50. device.SendPacket(ethernetPacket);
  51. }));
  52.  
  53. DeviceCaptureThread = new Thread(new ThreadStart(() =>
  54. {
  55. device.OnPacketArrival += new PacketArrivalEventHandler(device_OnPacketArrival);
  56. device.Open(DeviceMode.Normal, );
  57. string filter = "arp";
  58. device.Filter = filter;
  59.  
  60. device.StartCapture();
  61. }));
  62.  
  63. DeviceCaptureThread.IsBackground = true;
  64. DeviceCaptureThread.Start();
  65.  
  66. DeviceNoticeThread.IsBackground = true;
  67. DeviceNoticeThread.Start();
  68. }
  69. }
  1. getBas函数是拼出arp包内容,这里暂定长度40,内容自己拼
  1. private ByteArraySegment getBas(string mac)
  2. {
  3. byte[] bas = new byte[];
  4. bas[] = ;//硬件类型 - 以太网类型值0x1
  5. bas[] = ;
  6.  
  7. bas[] = ;//上层协议类型 - IP协议(0x0800)
  8. bas[] = ;
  9.  
  10. bas[] = ;//MAC地址长度
  11. bas[] = ;//IP地址长度
  12.  
  13. bas[] = ;//操作码 - 0x1表示ARP请求包,0x2表示应答包
  14. bas[] = ;
  15.  
  16. string sendermac = localMAC.ToString().Trim();
  17. if (sendermac.Length == )
  18. {
  19. for (int i = ; i < ; i++)
  20. {
  21. bas[i + ] = Convert.ToByte(sendermac.Substring(i * , ), );//发送方mac
  22. }
  23. }
  24. string[] senderip = localIP.ToString().Trim().Split('.');
  25. if (senderip.Length == )
  26. {
  27. for (int i = ; i < senderip.Length; i++)
  28. {
  29. bas[i + ] = Convert.ToByte(senderip[i]);//发送方ip
  30. }
  31. }
  32. string receivermac = mac;
  33. if (receivermac.Length == )
  34. {
  35. for (int i = ; i < ; i++)
  36. {
  37. bas[i + ] = Convert.ToByte(receivermac.Substring(i * , ), );//接收方mac
  38. }
  39. }
  40. string[] receiverip = destinationIP.ToString().Trim().Split('.');
  41. if (receiverip.Length == )
  42. {
  43. for (int i = ; i < receiverip.Length; i++)
  44. {
  45. bas[i + ] = Convert.ToByte(receiverip[i]);//接收方ip
  46. }
  47. }
  48.  
  49. string strpadding = "自定义头," + Convert2Hex(localIP.ToString().Trim()) + "," + sendermac;
  50.  
  51. byte[] padding = Encoding.UTF8.GetBytes(strpadding.PadRight(, '\0'));//自定义数据
  52. for (int i = ; i < ; i++)
  53. {
  54. bas[i + ] = padding[i];
  55. }
  56. return new ByteArraySegment(bas);
  57. }

监听到arp包且长度一致暂定80,根据实际情况改,且头一致,就可以解析显示了

  1. private void device_OnPacketArrival(object sender, CaptureEventArgs e)
  2. {
  3. if (bStopOnPacketArrival) return;
  4. try
  5. {
  6. Packet packet = Packet.ParsePacket(e.Device.LinkType, e.Packet.Data);
  7. if (packet is EthernetPacket)
  8. {
  9. EthernetPacket ep = (EthernetPacket)packet;
  10. if (ep.PayloadPacket is ARPPacket)
  11. {
  12. ARPPacket ap = (ARPPacket)ep.PayloadPacket;
  13. if (ep.Type == EthernetPacketType.Arp && ap.Operation == ARPOperation.Response)
  14. {
  15. byte[] data = ep.Bytes;
  16. if (data.Length == )
  17. {
  18.  
  19. }
  20. }
  21. }
  22. }
  23. }
  24. catch (System.Exception ex)
  25. {
  26. log.ErrorFormat("解析arp包失败!错误信息:{0}", ex.Message);
  27. }
  28. }

使用WinPcap(SharpPcap)实现ARP抓包以实现设备IP搜索功能的更多相关文章

  1. 使用WinPcap(SharpPcap)实现ARP抓包以实现设备IP修改功能

    参考上一篇: 使用WinPcap(SharpPcap)实现ARP抓包以实现设备IP搜索功能 搜索出设备后,需要修改设备IP网关掩码等信息 继续采用ARP包 getBas类似之前的,根据用户电脑的网卡物 ...

  2. ARP抓包实战小结-TCP/IP协议学习

    2011-12-26 21:36:47 图1 一,环境说明 硬件连线.PC与2440开发板直接用网线连接. PC的ip地址:192.168.0.107.2440开发板的ip地址:192.168.0.1 ...

  3. C#使用sharppcap实现网络抓包-----2

    虽然网上已经有了SharpSniffer 这一个SharpSniffer还是原创的无他,唯为学习工程文件下载:SharpSniffer.rar 1.创建套接字2.绑定到本机3.设置IOControl4 ...

  4. Wireshark抓包笔录--之指定IP地址筛选捕获结果

    Wireshark安装 1.去官网下载相应的安装包 地址如下:https://www.wireshark.org/ 2.安装步骤,一路next,需要同意的地方点同意 3.安装完成后打开软件,如下: W ...

  5. C#使用sharppcap实现网络抓包

    sharppcap dll的下载地址: http://sourceforge.net/directory/os:windows/?q=sharppcap 具体使用详细步骤: http://www.co ...

  6. Fiddler抓包【7】_次要功能和第三方插件

    1.替换HTTP Request Host 应用场景:进行开发时,线上去测试跳转调试 替换命令:urlreplace news.baidu.com www.baidu.com: 清除命令:urlrep ...

  7. C winpcap 网络抓包 并获取IP TCP 协议的相关信息

    以太网协议分析函数: void ethernet_protocol_packet_handle (u_char *argument, const struct pcap_pkthdr *packet_ ...

  8. 网络协议抓包分析——ARP地址解析协议

    前言 计算机之间可以相互通信的前提是要知道对方的地址,才可以发送信息给其他计算机,就像别人要联系你也得先知道你的电话号码一样.这里的地址因为网络分层的原因就包括IP地址和MAC地址(即网卡地址.硬件地 ...

  9. wireshark抓包,安装及简单使用

    跟着实验室师兄尝试做流量分析,趁着离期末考试还有几天,尽快把环境搭好. 采集:自动化测试monkeyrunner,ok 抓包 charles/Wireshark,ok 限制其他应用运行App Moun ...

随机推荐

  1. oracle判断是否包含字符串的方法

    首先想到的就是contains,contains用法如下: select * from students where contains(address,  ‘beijing’) 但是,使用contai ...

  2. react使用setstate注意的两点

    1.this.state里的属性不修改,或是只修改一个,那么不修改的剩下的属性不会被变动. this.state={ name:"Aliece", age:19, msg:&quo ...

  3. 基于MMSE的预测

    本文的目的是预测随机变量的输出值. 既然有预测值,那么我们就需要一个判断基准(criterion)用于判断该预测值与该随机变量的实际输出之间的差值,这里采用的判断基准就是MSE(mean-square ...

  4. HTML5-Audio-基础篇

    播放音频文件 //control属性添加播放.暂停和音量控件<audio controls> <source src="horse.ogg" type=" ...

  5. Server socket

    用法都一样 区别:  self.request   TCP  self.requsst 代表具体的链接 UDP  self.requst 代表一个小元组(元组里面: 第一个元素 客户端发来的数据 ,第 ...

  6. hashlib 模块用来进行hash

    hashlib的基本概述: python中的 hashlib 模块用来进行hash 或者md5加密,而且这种加密是不可逆的,所以这种算法又被称为摘要算法, 其支持Opennssl库提供的所有算法,包括 ...

  7. Matplotlib学习---用matplotlib画柱形图,堆积柱形图,横向柱形图(bar chart)

    这里利用Nathan Yau所著的<鲜活的数据:数据可视化指南>一书中的数据,学习画图. 数据地址:http://datasets.flowingdata.com/hot-dog-cont ...

  8. Min_25

    可以用来筛出一个积性函数的前缀和.这个积性函数要满足当\(x\)是质数时,\(f(x)\)可以快速求出,\(f(x^k)\)也可以快速算出. 首先我们要处理出一个\(g(x)=\sum_{x\in p ...

  9. [HNOI2015]落忆枫音 解题报告

    [HNOI2015]落忆枫音 设每个点入度是\(d_i\),如果不加边,答案是 \[ \prod_{i=2}^nd_i \] 意思是我们给每个点选一个父亲 然后我们加了一条边,最后如果还这么统计,那么 ...

  10. js 触摸的Event--获取触摸位置

    继上一篇js原生拖拽之后,现在又来写一下移动端touch列表,获取触摸位置.pc端的event事件,鼠标的位置信息在上一篇,点此进入上一篇. touch有3个事件:touchstart,touchmo ...