回头再看libpcap

libpcap 之前由于lex yacc 看不下去, 不好的借口(因为我也没有好好看看libpcap的接口设计及使用)

之后由于很多原因有接触了一下lex yacc (主要是我想写一个解析各种报文的程序,看了一段之后,似乎不适合,可能是理解不深吧)

回头再看scanner.l 似乎不是那么困难, grammer.y 也不是那么难, libpcap是一个很好的库, 其中内部的虚拟机的设计很是经典,

值得我们好好看看,学习接口设计, 学习代码...

理解一个库,看一下简介,即可入手了, 下载,编译,小实例接口一步一步开始了,

1 使用那个接口

在linux中用ifconfig即可查看机器上的网口

传递给程序

1) 输入

#include <stdio.h>

#include <pcap.h> int main(int argc, char *argv[]) {   

  char *dev = argv[1];   

  printf("Device: %s ", dev);   

  return(0);

}

2) pcap自己使用第一个
#include <stdio.h>
#include <pcap.h>

int main(int argc, char *argv[])
{
    char *dev, errbuf[PCAP_ERRBUF_SIZE];

    dev = pcap_lookupdev(errbuf);
    if (dev == NULL) {
        fprintf(stderr, "Couldn't find default device: %s ", errbuf);
        return(2);
    }
    printf("Device: %s ", dev);
    return(0);
}

2 Opening the device for sniffing  打开设备准备sniffing

pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf);

第一个参数 设备名(如 eth0, wlan0 etc )

第二个参数 capture 最大的报文字节数

第三个参数 是否处理 promisc 模式

第四个参数 指定超时时间(豪秒)

第五个参数 错误信息的指针 (就是有什么错误就写到这里, 你爱看不看, 也可以传null值)

3 编译表达式

int pcap_compile(pcap_t *p, /*handle 上一步的结果 */

struct bpf_program *fp/*编译之后的结果 */,

char *str/*输入过滤字符串 ip .. */,

int optimize,/*是否优化*/

bpf_u_int32 netmask/*网络的netmask */)

4 设置过滤器

int pcap_setfilter(pcap_t *p/*如上*/,

struct bpf_program *fp/*上一步的结果 */ );

5 获取一个报文

u_char *pcap_next(pcap_t *p,/*如上*/

struct pcap_pkthdr *h/*结果*/ );

6 关闭

pcap_close(handle);

现在去深入

pcap_compile

其乐无穷...

 ==>这里有更多

http://www.tcpdump.org/pcap.html

原文地址:https://www.cnblogs.com/kwingmei/p/3622001.html