2013-06-01 6 views
1

pcap 필터에 문제가 있습니다.필터가있는 pcap_loop이 패킷을 캡처하지 않습니다.

#include <pcap.h> 
#include <stdio.h> 

void pcap_fatal(const char *failed_in, const char *errbuf) { 
printf("Fatal error in %s: %s\n", failed_in, errbuf); 
exit(1); 
} 

int main() { 
struct pcap_pkthdr header; 
const u_char *packet; 
char errbuf[PCAP_ERRBUF_SIZE]; 
char *device; 
pcap_t *pcap_handle; 
int i; 
struct bpf_program filter; 
char filter_str[1000]; 
pcap_dumper_t *pd; 

device = pcap_lookupdev(errbuf); 
if(device == NULL) 
    pcap_fatal("pcap_lookupdev", errbuf); 

printf("Sniffing on device %s\n", device); 

pcap_handle = pcap_open_live(device, 4096, 1, 0, errbuf); 
if(pcap_handle == NULL) 
    pcap_fatal("pcap_open_live", errbuf); 

// Set the packet filter 
sprintf(filter_str, "port 80"); 
if(pcap_compile(pcap_handle, &filter, filter_str, 0, 0) == -1) 
    fatal("create filter"); 
if(pcap_setfilter(pcap_handle, &filter) == -1) 
    fatal("install filter"); 

for(i=0; i<3; i++) { 
    packet = pcap_next(pcap_handle, &header); 
    printf("Got a %d bytes packet\n", header.len); 
    dump(packet, header.len); 
} 

pd = pcap_dump_open(pd, "-"); 

pcap_loop(pcap_handle, -1, &pcap_dump, (char *)pd); 

pcap_close(pcap_handle); 

} 

pcap_next() 잘 패킷을 포착하고 dump() 기능은 패킷의 데이터를 덤프하는 데 사용된다 : 다음의 코드의 일부분이다. 그러나 pcap_loop은 어떤 패킷도 포착하지 못하며, for 루프의 패킷 포착 후에 막 막히게됩니다.

나는 "브리지"로 설정된 네트워크 어댑터로 가상 박스에서 실행중인 우분투에서 프로그래밍 중입니다. 문제가 될 수 있습니까? 아니면 코드에 문제가있는 것입니다.

감사합니다. 감사드립니다.

답변

0

이것은 아마 당신의 문제 :

pd = pcap_dump_open(pd, "-"); 

pcap_dump_open()에 대한 서명은 다음과 같습니다

pd = pcap_dump_open(pcap_handle, "-"); 
+0

아이는 당황 : 당신은 아마 대신 pcap_handle에 전달하는 의미

pcap_dumper_t *pcap_dump_open(pcap_t *p, const char *fname); 

잘못. 도움을 주셔서 감사합니다 – AuA

+0

컴파일러 경고에주의를 기울여야합니다. 컴파일러가이 특별한 실수를 알려 줘야합니다. – jxh

+0

제안 해 주셔서 감사합니다. – AuA