1

SNMPエージェントがソースリクエスターに応じて異なる応答をするようにしたいのですが、SNMPエージェントで区別できるように一部のデータを魔法で伝達する方法を見つけることができません。

設定してみたのはnetsnmp_session構造とnetsnmp_pdu構造です。の2つのパラメータだからですsnmp_send。私が促進しようとしたデータフィールドはmyvoidとcallback_magicです。

しかし、残念ながらSNMPエージェントでは、受信したデータはすべて0であり、これはSNMPクライアントで設定したものではありません。

4

1 に答える 1

0

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 {
                       ...
                    }
于 2010-11-17T03:04:05.053 に答える