pcap_loop只是等待

时间:2013-12-03 22:36:08

标签: c network-programming pcap

我正在尝试使用C中的pcap执行一些嗅探器,如解释here 我的问题是pcap_loop绝对没有捕获数据包和/或什么都不做,我的回调函数永远不会被调用。我的猜测是超时值,但即使我将其设置为20(ms),也没有任何变化。它希望这只是一个我无法看到的简单错误,但我会让你们试着弄清楚,因为它太多了我的大脑!

由于

日光

编辑:我选择wlan0作为界面,它与链接上给出的程序一起使用 我的主要:

int main(int argc, char* argv[]) {

// interface & err buff
char *dev, errbuff[PCAP_ERRBUF_SIZE];
int i = 0,inum= -1;
// it filters out only packet from this machin
char filter_exp[] = "ip host localhost"; 
struct bpf_program fp;  /* compiled filter program (expression) */
/* typedef, no need for struct ... */
bpf_u_int32 mask;
bpf_u_int32 net;

int num_packets = 10;

// 1.0+ API pcap version
pcap_if_t * alldevs;    
pcap_if_t * pdev;
pcap_t * handle;
// 1st argument interface
if(argc == 2) {
    dev = argv[1];
    printf("Chosen interface : %s\n",dev);
}



//+1.0 api version
if(pcap_findalldevs(&alldevs,errbuff)){
    fprintf(stderr,"findalldev failed to retrieve interface\n %s",errbuff);
    return(2);
}
if(alldevs == NULL){
    fprintf(stderr,"Retrieved interface is null\n");
    return(2);
}
// select all interfaces
for(pdev = alldevs; pdev != NULL;pdev = pdev->next) {
    printf("Device %d : ",++i);
    print_pcap_if_t(pdev);
    //print_pcap_addr(pdev->addresses);

}
printf("Enter the interface number (1-%d):",i);
scanf("%d", &inum);
if(inum < 1 || inum > i){
    fprintf(stderr,"Device %d not in list.\n",i);
    return(2);
}
/* Jump to the selected adapter */
for(pdev=alldevs, i=0; i< inum - 1 ;pdev=pdev->next, i++);
printf("\n-------------------------------------------------\n");    

//printf("Chosen device : %s",pdev->name);
//print_pcap_if_t(pdev);    

/* activate device */   
printf("activating\n");
handle = pcap_open_live(pdev->name,SNAP_LEN,1,1000,errbuff);
if(handle == NULL){
    fprintf(stderr,"Could not open device for sniffing");
    return(2);
}

/* compile filter */
if(pcap_compile(handle,&fp,filter_exp,0,net) == -1) {
    fprintf(stderr,"Could not compile filtering rules");
    return(EXIT_FAILURE);
}

/* apply filter */
if(pcap_setfilter(handle,&fp) == -1) {
    fprintf(stderr,"Could not set filtering rules");
    return(EXIT_FAILURE);
}

printf("Waiting for packets to come in your hands");
fflush(stdout);

pcap_loop(handle,num_packets,got_packet,NULL);

pcap_freecode(&fp);
pcap_close(handle);

pcap_freealldevs(alldevs);
return(0);

}

2 个答案:

答案 0 :(得分:1)

  

ip host localhost

“localhost”是IP地址127.0.0.1的名称;它是您的机器在Internet上的IP地址,它是一个特殊的IP地址,用于将IPv4数据包从您的机器发送到自身(例如,如果您想测试FTP服务器,请使用“ftp localhost”)通过计算机上的命令提示符连接到您的计算机上。

来往或来自其他主机的流量将来自或发送至127.0.0.1。

例如,如果您的计算机的IP地址为10.0.1.2,请尝试“ip host 10.0.1.2”。

答案 1 :(得分:0)

好的我发现了问题: 我的过滤器“ip host localhost”是原因。我把它改为“ip”,然后就是=)

我真的不明白。我所做的是启动程序,然后刷新网页。所以我的第一个请求是GET或stg,source = localhost,不是吗?响应将在目标字段中包含我的地址。根据手册页:

  

host HOST如果数据包的IPv4 / v6源或目标是,则为True   HOST。

设置过滤器时,是否没有“localhost”的翻译?

无论如何,我希望它可以帮助其他人......