0

ACKを受信して​​接続を作成できる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 しかし、私はまだ少し混乱しています。簡単に説明していただけますか?ありがとう!

4

1 に答える 1

2

少なくとも論理的には、関数をすでに理解しているようです。最初のifステートメントは、リッスンしているデバイスを開こうとし、失敗するとエラーを出力します。2番目のステートメントは、その後にpcapフィルターを設定します。コンパイルされました。

特定の関数とそのパラメータについて詳しく知りたい場合は、実際にはmanページを確認する必要があります。

男pcap_open_live

于 2012-07-25T23:49:57.453 に答える