当前位置:   article > 正文

pcap抓包库部分函数说明_pcap_next_ex

pcap_next_ex

学习通过侦听网卡获取报文的程序,遇到部分pacp抓包库中的函数,在查阅资料后,作以下整理说明:

1. pcap_next_ex(): 基于非回调函数的捕获数据包,参数有三个,一个网卡描述符,两个指针,两个指针会被初始化并返回给用户,一个是pcap_pkthdr结构,一个是接收数据的缓冲区。pcap_pkthdr结构如下所示:

struct pcap_pkthdr

{

      struct timeval ts;   ts是一个结构struct timeval,它有两个部分,第一部分是1900开始以来的秒数,第二部分是当前秒之后的毫秒数

      bpf_u_int32 caplen;  表示抓到的数据长度

      bpf_u_int32 len;    表示数据包的实际长度

}

2.pcap_open():

pcap_t *pcap_open(const char *               source,

                                     int                              snaplen,

                                     int                              flags,

                                     int                              read_timeout,

                                     struct pcap_rmtauth *       auth,

                                     char *                        errbuf

)

为捕获/发送数据打开一个普通的源,pcap_open()能够替代所有的pcap_open_xxx()函数,它隐藏了不同的pcap_open_xxx()之间的差异,所以程序员不必使用不同的open函数。

source:的是包含要打开的源名称的以’\0’结尾的字符串。源名称得包含新的源规范语法(Source Specification Syntax),并且它不能为NULL。为了方便的使用源语法,请记住:(1)pcap_findalldevs_ex()返回的适配器(网卡)可以直接被pcap_open()使用;(2)万一用户想传递他自己的源字符串给pcap_open(),pcap_createsrcstr()可以创建正确的源标识。

snaplen:需要保留的数据包的长度。对每一个过滤器接收到的数据包,第一个‘snaplen’字节的内容将被保存到缓冲区,并且传递给用户程序。例如,snaplen等于100,那么仅仅每一个数据包的第一个100字节的内容被保存。简言之就是从每一个包的开头到snaplen的那段内容将被保存。

flags:保存一些由于抓包需要的标志。Winpcap定义了三种标志:

l         PCAP_OPENFLAG_PROMISCUOUS:1,它定义了适配器(网卡)是否进入混杂模式(promiscuous mode)。

l         PCAP_OPENFLAG_DATATX_UDP:2,它定义了数据传输(假如是远程抓包)是否用UDP协议来处理。

l         PCAP_OPENFLAG_NOCAPTURE_RPCAP:4,它定义了远程探测器是否捕获它自己产生的数据包。

read_timeout:以毫秒为单位。read timeout被用来设置在遇到一个数据包的时候读操作不必立即返回,而是等待一段时间,让更多的数据包到来后从OS内核一次读多个数据包。并非所有的平台都支持read timeout;在不支持read timeout的平台上它将被忽略。

auth:一个指向’struct pcap_rmtauth’的指针,保存当一个用户登录到某个远程机器上时的必要信息。假如不是远程抓包,该指针被设置为NULL。

errbuf:一个指向用户申请的缓冲区的指针,存放当该函数出错时的错误信息。

返回值是一个’pcap_t’指针,它可以作为下一步调用(例如pcap_compile()等)的参数,并且指定了一个已经打开的Winpcap会话。在遇到问题的情况下,它返回NULL并且’errbuf’变量保存了错误信息。

3.pcap_datalink():

返回链路层的类型,链路层的类型包括:

DLT_NULL: BSD回路封装;链路层协议头是一个4字节的域,以主机字节顺序(host byte order),包含一个从socket.h来的PF_value。主机字节顺序(host byte order)是捕获数据包的机器的字节顺序,而PF_value是捕获数据包的机器的OS。如果一个读取一个文件,字节顺序和PF_value不一定是抓取文件的那些机器。

DLT_EN10MB: 以太网(10Mb, 100Mb, 1000Mb, 或者更高)。

DLT_IEEE802: IEEE802.5令牌环网。

DLT_ARCNET:ARCNET。

DLT_SLIP:SLIP。

DLT_PPP:PPP;如果第一个字节是0xff或0x03,它是类HDLC帧上的PPP。

DLT_FDDI:FDDI

DLT_ATM_RFC1483:RFC1483LLC/SNAP ATM;数据包以IEEE802.2 LLC头开始。

DLT_RAW:原始IP(raw IP);数据包以IP头开始。

DLT_PPP_SERIAL:按照RFC1662,基于类HDLC帧的PPP,或者按照RFC1547的4.3.1,基于HDLC帧的Cisco PPP;前者的第一个字节是0xFF,后者的第一个字节是0x0F或0x8F。

DLT_PPP_ETHER:按照RFC2516,PPPoE;数据包以PPPoE头开始。

DLT_C_HDLC:按照RFC1547的4.3.1,基于HDLC帧的Cisco PPP。

DLT_IEEE802_11:IEEE 802.11无线局域网。

DLT_FRELAY:帧中继(Frame Relay)。

DLT_LOOP:OpenBSD回路封装。

DLT_LINUX_SLL:Linux抓包封装。

DLT_LTALK:苹果的LocalTalk,数据包以AppleTalk LLAP头开始。

DLT_PFLOG:OpenBSD pflog。

DLT_PRISM_HEADER:后接802.11头的棱镜监视器模式(Prism monitor mode)信息。

DLT_IP_OVER_FC:RFC2625 IP-over-Fiber 频道,以RFC2625中定义的Network_Header开始。

DLT_SUNATM:SunATM设备。

DLT_IEEE802_11_RADIO:后接802.11头的链路层信息。

DLT_ARCNET_LINUX:没有异常帧的ARCNET。

DLT_LINUX_IRDA:Linux-IrDA数据包,DLT_LINUX_SLL头后接IrLAP头。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/162426
推荐阅读
相关标签
  

闽ICP备14008679号