struct pcap [pcap-int.h]linux
{
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
};