c – libpcap和无线信号捕获
我正在尝试编写一个c应用程序(
linux),它将捕获无线数据包以及相关的信号强度(以dBm为单位).捕获部分很简单,但问题是我找不到任何关于如何获得每个数据包的信号强度的文档.
它是标题的一部分吗? 这是我到目前为止所拥有的: printf("Device: %sn",dev); printf("Number of packets: %dn",num_packets); printf("Filter expression: %sn",filter_exp); /* open capture device */ pcap_t *handler = pcap_create("wlan0",errbuf); if (handler == NULL) { exit(-1); } if(pcap_set_rfmon(handler,1)==0 ) { printf("monitor mode enabledn"); } pcap_set_snaplen(handler,2048); // Set the snapshot length to 2048 pcap_set_promisc(handler,0); // Turn promiscuous mode off pcap_set_timeout(handler,512); // Set the timeout to 512 milliseconds int status = pcap_activate(handler); /* now we can set our callback function */ pcap_loop(handle,num_packets,got_packet,NULL); 这是got_packet代码: /* define ethernet header */ ethernet = (struct sniff_ethernet*)(packet); /* define/compute ip header offset */ ip = (struct sniff_ip*)(packet + SIZE_ETHERNET); size_ip = IP_HL(ip)*4; if (size_ip < 20) { printf(" * Invalid IP header length: %u bytesn",size_ip); return; } /* print source and destination IP addresses */ printf(" From: %sn",inet_ntoa(ip->ip_src)); printf(" To: %sn",inet_ntoa(ip->ip_dst)); /* determine protocol */ switch(ip->ip_p) { case IPPROTO_TCP: printf(" Protocol: TCPn"); break; case IPPROTO_UDP: printf(" Protocol: UDPn"); return; case IPPROTO_ICMP: printf(" Protocol: ICMPn"); return; case IPPROTO_IP: printf(" Protocol: IPn"); return; default: printf(" Protocol: unknownn"); return; } /* define/compute tcp header offset */ tcp = (struct sniff_tcp*)(packet + SIZE_ETHERNET + size_ip); size_tcp = TH_OFF(tcp)*4; if (size_tcp < 20) { printf(" * Invalid TCP header length: %u bytesn",size_tcp); return; } printf(" Src port: %dn",ntohs(tcp->th_sport)); printf(" Dst port: %dn",ntohs(tcp->th_dport)); /* define/compute tcp payload (segment) offset */ payload = (char *)(packet + SIZE_ETHERNET + size_ip + size_tcp); /* compute tcp payload (segment) size */ size_payload = ntohs(ip->ip_len) - (size_ip + size_tcp); /* * Print payload data; it might be binary,so don't just * treat it as a string. */ if (size_payload > 0) { printf(" Payload (%d bytes):n",size_payload); //print_payload(payload,size_payload); } 任何帮助都会非常感激. 更新: pcap_set_snaplen(handle,2048); // Set the snapshot length to 2048 pcap_set_promisc(handle,1); // Turn promiscuous mode off pcap_set_timeout(handle,512); // Set the timeout to 512 milliseconds int status = pcap_activate(handle); if(pcap_set_datalink(handle,DLT_IEEE802_11_RADIO) == -1) { printf("Couldn't set datalink type %s: %sn",device,pcap_geterr(handle)); } 所以现在的问题是解析数据包,这似乎是一个非常棘手的问题.我对源地址,目标地址和相关信号等感兴趣.我不知道如何匹配和加载数据包中的数据并将其与radiotap结构相匹配. struct ieee80211_radiotap_header { u_int8_t it_version; /* set to 0 */ u_int8_t it_pad; u_int16_t it_len; /* entire length */ u_int32_t it_present; /* fields present */ } __attribute__((__packed__)); /* Presence bits */ #define RADIOTAP_TSFT 0 #define RADIOTAP_FLAGS 1 #define RADIOTAP_RATE 2 #define RADIOTAP_CHANNEL 3 #define RADIOTAP_FHSS 4 #define RADIOTAP_ANTENNA_SIGNAL 5 #define RADIOTAP_ANTENNA_NOISE 6 #define RADIOTAP_LOCK_QUALITY 7 #define RADIOTAP_TX_ATTENUATION 8 #define RADIOTAP_DB_TX_ATTENUATION 9 #define RADIOTAP_DBM_TX_POWER 10 #define RADIOTAP_ANTENNA 11 #define RADIOTAP_DB_ANTENNA_SIGNAL 12 void process_packet (u_char * args,const struct pcap_pkthdr *header,const u_char * packet) { struct ieee80211_radiotap_header *packet_header = (struct ieee80211_radiotap_header *) header; // This is where I am stuck 有人告诉我,一旦我捕获了数据包,我该如何从中提取上述值? 谢谢 解决方法
调用pcap_open_live(),pcap_create()/ pcap_activate()或pcap_open_offline()的每个程序都应该,如果调用成功,则调用pcap_datalink()以找出捕获的链接层头类型.
这条规定没有例外. 然后查看the link-layer header types page for tcpdump.org以查看pcap_datalink()返回的值是什么意思.将它们与那里列出的DLT_值进行比较.你可能得到的是DLT_IEEE802_11,它没有信号强度信息,DLT_PRISM_HEADER,DLT_IEEE802_11_RADIO和DLT_IEEE802_11_RADIO_AVS,它们都有信号强度信息.有关如何在分组数据中表示信号强度信息(和其他无线电元数据)的信息,请参阅后三种可能性的链接. (并且,是的,这是无线电元数据的三个选项,因此另一个答案中给出的链接是一个不完整的来源;大多数时候你可能会获得radiotap头,而不是AVS或Prism头.Radiotap更通用,因为它的设计是可扩展的,但解析起来更复杂.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |