我正在尝试使用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);
}
答案 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”的翻译?
无论如何,我希望它可以帮助其他人......