C++ nfq_如何获取其返回数据的有效载荷结构?

C++ nfq_如何获取其返回数据的有效载荷结构?,c++,linux,network-programming,iptables,netfilter,C++,Linux,Network Programming,Iptables,Netfilter,首先,我试图从Netfilter队列负载的负载中获取源地址和dest端口(使用nfq_get_负载函数检索负载)。以下问题问了同样的问题并得到了正确答案: 不幸的是,没有人解释为什么在地址中添加20和22会让你处于阅读信息的正确位置。我假设这是因为数据的结构(显然),但如果有一个定义的结构,它是什么 文档没有明确解释数据的格式,只是“此函数检索的数据类型将取决于nfq_set_mode()函数设置的模式”,但是set_mode的文档没有提到任何关于数据类型的内容,并且源代码也没有立即显示任何内

首先,我试图从Netfilter队列负载的负载中获取源地址和dest端口(使用nfq_get_负载函数检索负载)。以下问题问了同样的问题并得到了正确答案:

不幸的是,没有人解释为什么在地址中添加20和22会让你处于阅读信息的正确位置。我假设这是因为数据的结构(显然),但如果有一个定义的结构,它是什么

文档没有明确解释数据的格式,只是“此函数检索的数据类型将取决于nfq_set_mode()函数设置的模式”,但是set_mode的文档没有提到任何关于数据类型的内容,并且源代码也没有立即显示任何内容

我觉得这一定是我缺少或不理解的常见网络编程结构的核心


注意:nfq_get_payload函数:

我设法解决了这个问题,我将把它留在这里让其他人查找

有效负载以iphdr结构开始。iphdr结构有一个协议字段,例如tcp,如果是tcp,则iphdr结构后的数据是tcphdr结构,如果是udp,则有另一个用于该结构的结构hdr,等等,用于icmp等

要访问端口,假设q_数据是指向nfq_数据结构的指针:

unsigned char *data;
nfq_get_payload(q_data, (unsigned char**)&data);
struct iphdr * ip_info = (struct iphdr *)data;
if(ip_info->protocol == IPPROTO_TCP) {
    struct tcphdr * tcp_info = (struct tcphdr*)(data + sizeof(*ip_info));
    unsigned short dest_port = ntohs(tcp_info->dest);
} else if(ip_info->protocol == IPPROTO_UDP) {
    //etc etc
}

不应该是:
struct iphdr*ip_info=(struct iphdr*)(data+sizeof(struct ethhdr))?为什么不跳过
struct ethhdr
,进入“struct iphdr”?