C:如何访问Net-SNMP GET返回的值

时间:2016-06-13 15:48:05

标签: c snmp net-snmp

我为这个天真的问题道歉,我是Net-SNMP的新手。我尝试过在Net-SNMP网站上使用this simple SNMP demo app

此代码执行SNMP-GET并操作响应以检查返回的值是否为ASN_OCTET_STRING,如果是,则使用vars->val.string访问该字符串并将其分配给字符指针{{1 }}

但如果类型不是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类型,当GET回复是这样的时候,

ASN_OCTET_STRING

然后HOST-RESOURCES-MIB::hrSWInstalledDate.1953 = STRING: 0-1-1,0:0:0.0 没有vars->val.string作为字符串。

基本上我的问题是如何将值存储在"0-1-1,0:0:0.0"结构中,我可以从中检索值?

先谢谢!!

P.S:来自Net-SNMP网站的Makefile链接。

EDIT1: 对于整数,我可以使用immibis指出的response进行阅读。有关如何访问其他数据类型的任何想法?

1 个答案:

答案 0 :(得分:3)

正如您在系统/usr/include/net-snmp/types.h文件或类似文件中看到的那样,net-snmp vars->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访问整数,将字符串作为指向带有vars->val.string个字符的u_char vars->val_len的指针,使用oid作为指向vars->val.objid vars->val_len/sizeof(oid)的指针oid元素等等。