如何通过编程调用libipset获取ipset的超时时间?
解决libipset获取ipset超时值的问题
问题分析
你当前代码使用IPSET_CMD_TEST仅验证集合是否存在,该命令不会从内核拉取集合的属性配置(包括超时值),因此无法通过ipset_session_data_get拿到目标数据。需要使用专门的查询命令触发内核返回集合的详细配置。
解决方案
改用IPSET_CMD_GET或IPSET_CMD_LIST命令获取集合属性,修改后的代码如下:
#include <stdlib.h> #include <stdio.h> #include <libipset/types.h> #include <libipset/session.h> int main(int argc, char* argv[]) { ipset_load_types(); struct ipset_session *session = ipset_session_init(NULL, NULL); if (!session) { fprintf(stderr, "Failed to init ipset session\n"); return 1; } // 设置要查询的集合名称 ipset_session_data_set(session, IPSET_SETNAME, "my_set"); // 使用GET命令获取集合属性(LIST命令也可实现相同效果) if (ipset_type_get(session, IPSET_CMD_GET) == NULL) { fprintf(stderr, "Error: Failed to get set properties\n"); ipset_session_fini(session); return 1; } // 读取并打印超时值 const uint32_t *timeout = (const uint32_t*)ipset_session_data_get(session, IPSET_OPT_TIMEOUT); if (timeout) { printf("Set timeout: %u seconds\n", *timeout); } else { printf("Timeout field is NULL or not available\n"); } ipset_session_fini(session); return 0; }
关键说明
IPSET_CMD_GET命令会向内核请求指定集合的完整配置信息,包括创建时设置的超时值,这是获取集合属性的正确方式。IPSET_CMD_TEST仅用于校验集合存在性或元素归属,不会返回任何配置参数。- 必须调用
ipset_session_fini释放会话资源,避免内存泄漏。
编译与运行
编译命令保持不变:
gcc -lipset test.c -o ipset_timeout
运行编译后的程序即可输出目标集合的超时值。
内容的提问来源于stack exchange,提问作者Dannycy
相关产品推荐
相关产品推荐

