我希望SNMP代理能够以不同的方式响应,具体取决于源请求者,但无法通过SNMP代理找到一种魔术传达某些数据的方法。
我尝试设置的是netsnmp_session
结构和netsnmp_pdu
结构。因为它们是snmp_send
的两个参数。我试图促成的数据字段是myvoid和callback_magic。
但不幸的是,在SNMP代理上,收到的数据都是0,这不是我在SNMP客户端上设置的。
答案 0 :(得分:0)
很抱歉回答myselv的问题。
最后,我找到了以下技巧来规避问题: 在目标SNMP对象之后立即插入一个众所周知的SNMP对象(例如ifNumber)来标识特定的SNMP查询。
代理中的处理函数应该检查当前变量旁边的变量以查看是否 它就是众所周知的SNMP对象ifNumber。如果是,则查询来自您,使用 NET-SNMP API,用于构成此查询的变量列表。
客户代码:
oid dest_OID[ MAX_OID_LEN ] = {0};
size_t dest_OID_len = COUNT_OF(dest_OID);
get_node(g_snmp_name_ifNumber, dest_OID, &dest_OID_len );
snmp_add_null_var(pdu, dest_OID, dest_OID_len);
在代理方面:
int get_status(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info *reqinfo,
netsnmp_request_info *requests)
{
switch (reqinfo->mode) {
case MODE_GET:
{
bool is_sent_by_manager = false;
if( requests->requestvb->next_variable )
{
struct variable_list * v = requests->requestvb->next_variable;
oid dest_OID[ MAX_OID_LEN ] = {0};
size_t dest_OID_len = COUNT_OF(dest_OID);
get_node(g_snmp_name_ifNumber, dest_OID, &dest_OID_len );
const int nbytes = v->name_length * sizeof(v->name[0]);
if( dest_OID_len >= v->name_length
&& memcmp(dest_OID, v->name, nbytes) == 0 ) {
is_sent_by_manager = true;
}
}
if( is_sent_by_manager ) {
...
}
else {
...
}