我一直在关注找到here的NET-SNMP教程。
设置-上级:
在示例中有这行代码。
netsnmp_register_long_instance("nstAgentSubagentObject",
nstAgentSubagentObject_oid,
OID_LENGTH(nstAgentSubagentObject_oid),
&nstAgentSubagentObject, NULL);
在做了一些调查之后,我发现NULL
实际上是这个签名的回调指针。
int CallBackFunction(netsnmp_mib_handler*handler, netsnmp_handler_registration*reginfo,
netsnmp_agent_request_info*reqinfo, netsnmp_request_info*requests)
所以我可以像这样重写上一行代码,
netsnmp_register_long_instance("nstAgentSubagentObject",
nstAgentSubagentObject_oid,
OID_LENGTH(nstAgentSubagentObject_oid),
&nstAgentSubagentObject, &CallBackFunction);
每次在我的一个变量上使用snmpget
命令时,都会调用回调函数CallBackFunction
。哪个好,但我找不到一种方法来获取使用回调AKA &nstAgentSubagentObject
注册的值的指针。
我查看了4个参数的数据类型,无法弄清楚我错过了什么。
问题:
有没有办法获得使用回调函数注册的&nstAgentSubagentObject
指针?
有没有更好的方法来关联这些回调?我在net-snmp的通用回调函数here上找到了一些文档,但是如果我能用现有的指针得到指针,我就可以全部设置。
谢谢!
答案 0 :(得分:1)
long nstAgentSubagentObject;
size_t long_size = sizeof(long);
int handle_nstAgentSubagentObject(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)
{
printf("handle_nstAgentSubagentObject\n");
switch(reqinfo->mode) {
case MODE_GET:
nstAgentSubagentObject = 100500;
snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
&nstAgentSubagentObject,
long_size);
break;
default:
snmp_log(LOG_ERR, "unknown mode (%d) in handle_totalClients\n", reqinfo->mode );
return SNMP_ERR_GENERR;
}
return SNMP_ERR_NOERROR;
}
五月对某人有用
Counter64用法(子代理agentx):
struct counter64 createdFlowsAll;
size_t counter64_size = sizeof(struct counter64); // sizeof(U64);
netsnmp_register_instance (
netsnmp_create_handler_registration("createdFlowsAll", handle_createdFlowsAll, createdFlowsAll_oid, OID_LENGTH(createdFlowsAll_oid), HANDLER_CAN_RONLY
));
int handle_createdFlowsAll(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)
{
size_t i;
u_long createdFlowsAll_t;
switch(reqinfo->mode) {
case MODE_GET:
createdFlowsAll_t = 100500;
// createdFlowsAll.high = createdFlowsAll_t & 0xffffffff00000000ULL;
// createdFlowsAll.low = createdFlowsAll_t & 0x00000000ffffffffULL;
createdFlowsAll.high = createdFlowsAll_t >> 32;
createdFlowsAll.low = createdFlowsAll_t & 0xffffffff;
snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER64,
&createdFlowsAll,
counter64_size);
break;
default:
snmp_log(LOG_ERR, "unknown mode (%d) in handle_createdFlowsAll\n", reqinfo->mode );
return SNMP_ERR_GENERR;
}
return SNMP_ERR_NOERROR;
}