| 发表于:2007-06-07 16:43:13 楼主 |
前两天遇到一个非常奇怪的问题,在centos 5下用libpcap库来写一个数据包捕捉的小程序,在调用pcap_next_ex函数来捕捉数据包的时候居然不会超时返回,但是在freebsd下面调用又可以返回,真的很奇怪,请帮忙看看问题出在那里,谢谢! 测试程序代码: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <net/if.h> #include <netinet/if_ether.h> #include <netinet/tcp.h> #include <pcap.h> /* default snap length (maximum bytes per packet to capture) */ #define snap_len 1518 /* ethernet headers are always exactly 14 bytes [1] */ #define size_ethernet 14 int main(int argc, char **argv) { char *dev = null; /* capture device name */ char errbuf[pcap_errbuf_size+1]; /* error buffer */ pcap_t *descr; /* packet capture descriptor */ char filter_exp[] = "port 19 "; /* filter expression [3] */ struct bpf_program fp; /* compiled filter program (expression) */ bpf_u_int32 maskp; /* subnet mask */ bpf_u_int32 netp; /* ip */ int num_packets = -1; /* number of packets to capture */ struct pcap_pkthdr pkthdr; struct timeval tv_out; int capflag = 1; struct pcap_pkthdr *header ; const u_char *packet; dev = pcap_lookupdev(errbuf); if (dev == null) { printf( "pcap_lookupdev error: %s\n ", errbuf); exit(exit_failure); } /* get network number and mask associated with capture device */ if (pcap_lookupnet(dev, &netp, &maskp, errbuf) == -1) { printf( "pcap_lookupnet error: %s\n ", errbuf); exit(exit_failure); } /* open capture device */ descr = pcap_open_live(dev, snap_len, 1, 10, errbuf); if (descr == null) { printf( "pcap_open_live failed: %s\n ", errbuf); exit(exit_failure); } /* make sure we 're capturing on an ethernet device [2] */ if (pcap_datalink(descr) != dlt_en10mb) { printf( "error: device is not an ethernet\n "); exit(exit_failure); } /* compile the filter expression */ if (pcap_compile(descr, &fp, filter_exp, 0, maskp) == -1) { printf( "pcap_compile failed: %s\n ", pcap_geterr(descr)); exit(exit_failure); } /* apply the compiled filter */ if (pcap_setfilter(descr, &fp) == -1) { printf( "pcap_setfilter failed: %s\n ", pcap_geterr(descr)); exit(exit_failure); } printf( "ready\n "); packet = pcap_next(descr, &pkthdr); capflag = pcap_next_ex(descr, &header, (const u_char**)&packet); printf( "capture=%d\n ", capflag); pcap_freecode(&fp); pcap_close(descr); printf( "\ncapture complete.\n "); return 0; } |
|
|
|
|