www.pudn.com > SuperSnmp.rar > SuperSnmp.cpp


// SuperSnmp.cpp : Defines the initialization routines for the DLL. 
// 
 
#include "stdafx.h" 
#include  
#include  
#include "SuperSnmp.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
////////////////////////////////////////////////////////////// 
// 
// 
//	Note! 
// 
//		If this DLL is dynamically linked against the MFC 
//		DLLs, any functions exported from this DLL which 
//		call into MFC must have the AFX_MANAGE_STATE macro 
//		added at the very beginning of the function. 
// 
//		For example: 
// 
//		extern "C" BOOL PASCAL EXPORT ExportedFunction() 
//		{ 
//			AFX_MANAGE_STATE(AfxGetStaticModuleState()); 
//			// normal function body here 
//		} 
// 
//		It is very important that this macro appear in each 
//		function, prior to any calls into MFC.  This means that 
//		it must appear as the first statement within the  
//		function, even before any object variable declarations 
//		as their constructors may generate calls into the MFC 
//		DLL. 
// 
//		Please see MFC Technical Notes 33 and 58 for additional 
//		details. 
// 
 
///////////////////////////////////////////////////////////////////////////// 
// CSuperSnmpApp 
 
BEGIN_MESSAGE_MAP(CSuperSnmpApp, CWinApp) 
//{{AFX_MSG_MAP(CSuperSnmpApp) 
// NOTE - the ClassWizard will add and remove mapping macros here. 
//    DO NOT EDIT what you see in these blocks of generated code! 
//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CSuperSnmpApp construction 
 
CSuperSnmpApp::CSuperSnmpApp() 
{ 
} 
 
CSuperSnmpApp::~CSuperSnmpApp()  
{ 
	// TODO: Add your specialized code here and/or call the base class 
} 
 
 
///////////////////////////////////////////////////////////////////////////// 
// The one and only CSuperSnmpApp object 
 
CSuperSnmpApp theApp; 
 
__declspec(dllexport) void __stdcall JustSoSo() 
{ 
	MessageBox(NULL,"It's so easy!","Test",MB_OK); 
} 
 
bool ValidParamCheck(char *sagent,char *soid,char *scommunity,int timeout,int retries, 
						char *sobjcnt,char *sobjname,char *sobjdata,char *srtnmsg, 
						int nmaxobjcnt,int nmaxbuflen,int &nobjcnt,int &nrtn) 
{ 
	if (sagent == NULL) 
	{ 
		nrtn = -101; 
		return  false; 
	} 
	if (soid == NULL) 
	{ 
		nrtn = -102; 
		return  false; 
	} 
	if (scommunity == NULL) 
	{ 
		nrtn = -103; 
		return  false; 
	} 
	if (sobjcnt == NULL) 
	{ 
		nrtn = -106; 
		return  false; 
	} 
	if (sobjname == NULL) 
	{ 
		nrtn = -107; 
		return  false; 
	} 
	if (sobjdata == NULL) 
	{ 
		nrtn = -108; 
		return  false; 
	} 
	if (srtnmsg == NULL) 
	{ 
		nrtn = -109; 
		return  false; 
	} 
 
 
	if (strlen(sagent) == 0 || strlen(sagent) > 99) 
	{ 
		nrtn = -201; 
		return  false; 
	} 
	if (strlen(soid) == 0 || strlen(soid) > 99) 
	{ 
		nrtn = -202; 
		return  false; 
	} 
	if (strlen(scommunity) == 0 || strlen(scommunity) > 99) 
	{ 
		nrtn = -203; 
		return  false; 
	}	 
	if (timeout < 0) 
	{ 
		nrtn = -204; 
		return  false; 
	} 
	if (retries < 0) 
	{ 
		nrtn = -205; 
		return  false; 
	} 
	if (nmaxobjcnt <= 0) 
	{ 
		nrtn = -210; 
		return  false; 
	} 
	if (nmaxbuflen <= 0) 
	{ 
		nrtn = -211; 
		return  false; 
	} 
	nobjcnt = 0; 
	nrtn	= 0; 
	return true; 
} 
 
bool CheckAsnValueValid(RFC1157VarBindList &VarBind) 
{ 
	bool bRtn = false; 
	switch(VarBind.list[0].value.asnType) 
	{ 
	case  ASN_INTEGER32:		bRtn = true; 
		break; 
	case  ASN_UNSIGNED32:		bRtn = true; 
		break; 
	case  ASN_COUNTER64:		bRtn = true; 
		break; 
	case  ASN_OCTETSTRING:		if (VarBind.list[0].value.asnValue.string.length > 0) bRtn = true; 
		break; 
	case  ASN_BITS:				if (VarBind.list[0].value.asnValue.bits.length > 0) bRtn = true; 
		break; 
	case  ASN_OBJECTIDENTIFIER:	if (VarBind.list[0].value.asnValue.object.idLength > 0) bRtn = true; 
		break; 
	case  ASN_SEQUENCE:			if (VarBind.list[0].value.asnValue.sequence.length > 0) bRtn = true; 
		break; 
	case  ASN_IPADDRESS:		if (VarBind.list[0].value.asnValue.address.length > 0) bRtn = true; 
		break; 
	case  ASN_COUNTER32:		bRtn = true; 
		break; 
	case  ASN_GAUGE32:			bRtn = true; 
		break; 
	case  ASN_TIMETICKS:		bRtn = true; 
		break; 
	case  ASN_OPAQUE:			if (VarBind.list[0].value.asnValue.arbitrary.length > 0) bRtn = true; 
		break;               
	} 
	return bRtn; 
} 
 
void GetAsnValueValue(RFC1157VarBindList &VarBind,char *sTmpObjName,char *sTmpObjData, 
					  int &nTmpObjNameLen,int &nTmpObjDataLen) 
{ 
	char *namestring = NULL; 
	SnmpMgrOidToStr(&VarBind.list[0].name, &namestring);		 
	if (namestring) 
	{ 
		nTmpObjNameLen = strlen(namestring); 
		memcpy(sTmpObjName,namestring,nTmpObjNameLen); 
		SNMP_free(namestring); 
	} 
	 
	switch(VarBind.list[0].value.asnType) 
	{ 
	case  ASN_INTEGER32: 
		sprintf(sTmpObjData,"%d",VarBind.list[0].value.asnValue.number); 
		nTmpObjDataLen = strlen(sTmpObjData); 
		break; 
	case  ASN_UNSIGNED32:		 
		sprintf(sTmpObjData,"%u",VarBind.list[0].value.asnValue.unsigned32); 
		nTmpObjDataLen = strlen(sTmpObjData); 
		break; 
	case  ASN_COUNTER64:		 
		break; 
	case  ASN_COUNTER32: 
		sprintf(sTmpObjData,"%u",VarBind.list[0].value.asnValue.counter); 
		nTmpObjDataLen = strlen(sTmpObjData); 
		break; 
	case  ASN_GAUGE32:	 
		sprintf(sTmpObjData,"%u",VarBind.list[0].value.asnValue.gauge); 
		nTmpObjDataLen = strlen(sTmpObjData); 
		break; 
	case  ASN_TIMETICKS:	 
		sprintf(sTmpObjData,"%u",VarBind.list[0].value.asnValue.ticks); 
		nTmpObjDataLen = strlen(sTmpObjData); 
		break; 
		 
	case  ASN_OCTETSTRING: 
		nTmpObjDataLen = VarBind.list[0].value.asnValue.string.length; 
		memcpy(sTmpObjData,VarBind.list[0].value.asnValue.string.stream,nTmpObjDataLen); 
		break; 
	case  ASN_BITS:	 
		nTmpObjDataLen = VarBind.list[0].value.asnValue.bits.length; 
		memcpy(sTmpObjData,VarBind.list[0].value.asnValue.bits.stream,nTmpObjDataLen); 
		break; 
	case  ASN_SEQUENCE:	 
		nTmpObjDataLen = VarBind.list[0].value.asnValue.sequence.length; 
		memcpy(sTmpObjData,VarBind.list[0].value.asnValue.sequence.stream,nTmpObjDataLen); 
		break; 
	case  ASN_IPADDRESS: 
		nTmpObjDataLen = VarBind.list[0].value.asnValue.address.length; 
		memcpy(sTmpObjData,VarBind.list[0].value.asnValue.address.stream,nTmpObjDataLen); 
		break; 
	case  ASN_OPAQUE:	 
		nTmpObjDataLen = VarBind.list[0].value.asnValue.arbitrary.length; 
		memcpy(sTmpObjData,VarBind.list[0].value.asnValue.arbitrary.stream,nTmpObjDataLen); 
		break;  
		 
	case  ASN_OBJECTIDENTIFIER:	 
		char *ObjIDString = NULL; 
		SnmpMgrOidToStr(&VarBind.list[0].value.asnValue.object, &ObjIDString);		 
		if (ObjIDString) 
		{ 
			nTmpObjDataLen = strlen(ObjIDString); 
			memcpy(sTmpObjData,ObjIDString,nTmpObjDataLen); 
			SNMP_free(ObjIDString); 
		} 
		break; 
	} 
} 
 
__declspec(dllexport) void __stdcall GetParamSingle( 
								char *sagent,char *soid,char *scommunity,int timeout,int retries, 
								char *sobjcnt,char *sobjname,char *sobjdata,char *srtnmsg, 
								int  nmaxobjcnt,int nmaxbuflen,int &nobjcnt,int &nrtn) 
{ 
	nrtn = 1; 
	if (!ValidParamCheck(sagent,soid,scommunity,timeout,retries, 
							sobjcnt,sobjname,sobjdata,srtnmsg, 
							nmaxobjcnt,nmaxbuflen,nobjcnt,nrtn)) 
		return; 
	char sMsg[1000]; 
	char s_agent[100]; 
	char s_oid[100]; 
	char s_community[100]; 
    RFC1157VarBindList variableBindings; 
    LPSNMP_MGR_SESSION session; 
	 
    memset(s_agent,0,100); 
    strcat(s_agent,sagent); 
	 
    memset(s_oid,0,100); 
    strcat(s_oid,soid); 
	 
	memset(s_community,0,100); 
    strcat(s_community,scommunity); 
 
	char sTmpObjName[10000]; 
	char sTmpObjData[10000]; 
	char sTmpObjCnt[10]; 
	int  nTmpObjNameLen,nTmpObjDataLen,sTmpObjCntLen; 
	int  nCurObjCnt = 0; 
	int  nCurObjCntLen = 0; 
	int  nCurObjNameLen = 0; 
	int  nCurObjDataLen = 0; 
	int  nCurRtnMsgLen = 0; 
	int  nLen = 0; 
	 
    BYTE       requestType; 
    AsnInteger errorStatus; 
    AsnInteger errorIndex; 
	 
    variableBindings.list = NULL; 
    variableBindings.len = 0; 
	 
    AsnObjectIdentifier reqObject; 
    if (!SnmpMgrStrToOid(s_oid, &reqObject)) 
    { 
		sprintf(sMsg,"Error: Invalid oid, %s, specified", s_oid); 
		nLen = strlen(sMsg); 
		if (nLen + nCurRtnMsgLen < nmaxbuflen) 
		{ 
			strcat(srtnmsg,sMsg); 
			nCurRtnMsgLen += nLen; 
		}			 
		nrtn = -1; 
		return; 
    } 
    else 
    { 
		variableBindings.len++; 
		variableBindings.list = (RFC1157VarBind *)SNMP_realloc(variableBindings.list, sizeof(RFC1157VarBind) * variableBindings.len); 
		if ((variableBindings.list) == NULL) 
		{ 
			sprintf(sMsg,"Error: Error allocating oid, %s",s_oid); 
			nLen = strlen(sMsg); 
			if (nLen + nCurRtnMsgLen < nmaxbuflen) 
			{ 
				strcat(srtnmsg,sMsg); 
				nCurRtnMsgLen += nLen; 
			}			 
			nrtn = -1; 
			return; 
		} 
		 
		variableBindings.list[variableBindings.len - 1].name = reqObject; 
		variableBindings.list[variableBindings.len - 1].value.asnType = ASN_NULL; 
    } 
    session = SnmpMgrOpen(s_agent, s_community, timeout, retries); 
    if ((session) == NULL) 
    { 
		sprintf(sMsg,"Error on SnmpMgrOpen errorno %d", GetLastError()); 
		nLen = strlen(sMsg); 
		if (nLen + nCurRtnMsgLen < nmaxbuflen) 
		{ 
			strcat(srtnmsg,sMsg); 
			nCurRtnMsgLen += nLen; 
		}			 
		nrtn = -1; 
		return; 
    } 
 
    AsnObjectIdentifier root;	 
    SnmpUtilOidCpy(&root, &variableBindings.list[0].name); 
    requestType = ASN_RFC1157_GETREQUEST;	 
 
	if (!SnmpMgrRequest(session, requestType, &variableBindings,&errorStatus, &errorIndex)) 
	{ 
		sprintf(sMsg,"Error on SnmpMgrRequest %d", GetLastError()); 
		nLen = strlen(sMsg); 
		if (nLen + nCurRtnMsgLen < nmaxbuflen) 
		{ 
			strcat(srtnmsg,sMsg); 
			nCurRtnMsgLen += nLen; 
		}			 
		nrtn = -1; 
	} 
	else 
	{ 
		if (errorStatus == SNMP_ERRORSTATUS_NOSUCHNAME || 
			SnmpUtilOidNCmp(&variableBindings.list[0].name, &root, root.idLength)) 
		{ 
			sprintf(sMsg,"End of MIB subtree"); 
			nLen = strlen(sMsg); 
			if (nLen + nCurRtnMsgLen < nmaxbuflen) 
			{ 
				strcat(srtnmsg,sMsg); 
				nCurRtnMsgLen += nLen; 
			}			 
			nrtn = -1; 
		} 
		else 
		{ 
			if (errorStatus > 0) 
			{ 
				sprintf(sMsg,"Error: errorStatus=%d, errorIndex=%d",errorStatus, errorIndex); 
				nLen = strlen(sMsg); 
				if (nLen + nCurRtnMsgLen < nmaxbuflen) 
				{ 
					strcat(srtnmsg,sMsg); 
					nCurRtnMsgLen += nLen; 
				}			 
				nrtn = -1; 
			} 
			else if (CheckAsnValueValid(variableBindings)) 
			{ 
				memset(sTmpObjName,0,10000); 
				memset(sTmpObjData,0,10000); 
				nTmpObjNameLen = 0; 
				nTmpObjDataLen = 0; 
				GetAsnValueValue(variableBindings,sTmpObjName,sTmpObjData,nTmpObjNameLen,nTmpObjDataLen); 
				 
				memset(sTmpObjCnt,0,10); 
				sprintf(sTmpObjCnt,"%d",nTmpObjDataLen); 
				sTmpObjCntLen = strlen(sTmpObjCnt);	 
				 
				if (nCurObjCnt >= nmaxobjcnt  
					|| nCurObjDataLen + nTmpObjDataLen >= nmaxbuflen 
					|| nCurObjNameLen + nTmpObjNameLen >= nmaxbuflen 
					|| nCurObjCntLen + sTmpObjCntLen >= nmaxbuflen) 
				{ 
				} 
				else 
				{ 
					memcpy(sobjcnt + nCurObjCntLen,sTmpObjCnt,strlen(sTmpObjCnt)); 
					memcpy(sobjname + nCurObjNameLen,sTmpObjName,nTmpObjNameLen); 
					memcpy(sobjdata + nCurObjDataLen,sTmpObjData,nTmpObjDataLen); 
					nCurObjCnt ++; 
					nCurObjCntLen += strlen(sTmpObjCnt); 
					nCurObjNameLen += nTmpObjNameLen; 
					nCurObjDataLen += nTmpObjDataLen; 
					nobjcnt = nCurObjCnt;  
					nrtn = 0; 
				} 
			} 
		} 
	} 
	 
    SnmpUtilVarBindListFree(&variableBindings);     
    SnmpUtilOidFree(&root); 
    SnmpMgrClose(session);		 
} 
 
__declspec(dllexport) void __stdcall GetParamMulti( 
								char *sagent,char *soid,char *scommunity,int timeout,int retries, 
								char *sobjcnt,char *sobjname,char *sobjdata,char *srtnmsg, 
								int  nmaxobjcnt,int nmaxbuflen,int &nobjcnt,int &nrtn) 
{ 
	nrtn = 1; 
	if (!ValidParamCheck(sagent,soid,scommunity,timeout,retries, 
							sobjcnt,sobjname,sobjdata,srtnmsg, 
							nmaxobjcnt,nmaxbuflen,nobjcnt,nrtn)) 
		return; 
	char sMsg[1000]; 
	char s_agent[100]; 
	char s_oid[100]; 
	char s_community[100]; 
    RFC1157VarBindList variableBindings; 
    LPSNMP_MGR_SESSION session; 
	 
    memset(s_agent,0,100); 
    strcat(s_agent,sagent); 
	 
    memset(s_oid,0,100); 
    strcat(s_oid,soid); 
	 
	memset(s_community,0,100); 
    strcat(s_community,scommunity); 
 
	char sTmpObjName[10000]; 
	char sTmpObjData[10000]; 
	char sTmpObjCnt[10]; 
	int  nTmpObjNameLen,nTmpObjDataLen,sTmpObjCntLen; 
	int  nCurObjCnt = 0; 
	int  nCurObjCntLen = 0; 
	int  nCurObjNameLen = 0; 
	int  nCurObjDataLen = 0; 
	int  nCurRtnMsgLen = 0; 
	int  nLen = 0; 
	 
    BYTE       requestType; 
    AsnInteger errorStatus; 
    AsnInteger errorIndex; 
	 
    variableBindings.list = NULL; 
    variableBindings.len = 0; 
	 
    AsnObjectIdentifier reqObject; 
    if (!SnmpMgrStrToOid(s_oid, &reqObject)) 
    { 
		sprintf(sMsg,"Error: Invalid oid, %s, specified", s_oid); 
		nLen = strlen(sMsg); 
		if (nLen + nCurRtnMsgLen < nmaxbuflen) 
		{ 
			strcat(srtnmsg,sMsg); 
			nCurRtnMsgLen += nLen; 
		}			 
		nrtn = -1; 
		return; 
    } 
    else 
    { 
		variableBindings.len++; 
		variableBindings.list = (RFC1157VarBind *)SNMP_realloc(variableBindings.list, sizeof(RFC1157VarBind) * variableBindings.len); 
		if ((variableBindings.list) == NULL) 
		{ 
			sprintf(sMsg,"Error: Error allocating oid, %s",s_oid); 
			nLen = strlen(sMsg); 
			if (nLen + nCurRtnMsgLen < nmaxbuflen) 
			{ 
				strcat(srtnmsg,sMsg); 
				nCurRtnMsgLen += nLen; 
			}			 
			nrtn = -1; 
			return; 
		} 
		 
		variableBindings.list[variableBindings.len - 1].name = reqObject; 
		variableBindings.list[variableBindings.len - 1].value.asnType = ASN_NULL; 
    } 
    session = SnmpMgrOpen(s_agent, s_community, timeout, retries); 
    if ((session) == NULL) 
    { 
		sprintf(sMsg,"Error on SnmpMgrOpen errorno %d", GetLastError()); 
		nLen = strlen(sMsg); 
		if (nLen + nCurRtnMsgLen < nmaxbuflen) 
		{ 
			strcat(srtnmsg,sMsg); 
			nCurRtnMsgLen += nLen; 
		}			 
		nrtn = -1; 
		return; 
    } 
 
	AsnObjectIdentifier root; 
	AsnObjectIdentifier tempOid; 
 
    SnmpUtilOidCpy(&root, &variableBindings.list[0].name); 
	requestType = ASN_RFC1157_GETNEXTREQUEST;	 
 
	bool bContinue = true; 
	while(1) 
	{ 
		if (!SnmpMgrRequest(session, requestType, &variableBindings,&errorStatus, &errorIndex)) 
		{ 
			if (nCurObjCnt > 0) 
				sprintf(sMsg,"||Error on SnmpMgrRequest %d", GetLastError()); 
			else 
				sprintf(sMsg,"Error on SnmpMgrRequest %d", GetLastError()); 
			nLen = strlen(sMsg); 
			if (nLen + nCurRtnMsgLen < nmaxbuflen) 
			{ 
				strcat(srtnmsg,sMsg); 
				nCurRtnMsgLen += nLen; 
			}			 
			nrtn = -1; 
			if (nCurObjCnt > 0)  
				nrtn = 0; 
			break; 
		} 
		else 
		{ 
			if (errorStatus == SNMP_ERRORSTATUS_NOSUCHNAME || 
				SnmpUtilOidNCmp(&variableBindings.list[0].name, &root, root.idLength)) 
			{				 
				if (nCurObjCnt > 0) 
					sprintf(sMsg,"||End of MIB subtree"); 
				else 
					sprintf(sMsg,"End of MIB subtree"); 
				nLen = strlen(sMsg); 
				if (nLen + nCurRtnMsgLen < nmaxbuflen) 
				{ 
					strcat(srtnmsg,sMsg); 
					nCurRtnMsgLen += nLen; 
				}			 
				nrtn = -1; 
				if (nCurObjCnt > 0)  
					nrtn = 0; 
				break; 
			} 
			else 
			{ 
				if (errorStatus > 0) 
				{					 
					if (nCurObjCnt > 0) 
						sprintf(sMsg,"Error: errorStatus=%d, errorIndex=%d",errorStatus, errorIndex); 
					else 
						sprintf(sMsg,"||Error: errorStatus=%d, errorIndex=%d",errorStatus, errorIndex); 
					nLen = strlen(sMsg); 
					if (nLen + nCurRtnMsgLen < nmaxbuflen) 
					{ 
						strcat(srtnmsg,sMsg); 
						nCurRtnMsgLen += nLen; 
					}			 
					nrtn = -1; 
					if (nCurObjCnt > 0)  
						nrtn = 0; 
					break; 
				} 
				else if (CheckAsnValueValid(variableBindings)) 
				{ 
					memset(sTmpObjName,0,10000); 
					memset(sTmpObjData,0,10000); 
					nTmpObjNameLen = 0; 
					nTmpObjDataLen = 0; 
					GetAsnValueValue(variableBindings,sTmpObjName,sTmpObjData,nTmpObjNameLen,nTmpObjDataLen); 
					 
					memset(sTmpObjCnt,0,10); 
					sprintf(sTmpObjCnt,"%d",nTmpObjDataLen); 
					sTmpObjCntLen = strlen(sTmpObjCnt);	 
					 
					if (nCurObjCnt >= nmaxobjcnt  
						|| nCurObjDataLen + nTmpObjDataLen + 2 >= nmaxbuflen 
						|| nCurObjNameLen + nTmpObjNameLen + 2 >= nmaxbuflen 
						|| nCurObjCntLen + sTmpObjCntLen + 2 >= nmaxbuflen) 
					{ 
						bContinue = false; 
					} 
					else 
					{ 
						memcpy(sobjcnt + nCurObjCntLen,sTmpObjCnt,strlen(sTmpObjCnt)); 
						memcpy(sobjname + nCurObjNameLen,sTmpObjName,nTmpObjNameLen); 
						memcpy(sobjdata + nCurObjDataLen,sTmpObjData,nTmpObjDataLen); 
						nCurObjCnt ++; 
						nCurObjCntLen += strlen(sTmpObjCnt); 
						nCurObjNameLen += nTmpObjNameLen; 
						nCurObjDataLen += nTmpObjDataLen; 
						sobjcnt[nCurObjCntLen] = '|'; 
						sobjcnt[nCurObjCntLen + 1] = '|'; 
						sobjname[nCurObjNameLen] = '|'; 
						sobjname[nCurObjNameLen + 1] = '|'; 
						sobjdata[nCurObjDataLen] = '|'; 
						sobjdata[nCurObjDataLen + 1] = '|'; 
						nCurObjCntLen += 2; 
						nCurObjNameLen += 2; 
						nCurObjDataLen += 2; 
 
						nobjcnt = nCurObjCnt;  
						nrtn = 0; 
					} 
				} 
			} 
		} 
		// Prepare for the next iteration.  Make sure returned oid is 
		// preserved and the returned value is freed. 
		SnmpUtilOidCpy(&tempOid, &variableBindings.list[0].name); 
		SnmpUtilVarBindFree(&variableBindings.list[0]); 
		SnmpUtilOidCpy(&variableBindings.list[0].name, &tempOid); 
		variableBindings.list[0].value.asnType = ASN_NULL; 
		SnmpUtilOidFree(&tempOid); 
		if (!bContinue) 
			break; 
	} 
	 
    SnmpUtilVarBindListFree(&variableBindings);     
    SnmpUtilOidFree(&root); 
    SnmpMgrClose(session);		 
} 
 
__declspec(dllexport) void __stdcall CompAsnObjId(char *sObjIdA,char *sObjIdB,int &nrtn) 
{ 
	nrtn = 1; 
	AsnObjectIdentifier reqObjectA; 
	AsnObjectIdentifier reqObjectB; 
	if (!SnmpMgrStrToOid(sObjIdA, &reqObjectA)) 
    { 
		nrtn = -1; 
		return; 
    } 
	if (!SnmpMgrStrToOid(sObjIdB, &reqObjectB)) 
    { 
		nrtn = -2; 
		return; 
    } 
	char *namestringA = NULL; 
	SnmpMgrOidToStr(&reqObjectA, &namestringA);	 
	 
	char *namestringB = NULL; 
	SnmpMgrOidToStr(&reqObjectB, &namestringB); 
 
	if (namestringA && namestringB) 
	{ 
		if (strcmp(namestringA,namestringB) == 0) 
			nrtn = 0; 
	} 
	if (namestringA) 
		SNMP_free(namestringA); 
	if (namestringB) 
		SNMP_free(namestringB); 
}