myselvの質問に答えてすみません。
最後に、この問題を回避するための次のトリックを見つけました。ターゲットSNMPオブジェクトの直後に既知のSNMPオブジェクト(ifNumberなど)を挿入して、特定のSNMPクエリを識別します。
エージェントのハンドラー関数は、現在の変数の横にある変数をチェックして、それが正確に既知のSNMPオブジェクトifNumberであるかどうかを確認する必要があります。はいの場合、クエリはあなたからのものであり、NET-SNMPAPIを使用してこのクエリの変数リストを形成します。
クライアントコード:
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 {
...
}