Понимание функции. пкап и бпф

Пытаясь создать 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, но я все еще немного запутался. Может ли кто-нибудь из вас объяснить это более простыми словами? Спасибо!


person youjustreadthis    schedule 25.07.2012    source источник
comment
Какая именно часть вас смущает?   -  person RedX    schedule 26.07.2012
comment
@RedX, если честно, большая часть из них, но особенно первые два оператора if и часть между ними. Я знаю, что здесь я немного общаюсь, но, как я уже сказал, все это для меня в новинку.   -  person youjustreadthis    schedule 26.07.2012


Ответы (1)


Вроде бы вы уже разобрались с функцией, по крайней мере логически, что касается первого оператора if, он пытается открыть прослушиваемое вами устройство и в случае неудачи печатает ошибку, второй после него ставит фильтр pcap был скомпилирован.

Если вы хотите узнать больше о конкретной функции и ее параметрах, вам следует просто взглянуть на справочные страницы, например.

человек pcap_open_live

person iabdalkader    schedule 25.07.2012