您的位置:程序门 -> linux/unix社区 -> 程序开发区



请教一个关于pcap_next_ex函数的问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


请教一个关于pcap_next_ex函数的问题
发表于: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;
}

发表于:2007-06-18 11:02:181楼 得分:0
有没有人遇到个这种问题啊,help,郁闷~~~~


快速检索

最新资讯
热门点击