免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2301 | 回复: 2
打印 上一主题 下一主题

[C] net-snmp如何把多个表编译为一个可执行文件? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-06-09 19:32 |只看该作者 |倒序浏览
本帖最后由 janeqi1987 于 2015-06-09 19:37 编辑

net-snmp中通过mib2c.iterate.conf生成了多个XXX_Table.c和 XXX_Table.h的文件,代码已写好。现在通过subagent的方法,通过一个main函数,想把这些表编译到一个文件来执行(运行该可执行文件就可以同时几个Table表都能处理相关操作),我按照网上的方法:
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include <signal.h>

#include <nstAgentSubagentObject.h>

static int keep_running;

RETSIGTYPE
stop_server(int a) {
    keep_running = 0;
}

int
main (int argc, char **argv) {
  int agentx_subagent=1; /* change this if you want to be a SNMP master agent */
  int background = 0; /* change this if you want to run in the background */
  int syslog = 0; /* change this if you want to use syslog */

  /* print log errors to syslog or stderr */
  if (syslog)
    snmp_enable_calllog();
  else
    snmp_enable_stderrlog();

  /* we're an agentx subagent? */
  if (agentx_subagent) {
    /* make us a agentx client. */
    netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_ROLE, 1);
  }

  /* run in background, if requested */
  if (background && netsnmp_daemonize(1, !syslog))
      exit(1);

  /* initialize tcpip, if necessary */
  SOCK_STARTUP;

  /* initialize the agent library */
  //init_agent("example-demon");
    init_agent("xxx1_table");
    init_agent("xxx2_table");
    init_agent("xxx3_table");
    init_agent("xxx4_table");
    init_agent("xxx5_table");
    init_agent("xxx6_table");
    init_agent("xxx7_table");


  /* initialize mib code here */

  /* mib code: init_nstAgentSubagentObject from nstAgentSubagentObject.C */
  init_nstAgentSubagentObject();  

  /* initialize vacm/usm access control  */
  if (!agentx_subagent) {
      init_vacm_vars();
      init_usmUser();
  }

  /* example-demon will be used to read example-demon.conf files. */
  //init_snmp("example-demon");
    init_snmp("xxx1_table");
    init_snmp("xxx2_table");
    init_snmp("xxx3_table");
    init_snmp("xxx4_table");
    init_snmp("xxx5_table");
    init_snmp("xxx6_table");
    init_snmp("xxx7_table");

   
  /* If we're going to be a snmp master agent, initial the ports */
  if (!agentx_subagent)
    init_master_agent();  /* open the port to listen on (defaults to udp:161) */

  /* In case we recevie a request to stop (kill -TERM or kill -INT) */
  keep_running = 1;
  signal(SIGTERM, stop_server);
  signal(SIGINT, stop_server);

  snmp_log(LOG_INFO,"example-demon is up and running.\n");

  /* your main loop here... */
  while(keep_running) {
    /* if you use select(), see snmp_select_info() in snmp_api(3) */
    /*     --- OR ---  */
    agent_check_and_process(1); /* 0 == don't block */
  }

  /* at shutdown time */
  //snmp_shutdown("example-demon");
     snmp_shutdown("xxx1_table");
     snmp_shutdown("xxx2_table");
     snmp_shutdown("xxx3_table");
     snmp_shutdown("xxx4_table");
     snmp_shutdown("xxx5_table");
     snmp_shutdown("xxx6_table");
     snmp_shutdown("xxx7_table");
      
  SOCK_CLEANUP;

  return 0;
}

我通过init_agent("XXX1_table"); init_agent("XXX2_table"); ......init_agent("XXX7_table"); 这种方式编译不行。
打印:
ignoring extra call to init_agent (2)
ignoring extra call to init_agent (3)
ignoring extra call to init_agent (4)
ignoring extra call to init_agent (5)
ignoring extra call to init_agent (6)
ignoring extra call to init_agent (7)

我通过snmpset试了下,只能运行XXX1_table,后面的几个表都不行。
不知道用什么方法来实现多个表同时运行?因为我还需要存储其他一些额外的数据信息,所以不知道怎么处理,如果使用静态或者动态的方法的话,这些额外数据在哪里定义和申请空间。
请高手指导下,谢谢!

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2015-06-10 10:01 |只看该作者
回复 1# janeqi1987


     init_nstAgentSubagentObject();  

有多少张表,就有多少个这种init函数,你可以看一下mib2c的自动生成结果

不是init_agent(),也不是init_snmp(),这些只是给一个名字,做一次初始化就好了

http://www.net-snmp.org/wiki/index.php/TUT:Writing_a_Subagent

1.JPG (25.64 KB, 下载次数: 44)

1.JPG

论坛徽章:
0
3 [报告]
发表于 2015-06-11 20:27 |只看该作者
楼上说的对,我用过net-snmp 不管多少个表,都需要你注册mib库, init_xxx 就是注册mib库过程。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP