理解一个功能。 pcap和BPF

时间:2012-07-25 22:55:06

标签: c tcp network-programming pcap

在尝试制作可以接收acks并创建连接的TCP程序时,我在一个示例程序中遇到了这个函数:

void *pth_capture_run(void *arg)
{
pcap_t *pd;
char *filter = "dst host 172.17.14.90 and ip";
char *dev = "fxp0";
char errbuf[PCAP_ERRBUF_SIZE];
bpf_u_int32 netp;
bpf_u_int32 maskp;
struct bpf_program  fprog;                  /* Filter Program   */
int dl = 0, dl_len = 0;

if ((pd = pcap_open_live(dev, 1514, 1, 500, errbuf)) == NULL) {
    fprintf(stderr, "cannot open device %s: %s\n", dev, errbuf);
    exit(1);
}

pcap_lookupnet(dev, &netp, &maskp, errbuf);
pcap_compile(pd, &fprog, filter, 0, netp);
if (pcap_setfilter(pd, &fprog) == -1) {
    fprintf(stderr, "cannot set pcap filter %s: %s\n", filter, errbuf);
    exit(1);
}
pcap_freecode(&fprog);
dl = pcap_datalink(pd);

switch(dl) {
    case 1:
        dl_len = 14;
        break;
    default:
        dl_len = 14;
        break;
}

if (pcap_loop(pd, -1, raw_packet_receiver, (u_char *)dl_len) < 0) {
    fprintf(stderr, "cannot get raw packet: %s\n", pcap_geterr(pd));
    exit(1);
}
}

现在我已经知道这个函数打开一个BPF设备并设置数据包过滤器,然后等待数据包到达。然而,对于网络编程来说还是一个新手,我不熟悉各种pcap函数,但仍然有点不清楚这个函数,简单来说,是什么以及如何做到这一点。我已完成本教程:http://yuba.stanford.edu/~casado/pcap/section1.html 但我仍然有点困惑。你们中的任何人都可以用简单的方式解释一下吗?谢谢!

1 个答案:

答案 0 :(得分:2)

似乎你已经找到了这个函数,至少从逻辑上讲,对于第一个if语句,它试图打开你正在监听的设备并在失败时输出错误,第二个设置pcap编译后过滤。

如果您想了解有关特定功能及其参数的更多信息,您应该只看一下手册页,例如

  

man pcap_open_live