logo资料库

Winpcap中文技术文档.pdf

第1页 / 共63页
第2页 / 共63页
第3页 / 共63页
第4页 / 共63页
第5页 / 共63页
第6页 / 共63页
第7页 / 共63页
第8页 / 共63页
资料共63页,剩余部分请下载后查看
WinPcap 中文技术文档(4.1.2) 作者: The WinPcap Team 作者主页: http://www.winpcap.org 1. 介绍 本手册描述了 WinPcap 的编程接口及其源代码。它与完整的 WinPcap 核心文档一起,为编程人员提供 了函数与结构的详细描述,同时也提供了几个教程和程序范例。 您可以点击页面顶部的导航链接,或者使用页面左边的树形控件来跳转到您感兴趣的内容。 本文档使用 Doxygen 文档系统创建,您可以登录 http://www.doxygen.org 阅览相关内容。 1.1. 什么是 WinPcap WinPcap 是一个基于 Win32 平台的开源库,用于数据包捕获和网络分析。 大多数网络应用程序通过被广泛使用的操作系统组件来访问网络,例如:sockets。使用这种方式你可 以很容易的访问网络上的数据,因为操作系统已经为你妥善处理了底层具体实现细节(比如:协议处理, 封装数据包等等),并且提供了一个与读写文件类似的简单接口。 然而,有些时候,这种“简单的方式”并不能满足任务的需求,因为有些应用程序需要直接访问网络 中的数据包。也就是说,他们需要访问网络中的原始(没有被操作系统进行网络协议处理)的数据包。 WinPcap 的目的就是为 Win32 应用程序提供这种访问方式;它提供了以下功能: 1) 捕获原始数据包,无论它是发往某台机器的,还是在其他设备(共享媒介)上进行交换的; 2) 在数据包发送给某应用程序前,根据用户指定的规则过滤数据包; 3) 将原始数据包通过网络发送出去; 4) 收集并统计网络流量信息; 以上这些功能需要通过设备驱动程序获得,它们安装在 Win32 内核中网络接口的内部,再加上几个动 态链接库 DLL。 所有这些功能都能通过一个强大的编程接口来表现出来,易于开发,可以在不同的操作系统上使用。 本 手册的主要目标是在一些程序范例的帮助下描述这些接口的使用。 如果您现在就想开始探索这些功能,您 可以直接进入“WinPcap 用户手册”章节。 1.2. 哪些程序使用 WinPcap WinPcap 编程接口已经被许多类型的网络工具使用,包括数据分析、故障排查、安全和监控等。特别的, 一些基于 WinPcap 的典型应用有: 1) 网络与协议分析器 (network and protocol analyzers) 2) 网络监视器 (network monitors)
3) 网络流量记录器 (traffic loggers) 4) 网络流量发生器 (traffic generators) 5) 用户级网桥及路由 (user-level bridges and routers) 6) 网络入侵检测系统 (network intrusion detection systems (NIDS)) 7) 网络扫描器 (network scanners) 8) 安全工具 (security tools) 1.3. 什么是 WinPcap 做不到的 WinPcap 可以独立地通过主机协议发送和接收数据,例如:TCP-IP。这就意味着它不能阻止、过滤或操 作同一机器上由其他应用程序产生的流量:它仅仅能简单地“监视”网络上传输的数据包。所以,它不能 提供类似于网络流量控制、服务质量调度和个人防火墙应用程序之类的支持。 1.4. 本手册的目标 本手册的目的是提供一个完整和简单的方法,让您浏览 WinPcap 结构的文档。 你会发现两个主要部分: WinPcap 用户指南和 WinPcap 核心资料。 第一部分内容主要适用于那些需要使用 WinPcap 开发应用程序的编程人员:它包含 WinPcap API 导出的 所有函数和数据结构的信息,这一部分解释如何编写一个数据包过滤器,而另一个页面则解释了何将它包 含到应用程序中。本教程也提供了若干个程序的范例,您可以使用它来循序渐进地学习 WinPcap API 的基本 使用方法,但是它也会提供一些高级应用的代码片断。 第二部分内容主要为 WinPcap 的开发者和维护人员,以及那些希望了解系统工作原理的人士而准备的。 它提供 WinPcap 架构的通用描述,并且解释了它是如何工作的。 另外,它说也明了完整的设备驱动的数据 结构及源代码,Packet.dll 的接口以及底层的 WinPcap 的 API。 如果您想了解 WinPcap 内部发生了什么,或 者您需要扩展它,那么请您阅读这一部分的内容。 1.5. 附加文档 其他文档和最新的文档,我建议你请访问 http://www.winpcap.org/docs/。 特别地,如果您对 WinPcap 的结构和核心内容感兴趣,我们建议您阅读下列的文档: 1) Fulvio Risso, Loris Degioanni, An Architecture for High Performance Network Analysis, Proceedings of the 6th IEEE Symposium on Computers and Communications (ISCC 2001), Hammamet, Tunisia, July 2001 2) Loris Degioanni, Mario Baldi, Fulvio Risso and Gianluca Varenni, Profiling and Optimization of Software-Based Network-Analysis Applications, Proceedings of the 15th IEEE Symposium on Computer Architecture and High Performance Computing (SBAC-PAD 2003), Sao Paulo, Brasil, November 2003 3) Loris Degioanni, Development of an Architecture for Packet Capture and Network Traffic Analysis, Graduation Thesis, Politecnico Di Torino (Turin, Italy, Mar. 2000) 1.6. 术语 1) 为了文献的一致性, 我们会使用术语“数据包(packet)” ,尽管用术语“帧(frame)”会更加准确, 因为捕获过程是在数据链路层上完成的,并且数据链路首部也包含在被捕获的数据之中。
2) 本文档中使用的术语“Win9x ”表示与 Windows95 同一体系的微软操作系统,例如:Windows 98 和 Windows ME。术语“WinNTx”表示基于 NT 内核的操作系统,从 Windows NT 4 开始,包含 Windows 2000,Windows XP,Windows Server 2003 等。 1.7. 附注 我们主要会致力于开发基于 Windows NT/2000/XP/2003 版本的 WinPcap 及其相关文档。这一选择是基于 这样一个事实,大多数 WinPcap 用户都工作在 NTx 系统上, 而且 9x 技术已经被微软放弃。此外,我们假 定,使用 PC 机来完成类似网络分析这样高级任务的用户,都会安装高级的操作系统。鉴于这个原因, 本 文档将参考 WinNTx 的驱动和 API。Win9x 版本在概念上很类似,不过有时在执行上有些不同。在有些场合, Win9x 版本的 API 缺少一些高级功能。 这本手册会给出一个完整的 API 描述,并会指出那些只有 WinNTx 才 得到支持的函数。 2. WinPcap 用户手册 2.1. 详细描述 这节包含了有关 wpcap.dll 的用户指南,wpcap.dll 是一个包含公共 WinPcap API 的动态链接库。Wpcap.dll 导出一组系统独立的包捕获和网络分析的函数。这些函数可以用于: 1) 获取网络适配器列表 2) 获取网络适配器的不同信息,比如网卡描述和地址的列表 3) 使用 PC 的一个网卡来捕获数据包 4) 向网络上发送数据 5) 有效保存数据包到磁盘,并通过一个接口捕获数据包,就如同从网卡捕获数据一样 6) 使用高级语言创建一个数据包过滤器,并把它们应用到数据捕获中去 wpcap.dll 兼容 libpcap 库,后者是 Unix 平台下著名的数据包捕获库。这个兼容性意味着你可以开发可 移植的网络工具,这些工具既可以运行在 Win32 系列的操作系统,也可以运行在与 Unix 兼容的机器上。 在这一章节中,手册中的几个部分内容直接来自于 tcpdump 和 libpcap 的用户手册,它们由 tcpdump.org 的开发人员维护。因此,如果你想阅读最新的文档,你可以访问 www.tcpdump.org 网站。 2.2. 注意 有些函数被标注为 deprecated 或 discouraged。这些标签的含义是: 1) discouraged: 这个函数的功能已经被另一个函数所代替,不过这个函数仍然可以使用。 2) deprecated: 这些函数只是为了可移植性和向下兼容而存在的,它应该被禁止使用,并且强烈建议 你使用另一个等价的函数来代替它。 2.3. 过滤串表达式的语法 注意:这篇文档取自 tcpdump 的指南。原始的版本可以在 www.tcpdump.org 上找到。
wpcap 的过滤器是以已声明的谓词语法为基础的。过滤器是一个包含过滤表达式的 ASCII 字符串。 pcap_compile()把这个表达式编译成内核级的包过滤器。 这个表达式会选择那些数据包将会输出。如果给定表达式,那么网络上所有的包都会被内核级过滤引 擎所接收。不然,只有那些表达式为“true”的包才会被接收。 这个表达式包含了一个或多个原语。原语通常包含一个 id(名字或序列),后面跟着一个或者多个限定词。 以下是三种不同的限定词: type(类型) 限定词指明 id 名称或数字所代表是什么东西。可能的类型有 host、net 和 port。比如:“host foo”,“net 128.3”,“port 20”。如果没有类型限定词,就缺省为 host。 dir(方向) 限定词指定相对于 id 的一个特定的传输方向。可能的方向有 src、dst、src or dst 和 src and dst。例如: “src foo”,'dst net 128.3',`src or dst port ftp-data'。如果没有指定方向,那就缺省为 src or dst。如果没有链 路层(比如,像 slip 这样的点对点协议),那么限定词可以使用 inbound 和 outbound,来指明一个方向。 Proto(协议) 限定词限制了所匹配的协议。可能的协议有 ether,fddi,tr,ip,ip6,arp,rarp,decnet,tcp 和 udp。 比如:`ether src foo',`arp net 128.3',`tcp port 21'。如果没有指定协议限定词,那么就假定所有的协议都会 被允许。例如:'src foo'等价于'(ip or arp or rarp)src foo'(当然,不能有不符合语法的字母出现),'net bar'等价 于'(ip or arp or rarp) net bar','port 53'等价于'(tcp or udp) port 53'。 [ 'fddi'通常是'ether'的别名;解析器会认为它们是在特定网络接口上的数据链路层。FDDI 的首部包含了 和以太网很相似的源地址和目的地址,并且通常也包含了和以太网很相似的数据包类型。所以,在 FDDI 网 域上使用过滤器和在以太网上使用过滤器基本一致。FDDI 的首部还包括了其他的数据,不过你不能在过滤 器表达式内表示他们。 同样的,'tr'也是'ether'的一个别名,它是较早被应用于 FDDI 的首部,也应用在令牌 环网络首部。] 除了以上内容,还有一些特殊的限定词和上面的形式不太一样,它们是 gateway,broadcast,less,greater 和一些算术表达式。这些内容会在下面和大家介绍。 我们可以使用 and,or 和 not 逻辑表达式将原语连接起来,来构造一个更复杂的过滤表达式。例如:`host foo and not port ftp and not port ftp-data'。如果要简化输入,我们可以把已列出的 id 限定词省略。比如:`tcp dst port ftp or ftp-data or domain' 和 `tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain'两者是完全 等价的。 可使用的原语有: dst host host:当 IPv4/v6 数据包的目标域(destination field)为 host 时为 true,host 既可以是地址,也可 以是名字。 src host host:当 IPv4/v6 数据包的源字段(source field)为 host 时为 true。 host host 当 IPv4/v6 数据包的源字段(source field)或目标字段(destination field)为 host 时为 true。以上任 何一个 host 表达式可以是 ip,arp,rarp 或 ip6 开头,如下所示: ip host host 等价于: ether proto ip and host host 如果 host 是一个带有多 IP 地址的名称,那么每一个地址都会被匹配。 ether dst ehost:当以太网的目的地址为 ehost 时为 true。ehost 可以是一个来自/etc/ether 的名字,也可 以是一个数字代号(参见 ethers(3N)for numeric format)。 ether src ehost: 当以太网的源地址为 ehost 时为 true。 ether host ehost: 当以太网的目的地址,或源地址为 ehost 时为 true。 gateway host:当 host 为网关时为 true。即,以太网源地址或目的地址是 host,但源地址和目的地址不 同时为 host。host 必须能被机器的主机到 IP 地址(host-name-to-IP-address)机制找到(例如:主机名文件,DNS, NIS 等),也能被主机到以太网地址(host-name-to-Ethernet-address)机制找到(如:/etc/ethers 等)。
例如: ether host ehost and not host host host / ehost 均可使用名字或数字。这个语法目前在 IPv6 下不能工作。 dst net net:当 IPv4/v6 数据包的目的地址的网络号包含 net 时为 true。net 可以是一个来自/etc/networks 的名字,也可以是一个网络号(更多内容请参见 networks(4))。 src net net 当 IPv4/v6 数据包的源地址的网络 号包含了 net 时为 true。 net net:当 IPv4/v6 数据包的目的地址,或源地址的网络号包含了 net 时为 true net net mask netmask:当 IP 地址是 net ,子网掩码匹配 netmask 时为 true。 可能需要 src 或 dst 加 以限制。 注意,这个语法不能应用于 IPv6。 net net/len:当 IP 地址是 net ,子网掩码连续 1 的个数为 len 时为 true。可能需要 src 或 ds 加以限制。 dst port port:当数据包是 ip/tcp, ip/udp, ip6/tcp 或 ip6/udp,并且目的端口号是 port 时为 true。port 可以是数字,或是在/etc/services 中被使用的名字。(参见 tcp(4P) and udp(4P))。如果使用名字,那么端口号 和协议都将被检测。如果使用数字,或者一个不明确的名字,那么只有端口号会被检测。(比如:dst port 513 将打印 tcp/login 数据流和 udp/who 数据流。port domain 将打印 tcp/domain 的数据流和 udp/domain 的数据 流)。 src port port:当源端口号是 port 时为 true。 port port:当源端口号或目的端口号为 port 时为 true。以上任何一个 port 表达式可以以关键字 tcp 或 udp 开头,如下所示: tcp src port port 只匹配源端口是 port 的 tcp 数据包。 less length:当数据包的长度小于等于 length 时为 true。即: len <= length. greater length:当数据包的长度大于等于 length 时为 true。即: len >= length. ip proto protocol:当数据包是 IP 数据包,并且它的协议类型为 protocol 时为 true。protocol 可以是一个 数字,也可以是 icmp, icmp6,igmp,igrp,pim,ah,esp,vrrp,udp 或 tcp 中的一个。注意,tcp,udp, icmp 是关键字,所以,它们要使用反斜杠(\)来转义,就好比 C-shell 中的\\。注意,这个原语不会去追踪协议首 部链。 ip6 proto protocol:当数据包是 IPv6 数据包,并且它的协议类型为 protocol 时为 true。注意,这个原语 不会去追踪协议首部链。 ip6 protochain protocol 当数据包是 IPv6 数据包,并且,在它的协议首部链中,包含了 protocol 类型的 协议首部时,为 true。 例如: ip6 protochain 6 能匹配所有的,拥有 TCP 协议首部的 IPv6 的数据包。在 IPv6 首部和 TCP 首部之间,可能包含认证首部, 路由首部和跳数选项首部。由这个原语所生成的 BPF(BSD Packet Filter,包过滤机制)码是复杂的,而且不能 被 BPF 优化器优化,所以,在某些程度上,它的速度比较慢。 ip protochain protocol:其功能和 ip6 protochain protocol 相同,只是这个应用于 IPv4。 ether broadcast:当数据包是以太网广播数据包时为 true。关键字 ether 是可选的。 ip broadcast:当数据包是 IP 广播数据包时为 true。它会检查所有的广播,包括地址全是 0 的和地址全 是 1 的,然后,检查子网掩码。 ether multicast:当数据包是以太网多播数据包时为 true。关键字 ether 是可选的。 下面是一个常用短 语`ether[0] & 1 != 0' ip multicast: 当数据包是 IP 多播数据包时为 true。 ip6 multicast:当数据包是 IPv6 多播数据包时为 true。 ether proto protocol:当数据包是以太类型的 protocol 时为 true。protocol 可以是一个数字,也可以是 ip, ip6, arp, rarp, atalk, aarp,decnet, sca, lat, mopdl, moprc,iso, stp, ipx, netbeui 中的一个。注意,这些符号也都是 关键字,所以,他们都需要用反斜杠(\)转义。 [在使用 FDDI(比如'fddi protocol arp')和令牌环(比如'tr protocol arp')和其他大多数这种协议时,协议根据 802.2 逻辑链路控制(LLC)来识别,这些信息通常在 FDDI 或令牌环 首部的开始。 当需要识别大多数协议的标识,比如 FDDI 或令牌环时, Tcpdump 只检查 LLC 报头的 ID 数据域,
它们以 SNAP 格式存储,并且,组织单位识别码(Organizational Unit Identifier(OUI))为 0x000000,以封装以太 网。它不会检查这个包是不是 SNAP 格式的,并在 0x000000 单元有 OUI。 然而,iso 是个特例,它会检查 LLC 首部的目的服务存取点 DSAP(Destination Service Access Point)和源服务存取点 SSAP(Source Service Access Point),stp 和 netbeui 会检查 LLC 首部的 DSAP,atalk 会检查数据包是不是 SNAP 格式的,并且 OUI 是不是 0x080007。Appletalk 同样如此。 在以太网的例子中,tcpdump 检查大部分协议的以太网类型字段,iso,sap 和 netbeui 除外,因为它们会检查 802.3 帧,然后检查 LLC 首部,就像它对 FDDI 和令牌环那样。atalk,它 检查以太网帧的 Appletalk etype 和 SNAP 格式的以太网帧,arrp,它在以太网帧中检查 Appletalk ARP etype, 或是在 OUI 为 0x000000 的 802.2 SNAP 帧中查找,还有 ipx,他会在以太网帧中检查 IPX etype,在 LLC 首部 检查 IPX DSAP,没有用 802.3 封装的 LLC 首部的 IPX,和 SNAP 帧中的 IPX etype。] decnet src host:当 DECNET 的源地址为 host 时为 true,它可能是一个格式为'10.123'的地址,也可能是 一个 DECNET 主机名。[DECNET 主机名称只有在配置成可运行 DECNET 的 Ultrix 系统中才得到支持。] decnet dst host :当 DECNET 的目的地址为 host 时为 true。 decnet host host:当 DECNET 的源地址或目的地址为 host 时为 true。 ip, ip6, arp, rarp, atalk, aarp, decnet, iso, stp, ipx, netbeui 缩写是: ether proto p p 是以上协议中的一个。 lat, moprc, mopdl 缩写是: ether proto p p 是以上协议中的一个。 注意: tcpdump 目前并不知道,如何解析出这些协议。 vlan [vlan_id]当数据包是 IEEE 802.1Q VLAN 数据包时为 true。若[vlan_id]被指定,则仅当数据包为指定的 vlan_id,值才为 true。注意,在假设数据包为 VLAN 数据包的前提下,表达式中的第一个关键字 vlan 会改变 剩余表达式的解码偏移量。 tcp, udp, icmp 缩写是: ip proto p or ip6 proto p p 是以上协议中的一个。 iso proto protocol:当数据包的协议类型为 protocol 的 OSI 数据包时值为 true。Protocol 可以是一个数 字或以下名称中的一个:clnp,esis 或 isis。 clnp, esis, isis 缩写是: iso proto p p 是以上协议中的一个。注意,tcpdump 并不能完成这些协议的全部解析工作。 expr relop expr: 若关系式如下:relop 是 >, <, >=, <=, =, != 中的一个,并且 expr 是一个由正整常数(用 标准 C 语言的语法表示),标准二进制运算符[ +, -, *, /, &, | ],运算符的长度,和指定数据包存取,则值为 true。 要存取数据包内的数据,可以使用以下的语法: proto [ expr : size ] Proto 是 ether, fddi, tr, ip, arp, rarp, tcp, udp, icmp or ip6 中的一个,它为索引操作指明了协议层。注意, tcp,udp 和其他较高层的协议类型只能应用于 IPv4,而不能用于 IPv6(这个问题可能在将来能得到解决)。被指 定的协议层的字节偏移量由 expr 给出。Size 是可选的,它指明了数据域中,我们所感兴趣的字节数。它可 以是 1,2,或 4,默认为 1。运算符的长度,由关键字 len 给出,指明了数据包的长度。 例如,`ether[0] & 1 != 0'会捕捉所有的多播数据流。表达式`ip[0] & 0xf != 5'能捕捉所有带可选域的 IP 数 据包。表达式`ip[6:2] & 0x1fff = 0'仅捕捉未分段的数据报和段偏移量是 0 的数据报。这个检查隐含在 tcp 和 udp 的下标操作中。例如,tcp[0]通常指第一个字节的 TCP 首部,而不是指第一个字节的分段。 有些偏移量和域值可以以名字来表示,而不是数值。以下协议首部域的偏移量是正确的:icmptype (ICMP 类型域), icmpcode (ICMP 代码域), and tcpflags (TCP 标志域)。 ICMP 类型域有以下这些: icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect, icmp-echo, icmp-routeradvert, icmp-routersolicit, icmp-timxceed, icmp-paramprob, icmp-tstamp, icmp-tstampreply, icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply. TCP 标志域有以下这些: tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-push, tcp-ack, tcp-urg. 原语可以用以下内容组合:用圆括号括起来的原语和操作符 (圆括号在 Shell 中是特殊符号,所以必须 要转义)。 取反操作 (`!' 或 `not'). 连接操作 (`&&' 或 `and'). 选择操作 (`||' 或 `or').
取反操作的优先级最高。 连接操作和选择操作有相同的优先级,并且它们的结合方向为从左向右。 注 意:做连接的时候是需要显示的 and 操作符的,而不是把要连接的东西写在一起。 如果给出一个标识符,却没有关键字,那么就会假定用最近使用的关键字。 例如: not host vs and ace 等价于 not host vs and host ace 不能和下面的混淆 not ( host vs or ace ) 表达式参数即可以作为单个参数,也可以作为多个参数传递给 tcpdump,后者更加方便一些。一般的, 如果表达式包含一个 Shell 的元字符,那么用一个参数传递比较容易,最好把它括起来,多个参数在传递前, 用空格连接起来。 2.4. 在你程序中使用 WinPcap 2.4.1. 创建一个使用 wpcap.dll 的应用程序 用 Microsoft Visual C++ 创建一个使用 wpcap.dll 的应用程序,需要按一下步骤: 1) 在每一个使用了库的源程序中,将 pcap.h 头文件包含(include)进来。 2) 如果你在程序中使用了 WinPcap 中提供给 Win32 平台的特有的函数, 记得在预处理中加入 WPCAP 的定义。 3) 如果你的程序使用了 WinPcap 的远程捕获功能,那么在预处理定义中加入 HAVE_REMOTE。不要直 接把 remote-ext.h 直接加入到你的源文件中去。 4) 设置 VC++的链接器(Linker),把你的目标(x86 或 x64)指定的 wpcap.lib 库文件包含进来。X86 的 wpcap.lib 可以在 WinPcap 开发包中 lib 目录下找到,x64 位的 wpcap.lib 可以在 lib/x64 目录中发现。 5) 设置 VC++的链接器(Linker),把 ws2_32.lib 库文件包含进来。这个文件分布于 C 的编译器,并且包 含了 Windows 的一些 socket 函数。本教程中的一些范例程序,会需要它。 如何正确的设置Microsoft Visual Studio: Visual Studio 6 1) 要添加一个预处理定义,你需要打开 Project 菜单,选择 Settings,然后选择 C/C++选项卡,在 General 类下,你必须在 Preprocessor Definitions 下的文本框中添加定义。 2) 要在一个 VC++6.0 工程中,添加一,个新的库,你必须打开 Project 菜单,选择 Settings,然后选择 Link 选项卡,然后把新库的名字添加到 Object/Library modules 下的文本框中 3) 要向 VC++6.0 中添加一个新的库所在的路径,你必须打开 Tool 菜单,选择 Options,然后选择 Directories 选项卡,在 Show directories 下拉框中选择 Library files,并且将新的路径添加到 Directories 中去 4) 要向 VC++6.0 中添加一个新的包含文件所在的路径,你必须打开 Tool 菜单,选择 Options,然后选 择 Directories 选项卡,在 Show directories 下拉框中选择 Include files,并且将新的路径添加到 Directories 中去。 Visual Studio 2005(需要编译 x64 位应用程序) 1) 添加一个预处理器定义,你必须选择“Project”/“Properties”,然后从左边的列表控件中选择 C/C++, 在 Preprocessor 目录下,你必须把定义添加到 Preprocessor Definitions 文本框中。 2) 添加新的库到项目中,你必须选择 Project/Properties,然后从坐标的列表控件中选择 Linker,在 Inpute 目录下,把一个新的库添加到 Additonal Dependencies 文本框中。
3) 把新的路径添加到查找库的路径中,你必须选择 Tools/Options,然后从左边的列表控件中选中 Project/Solutions,VC++Directories,然后再显示的目录可选框中选择库文件,添加路径到文本框中。 4) 添加新的路径,从改路径中查找 Include 文件,你必须选择 Tools/Options,然后在左边的列表控件 中选择 Project/Solutions,VC++ Directories,这时选择 Include Files,添加路径到文本框中。 2.4.2. 范例程序 我们提供一些范例程序来显示 WinPcap API 的使用方法。这些程序的源代码,以及编译运行这些代码所 需的所有文件,都可以在 Developer's Pack 找到。作为教程,在这里我们提供了可浏览形式的代码:这样, 在每个函数和变量之间的跳转会比较方便。更多完整的范例程序,请参阅 WinPcap 教程。 2.4.2.1. Packet Dump 这个程序会依据命令行参数,从网络适配器或是从文件中读取数据包。如果没有提供数据源,那么程 序会显示出所有可用的适配器,你可以从中选择一个。当捕获过程开始后,程序会打印数据包的时间戳、 长度和原始内容。一旦程序被编译,那么它将能运行于所有的 Win32 平台,当然,它也可以被编译成 Unix 平台的程序。 /* * Copyright (c) 1999 - 2005 NetGroup, Politecnico di Torino (Italy) * Copyright (c) 2005 - 2006 CACE Technologies, Davis (California) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the Politecnico di Torino, CACE Technologies * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
分享到:
收藏