You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过编程调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 11:28:06