この関数を実行しようとすると、2 番目のif
ステートメントと印刷で壁にぶつかります:
cannot set pcap filter: ip dest host 92.40.255.82 ��z]$
(最後の奇妙な記号に注意してください)。エラーはにあると思われますが、bpf_program filterprog
それを整理するのに運がありませんでした。関連するマニュアルページを確認しましたが、何か見落としがない限り、使用した関数は問題ないはずです...だから困惑しています。エラーメッセージの末尾にある記号と関係がありますか? フィルターを設定しないのはなぜですか?
void capture()
{
pcap_t *pd;
bpf_u_int32 netmask;
bpf_u_int32 localnet;
char filterbuf[64];
snprintf(filterbuf, sizeof(filterbuf), "ip dest host %s", dstip);
char *filter = filterbuf;
char *dev = NULL;
char errbuf[PCAP_ERRBUF_SIZE];
struct bpf_program filterprog;
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, &localnet, &netmask, errbuf);
pcap_compile(pd, &filterprog, filter, 0, localnet);
if (pcap_setfilter(pd, &filterprog) == - 1)
{
fprintf(stderr, "cannot set pcap filter: %s %s\n", filter, errbuf);
exit(1);
}
pcap_freecode(&filterprog);
dl = pcap_datalink(pd);
switch(dl) {
case 1:
dl_len = 14;
break;
default:
dl_len = 14;
break;
}
if (pcap_loop(pd, -1, receive, (u_char *) &dl_len) < 0)
{
fprintf(stderr, "cannot get raw packet: %s\n", pcap_geterr(pd));
exit(1);
}
}
編集: これらは dstip への他の参照です:
(試作品)char *dstip = 0;
(主に)dstip = optarg;