2016-06-13 34 views
1

Net-SNMPの初心者であることを謝ります。私はthis simple SNMP demo appをNet-SNMPウェブサイトで使ってみました。C:Net-SNMPによって返された値にアクセスする方法GET

このコードは、返される値がASN_OCTET_STRINGであるかどうかを確認するために応答を操作し、そうであれば、vars->val.stringを使用して文字列にアクセスし、文字ポインタspに割り当てます。

しかし、タイプがASN_OCTET_STRING以外の場合、この値にアクセスする方法はわかりません。例えば、私がこの値を取って、それが変数'ASN_INTEGER'または'ASN_OBJECT_ID'である場合、それを変数に割り当てるにはどうすればよいですか?

#include <net-snmp/net-snmp-config.h> 
#include <net-snmp/net-snmp-includes.h> 
#include <string.h> 
#define DEMO_USE_SNMP_VERSION_3 

#ifdef DEMO_USE_SNMP_VERSION_3 
const char *our_v3_passphrase = "MD5Password"; 
#endif 

int main(int argc, char ** argv) 
{ 
    netsnmp_session session, *ss; 
    netsnmp_pdu *pdu; 
    netsnmp_pdu *response; 

    oid anOID[MAX_OID_LEN]; 
    size_t anOID_len; 

    netsnmp_variable_list *vars; 
    int status; 
    int count=1; 

    init_snmp("snmpdemoapp"); 

    snmp_sess_init(&session);     
    session.peername = strdup("localhost:161"); 


#ifdef DEMO_USE_SNMP_VERSION_3 

    session.version=SNMP_VERSION_3; 

    session.securityName = strdup("user2"); 
    session.securityNameLen = strlen(session.securityName); 

    session.securityLevel = SNMP_SEC_LEVEL_AUTHNOPRIV; 

    session.securityAuthProto = usmHMACMD5AuthProtocol; 
    session.securityAuthProtoLen = sizeof(usmHMACMD5AuthProtocol)/sizeof(oid); 
    session.securityAuthKeyLen = USM_AUTH_KU_LEN; 

    if (generate_Ku(session.securityAuthProto, 
        session.securityAuthProtoLen, 
        (u_char *) our_v3_passphrase, strlen(our_v3_passphrase), 
        session.securityAuthKey, 
        &session.securityAuthKeyLen) != SNMPERR_SUCCESS) { 
     snmp_perror(argv[0]); 
     snmp_log(LOG_ERR, 
       "Error generating Ku from authentication pass phrase. \n"); 
     exit(1); 
    } 

#else /* we'll use the insecure (but simplier) SNMPv1 */ 

    session.version = SNMP_VERSION_1; 

    session.community = "demopublic"; 
    session.community_len = strlen(session.community); 

#endif /* SNMPv1 */ 

    SOCK_STARTUP; 
    ss = snmp_open(&session);      
    if (!ss) { 
     snmp_sess_perror("ack", &session); 
     SOCK_CLEANUP; 
     exit(1); 
    } 

    pdu = snmp_pdu_create(SNMP_MSG_GET); 
    anOID_len = MAX_OID_LEN; 
    if (!snmp_parse_oid("ip.21.1.8.xx.xx.xx.xx", anOID, &anOID_len)) { 
     snmp_perror("ip.21.1.8.xx.xx.xx.xx"); 
     SOCK_CLEANUP; 
     exit(1); 
    } 

    snmp_add_null_var(pdu, anOID, anOID_len); 

    status = snmp_synch_response(ss, pdu, &response); 

    if (status == STAT_SUCCESS && response->errstat == SNMP_ERR_NOERROR) { 

     for(vars = response->variables; vars; vars = vars->next_variable) 
     print_variable(vars->name, vars->name_length, vars); 

     /* manipuate the information ourselves */ 
     for(vars = response->variables; vars; vars = vars->next_variable) { 



     if (vars->type == ASN_OCTET_STR) { 
     char *sp = (char *)malloc(1 + vars->val_len); 
     memcpy(sp, vars->val.string, vars->val_len); 
     sp[vars->val_len] = '\0'; 
      printf("value #%d is a string: %s\n", count++, sp); //Here sp now has the string - But this doesnt work when the string is for eg."HOST-RESOURCES-MIB::hrSWInstalledDate.1953 = STRING: 0-1-1,0:0:0.0" 
     free(sp); 
    } 


     else if(vars->type == ASN_INTEGER) { 
      printf("value is an Integer\n"); 
      int ObjVal; 
      // How do I get the Integer value and assign it to 'ObjVal' 
     } 


     else if(vars->type == ASN_OBJECT_ID) { 
      printf("value is an OID\n"); 
      // How do I get the OID and assign it to some variable 
     } 


     else if(vars->type == ASN_TIMETICKS) { 
      printf("value is in Timeticks\n"); 
      // How do I get the Timeticks and assign it to some variable for further processing 
     } 



     } 
    } else { 
     if (status == STAT_SUCCESS) 
     fprintf(stderr, "Error in packet\nReason: %s\n", 
       snmp_errstring(response->errstat)); 
     else if (status == STAT_TIMEOUT) 
     fprintf(stderr, "Timeout: No response from %s.\n", 
       session.peername); 
     else 
     snmp_sess_perror("snmpdemoapp", ss); 

    } 

    if (response) 
     snmp_free_pdu(response); 
    snmp_close(ss); 

    SOCK_CLEANUP; 
    return (0); 
} 

vars->val.integerまたはvars->val.object_idしようとしましたが、それdoesnotは値が含まれています。私はここで何が欠けていますか?

私の他の質問は、その後vars->val.string doesntのは、文字列として"0-1-1,0:0:0.0"を持って

HOST-RESOURCES-MIB::hrSWInstalledDate.1953 = STRING: 0-1-1,0:0:0.0 

、GET応答はこのようなものであるとき、それはタイプ ASN_OCTET_STRINGの場合でも、です。

基本的に私の質問は、値を取得することができるresponse構造体に値が格納される方法です。

ありがとうございました!

P.S:Makefile Net-SNMP Webサイトからのリンク。

Edit1: 整数の場合、私はimmibisが指摘しているように*vars->val->stringを使って読むことができます。他のデータ型へのアクセス方法に関するアイデア

+1

整数の場合:* vars-> val.integerを使用します。 – immibis

+0

ありがとう、今私は* vars-> val.integerを使って整数にアクセスできます。他のデータ型に関する考え方? – Deepa

+1

他のどのタイプにアクセスしますか? 'Integer'、' Integer32'、 'Counter32'、' Unsigned32'のようなそれらのいくつかは全て 'integer'フィールドにあります。 'netsnmp_vardata'は共用体なので、すべてのメンバが同じ値を持つことに注意してください。それは異なる解釈であり、' variable_list :: type'に依存する必要があります。 –

答えて

2

あなたのシステム上の/usr/include/net-snmp/types.hファイルまたは同様に見ることができるように、net-snmpvars->val以下の労働組合の種類があります。

typedef union { 
    long   *integer; 
    u_char   *string; 
    oid   *objid; 
    u_char   *bitstring; 
    struct counter64 *counter64; 
#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES 
    float   *floatVal; 
    double   *doubleVal; 
    /* 
    * t_union *unionVal; 
    */ 
#endif       /* NETSNMP_WITH_OPAQUE_SPECIAL_TYPES */ 
} netsnmp_vardata; 

*varsは、データの長さが格納されているval_lenフィールドを持っています。 したがって、*vars->val.integerという整数、u_char vars->val.stringのポインタとして文字列vars->val_lenの文字、oidvars->val.objidのポインタとしてのoid、vars->val_len/sizeof(oid)のoid要素などが利用できます。

関連する問題