这个错误表明你正在尝试在一个非结构体或联合体中访问成员http
。通常情况下,成员http
是定义在nDPI提供的ndpi_detection_results
结构体中的,因此要访问它,你需要先声明一个指向该结构体的指针,并将其作为参数传递给协议识别函数。
以下是一个示例代码片段,展示了如何正确地访问ndpi_detection_results
结构体中的HTTP信息:
#include <stdio.h>
#include <string.h>
#include <rte_eal.h>
#include <rte_ethdev.h>
#include <rte_mbuf.h>
#include <ndpi_api.h>
#define BURST_SIZE 32
static struct ndpi_detection_module_struct *ndpi_struct = NULL;
static void packet_handler(struct rte_mbuf *pkt) {
struct ndpi_detection_results results;
int rc = 0;
// 获取数据包缓冲区地址
void *packet = rte_pktmbuf_mtod(pkt, void *);
// 进行协议识别
memset(&results, 0, sizeof(results));
ndpi_protocol detection = ndpi_detection_process_packet(ndpi_struct, packet, pkt->data_len, &results);
if (detection.app_protocol == NDPI_PROTOCOL_HTTP) {
printf("Detected HTTP traffic from flow %u.%u.%u.%u:%u to %u.%u.%u.%u:%u\n",
(pkt->hash.rss & 0xff000000) >> 24, (pkt->hash.rss & 0x00ff0000) >> 16,
(pkt->hash.rss & 0x0000ff00) >> 8, pkt->hash.rss & 0x000000ff,
rte_be_to_cpu_16(pkt->port),
(pkt->hash.fdir.hi & 0xffff0000) >> 16, pkt->hash.fdir.hi & 0x0000ffff,
(pkt->hash.fdir.lo & 0xffff0000) >> 16, pkt->hash.fdir.lo & 0x0000ffff,
rte_be_to_cpu_16(pkt->hash.fdir.hi));
// 输出HTTP主机名
if (results.http != NULL && results.http.host_name != NULL) {
printf("HTTP host: %s\n", results.http.host_name);
}
}
}
int main(int argc, char *argv[]) {
int ret;
// 初始化DPDK环境
ret = rte_eal_init(argc, argv);
if (ret < 0) {
rte_exit(EXIT_FAILURE, "rte_eal_init failed\n");
}
// 获取网口数量
uint16_t nb_ports = rte_eth_dev_count_avail();
if (nb_ports == 0) {
rte_exit(EXIT_FAILURE, "No Ethernet ports - bye\n");
}
// 配置DPDK网口...
// 初始化nDPI...
// 加载nDPI协议识别规则...
// 开始接收数据包并进行处理...
}
在上述代码中,我们首先定义了一个指向ndpi_detection_results
结构体的指针results
,并将其作为参数传递给协议识别函数。如果检测到HTTP流量,我们可以通过检查results.http
是否为NULL来确定是否存在HTTP信息。如果存在,我们就可以访问其成员host_name
来输出HTTP主机名。
需要注意的是,在nDPI中,并不是所有协议都包含HTTP信息。因此,在访问HTTP信息之前,你应该首先检查它是否为NULL。