SharpPcap-中文开发全攻略_第1页
SharpPcap-中文开发全攻略_第2页
SharpPcap-中文开发全攻略_第3页
SharpPcap-中文开发全攻略_第4页
SharpPcap-中文开发全攻略_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、简介包捕获(或数据包嗅探)是收集数据,通过特定的网络接口将所有数据包的过程。在我们的应用 程序捕获网络数据包是一个强大的能力,它可以让我们写网络监控,数据包分析器和安全工具。本的libpcap 库和基于UNIX系统WinPcap的用于Windows 是最广泛使用的数据包捕获驱动 程序监视API提供低级别的网络。其中应用程序使用的libpcap / WinPcap的包捕获子系统为是著名的tcpdump 的和 Wireshark 的。在这篇文章中,我们将介绍SharpPcap WinPcap的从您的。NET应用程序。)NET程序集(库 接口与libpcap的或并会给你一个详细的方案编制教程教你如何

2、使用。背景塔米尔加尔在2004年左右开始的 SharpPcap 项目。他想用在。NET应用WinPcap 而在他的 大学最后项目的工作。该项目涉及VoIP流量分析和解码,他想继续用C #编码具有省时,如垃圾收集功能简单。WinPcap的API的访问似乎从净是相当流行的要求,他发现在CodeProject上的一些网站,让您做到这一点有益的项目。:? 数据包捕获和分析仪? 原始套接字捕获使用C#? 与WinPcap的包嗅探功能移植到。NET库第一个项目是一个伟大的空灵。NET的克隆,让您获取和分析大量的数据包的协议类型。然而,随着这个项目的几个问题使它几乎不可能得到在其他。NET应用程序共享。首先

3、,作者没有提供用于捕获,可以通过其他。NET应用程序中使用任何通用的API包。他没有单独的 UI代码和他的分析和捕获的代码,使他的捕捉代码类依赖于图形用户界面,如ListView 操作。其次,由于某些原因,笔者选择了重新实现在C #由他本人,而不是仅仅WinPcap的包装他们的部分职能。这意味着他的应用程序无法利用新的Win Pcap的版本的硬编码的优势,因为他在他的Win Pcap的应用程序的某些版本。第二个和第三个物品的包装项目为Win Pcap 的好开始,但他们没有提供一些重要的Win Pcap的功能,如离线pcap的文件处理和应用内核级数据包过滤器,以及最重要的是他们提供了这样的分析没

4、有协议分析器类包。这两个项目没有张贴的文章,以自己的库的源代码,让其他人一起延长他们的工作和增加新功能和新的数据包分析器类。因此,塔米尔决定开始他对自己的图书馆工作。在1.x系列的几个版本发布。发展放缓对2007年年中时,在1.x系列的最后一个版本发布时,SharpPcap 1.6.2。克里斯摩根发生在 2008年11月超过SharpPcap 发展。从那时起 SharpPcap 主要内部已重 写和API改进。2010年2月下旬,SharpPcap 3.0被释放。此版本是一个重写 SharpPcap的数据包分析器。分组分析功能被打破,进入一个新的图书馆,Packet.Net 。SharpPcap

5、注意到与libpcap 的/WinPcap 的包和Packet.Net 注意到接口解剖和创造护理照顾。对Packet.Net 的建筑的细节将在本教程的后面讨论。SharpPcap v3.5版本发布了 2月1 日, 2011年。3.5版本包含重大的空气污染指数的变化以及WinPcap 的远程采集和支持 AirPcap。关于 SharpPcap的目的SharpPcap是提供一个框架 NET应用程序捕获,注资。和分析网络数据包。SharpPcap 是公开和积极发展同它的源代码和文件发布在SourceForge 托管。源代码补丁,以改善或解决问题欢迎通过sharppcap开发者邮件列表。错误报告,功能

6、要求和其他查询正在积极回答问题的论坛和跟踪支持,所以如果你有任何问题请与库随时问。SharpPcap 是一个完全跨平台的库管理。同一程序集运行在微软的。NET以及单在32位和64位平台。F面的列表说明了目前SharpPcap功能支持:? 单一组件的 MicrosoftoNET 和 Mo no 平台上的 Win dows ( 32 位或64 位)和Lin ux(32 或 64 位)和 Mac。? 高性能-SharpPcap可以捕捉足够快跟上 的3MB / s 的传输速率高达 SCP的? WinPcap的扩展部分支持:o 设置内核缓冲区大小o 注射用的数据包发送队列。o 收集在一个特定的网络接口的

7、网络统计? AirPcap 支持? 枚举和显示有关 Win dows 机器上的物理网络接口的细节? 捕获低级别的网络数据包将通过给定的接口。? 分析和解析以下协议:o 以太网o 血清瘦素(Linux的熟食方式采集)o ARP(地址解析协议)o IP (因特网协议):? IPv4 的? IPv6 的请检查项目主页主页最新的更新和 bug修复。SharpPcap 架构SharpPcap 具有层状结构,在顶层的类,所有设备的工作:? CaptureDeviceList-检索系统名单上的所有设备?OfflineCaptureDevice-文件读取装置从一个pcap的捕捉? ICaptureDevice

8、-所有的捕捉设备有ICaptureDevice 接口该命名空间的布局层次:? libpcap 的o LibPcapLiveDevice- 一个 ICaptureDeviceo LibPcapLiveDeviceList-检索一个名单 LibPcapLiveDevice设备(其中包括pcap的/ WinPcap 的和airpcap 设备)?Win Pcap的o WinPcapDeviceList-检索一个名单 WinPcapDevices(其中包括WinPcap 的和 airpcap 设备)o WinPcapDevice-阿 LibPcapLiveDevice额外 WinPcap 的功能和接口?

9、 AirPcapo AirPcapDeviceList-检索一个名单 AirPcapDeviceso AirPcapDevice-阿 WinPcapDevice额外 AirPcap 功能和接口CaptureDeviceList返回一个设备清单完全分化。这意味着每个ICaptureDevice由归国 CaptureDeviceList要么是 LibPcapLiveDevice,一WinPcapDevice 或AirPcapDevice。这使您可以检索整个列表的设备和差异化在每个设备类型看。如果你想获得一个特定的特定类型的设备只,你可以使用一个*DeviceList 类。口 Collapse |C

10、opy Code/ /检索所有捕获设备=CaptureDeviceListVaR 的装置;/ /类型的区分依据的 foreach (ICaptureDevice dev 的设备中)如果(dev 是 AirPcapDevice )/ / 过程作为 AirPcapDevice否则如果(dev 是 WinPcapDevice )/ / 过程作为 WinPcapDevice否则如果(dev 是 LibPcapLiveDevice )/ / 过程作为 LibPcapLiveDevice-Collapse | Copy Code/ /只检索WinPcap的(和AirPcap 设备)=AirPcapDevi

11、ceListVaR 的装置;的 foreach ( AirPcapDevice dev 的设备中)/ /处理该AirPcap 设备Packet.Net结构和用法Packet.Net 切换从2.x到SharpPcap继承模型的嵌套包之一。所有的数据包包含一个Packet PayloadPacket 属性和一个Byte PayloadData财产。一个或多个这些都不能有效。以太网上的TCP数据包捕获的可能 EthernetPacket “ - IPv4 包-” TCP数据包。在Packet.Net 时,TCP数据包可能被访问一样capturedPacket.PayloadPacket .P ayl

12、oadPacket而是要帮助用户从 staticGetE ncapsulsted()方法被添加,因此用户可以做的var tcpPacket =TcpPacket.GetE ncapsulated(capturedPacket);。该GetEncapsulated()方法是很聪明,设计工作在许多不同的情况。UdpPacket.GetEncapsulated()将返回 EthernetPacket UDP包的数据包,包括“-IP数据包” - UdpPacket 或Linux 熟捕捉- 知识产权” - UdpPacket 或EthernetPacket - “的PPPoE - ”和平之路“- 知识产

13、权 -” UdpPacket。我们建议使用GetEncapsulated()方法来检索子数据包。随着Packet.Net,建设包是这样的:Collapse | Copy Code使用 PacketDotNet;ushort 的 tcpSourcePort =123;ushort 的 tcpDestinationPort =321;风险 tcpPacket = 新 TcpPacket (tcpSourcePort , tcpDestinationPort);风险 ipSourceAddress =System.Net.lPAddress.Parse( “ ”);风险 ipD

14、estinationAddress =System.Net.IPAddress.Parse( “ ”)风险 ipPacket = 新 IPv4Packet (ipSourceAddress , ipDestinationAddress);风险 sourceHwAddress = “90-90-90-90-90-90”;风险 ethernetSourceHwAddress =System.Net.Networklnformation.PhysicalAddress.Parse(sourceHwAddress);风险 destinationHwAddress= “80-80-

15、80-80-80-80”;风险 ethernetDestinationHwAddress =System.Net.NetworkInformation.PhysicalAddress.Parse(destinationHwAddress);/ /注意:使用EthernetPacketType.None说明了以太网/ /协议类型的更新是基于数据包有效载荷/ /分配给特定的以太网包风险 ethernetPacket =新 EthernetPacket (ethernetSourceHwAddress,ethernetDestinationHwAddress,EthernetPacketType.N

16、one);/ /现在所有的数据包缝在一起ipPacket.PayloadPacket = tcpPacket;ethernetPacket.PayloadPacket = ipPacket;/ /并打印出包地看到,它看上去就像我们希望它Console.WriteLine(ethernetPacket.ToString();/ /要检索的字节表示这个新创建/ / EthernetPacket使用属性的字节字节packetBytes = ethernetPacket.Bytes;SharpPcap教程:一步步教您使用 SharpPcap例子可以发现,在 示例/包目录源。本教程的文本,这是直接取自

17、WinPcap的的官方教程,但修改以显示 C #中使用SharpPcap 库。所有的例子可以下载连同 SharpPcap此网页的源代码从顶部。如果您是Win dows 上运行,WinPcap的库必须安装运行的例子,然后再尝试任何这些,所以请下载并安装最新版本的WinPcap 的的下载页面。如果Mac运行在Unix / Linux /时,libpcap库必须安装使用你的系统软件管理系统。涵盖以下主题在这方面与在括号中的实例名称教程:1.获取设备列表(例 1)2.打开适配器并捕获数据包(示例3)3.4)捕获的数据包,但无事件(例4.过滤流量(例5)5.解读包(例6)6.脱机处理转储文件(例 8)7

18、.发送数据包(例 9)8.发送队列(例10) - Win Pcap的唯一9.11)收集统计数据在网络上的流量(例如-WinPcap 的唯一10.后台处理数据包队列-高封包捕获率获取设备列表(例如,在源码包1)通常,第一个事,一个SharpPcap为基础的应用程序是得到一个连接的网络适配器的列表。SharpPcap 提供了一个类, CaptureDeviceList用于这一目的。这个类是一个单实例,持有型缓存网络适配器列表ICaptureDevice。特别是,Name和Description 属性包含人类可读的名称和描述,分别对相应的设备。下面的C #示例显示了如何检索适配器列表和打 印在屏幕上

19、,印刷错误,如果没有适配器发现:Collapse | Copy Code/ / 打印 SharpPcap版本字符串 版本=SharpPcap.Version.VersionString;Console.WriteLine(“0 SharpPcap, Example1.lfList.cs ”,版本);/ /检索设备列表CaptureDeviceList设备=CaptureDeviceList.Instance;/ /如果没有设备被发现打印错误女口果(devices.Count “1)Console.WriteLine(设备不被发现本机”);返回Console.WriteLine(“ n以下是机器

20、设备可以用这样的:”);Console.WriteLine(? “)/ /打印岀可用的网络设备的 foreach (ICaptureDevice dev 的设备中)Console.WriteLine(“0 N的,dev.ToString()Console.Write(点击输入退出.”);Console.ReadLine()上述应用程序的输出会是这样的:Collapse | Copy Code?:实例目录调试 “Example1.IfList.exeSharpPcap ,Example1.lfList.cs以下是这台机器上的设备可供选择:接口:名称: Device NPF_ D8B

21、7C9B2 - D53D - 45DA - ACF0 - 2E2116F97314 的FriendlyName :局域网连接2描述:英特尔(R) PRO/1000 MT 台式机适配器地址:地址:为 fe80 : : b444 : 92d8 : c882 : 8227网络掩码:Broadaddr :地址:地址:5网络掩码:Broadaddr : 55地址:地址:硬件地址:0800276AC792标志:0按Enter 键退出打开一个适配器和捕获数据包(例如,在源码包3)现在,我们已经看到了如何获得一个适配器一起玩,让我们开始真正的

22、工作,打开适配器并捕获一些交通。在本节中,我们将编写一个程序,打印一些通过适配器每个数据包信息流。该函数打开一个捕获装置是Open()重载是如下一些论据:Ope n()Open( DeviceMode mode)Open( DeviceMode mode, int read_timeout)以上两个论点值得一些进一步的解释DeviceMode :在正常模式(DeviceMode.Normal ),网络适配器只捕获的数据包直接解决它;在网络上的其他主机的数据包交换的被忽略。相反,当适配器(处于混杂模式 DeviceMode.Promiscuous ),它捕获所有的数据包不管是不是注定它或。这意味

23、着,在 共同的媒介(如非交换以太网),libpcap的/ Win Pcap 的将能够捕捉到其他主机的数据包。混杂模式是应用程序的默认大多数捕捉,所以我们能够例如它在以下方面:。注意混杂模式,可以通过网络检测手段,如果你是在混杂模式捕获您可能能够被检测到其他实体在网络上。搜索发现混杂”通过获取更多信息网上搜索引擎。read_timeout :指定读取超时毫秒,在。一个读了适配器(例如,使用GetNextPacket() 函数)将总是返回后 read_timeout 毫秒,即使没有数据包网络可从。read_timeout 还定义统计报告之间的间隔如果适配器模式在统计(见在网络流量收集统计数据的部分

24、)。设置read_timeout 以0表示没有超时,数据包到达一个适配器上的阅读永远不会返回,如果没 有。甲-1方超时而导致适配器读取上总是立即返回。下面的例子显示了使用On PacketArrival事件接收数据包。我们创建一个事件处理程序被称为每当一个新的包是经历ICaptureDevice :Collapse |Copy Code/ /提取设备的清单ICaptureDevice 设备=器件我;/ /注册的处理函数的/ / 包到来的事件device.OnPacketArrival + =新 SharpPcap.PacketArrivalEventHandler( device_OnPack

25、etArrival)/ /打开设备捕捉诠释 readTimeoutMilliseconds =1000;device.Open ( DeviceMode.Promiscuous , readTimeoutMilliseconds)(“-. 监听0,按回车停止);()Console.WriteLinedevice.Description/ /开始捕获过程device.StartCapture / /等待回车从用户。Console.ReadLine ()/ /停止捕获过程device.StopCapture()/ /关闭pcap的设备 device.Close ();这里是我们的包处理程序的执行情

26、况:Collapse | Copy Code/ / /摘要/ / /打印的时间和长度分别获得分组/ / /摘要私有静态无效 device_OnPacketArrival(对象发件人,CaptureEventArgs 包)DateTime 的时间=packet.Timeval.Date;诠释 长度=packet.Data.Length;Console.WriteLine( “0 : 1 : 2 ,3 4 长度=”time.Hour , time.Minute ,time.Second ,time.Millisecond, len 个);一旦适配器被打开,可以开始捕捉与StartCapture()

27、 或Capture(int packetCount) 功能。这两个函数非常相似,所不同的是StartCapture()是一个非阻断功能,启动新的线程捕获进程 A,而Capture(int packetCount) 直至块packetCount包已被抓获。当使用StartCapture()我们应该以后调用 StopCapture()终止捕获过程。为了捕捉下去,调用Capture() 方法。这些功能都需要一个用于处理数据包的事件处理程序调用它们前登记。此事件处理程序调用 ICaptureDevice为每个新的网络数据包,并接收来自发送者对象,调用该处理程序(即ICaptureDevice 对象)和

28、实际收到的Packet ,包括所有的协议头。请注意该帧的CRC通常不会在报文中,因为它是由框架验证后的网络适配器中删除。还要注意的是大多数适配器丢弃错误的CRC,所以 WinPcap 的包(因此 SharpPcap )通常无法捕捉他们。该Packet 类表示一个通用分组网络捕捉到的。每一个这样的数据包有一个PcapHeader 的TIMESTAMP 属性包含了捕获的数据包的长度和捕获)的有关数据包信息(例如。上面的例子 中提取和长度从每一个时间戳Packet对象,并打印在屏幕上。请注意,处理程序代码是由所谓的ICaptureDevice,因此,用户应用程序没有在它的直接控制。另一种方法是使用G

29、etNextPacket()函数,它在未来的一段介绍。如果没有事件处理程序(例如,在源码包4 )捕获数据包在本节中的示例程序中的行为完全像前面的示例,但它使用ICaptureDevice.GetNextPacket()事件处理方法,而不是注册一个。该On PacketArrival事件是一个很好的做法,可在一次捕捉设备从几个不错的选择在这样一些情况,因为当。但是,处理回调有时并不实用-它往往使得程序更加复杂,特别是在多线程应用程序的情况。在这种情况下, GetNextPacket()检索直接调用一个包,一 -使用GetNextPacket() 数据包只收到当程序员想用它们。在下面的程序,我们重

30、新使用以前的示例中的事件处理程序代码和移动循环它成一个函数调用后立即在主要以GetNextPacket()注意:下面的例子将退岀如果MS超时到期的1000网络上没有数据包: -Collapse | Copy Code/ /提取设备的清单ICaptureDevice 设备=器件我;/ /打开设备捕捉诠释 readTimeoutMilliseconds =1000;readTimeoutMilliseconds)device.Open (DeviceMode.Promiscuous();(“ -监听0,);Console.WriteLineConsole.WriteLinedevice.Descr

31、iption分组包=0;/ /保存捕获数据包使用GetNextPacket ()而(包=device.GetNextPacket()!=空)/ /打印的时间和收到的每个数据包的长度DateTime 的时间=packet.PcapHeader.Date;诠释 长度=packet.PcapHeader.PacketLength;Console.WriteLine( “0 : 1 : 2 ,3 4长度=”time.Hour , time.Minute ,time.Second , time.Millisecond, len 个);/ /关闭pcap的设备device.Close ();Console

32、.WriteLine( “ -捕捉停止,装置关闭。”);过滤交通(例如在源码包5 )由libpcap和WinPcap的提供了最强大的功能之一就是过滤引擎。它提供了非常有效的方式来接收网络流量的子集。WinPcap的和libpcap拥有一个完整的编译器,它接受一个string包含一个高层次的布尔(过滤器)的表达,并产生一个低级别的字节代码,可以通过数据包捕获驱动程序解释的过滤器的发动机。作为tcpdump 的布尔语法)表达式的语法(也称为被广泛用于许多应用的libpcap 和WinPcap 的除外。你可以找到它的规格在WinPcap 的文档页面,或者如果您运行的是通过Linux的人pcap的过滤

33、器。该Filter属性相关联过滤器,捕捉器。一旦Filter 设置,相关的过滤器将被应用到所有的数据包来自于网络,所有的符合性的数据包(即包为其布尔表达式的值为true )将实际复制到应用程序。下面的代码演示如何编译和设置过滤器。请注意的libpcap / WinPcap的的表达式编译器要求掩码由ICaptureDevice 传递连同过滤器,因为编译器创建的一些过滤器需要它。然而SharpPcap 需要通过自动提取从适配器掩码它照顾我们。该过滤器的表达我们在下面的代码片段使用“IP和TCP,这意味着只保留数据包是IPv4和TCP和提供这些应用程序”: -Collapse | Copy Code

34、/ /打开设备捕捉1000;诠释 readTimeoutMilliseconds =,readTimeoutMillisecondsdevice.Open ( DeviceMode.Promiscuous/ / tcpdump的过滤器,只捕获的TCP / IP 数据包字符串过滤=“IP和TCP ;device.Filter =Console.WriteLineConsole.WriteLine();(“-下tcpdump的过滤器将被应用于:032 / 27过滤器);Console.WriteLine(“-. 监听0,按回车停止”,device.Description/ /开始捕获数据包无限期d

35、evice.Capture();关闭pcap的设备(注:这条线将永远不会被调用,因为 我们捕捉无限期device.Close();口译(在源代码包示例 6)包现在,我们能够捕捉和过滤网络流量,我们希望把我们的知识,可以用一个简单的真实世界”的申请。在这一课,我们将采取从前面的代码,并使用这些作品建立一个更加有用的程序。当前 计划的主要目的是展示如何捕获的数据包的协议头可以解析和解释。由此产生的程序,名字叫DumpTCP,打印网络摘要对我们的 TCP流量。我选择了解析和显示 TCP协议(UDP的例子, 而不是在原来的教程贴),因为它是一个更加有趣比UDP和SharpPcap 它不需要太多的编码解

36、析。Collapse |Copy Code/摘要/ / / 打印的时间,长度,源IP ,/ / /源端口,DST的IP和端口的DST/ / / 为每个TCP / IP数据包在网络上收到/ / /摘要私有静态无效 device_OnPacketArrival(对象发件人,CaptureEventArgs 五)风险值的 TCP = TcpPacket.GetEncapsulated( e.Packet )如果(技术合作计划!=空)DateTime 的时间=e.Packet.Timeval.Date;诠释长度=e.Packet.Data.Length;串 srcIp = tcp.SourceAddr

37、ess;串 dstIp = tcp.DestinationAddress;Console.WriteLine( “0 : 1 : 2 ,3 4长度=”time.Hour , time.Minute ,time.Second , time.Millisecond, len 个);Console.WriteLine( e.Packet.ToString();如果你在看一个 UDP的例子原WinPcap教程,你将看到它是多么复杂的报文解析(虽然 UDP 是一个简单的TCP解析位比在我们的例子)提供直接从数据字节的原始WinPcap的库。幸运的是,SharpPcap 提供了一些有用的数据包进行分析一些

38、常见的协议(例如TCP , UDP和ICMP和其他)类。这些分析类是直接的 C #最初是从翻译 JPcap,一个libpcap的Java包装/ WinPcap 的类似SharpPcap ,但已作岀重大改变,使他们更好地适应。NET中。所有代码的数据包解析和生成可以发现,在 PacketDotNet 命名空间中 PacketDotNet 大会。正如你可以看到,在我们的包处理,我们首先尝试提取的TCP报文的那包就行了捕获封装。如果一个人发现了,它应该是唯一的选择,因为我们的TCP数据包过滤器,我们就可以访问其属性。如果我们也希望看到的 IP数据包通过这些属性是可以访问 var ip =IpPack

39、et.GetE ncapsulated(e.Packet); Collapse | Copy Code可用设备:1 )英特尔(R) PRO/1000 吨移动连接(微软的数据包调度程序)请选择一个设备捕捉:1-英特尔听力(R)的PRO/1000 吨移动连接-(微软的数据包调度程序) “1:43501 “47:80 “1:435011:18:17,675长度=123 47:80 -1:18:17,675长度=80 1:43501 -1:18:17,919长度=54 47:80 -

40、最后三个行,每行代表一个不同的数据包。脱机处理转储文件(例如,在源码包8)在本节中,我们将学习如何处理数据包捕获到一个文件(转储到文件)。Libpcap的/ Win Pcap的提供内置的保存到一个文件中的网络通信功能和读取的转储内容-这部分将教你如何完成与SharpPcap 这一点。为转储文件的格式是 libpcap的一个。这种格式包含了二进制数据捕获的数据包的形式,广泛应用于许多网络工具,包括的wireshark ,windump ,tcpdump 和snort的使用标准。因此,任何转储文件中,我们创建使用SharpPcap 可与上述工具和其他人可以通过这些工具创建的文件SharpPcap打

41、开任何打开。保存数据包转储文件首先,让我们来看看如何写libpcap文件格式的数据包。下面的示例捕获从选定的接口的数据包并将其保存在一个文件的名称是由用户提供他们:-Collapse | Copy CodeConsole.Write(“-请输入输岀文件名:”);串 capFile = Console.ReadLine();ICaptureDevice设备=CaptureDeviceList.Instance 我;/ /注册的处理函数的包到来的事件device.OnPacketArrival + =新 SharpPcap.PacketArrivalEventHandler(device_OnPa

42、cketArrival/ /打开设备捕捉诠释 readTimeoutMilliseconds =1000;device.Open (DeviceMode.Promiscuous,readTimeoutMilliseconds/ /打开或创建一个捕获输出文件device.DumpOpen(capFile );Console.WriteLineConsole.WriteLine();(“-. 监听0,按按 Ctrl - c来退岀”device.Description/ /开始捕获无限期device.Capture();/ /关闭pcap的设备/ / (注:这条线将永远不会被调用,因为 / /我们永

43、远捕捉device.Close ();这里是包处理程序,将每一个收到的数据包转储到文件中:Collapse |Copy Code/ / /摘要/每次接收的数据包转储到一个pcap的文件/ / /摘要私有静态无效 device_OnPacketArrival(对象发件人,CaptureEventArgs 包)ICaptureDevice 设备=(ICaptureDevice)寄件人;/ /如果设备有一个转储文件打开女口果(device.DumpOpened )/ /数据包转储到文件device.Dump (包);Console.WriteLine(数据包转储到文件中。”;正如你可以看到,该方案的

44、结构非常相似,我们在前面的章节中看到的。区别是:? 调用device.DumpOpen(capFile)发岀一旦接口被打开。此调用打开与接口转储文件和关联。处理程序调用的数据包。请注意ICaptureDevice 。? 数据包写入该文件以 device.Dump( packet )个使用发送者的对象参数传递给包处理程序回调是投从转储文件中读数据包现在,我们有一个转储文件可用,我们可以尝试读取其内容。下面的代码打开一个Win Pcap的/ libpcap的转储文件并显示文件中的每个数据包。该SharpPcap.OfflineCaptureDevice(capFile)类是一个 ICaptureD

45、evice 对象,表示脱机捕获文件,我们读到,那么通常On PacketArrival事件中使用的数据包按顺序。正如你可以看到,从脱机阅读捕获数据包几乎是相同的,以期得到一个物理接口它们:Collapse |Copy CodeConsole.Write ( “ -请输入一个输入捕捉文件名:”);串 capFile = Console.ReadLine();ICaptureDevice 装置;尝试/ /得到一个脱机文件pcap的设备设备=新 OfflineCaptureDevice(capFile );/ /打开设备捕捉device.Open ();赶上(例外五)Console.WriteLin

46、e( e.Message );返回;/ /注册的处理函数的包到来的事件device.OnPacketArrival + =新 SharpPcap.PacketArrivalEventHandler( device_OnPacketArrival);Console.WriteLine();Console.WriteLine( “-捕获0,按按 Ctrl - C 退出”capFile );/ /开始捕获的数据包数量不定device.Capture();/ /关闭pcap的设备device.Close ();Console.WriteLine( “ -文件结束为止。”);发送数据包(例如,在源码包9

47、)最简单的方法来发送一个数据包显示在下面的代码片段。开业后适配器,Sen dPacket调用来发送一个手工制作的数据包。Sen dPacket作为参数的字节数组或Packet 对象,它包含的数据被发送。请注意,缓冲区发送到网络中,它已收到。这意味着应用程序必须创建正确的协议头,以送一些有意义的事:Collapse | Copy Code/ /打开设备device.Open ();/ /生成一个随机分组字节 字节=GetRandomPacket ()尝试/ /发送数据包的网络设备岀device.SendPacket(字节);Console.WriteLine(“-包发送成功。”);赶上(例外五)

48、Console.WriteLine(“ - +e.Message );/ /关闭pcap的设备device.Close ();Console.WriteLine( “ -设备关闭。”)发送队列-WinPcap 的专用的扩展(例如,在源码包 10)虽然SendPacket 提供了一个简单而直接的方法来发送一个数据包,发送队列提供了一个先进,强大和优化机制,寄包集合。发送队列是一个一将数据包发送到网络变量的容器。它有大小,它代表的字节可以存储的最大数量。由于SendQueue WinPcap的具体功能是,作者建议的SharpPcap 基准特定使用您的发送队 列发送数据包,以确定如果损失跨平台支持的

49、使用效率是值得的补充。一句老话,避免过早优化”应该慎重考虑。SharpPcap 代表发送队列使用 SendQueue类,这是通过指定构造队列的大小,新的发送。一旦发送队列的创建,Sen dQueue.Add()可以被调用时,添加一个数据包的发送队列。这个函数接受一个PcapHeader 与数据包的时间戳和长度和一个缓冲或Packet分组数据对象持有的。这些参数是由收到相同的On PacketArrival事件,因此排队一个数据包从刚刚抓获了一名或读文件是传递参数的问题这些Sen dQueue.Add()要发送发送队列,SharpPcap 提供 WinPcapDevice.SendQueue(S

50、endQueue q,Sen dQueueTra nsmitModes tran smitMode)功能。请注意第二个参数:如果SendQueueTransmitModes.Synchronized,发送将被 同步,即数据包的相对时间戳将得到尊重。此操作需要非凡的CPU数量,因为同步需要在内核中使用忙等待”循环赶车。尽管这个操作是相当的 CPU密集型的,它往往在非常高的精度的数据包传输的结果(经常在以下 几微秒)。请注意,转递发送队列Win PcapDevice.Se ndQueue()能更有效的不是执行一系列ICaptureDevice.Se ndPacket()由于发送量在内核队列缓冲交换

51、机数量急剧减少的情况。当不再需要排队,它可以被删除的Sen dQueue.Dispose()是释放所有的队列发送缓冲区与。下一个程序显示了如何使用发送队列。它打开通过创建一个捕获文件Offli neCaptureDevice()那么它存储文件的数据包从发送到正确分配队列。在这一点上,它传输队列同步。请注意,链路层的转储文件是比一的接口,将数据包发送使用PcapDevice.DataLi nk财产,并打印一个警告,如果它们是不同的-这是很重要的捕获文件的链接层是作为适配器的,否则传输链路层一样是毫无意义的:-Collapse | Copy CodeICaptureDevice 装置;尝试/ /得

52、到一个脱机文件pcap的设备设备=新 OfflineCaptureDevice( capFile );/ /打开设备捕捉device.Open ();赶上(例外五)Console.WriteLine( e.Message );返回;Console.Write (排队包”);/ /分配一个新的发送队列SendQueue squeue = 新 SendQueue(int )的(OfflineCaptureDevice)设备)PcapFileSize 。);分组包;尝试/ /遍历所有数据包中的文件,并添加到队列而(包=device.GetNextPacket()!=空)如果(! squeue.Add

53、(包)Console.WriteLine(警告:数据包缓冲区太小,” +并非所有的数据包将被发送。”); 打破;赶上(例外五)(e.Message )Console.WriteLine返回;Console.WriteLine(行”Console.WriteLine()Console.WriteLine(以下设备机可在本:”)Console.WriteLine(“Console.WriteLine()诠释我=0;=CaptureDeviceList.lnstanceVaR 的 装置;/ /打印岀所有可用的设备的 foreach (ICaptureDevice dev 的设备中)Console.WriteLine( 0 ) 1,我 dev.Description );我+ +;Console.WriteLine();Console.Write (-请选择一个设备,传送关于:”;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论