2012-04-06 88 views
0

同一節目能成功在openSUSE 12.1(64) 雖然不能在Fedora上運行16(64) 在Fedora 16上運行,它顯示「錯誤調用使用pcap_compile」 我不知道這些操作系統有什麼區別,我認爲它們是完全一樣的,但我確定Opensuse 12.1可以成功過濾並捕獲數據包。linux下的libpcap編程

int init_capture() { 
int i; 
char *dev; 
char errbuf[PCAP_ERRBUF_SIZE]; 
pcap_t* descr; 
const u_char *packet; 
struct pcap_pkthdr hdr; /* pcap.h */ 
struct ether_header *eptr; /* net/ethernet.h */ 
struct bpf_program fp; 
char portfilter[20]= "dst port 1521"; 
bpf_u_int32 maskp; 
bpf_u_int32 netp; 
/* grab a device to peak into... */ 
dev = pcap_lookupdev(errbuf); 
if (dev == NULL) { 
    printf("%s\n", errbuf); 
    exit(1); 
} 
pcap_lookupnet(dev,&netp,&maskp,errbuf); 
/* open device for reading */ 
descr = pcap_open_live(dev, BUFSIZ, 0, -1, errbuf); 
if (descr == NULL) { 
    printf("pcap_open_live(): %s\n", errbuf); 
    exit(1); 
} 
if (pcap_compile(descr,&fp,portfilter,0,netp) == -1) 
{ 
    printf("Err calling pcap_compile\n"); 
    exit(1); 
} 
if (pcap_setfilter(descr,&fp) == -1) 
{ 
    printf("Err setting filter \n"); 
    exit(1); 
} 

/* allright here we call pcap_loop(..) and pass in our callback function */ 
/* int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)*/ 
/* If you are wondering what the user argument is all about, so am I!! */ 
pcap_loop(descr, -1, capture_callback, NULL); 

fprintf(stdout, "\nDone processing packets... wheew!\n"); 
return 0; 

}

回答

0

如果pcap_compile()失敗,你應該做的

printf("Err calling pcap_compile: %s\n", pcap_geterr(descr)); 

,看看它的報告有什麼問題。這可能有助於我們確定Fedora發生了什麼問題;不知道什麼是,很難確定如何解決它 - 該過濾器應該適用於任何支持IP的鏈路層類型,並且pcap_lookupdev()應該總是返回這樣的設備。

但是,如果您打開的設備沒有分配IPv4地址,則pcap_lookupnet()可能會失敗。如果失敗,你可能只需要傳入netpmaskp即可 - 在調用pcap_lookupnet()之前,您可以將它們初始化爲0。 不應該有所作爲,但是 - 網絡和掩碼不應該用於像dst port 1521這樣的過濾器。

(順便說一句,-1是不是一個有效的超時參數爲pcap_open_live() - 我會用1000代替 - 但這可能是在Linux上確定;如果它是無效的,打開將失敗,但打開不失敗對你來說,因爲它在報告pcap_compile()中的錯誤。)