⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snmpmsg.cpp

📁 SNMP++程序源码 for ll .8snmp++2_8.tar.Z 嵌入式linux环境下的SNMP开发代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
       else {	      raw_pdu->trap_type = 6;     // enterprise specific	                                  // last oid subid is the specific value	                                  // if 2nd to last subid is "0", remove it 			                          // enterprise is always the notify oid prefix	      raw_pdu->specific_type = (int) trapid[(int) (trapid.len()-1)];           trapid.trim(1);	      if ( trapid[(int)(trapid.len()-1)] == 0 )	      trapid.trim(1);          enterprise = trapid;             }	   if ( raw_pdu->trap_type !=6)	      pdu.get_notify_enterprise( enterprise);	   if ( enterprise.len() >0) {		   // note!!		   // these are hooks into an SNMP++ oid		   // and therefor the raw_pdu enterprise		   // should not free them. null them out!!		   SmiLPOID rawOid;		   rawOid = enterprise.oidval();		   raw_pdu->enterprise = rawOid->ptr;		   raw_pdu->enterprise_length = (int) rawOid->len;	   }	   // timestamp	   TimeTicks timestamp;	   pdu.get_notify_timestamp( timestamp);	   raw_pdu->time = ( unsigned long) timestamp;	   	}	// if its a v2 trap then we need to make a few adjustments	// vb #1 is the timestamp	// vb #2 is the id, represented as an Oid	if ( raw_pdu->command == sNMP_PDU_TRAP)	{		Pdu temppdu;		Vb tempvb;		// vb #1 is the timestamp		TimeTicks timestamp;		tempvb.set_oid("1.3.6.1.2.1.1.3.0");   // sysuptime		pdu.get_notify_timestamp( timestamp);		tempvb.set_value ( timestamp);		temppdu += tempvb;               	 		// vb #2 is the id		Oid trapid;		tempvb.set_oid("1.3.6.1.6.3.1.1.5");		pdu.get_notify_id( trapid);		tempvb.set_value( trapid);		temppdu += tempvb;		// append the remaining vbs		for ( int z=0;z<pdu.get_vb_count();z++) {			pdu.get_vb( tempvb,z);			temppdu += tempvb;		}        pdu = temppdu;          // reassign the pdu to the temp one	}	// load up the payload	// for all Vbs in list, add them to the pdu	int vb_count;	Vb tempvb;	Oid tempoid;	SmiLPOID smioid;	SmiVALUE smival;	vb_count = pdu.get_vb_count();	for (int z=0;z<vb_count;z++) {		pdu.get_vb( tempvb,z);		tempvb.get_oid( tempoid);		smioid = tempoid.oidval();		// clear the value portion, in case its		// not already been done so by the app		// writer		// only do it in the case its a get,next or bulk		if ((raw_pdu->command == sNMP_PDU_GET) ||			(raw_pdu->command == sNMP_PDU_GETNEXT) ||            (raw_pdu->command == sNMP_PDU_GETBULK))			tempvb.set_null();		status = convertVbToSmival( tempvb, 			                        &smival );		if ( status != SNMP_CLASS_SUCCESS)			return status;		// add the vb to the raw pdu	    snmp_add_var( raw_pdu, 			          smioid->ptr, 			          (int) smioid->len,			          &smival);		freeSmivalDescriptor( &smival);	}	// ASN1 encode the pdu	status = snmp_build( raw_pdu,	                     databuff,						 (int *) &bufflen,						 version,						 community.data(),						 (int) community.len());	if ( status != 0) {		valid_flag = FALSE;		return SNMP_ERROR_WRONG_ENCODING;	}	valid_flag = TRUE;	// prevention of SNMP++ Enterprise Oid death	if ( enterprise.len() >0) {		raw_pdu->enterprise = 0;		raw_pdu->enterprise_length=0;	}		snmp_free_pdu( raw_pdu);	return SNMP_CLASS_SUCCESS;};// load up a SnmpMessageint SnmpMessage::load( unsigned char *data, 					   unsigned long len){   bufflen = SNMP_MSG_LENGTH;   valid_flag = FALSE;   if ( len <= SNMP_MSG_LENGTH) {	   memcpy( (unsigned char *) databuff,		       (unsigned char *) data,			   (unsigned int) len);	   bufflen = len;	   valid_flag = TRUE;   }   else	   return SNMP_ERROR_WRONG_LENGTH;   return SNMP_CLASS_SUCCESS;	};// unload the data into SNMP++ objectsint SnmpMessage::unload( Pdu &pdu,                 // Pdu object						 OctetStr &community,      // community object						 snmp_version &version)    // SNMP version #{   unsigned char community_name[255];   unsigned long community_len;   Pdu tmppdu;   pdu = tmppdu;   if ( !valid_flag)	   return SNMP_CLASS_INVALID;   snmp_pdu *raw_pdu;   raw_pdu = snmp_pdu_create(0);   int status = snmp_parse( raw_pdu,                            databuff,							community_name,							community_len,							version,                            (int) bufflen);      if ( status != 0) 	   return SNMP_CLASS_INTERNAL_ERROR;      // load up the SNMP++ variables   community.set_data( community_name,		               community_len);   set_request_id( &pdu,raw_pdu->reqid);   set_error_status( &pdu,(int) raw_pdu->errstat);   set_error_index( &pdu,(int) raw_pdu->errindex);   pdu.set_type( raw_pdu->command);   // deal with trap parameters   TimeTicks timestamp;   timestamp = raw_pdu->time;   pdu.set_notify_timestamp( timestamp);   // vbs   Vb tempvb;   Oid tempoid;   struct   variable_list *vp;   for(vp = raw_pdu->variables; vp; vp = vp->next_variable) {	 // extract the oid portion	 tempoid.set_data( (unsigned long *)vp->name,                       ( unsigned int) vp->name_length);	 tempvb.set_oid( tempoid);	 // extract the value portion	 switch(vp->type){	 // octet string	 case sNMP_SYNTAX_OCTETS:     case sNMP_SYNTAX_OPAQUE:	 {	    OctetStr octets( (unsigned char *) vp->val.string,                         (unsigned long) vp->val_len);	    tempvb.set_value( octets);	 }	 break;	 // object id	 case sNMP_SYNTAX_OID:	 {	   	Oid oid( (unsigned long*) vp->val.objid,			     (int) vp->val_len);		tempvb.set_value( oid);	 }     break;	 // timeticks	 case sNMP_SYNTAX_TIMETICKS:	 {		 TimeTicks timeticks( (unsigned long) *(vp->val.integer));		 tempvb.set_value( timeticks);	 }	 break;	 // 32 bit counter	 case sNMP_SYNTAX_CNTR32:	 {	     Counter32 counter32( (unsigned long) *(vp->val.integer));		 tempvb.set_value( counter32);	 }	 break;	 // 32 bit gauge	 case sNMP_SYNTAX_GAUGE32:	 {	     Gauge32 gauge32( (unsigned long) *(vp->val.integer));		 tempvb.set_value( gauge32);	 }	 break;	 // ip address	 case sNMP_SYNTAX_IPADDR:	 {		 char buffer[20];		 sprintf( buffer,"%d.%d.%d.%d",			      vp->val.string[0],				  vp->val.string[1],				  vp->val.string[2],				  vp->val.string[3]);	     IpAddress ipaddress( buffer);		 tempvb.set_value( ipaddress);	 }	 break;	 // 32 bit integer	 case sNMP_SYNTAX_INT:	 {	    SnmpInt32 int32( (long) *(vp->val.integer));		tempvb.set_value( int32);	 }	 break;	 // 32 bit unsigned integer	 case sNMP_SYNTAX_UINT32:	 {		SnmpUInt32 uint32( (unsigned long) *(vp->val.integer));		tempvb.set_value( uint32);	 }     break;	 // v2 counter 64's	 case sNMP_SYNTAX_CNTR64:     break; 	 case sNMP_SYNTAX_NULL:	   tempvb.set_null();	 break;	 // v2 vb exceptions	 case sNMP_SYNTAX_NOSUCHOBJECT:	 case sNMP_SYNTAX_NOSUCHINSTANCE:	 case sNMP_SYNTAX_ENDOFMIBVIEW:		 set_exception_status( &tempvb, vp->type);     break;	 default:		 tempvb.set_null();    } // end switch	 // append the vb to the pdu	 pdu += tempvb;   }      snmp_free_pdu( raw_pdu);   return SNMP_CLASS_SUCCESS;	};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -