gpt4 book ai didi

c++ - nfq_get_payload 是如何构造它的返回数据的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:45:41 25 4
gpt4 key购买 nike

主要是,我试图从 Netfilter 队列有效负载的有效负载中获取源地址和目标端口(使用 nfq_get_payload 函数检索有效负载)。以下问题问同样的事情并得到正确答案:

How to extract source and destination port number from packet in queue of iptables

不幸的是,没有解释为什么将 20 和 22 添加到地址会使您在正确的位置阅读信息。我假设这是因为数据的结构(显然),但如果有定义的结构,它是什么?

文档没有明确解释数据是如何格式化的,只是“此函数检索的数据类型将取决于使用 nfq_set_mode() 函数设置的模式”,但是 set_mode 的文档没有提及关于数据类型和来源的任何信息都不会立即透露任何信息。

我觉得这一定是我遗漏或不理解的常见网络编程结构的核心内容。

注释:nfq_get_payload 函数:http://www.netfilter.org/projects/libnetfilter_queue/doxygen/group__Parsing.html#gaf79628558c94630e25dbfcbde09f2933

最佳答案

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

有效负载以 iphdr 结构开始。 iphdr 结构体有一个协议(protocol)字段,例如 tcp,如果它是 tcp 那么 iphdr 结构体之后的数据是一个 tcphdr 结构体,如果它是 udp,那么还有另一个结构体 hdr 用于 icmp 等。

要访问端口,假设 q_data 是指向 nfq_data 结构的指针:

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
}

关于c++ - nfq_get_payload 是如何构造它的返回数据的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15782630/

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