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

📄 snmpobject.cpp

📁 .Net C++ sample code for SNMP programming, Source from Open Source (sample code).
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		case SNMP_SYNTAX_OID:		case SNMP_SYNTAX_NSAPADDR:
		case SNMP_SYNTAX_IPADDR:
		case SNMP_SYNTAX_NULL:
		case SNMP_SYNTAX_NOSUCHOBJECT:
		case SNMP_SYNTAX_NOSUCHINSTANCE:
		case SNMP_SYNTAX_ENDOFMIBVIEW:
			break;
	}	
}

__int64 SNMPObject::getValueAsInteger() const {
	switch(_syntax) {		
		case SNMP_SYNTAX_INT:
			return (__int64)getInt();
		case SNMP_SYNTAX_OCTETS:
		case SNMP_SYNTAX_OPAQUE:
		case SNMP_SYNTAX_BITS:	
			if(_binary) {
				int sz = 0;
				char * pChar = getValueAsOctets(&sz);				
				if(pChar && sz) {
					switch(sz) {
						case 1: return (__int64)(char)*((char*)pChar);
						case 2:
						case 3: return (__int64)(short)ntohs(*((short*)pChar));
						default: return (__int64)(long)ntohl(*((long*)pChar));
					}						
				}
			} else {
				return (__int64)_atoi64(_string.c_str());
			}
			break;		
		case SNMP_SYNTAX_CNTR64:
		case SNMP_SYNTAX_CNTR32:
		case SNMP_SYNTAX_GAUGE32:
		case SNMP_SYNTAX_UINT32:
		case SNMP_SYNTAX_TIMETICKS:
			return (__int64)getUInt();
		case SNMP_SYNTAX_OID:		case SNMP_SYNTAX_NSAPADDR:
		case SNMP_SYNTAX_IPADDR:
		case SNMP_SYNTAX_NULL:
		case SNMP_SYNTAX_NOSUCHOBJECT:
		case SNMP_SYNTAX_NOSUCHINSTANCE:
		case SNMP_SYNTAX_ENDOFMIBVIEW:
			break;
	}	
	return 0;
}

int SNMPObject::compareValue(SNMPObject * pOther) const
{
	switch(_syntax) {		
		case SNMP_SYNTAX_OCTETS:
		case SNMP_SYNTAX_OPAQUE:
		case SNMP_SYNTAX_BITS:
		case SNMP_SYNTAX_OID:		case SNMP_SYNTAX_NSAPADDR:
		case SNMP_SYNTAX_IPADDR:
			return getValueAsString().compare(pOther->getValueAsString());
		case SNMP_SYNTAX_INT:
			if(getInt() < pOther->getInt()) {
				return -1;
			} else if(getInt() == pOther->getInt()) {
				return 0;
			} else  {
				return 1;
			}		
		case SNMP_SYNTAX_CNTR64:
		case SNMP_SYNTAX_CNTR32:
		case SNMP_SYNTAX_GAUGE32:
		case SNMP_SYNTAX_UINT32:
		case SNMP_SYNTAX_TIMETICKS:
			if(getUInt() < pOther->getUInt()) {
				return -1;
			} else if(getUInt() == pOther->getUInt()) {
				return 0;
			} else  {
				return 1;
			}
		case SNMP_SYNTAX_NULL:
		case SNMP_SYNTAX_NOSUCHOBJECT:
		case SNMP_SYNTAX_NOSUCHINSTANCE:
		case SNMP_SYNTAX_ENDOFMIBVIEW:
			return 0;
	}
	return 0;
}



std::string SNMPObject::getDisplayInformation() const {
	std::stringstream ss;
	ss << getOID() << " = " << getValueAsString() << " [" << getSyntaxAsString() + "]";
	return ss.str();
}

smiOID * SNMPObject::getBinaryOID() {
	if(!_bInit) {
		return NULL;
	}
	return &_oid;
}

std::string	SNMPObject::getOID() const {
	if(!_bInit) {
		return "";
	}
	char szName[MAXOBJIDSTRSIZE+1];
	szName[0] = szName[MAXOBJIDSTRSIZE] = '\0';
	if(SnmpOidToStr (&_oid, sizeof(szName), szName) == SNMPAPI_FAILURE) {
		SNMP_THROW_ERROR("Failed to convert OID to string", SnmpGetLastError(NULL), SNMP_ERROR);
	}
	return std::string(szName);
}

void SNMPObject::setSyntax(int syntax) {
	switch(syntax) {
		case SNMP_INT:
			_syntax = SNMP_SYNTAX_INT; break;
		case SNMP_OCTETS:
			_syntax = SNMP_SYNTAX_OCTETS; break;
		case SNMP_OPAQUE:
			_syntax = SNMP_SYNTAX_OPAQUE; break;
		case SNMP_BITS:
			_syntax = SNMP_SYNTAX_BITS; break;		
		case SNMP_CNTR64:
			_syntax = SNMP_SYNTAX_CNTR64; break;		
		case SNMP_CNTR32:
			_syntax = SNMP_SYNTAX_CNTR32; break;
		case SNMP_GAUGE32:
			_syntax = SNMP_SYNTAX_GAUGE32; break;
		case SNMP_TIMETICKS:
			_syntax = SNMP_SYNTAX_TIMETICKS; break;
		case SNMP_UINT32:
			_syntax = SNMP_SYNTAX_UINT32; break;
		case SNMP_OID:
			_syntax = SNMP_SYNTAX_OID; break;
		case SNMP_IPADDR:
			_syntax = SNMP_SYNTAX_IPADDR; break;
		default:
			_syntax = SNMP_NULL; break;
	}		
}

int SNMPObject::getSyntax() const {
	switch(_syntax) {		
		case SNMP_SYNTAX_INT:
			return SNMP_INT;
		case SNMP_SYNTAX_OCTETS:
			return SNMP_OCTETS;
		case SNMP_SYNTAX_OPAQUE:
			return SNMP_OPAQUE;
		case SNMP_SYNTAX_BITS:
			return SNMP_BITS;		
		case SNMP_SYNTAX_CNTR64:
			return SNMP_CNTR64;		
		case SNMP_SYNTAX_CNTR32:
			return SNMP_CNTR32;
		case SNMP_SYNTAX_GAUGE32:
			return SNMP_GAUGE32;
		case SNMP_SYNTAX_TIMETICKS:
			return SNMP_TIMETICKS;
		case SNMP_SYNTAX_UINT32:
			return SNMP_UINT32;
		case SNMP_SYNTAX_OID:
			return SNMP_OID;		case SNMP_SYNTAX_NSAPADDR:
		case SNMP_SYNTAX_IPADDR:
			return SNMP_IPADDR;			
	}	
	return SNMP_NULL;
}

std::string SNMPObject::getSyntaxAsString() const {
	static char * _syntaxStrMap[12] = {
		"Integer",
		"Octets",
		"Opaque",
		"Bits",
		"Counter64",
		"Counter32",
		"Gauge32",
		"UnsignedInteger32",
		"TimeTicks",		"ObjectIdentifier",
		"IPAddr",
		"Null" };
	return _syntaxStrMap[getSyntax()];
}


void SNMPObject::setValue(smiVALUE * smiVal)
{
	_syntax = (DWORD)smiVal->syntax;
	switch(smiVal->syntax) {
		
		case SNMP_SYNTAX_INT:
			setInt((__int64)smiVal->value.sNumber);
			break;
		
		case SNMP_SYNTAX_OCTETS:
		case SNMP_SYNTAX_OPAQUE:
		case SNMP_SYNTAX_BITS:
			{
				unsigned int i;
				unsigned char cB;
				bool binary = false;
				for (i=0; i<smiVal->value.string.len; i++) {
					cB = (unsigned char)smiVal->value.string.ptr[i];					if((cB < 0x20 && (cB != 0x0A && cB != 0x0D)) || cB > 0x7E) {
						binary = true;
						break;
					}
				}
				_binary = binary;
				if(binary) {
					setOctets(smiVal->value.string.ptr, smiVal->value.string.len);
				} else {
					std::stringstream ss;
					for (i=0; i<smiVal->value.string.len; i++) {
						ss << (unsigned char)smiVal->value.string.ptr[i];
					}
					setString(ss.str());
                }
			}
			break;
		
		case SNMP_SYNTAX_CNTR64:
			setUInt( (((unsigned __int64)(smiVal->value.hNumber.hipart)) << 32) | ((unsigned __int64)(smiVal->value.hNumber.lopart)) );
			break;
		
		case SNMP_SYNTAX_CNTR32:
		case SNMP_SYNTAX_GAUGE32:
		case SNMP_SYNTAX_TIMETICKS:
		case SNMP_SYNTAX_UINT32:
			setUInt((unsigned __int64)smiVal->value.uNumber);
			break;

		case SNMP_SYNTAX_OID:
			{
				char szName[MAXOBJIDSTRSIZE+1];
				szName[0] = szName[MAXOBJIDSTRSIZE] = '\0';
				if(SnmpOidToStr (&smiVal->value.oid, sizeof(szName), szName) == SNMPAPI_FAILURE) {
					szName[0] = '\0';
				}
				setString(szName);
			}
			break;
					case SNMP_SYNTAX_NSAPADDR:
		case SNMP_SYNTAX_IPADDR:
			{
				unsigned int i;
				std::stringstream ss;
				for (i=0; i<smiVal->value.string.len; i++) {
					ss << ((unsigned int)smiVal->value.string.ptr[i]);
					if(i+1 < smiVal->value.string.len) {
						ss << ".";
					}
				}
				setString(ss.str());
			}			
			break;
		
		case SNMP_SYNTAX_NULL:
		case SNMP_SYNTAX_NOSUCHOBJECT:
		case SNMP_SYNTAX_NOSUCHINSTANCE:
		case SNMP_SYNTAX_ENDOFMIBVIEW:
		default:
			break;
	}	
}


void SNMPObject::getValue(smiVALUE * smiVal)
{
	smiVal->syntax = (smiUINT32)_syntax;
	switch(smiVal->syntax) {
		
		case SNMP_SYNTAX_INT:
			smiVal->value.sNumber = (smiINT)getInt();
			break;
		
		case SNMP_SYNTAX_OCTETS:
		case SNMP_SYNTAX_OPAQUE:
		case SNMP_SYNTAX_BITS:
			{				
				int sz = 0;
				char * pChar = getValueAsOctets(&sz);
				smiVal->value.string.len = sz;
				if(sz) {
					smiVal->value.string.ptr = (smiLPBYTE)malloc(sz);
					memcpy(smiVal->value.string.ptr, pChar, sz);
				} else {
					smiVal->value.string.ptr = NULL;
				}
			}
			break;
		
		case SNMP_SYNTAX_CNTR64:
			smiVal->value.hNumber.hipart = (smiUINT32)((getUInt() >> 32) & 0x00000000FFFFFFFF);
			smiVal->value.hNumber.lopart = (smiUINT32)(getUInt() & 0x00000000FFFFFFFF);
			break;
		
		case SNMP_SYNTAX_CNTR32:
		case SNMP_SYNTAX_GAUGE32:
		case SNMP_SYNTAX_TIMETICKS:
		case SNMP_SYNTAX_UINT32:
			smiVal->value.uNumber = (smiUINT32)getUInt();
			break;

		case SNMP_SYNTAX_OID:
			SnmpStrToOid(_string.c_str(), &smiVal->value.oid);
			break;
					case SNMP_SYNTAX_NSAPADDR:
		case SNMP_SYNTAX_IPADDR:
			{
				int i;
				int sz = 0;
				for (i=0; i<(int)_string.size(); i++) {
					if(_string[i] == '.') {
						sz++;
					}
				}
				smiVal->value.string.ptr = (smiLPBYTE)malloc(sz);
				smiVal->value.string.len = sz;
				std::string aux;
				int istore = 0;
				for (i=0; i<(int)_string.size(); i++) {
					if(_string[i] == '.') {
						if(istore < sz) {
							smiVal->value.string.ptr[istore] = (smiBYTE)atoi(aux.c_str());
						}
						aux = "";
						istore++;
					} else {
						aux += _string[i];
					}
				}
				if(istore < sz) {
					smiVal->value.string.ptr[istore] = (smiBYTE)atoi(aux.c_str());
				}
			}			
			break;
		
		case SNMP_SYNTAX_NULL:
		case SNMP_SYNTAX_NOSUCHOBJECT:
		case SNMP_SYNTAX_NOSUCHINSTANCE:
		case SNMP_SYNTAX_ENDOFMIBVIEW:
		default:
			smiVal->value.uNumber = 0;
			break;
	}	
}

⌨️ 快捷键说明

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