gpt4 book ai didi

使用 libpcap 捕获任何接口(interface)时无法获取协议(protocol)

转载 作者:行者123 更新时间:2023-12-03 10:00:16 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





libpcap - capture packets from all interfaces

(1 个回答)


1年前关闭。




我使用 libpcap使用以下代码在我的 Ubuntu 中捕获网络流量的代码我在解析数据包协议(protocol)时遇到问题:

#include <stdio.h> 
#include <stdlib.h>
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <pcap.h>
#include <netinet/in.h>
#include <netinet/if_ether.h>
#include <netinet/ip.h>



int main(int argc, char *argv[]) {
char *device = "any";
char error_buffer[PCAP_ERRBUF_SIZE];
pcap_t *handle;
const u_char *packet;
struct pcap_pkthdr packet_header;
int packet_count_limit = 1;
int timeout_limit = 20000; /* In milliseconds */
bpf_u_int32 net;
bpf_u_int32 mask;

if ( -1 == pcap_lookupnet(device ,&net,&mask,error_buffer))
printf("error netmask\n");


/* Open device for live capture */
handle = pcap_open_live(
device ,
BUFSIZ,
packet_count_limit,
timeout_limit,
error_buffer
);
if(NULL == handle)
printf("error! %s\n",error_buffer);
struct pcap_pkthdr* header;
u_char *buffer;

while(1)
{

int ret = pcap_next_ex(handle,&header, &buffer);
if(header->len ==0)
{
printf("cont\n");
continue;

}

struct iphdr *iph = (struct iphdr*) (buffer + sizeof(struct ethhdr));
printf("protocol = %d \n", iph->protocol);
}

return 0;
}
问题是,当我选择在 any 中捕获时接口(interface) char *device = "any";我总是得到 协议(protocol) = 0
但是当我选择 char *device = "ens33";我得到了正确的协议(protocol)(如 TCP 6)
这是为什么 ?

最佳答案

根据所选择的接口(interface),libpcap 有时会用 Linux cooked header 替换第 2 层 header (在本例中为以太网)。它与以太网 header 的长度不同。您可以查看pcap_t 的数据链路类型。与 pcap_datalink功能。

unsigned int layer_2_header_length;

switch ( pcap_datalink(handle) ) {
case DLT_EN10MB: // Ethernet header
layer_2_header_length = 14;
break;

case DLT_LINUX_SLL: // Linux cooked header
layer_2_header_length = 16;
break;

// other options
}

关于使用 libpcap 捕获任何接口(interface)时无法获取协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64634957/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com