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

📄 snmpmsg.cpp

📁 SNMP++程序源码 for ll .8snmp++2_8.tar.Z 嵌入式linux环境下的SNMP开发代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*===================================================================  Copyright (c) 1999  Hewlett-Packard Company  ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.  Permission to use, copy, modify, distribute and/or sell this software   and/or its documentation is hereby granted without fee. User agrees   to display the above copyright notice and this license notice in all   copies of the software and any documentation of the software. User   agrees to assume all liability for the use of the software; Hewlett-Packard   makes no representations about the suitability of this software for any   purpose. It is provided "AS-IS without warranty of any kind,either express   or implied. User hereby grants a royalty-free license to any and all   derivatives based upon this software code base.   SNMP++ S N M P M E S S A G E . C P P           SNMPMESSAGE CLASS DEFINITION         VERSION:  2.8    RCS INFO:  $Header: Exp $         DESIGN:  Peter E Mellquist                  AUTHOR:        Peter E Mellquist                LANGUAGE:  ANSI C++         OPERATING SYSTEMS:  Win 32  BSD UNIX        DESCRIPTION:  ASN.1	encoding / decoding class      		 =====================================================================*/ #include "snmpmsg.h"	                // header file for SnmpMessage#include "asn1.h"                       // ASN.1 header file#include "stdio.h"                      // standard io file #ifdef sun#include <netdb.h>	//dcb#endif//--------------[ well known trap ids ]-----------------------------------// SMI trap oid defclass snmpTrapsOid: public Oid {   public:    snmpTrapsOid (void):Oid("1.3.6.1.6.3.1.1.5"){};}; // SMI Enterprise Oidclass snmpTrapEnterpriseOid: public Oid {   public:    snmpTrapEnterpriseOid(void):Oid("1.3.6.1.6.3.1.1.4.3.0"){};}; // SMI Cold Start Oidclass coldStartOid: public snmpTrapsOid {   public:    coldStartOid( void){*this+=".1";};};// SMI WarmStart Oidclass warmStartOid: public snmpTrapsOid {   public:    warmStartOid( void){*this+=".2";};};// SMI LinkDown Oidclass linkDownOid: public snmpTrapsOid {   public:    linkDownOid( void){*this+=".3";};}; // SMI LinkUp Oidclass linkUpOid: public snmpTrapsOid {   public:    linkUpOid( void){*this+=".4";};};// SMI Authentication Failure Oidclass authenticationFailureOid: public snmpTrapsOid {   public:    authenticationFailureOid( void){*this+=".5";};}; // SMI egpneighborloss Oidclass egpNeighborLossOid: public snmpTrapsOid {   public:    egpNeighborLossOid( void){*this+=".6";};};const coldStartOid coldStart;const warmStartOid warmStart;const linkDownOid linkDown;const linkUpOid linkUp;const authenticationFailureOid authenticationFailure;const egpNeighborLossOid egpNeighborLoss;const snmpTrapEnterpriseOid snmpTrapEnterprise;//------------[ convert SNMP++ VB to WinSNMP smiVALUE ]----------------int convertVbToSmival( Vb &tempvb, SmiVALUE *smival ){   smival->syntax = tempvb.get_syntax();   switch ( smival->syntax ) {	  // case sNMP_SYNTAX_NULL	  case sNMP_SYNTAX_NULL:      break;	  // case sNMP_SYNTAX_INT32:      case sNMP_SYNTAX_INT:	  tempvb.get_value(smival->value.sNumber);	  break;      //    case sNMP_SYNTAX_UINT32:      case sNMP_SYNTAX_GAUGE32:      case sNMP_SYNTAX_CNTR32:      case sNMP_SYNTAX_TIMETICKS:	  case sNMP_SYNTAX_UINT32:	  tempvb.get_value(smival->value.uNumber);	  break;	  // case Counter64      case sNMP_SYNTAX_CNTR64:      {	     Counter64 c64;	     tempvb.get_value(c64);	     smival->value.hNumber.hipart = c64.high();	     smival->value.hNumber.lopart = c64.low();	  }	  break;      case sNMP_SYNTAX_BITS:      case sNMP_SYNTAX_OCTETS:      case sNMP_SYNTAX_IPADDR:      {	     OctetStr os;	     tempvb.get_value(os);	     smival->value.string.ptr = NULL;	     smival->value.string.len = os.len();	     if ( smival->value.string.len > 0 ) 		 {			smival->value.string.ptr = (SmiLPBYTE) new  unsigned char [smival->value.string.len];	        if ( smival->value.string.ptr ) 		    {               for (int i=0; i<(int) smival->value.string.len ; i++)		          smival->value.string.ptr[i] = os[i];	        } 		    else 		    { 	           smival->syntax = sNMP_SYNTAX_NULL;  // invalidate the smival	           return SNMP_CLASS_RESOURCE_UNAVAIL;	        }	     }      }      break;      case sNMP_SYNTAX_OID:	  {	     Oid oid;	     tempvb.get_value(oid);	     smival->value.oid.ptr = NULL;	     smival->value.oid.len = oid.len();	     if ( smival->value.oid.len > 0 ) 		 {			smival->value.oid.ptr = (SmiLPUINT32) new unsigned long [ smival->value.oid.len];	        if ( smival->value.oid.ptr ) 			{               for (int i=0; i<(int)smival->value.oid.len ; i++)		          smival->value.oid.ptr[i] = oid[i];	        } 			else 			{	            smival->syntax = sNMP_SYNTAX_NULL;  // invalidate the smival	            return SNMP_CLASS_RESOURCE_UNAVAIL;	        }	    }	  }	  break;      default:        return SNMP_CLASS_INTERNAL_ERROR;   }   return SNMP_CLASS_SUCCESS;};// free a SMI valuevoid freeSmivalDescriptor( SmiVALUE *smival ){   switch ( smival->syntax ) {     case sNMP_SYNTAX_OCTETS:     case sNMP_SYNTAX_OPAQUE:     case sNMP_SYNTAX_IPADDR:     case sNMP_SYNTAX_BITS:		    // obsoleted in SNMPv2 Draft Std          delete [] smival->value.string.ptr;	          break;     case sNMP_SYNTAX_OID:		  delete [] smival->value.oid.ptr;       break;   }   smival->syntax = sNMP_SYNTAX_NULL;};// load up a SnmpMessageint SnmpMessage::load( Pdu pdu,                      // Pdu object to load					   OctetStr community,           // community to use					   snmp_version version)         // version 1 or 2{	int status;	bufflen = SNMP_MSG_LENGTH;    valid_flag = FALSE;	// create a raw pdu	snmp_pdu *raw_pdu;	raw_pdu = snmp_pdu_create( (int) pdu.get_type());		Oid enterprise;	// make sure pdu is valid	if ( !pdu.valid()) 		SNMP_CLASS_INVALID_PDU;	// load it up	raw_pdu->reqid = pdu.get_request_id();	raw_pdu->errstat= (unsigned long) pdu.get_error_status();	raw_pdu->errindex= (unsigned long) pdu.get_error_index();	// if its a V1 trap then load up other values	// for v2, use normal pdu format	if ( raw_pdu->command == sNMP_PDU_V1TRAP)	{                char addrString[256];       if (gethostname(addrString, 255) == 0) {          int status = 0;          IpAddress my_address;          hostent *lookupResult;          char    *namePtr = NULL;          in_addr ipAddr;                      if ((ipAddr.s_addr = inet_addr(addrString)) == -1){             lookupResult = gethostbyname(addrString);             if (lookupResult) {                if (lookupResult->h_length == sizeof(in_addr)){                   memcpy((void *) &ipAddr, (void *) lookupResult->h_addr_list[0],sizeof(in_addr));                   my_address = inet_ntoa(ipAddr);                }             }          }           else             my_address = addrString;          struct sockaddr_in agent_addr;  // agent address socket struct          // prepare the agent address          memset(&agent_addr, 0, sizeof(agent_addr));          agent_addr.sin_family = AF_INET;          agent_addr.sin_addr.s_addr = inet_addr(((IpAddress&)my_address).IpAddress::get_printable());          raw_pdu->agent_addr = agent_addr;       }	   //-----[ compute generic trap value ]-------------------------------       // determine the generic value       // 0 - cold start       // 1 - warm start       // 2 - link down       // 3 - link up       // 4 - authentication failure       // 5 - egpneighborloss       // 6 - enterprise specific	   Oid trapid;	   pdu.get_notify_id( trapid);	   if ( !trapid.valid() || trapid.len() < 2 ) 	   { 	       snmp_free_pdu( raw_pdu);	       return SNMP_CLASS_INVALID_NOTIFYID;       }	   raw_pdu->specific_type=0;       if ( trapid == coldStart)          raw_pdu->trap_type = 0;  // cold start       else if ( trapid == warmStart)          raw_pdu->trap_type = 1;  // warm start       else if( trapid == linkDown)          raw_pdu->trap_type = 2;  // link down       else if ( trapid == linkUp)          raw_pdu->trap_type = 3;  // link up       else if ( trapid == authenticationFailure )          raw_pdu->trap_type = 4;  // authentication failure       else if ( trapid == egpNeighborLoss)          raw_pdu->trap_type = 5;  // egp neighbor loss

⌨️ 快捷键说明

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