pcap结构--pcap_t数据类型

本文详细介绍了pcap结构,包括文件描述符、数据包捕获长度、设备类型等关键字段,并阐述了如何通过不同函数指针对特定操作系统进行抽象操作。此外还深入探讨了BPF过滤代码的执行方式以及错误信息缓冲区等内容。
struct pcap [pcap-int.h]
{
    int fd; /* 文件描述字,实际就是 socket */ 
    /* 在 socket 上,可以使用 select() 和 poll() 等 I/O 复用类型函数 */
    int selectable_fd;
    int snapshot; /* 用户期望的捕获数据包最大长度 */
    int linktype; /* 设备类型 */
    int tzoff;        /* 时区位置,实际上没有被使用 */
    int offset;    /* 边界对齐偏移量 */
    int break_loop; /* 强制从读数据包循环中跳出的标志 */
    struct pcap_sf sf; /* 数据包保存到文件的相关配置数据结构 */
    struct pcap_md md; /* 具体描述如下 */ 
    int bufsize; /* 读缓冲区的长度 */
    u_char buffer; /* 读缓冲区指针 */
    u_char *bp;
    int cc;
    u_char *pkt;
    /* 相关抽象操作的函数指针,最终指向特定操作系统的处理函数 */
    int    (*read_op)(pcap_t *, int cnt, pcap_handler, u_char *);
    int    (*setfilter_op)(pcap_t *, struct bpf_program *);
    int    (*set_datalink_op)(pcap_t *, int);
    int    (*getnonblock_op)(pcap_t *, char *);
    int    (*setnonblock_op)(pcap_t *, int, char *);
    int    (*stats_op)(pcap_t *, struct pcap_stat *);
    void (*close_op)(pcap_t *);
    /*如果 BPF 过滤代码不能在内核中执行,则将其保存并在用户空间执行 */
    struct bpf_program fcode;
    /* 函数调用出错信息缓冲区 */
    char errbuf[PCAP_ERRBUF_SIZE + 1];  
    /* 当前设备支持的、可更改的数据链路类型的个数 */
    int dlt_count;
    /* 可更改的数据链路类型号链表,在 linux 下没有使用 */
    int *dlt_list;
    /* 数据包自定义头部,对数据包捕获时间、捕获长度、真实长度进行描述 [pcap.h] */
    struct pcap_pkthdr pcap_header;    
};

/* 包含了捕获句柄的接口、状态、过滤信息  [pcap-int.h] */
struct pcap_md {
    /* 捕获状态结构  [pcap.h] */
    struct pcap_stat stat;  
    int use_bpf; /* 如果为1,则代表使用内核过滤*/
    u_long    TotPkts;
    u_long    TotAccepted; /* 被接收数据包数目 */
    u_long    TotDrops;    /* 被丢弃数据包数目 */
    long    TotMissed;    /* 在过滤进行时被接口丢弃的数据包数目 */
    long    OrigMissed; /*在过滤进行前被接口丢弃的数据包数目*/
#ifdef linux
    int    sock_packet; /* 如果为 1,则代表使用 2.0 内核的 SOCK_PACKET 模式 */
    int    timeout;    /* pcap_open_live() 函数超时返回时间*/
    int    clear_promisc; /* 关闭时设置接口为非混杂模式 */
    int    cooked;        /* 使用 SOCK_DGRAM 类型 */
    int    lo_ifindex;    /* 回路设备索引号 */
    char *device;    /* 接口设备名称 */  
    /* 以混杂模式打开 SOCK_PACKET 类型 socket 的 pcap_t 链表*/
    struct pcap *next;    
    #endif
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值