对不起回答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 {
...
}