- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于libpcap捕获数据包的开发
在对数据进行捕获时, 主要有两种方法: 1. 主要借助原始套接字Socket , 套接字是网络应用编程接口, 应用程序可以使用它进行网络通信发送和接收网络层以上的原始数据包, 而对底层的细节是透明的. 2. 使用系统抓包库Libpcap 和Winpcap, 通过数据链路层获取以太帧, 可以从网卡捕获或者发送原始数据包, 同时能过滤及存储数据包.这种方式的捕获是工作在网络底层数据链路层,能拦截所有正在网络上传送的数据包,并且可以通过相应的处理,从而实时的分析数据包的内容,使用数据包捕获函数来获得底层数据。
2. 1 Libpcap 方法开发的过程
采用Libpcap捕获网络数据包的开发过程. 主程序的流程如下图所示:
捕获网络数据包过程按以下步骤进行, 程序开发过程中主要语句的实现:
char * dev, errbuf [ PCAP- ERRBU FSIZE]
; / / 定义接口设备名和缓冲区的大小
pcap- t p; / / 捕获数据包句柄, 非常重要的数据结构
int snaplen = 65535; / / 代表用户期望的捕获数据包最大长度
int t imeout= 1000; / / 代表函数超时返回的时间
( 1) 进行本地网络设置检测, 获得网络接口设备. 调用函数dev= pcap- lookupdev ( er rbuf ) . Linux中最常见的接口设备名eth0 和lo, 而eth0 对应了实际的网卡, 数据包的传输都要经过eth0.
( 2) 设备找到后, 打开以准备捕获数据包. 调用的主函数是p = pcap- open- live ( dev, snaplen, 1,timeout , errbuf ) , 根据给定的接口设备名dev, 获得一个结构为pcap- t 的捕获句柄p, 函数中的1 代表设置接口为混杂模式.
( 3) 若用户设置了过滤条件, 则编译和安装过
滤代码. 编译过滤规则调用函数pcap- compile( p,f ilter , f ilter- app, 0, net ) , 函数将规则字符串转化为内核过滤程序. 根据过滤规则设置过滤器
pcap- set filter( p, filter) 传给BPF, 由BPF 过滤器捕获用户所需要的数据包.
( 4) 反复捕获数据包. 调用pcap- loo p( p, cnt ,packet - print , NULL) 进入循环捕获, 对捕获的数据包处理放在回调函数( 如packet - print ( ) ) 中进行.
( 5) 关闭设备. 调用pcap- close ( p) , 将打开设备时得到的结构为pcap- t 的捕获句柄, 作为参数传入.
2. 2 对数据包处理的回调函数的开发过程
在实现对捕获的数据包处理的回调函数packet- print ( ) 中, 具体分析的流程如图所示:
函数中主要语句的实现:
/ / 对以太头部进行分析, 判断所包含的数据包类型, 做进一步的处理
/ / 对捕获的数据进行类型转换, 转化成以太数据包类型
eth= ( st ruct ether - header * ) p;
/ / 若以太帧的协议类型为TCP/ IP
if ( eth- ether - type = = nto hs ( ETHERTYPE-
IP) )
{ ?
/ / 获取IP 头信息
iph= ( st ruct ip * ) ( p + sizeof ( st ruct etherheader
) ) ;
?
/ / 判断上层协议是否为T CP 协议
if( iph- ip- p= = 6)
{ ?
/ / 获取TCP 头信息
tcph= ( st ruct tcphdr * ) ( p + sizeof ( st ruct
ether- header) + 4 * iph- ip- hl ) ;
?
/ / T CP 包内容的长度
tcplength = ntohs ( iph- ip- len) -4 * iph-
ip- hl-4* tcph- doff ;
?
/ / T CP 包的数据内容
data= ( u- char * ) ( p+ sizeof ( st ruct etherheader
) + 4* iph- ip- hl+ 4* tcph- doff ) ;
?
/ / 申请一长度为tcplength 字符串变量
tcpdata= ( u- char * ) malloc( tcpleng th) ;
?
/ / 把T CP 内容拷贝到tcpdata 变量中
memcpy ( tcpdata, data, tcplength) ;
?}
?}
if ( eth- ether
文档评论(0)