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