如何确定 libpcap 中的数据包协议?

How determine a packet protocol in libpcap?

我想在c中写一个数据包嗅探器。现在我的代码可以计算网络中传输的每个数据包。我希望它只计算 http 个数据包,但我不知道如何确定 packet.This 中的那些是我的代码:

#include <stdio.h>
#include <pcap.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
    char error[PCAP_ERRBUF_SIZE];
    struct bpf_program *fp;
    char filter[] = "port 80";
    bpf_u_int32 network;
    pcap_t *handle = pcap_open_live(argv[1], BUFSIZ, 0, 1000, error);
    if (handle == NULL){
        printf("Error: %s\n", error);
        return 1;
    }
    
    if(pcap_compile(handle, &fp, filter,0, network)==-1){
        fprintf(stderr, "Error:%s\n", pcap_geterr(handle));
    }   

    if(pcap_setfilter(handle, &fp)==-1){
        fprintf(stderr, "Error:%s\n", pcap_geterr(handle));
        return 1;
    }

    pcap_loop(handle, atoi(argv[2]),callback, NULL );
    return 0;

}

我的回调函数只计算数据包的数量。

如果 http 数据包可以在任何端口上(除非您正在测试本地 Web 服务器,否则可能不会),您可以首先隔离数据包的有效负载。 https://www.devdungeon.com/content/using-libpcap-c 上的“查找数据有效负载”中有一个关于如何执行此操作的示例。

然后您可以将数据负载的前几个字节与任何 HTTP 方法或字符串“HTTP”进行比较以捕获响应。