SNMP开发问题

flinming 2006-03-16 09:58:05
在SNMP开发种,发现不断读取值,系统内存会不断增加,不知道做过相关开发的朋友是否有遇到类似的问题。。。。。。
...全文
527 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wanix 2006-03-23
  • 打赏
  • 举报
回复
长知识!公司正要让写一个SNMP相关的东西,可以参考一下啊!现在这方面成系统的东西太少了,简直无从下手!
flinming 2006-03-17
  • 打赏
  • 举报
回复
以上是解决的代码,提供大家参考。。。。。。。
flinming 2006-03-17
  • 打赏
  • 举报
回复
//////////////////////////////////////////////////////////////////////////
// 创建协议数据单元 //
//////////////////////////////////////////////////////////////////////////
void CSnmpManageDlg::CreatePdu(smiINT PDU_type,smiINT32 request_id,
smiINT error_status,smiINT error_index)
{
//创建协议数据单元
m_Hpdu = SnmpCreatePdu(m_Session,PDU_type,request_id,error_status,error_index,m_Hvbl);
if(m_Hpdu == SNMPAPI_FAILURE)
AfxMessageBox("CreatePdu failure");
else if (error_status > 0)
AfxMessageBox("Error: error_status=%d, error_index=%d\n",
error_status, error_index);
}

//////////////////////////////////////////////////////////////////////////
// SNMP发送函数
//////////////////////////////////////////////////////////////////////////
void CSnmpManageDlg::SnmpSend(LPCSTR address,const char * community)
{
//创建实体句柄
if(hAgent == NULL)
if((hAgent = SnmpStrToEntity(m_Session,address)) == SNMPAPI_FAILURE)
AfxMessageBox("SendMsg failure--entity");

if(hView == NULL)
{
contextName.ptr = (unsigned char *)community;
contextName.len = lstrlen(community);

//创建上下文句柄
if((hView = SnmpStrToContext(m_Session,&contextName)) == SNMPAPI_FAILURE)
AfxMessageBox("SendMsg failure--context");
}

if(SnmpSendMsg(m_Session,NULL,hAgent,hView,m_Hpdu) == SNMPAPI_FAILURE)
AfxMessageBox("SendMsg failure");
}

//////////////////////////////////////////////////////////////////////////
// 开始读取 //
//////////////////////////////////////////////////////////////////////////
void CSnmpManageDlg::SnmpStartRead(CString m_EquipIp)
{
if(m_SessionID == FALSE)
{
CreateSession(m_hWnd,SNMP_MSG);
m_SessionID = TRUE;

CreateVbl(m_initOid[0],NULL,0);

for(int i = 1;i <= 6;i++)
SetVbl(m_initOid[i],i);

CreatePdu(SNMP_PDU_GET,0,NULL,NULL);
}

SnmpSend(m_EquipIp,"public");
}

//////////////////////////////////////////////////////////////////////////
// SNMP接收消息 //
//////////////////////////////////////////////////////////////////////////
void CSnmpManageDlg::SnmpReceive()
{
smiINT PDU_type;
smiINT32 request_id;
smiINT error_status;
smiINT error_index;
smiOID pOid;

//if(SnmpRecvMsg(m_Session,&srcEntity,&dstEntity,&context,&pPdu) != SNMPAPI_SUCCESS)
if(SnmpRecvMsg(m_Session,NULL,NULL,NULL,&pPdu) != SNMPAPI_SUCCESS)
AfxMessageBox("receive failure--recv");

//提取协议数据单元
if(SnmpGetPduData(pPdu,&PDU_type,&request_id,&error_status,&error_index,&varbindlist)!=SNMPAPI_SUCCESS)
AfxMessageBox("receive failure--getpdu");

if((nCount = SnmpCountVbl(varbindlist))==SNMPAPI_FAILURE)
AfxMessageBox("Count Vbl Error");

for(int i = 0;i < nCount;i++)
{
//ID从1开始
if(SnmpGetVb(varbindlist,i + 1,&pOid,&m_Value[i]) != SNMPAPI_SUCCESS)
AfxMessageBox("receive failure--getvb");

if(SnmpOidToStr(&pOid,100,m_sOid[i]) == SNMPAPI_FAILURE)//获取变量名
AfxMessageBox("Get Vb Error");

//一定要加释放
SnmpFreeDescriptor(SNMP_SYNTAX_OID,(smiOCTETS *)&pOid);
}

//一定要加释放
SnmpFreeVbl(varbindlist);
SnmpFreePdu(pPdu);
}

//////////////////////////////////////////////////////////////////////////
// 接收消息函数 //
//////////////////////////////////////////////////////////////////////////
LRESULT CSnmpManageDlg::OnRecv(WPARAM wparam,LPARAM lparam)
{
int nIpin;
CString strIp,strTemp,lpstr;

if(wparam)
return 0;

SnmpReceive();

for(int i = 0;i < nCount;i++)
{
switch(m_Value[i].syntax)
{
case SNMP_SYNTAX_INT:
{
smiINT sNumber;
sNumber = m_Value[i].value.sNumber;
nIpin = sNumber;

memset(&m_ReadValue[i],NULL,500);
wsprintf(m_ReadValue[i],"%d",sNumber);
}
break;
case SNMP_SYNTAX_UINT32:
case SNMP_SYNTAX_CNTR32:
case SNMP_SYNTAX_GAUGE32:
case SNMP_SYNTAX_TIMETICKS:
{
smiUINT32 uNumber;
uNumber = m_Value[i].value.uNumber;
nIpin = uNumber;
memset(&m_ReadValue[i],NULL,500);
wsprintf(m_ReadValue[i],"%d",uNumber);
}
break;
case SNMP_SYNTAX_CNTR64:
{
smiCNTR64 hNumber;
hNumber = m_Value[i].value.hNumber;
}
break;
case SNMP_SYNTAX_OCTETS:
case SNMP_SYNTAX_OPAQUE:
case SNMP_SYNTAX_NSAPADDR:
{
memset(&m_ReadValue[i],NULL,500);
memcpy(m_ReadValue[i],(char *)m_Value[i].value.string.ptr,m_Value[i].value.string.len);
}
break;
case SNMP_SYNTAX_IPADDR:
{
strIp.Format("%d",*m_Value[i].value.string.ptr);
strIp+=".";
strTemp.Format("%d",*(m_Value[i].value.string.ptr + 1));
strIp+=strTemp;
strIp+=".";
strTemp.Format("%d",*(m_Value[i].value.string.ptr + 2));
strIp+=strTemp;
strIp+=".";
strTemp.Format("%d",*(m_Value[i].value.string.ptr + 3));
strIp+=strTemp;

memset(&m_ReadValue[i],NULL,500);
strcpy(m_ReadValue[i],strIp);
}
break;
case SNMP_SYNTAX_OID:
{
smiOID oid;
oid = m_Value[i].value.oid;

memset(&m_ReadValue[i],NULL,500);
SnmpOidToStr(&oid,30,m_ReadValue[i]);
}
break;
case SNMP_SYNTAX_NULL:
case SNMP_SYNTAX_NOSUCHOBJECT:
case SNMP_SYNTAX_NOSUCHINSTANCE:
case SNMP_SYNTAX_ENDOFMIBVIEW:
{
smiBYTE empty;
empty = m_Value[i].value.empty;
lpstr = "No Value Returned";

memset(&m_ReadValue[i],NULL,500);
strcpy(m_ReadValue[i],lpstr);
}
break;
default:
break;
}

//一定要加释放
SnmpFreeDescriptor(m_Value[i].syntax, (smiOCTETS *)&m_Value[i].value.oid);

if(strcmp(m_sOid[i],m_initOid[0]) == 0)
m_sDesr.SetWindowText(CString(m_ReadValue[i]));
else if (strcmp(m_sOid[i],m_initOid[1]) == 0)
m_sSysOid.SetWindowText(CString(m_ReadValue[i]));
else if (strcmp(m_sOid[i],m_initOid[2]) == 0)
m_sSysTime.SetWindowText(CString(m_ReadValue[i]));
else if (strcmp(m_sOid[i],m_initOid[3]) == 0)
m_sysContact.SetWindowText(m_ReadValue[i]);
else if (strcmp(m_sOid[i],m_initOid[4]) == 0)
m_sName.SetWindowText(m_ReadValue[i]);
else if (strcmp(m_sOid[i],m_initOid[5]) == 0)
m_sysLocation.SetWindowText(m_ReadValue[i]);
else if (strcmp(m_sOid[i],m_initOid[6]) == 0)
{
//SetWindowText(m_ReadValue[i]);
}
}

return 0;
}
flinming 2006-03-17
  • 打赏
  • 举报
回复
char m_Path[MAX_PATH];
char m_initOid[100][100];
char m_sOid[100][100];

smiVALUE m_Value[100];
char m_ReadValue[100][500];
smiOID m_Oid[10];

//////////////////////////////////////////////////////////////////////////
BOOL m_SessionID;
int nCount;
HSNMP_SESSION m_Session;
HSNMP_VBL m_Hvbl;
HSNMP_PDU m_Hpdu;
smiUINT32 m_nMajorVersion,m_nMinorVersion,m_nLevel,m_nTranslateMode;
smiUINT32 m_nRetransmitMode;
HSNMP_ENTITY hAgent;
HSNMP_CONTEXT hView;
smiOCTETS contextName;
HSNMP_PDU pPdu;
HSNMP_VBL varbindlist;

//////////////////////////////////////////////////////////////////////////
// 读取配置 //
//////////////////////////////////////////////////////////////////////////
void CSnmpManageDlg::Read_Configure()
{
CString lpstr;

lpstr = "1.3.6.1.2.1.1.1.0";
strcpy(m_initOid[0],lpstr);

lpstr = "1.3.6.1.2.1.1.2.0";
strcpy(m_initOid[1],lpstr);

lpstr = "1.3.6.1.2.1.1.3.0";
strcpy(m_initOid[2],lpstr);

lpstr = "1.3.6.1.2.1.1.4.0";
strcpy(m_initOid[3],lpstr);

lpstr = "1.3.6.1.2.1.1.5.0";
strcpy(m_initOid[4],lpstr);

lpstr = "1.3.6.1.2.1.1.6.0";
strcpy(m_initOid[5],lpstr);

lpstr = "1.3.6.1.2.1.2.1.0";
strcpy(m_initOid[6],lpstr);
//////////////////////////////////////////////////////////////////////////
}

//////////////////////////////////////////////////////////////////////////
// SNMP初始化 //
//////////////////////////////////////////////////////////////////////////
void CSnmpManageDlg::Snmp_Init()
{
if(SnmpStartup(&m_nMajorVersion,&m_nMinorVersion,&m_nLevel,&m_nTranslateMode,
&m_nRetransmitMode) != SNMPAPI_SUCCESS)
{
AfxMessageBox("initilization failure");
}

//设置传输模式
if(SnmpSetTranslateMode(SNMPAPI_UNTRANSLATED_V2)!=SNMPAPI_SUCCESS)
AfxMessageBox("SetTranslateMode failure");

//设置重传模式
if(SnmpSetRetransmitMode(SNMPAPI_ON)!=SNMPAPI_SUCCESS)
AfxMessageBox("SetRetransmitMode failure");

m_SessionID = FALSE;
hAgent = NULL;
hView = NULL;
}

//////////////////////////////////////////////////////////////////////////
// SNMP结束初始化 //
//////////////////////////////////////////////////////////////////////////
void CSnmpManageDlg::Snmp_Uninit()
{
if(hAgent!=NULL)
SnmpFreeEntity(hAgent);

if(hView!=NULL)
SnmpFreeContext(hView);

if(m_Session != NULL)
SnmpClose(m_Session);

SnmpCleanup();
}

//////////////////////////////////////////////////////////////////////////
// 创建会话 //
//////////////////////////////////////////////////////////////////////////
void CSnmpManageDlg::CreateSession (HWND hWnd,UINT wMsg)
{
if((m_Session = SnmpCreateSession(hWnd,wMsg,NULL,NULL)) == SNMPAPI_FAILURE)
AfxMessageBox("CreateSession failure");
}

//////////////////////////////////////////////////////////////////////////
// 创建变量捆绑列表 //
//////////////////////////////////////////////////////////////////////////
void CSnmpManageDlg::CreateVbl(LPCSTR name,smiLPVALUE pvalue,int m_Num)
{
smiOID m_Oid;
if(SnmpStrToOid(name,&m_Oid)==SNMPAPI_FAILURE)
AfxMessageBox("CreateVbl failure");

//创建变量捆绑列表
m_Hvbl = SnmpCreateVbl(m_Session,&m_Oid,pvalue);
if(m_Hvbl== SNMPAPI_FAILURE)
AfxMessageBox("CreateVbl failure");

if(SnmpFreeDescriptor(SNMP_SYNTAX_OID,(smiLPOPAQUE)&m_Oid) != SNMPAPI_SUCCESS)
AfxMessageBox("freedescriptor failure");
}

//////////////////////////////////////////////////////////////////////////
// 添加到变量绑定列表 //
//////////////////////////////////////////////////////////////////////////
void CSnmpManageDlg::SetVbl(LPCSTR name,int m_Num)
{
smiOID m_Oid;
if(SnmpStrToOid(name,&m_Oid) == SNMPAPI_FAILURE)
AfxMessageBox("SetVbl failure--oid");

//添加到变量绑定列表
if(SnmpSetVb(m_Hvbl,0,&m_Oid,NULL) == SNMPAPI_FAILURE)
AfxMessageBox("SetVbl failure");

if(SnmpFreeDescriptor(SNMP_SYNTAX_OID,(smiLPOPAQUE)&m_Oid) != SNMPAPI_SUCCESS)
AfxMessageBox("freedescriptor failure");
}
flinming 2006-03-17
  • 打赏
  • 举报
回复
问题解决。。。。。。。。。
Jimmy_Xia 2006-03-16
  • 打赏
  • 举报
回复
好啊,学习学习!
fisker0303 2006-03-16
  • 打赏
  • 举报
回复
好长啊,先关注下...
najzni 2006-03-16
  • 打赏
  • 举报
回复
你可以参考一下msdn中的snmputil那个例子。应该是你程序中的某些winsnmp变量没释放完。
najzni 2006-03-16
  • 打赏
  • 举报
回复
你的资源没有释放。使用的资源要成对释放。
比如这里if(SnmpRecvMsg(m_Session,&srcEntity,&dstEntity,&context,&pPdu) != ,
那么你要有对应的SNMPAPI_STATUS SnmpFreePdu(
HSNMP_PDU PDU // handle to the PDU to free
);来释放pPdu。
你注意看看winsnmp中的变量,凡是像pPdu这种,通过某种操作获取了数据后,winsnmp都为pPdu分配了内存,而这个内存winsnmp不会主动给你释放,你必须显示调用相应的函数来释放winsnmp分配的内存。
flinming 2006-03-16
  • 打赏
  • 举报
回复
//////////////////////////////////////////////////////////////////////////
// SNMP接收消息 //
//////////////////////////////////////////////////////////////////////////
void CSnmpManageDlg::SnmpReceive()
{
HSNMP_ENTITY srcEntity;
HSNMP_ENTITY dstEntity;
HSNMP_CONTEXT context;
HSNMP_PDU pPdu;
smiINT PDU_type;
smiINT32 request_id;
smiINT error_status;
smiINT error_index;
HSNMP_VBL varbindlist;
smiOID pOid;

if(SnmpRecvMsg(m_Session,&srcEntity,&dstEntity,&context,&pPdu) != SNMPAPI_SUCCESS)
AfxMessageBox("receive failure--recv");

//提取协议数据单元
if(SnmpGetPduData(pPdu,&PDU_type,&request_id,&error_status,&error_index,&varbindlist)!=SNMPAPI_SUCCESS)
AfxMessageBox("receive failure--getpdu");

if((nCount = SnmpCountVbl(varbindlist))==SNMPAPI_FAILURE)
AfxMessageBox("Count Vbl Error");

for(int i = 0;i < nCount;i++)
{
if(SnmpGetVb(varbindlist,i + 1,&pOid,m_Value[i]) != SNMPAPI_SUCCESS)
AfxMessageBox("receive failure--getvb");

if(SnmpOidToStr(&pOid,100,m_sOid[i])==SNMPAPI_FAILURE)//获取变量名
AfxMessageBox("Get Vb Error");
}

SnmpFreeEntity(srcEntity);
SnmpFreeEntity(dstEntity);
SnmpFreeContext(context);
SnmpFreePdu(pPdu);
SnmpFreeVbl(varbindlist);
}

//////////////////////////////////////////////////////////////////////////
// 开始读取 //
//////////////////////////////////////////////////////////////////////////
void CSnmpManageDlg::SnmpStartRead(CString m_EquipIp)
{
if(m_SessionID == FALSE)
{
CreateSession(m_hWnd,SNMP_MSG);
m_SessionID = TRUE;
}

if(m_HandSendFlag == 0)//读系统
{
CreateVbl(m_initOid[0],NULL);
for(int i = 1;i <= 6;i++)
SetVbl(m_initOid[i]);
}

CreatePdu(SNMP_PDU_GET,1000,NULL,NULL);


SnmpSend(m_EquipIp,"public");
}

//////////////////////////////////////////////////////////////////////////
// 接收消息函数 //
//////////////////////////////////////////////////////////////////////////
LRESULT CSnmpManageDlg::OnRecv(WPARAM wparam,LPARAM lparam)
{
CString lpstr,lpstr1;
lpstr.Format("w:%d,p:%d",wparam,lparam);
SetWindowText(lpstr);

int nIpin;
CString strIp;
CString strTemp;

SnmpReceive();

for(int i = 0;i < nCount;i++)
{
switch(m_Value[i]->syntax)
{
case SNMP_SYNTAX_INT:
{
smiINT sNumber;
sNumber = m_Value[i]->value.sNumber;
nIpin = sNumber;

memset(&m_ReadValue[i],NULL,500);
wsprintf(m_ReadValue[i],"%d",sNumber);
}
break;
case SNMP_SYNTAX_UINT32:
case SNMP_SYNTAX_CNTR32:
case SNMP_SYNTAX_GAUGE32:
case SNMP_SYNTAX_TIMETICKS:
{
smiUINT32 uNumber;
uNumber = m_Value[i]->value.uNumber;
nIpin = uNumber;
memset(&m_ReadValue[i],NULL,500);
wsprintf(m_ReadValue[i],"%d",uNumber);
}
break;
case SNMP_SYNTAX_CNTR64:
{
smiCNTR64 hNumber;
hNumber = m_Value[i]->value.hNumber;
}
break;
case SNMP_SYNTAX_OCTETS:
case SNMP_SYNTAX_OPAQUE:
case SNMP_SYNTAX_NSAPADDR:
{
memset(&m_ReadValue[i],NULL,500);
memcpy(m_ReadValue[i],(char *)m_Value[i]->value.string.ptr,m_Value[i]->value.string.len);
}
break;
case SNMP_SYNTAX_IPADDR:
{
strIp.Format("%d",*m_Value[i]->value.string.ptr);
strIp+=".";
strTemp.Format("%d",*(m_Value[i]->value.string.ptr + 1));
strIp+=strTemp;
strIp+=".";
strTemp.Format("%d",*(m_Value[i]->value.string.ptr + 2));
strIp+=strTemp;
strIp+=".";
strTemp.Format("%d",*(m_Value[i]->value.string.ptr + 3));
strIp+=strTemp;

memset(&m_ReadValue[i],NULL,500);
strcpy(m_ReadValue[i],strIp);
}
break;
case SNMP_SYNTAX_OID:
{
smiOID oid;
oid = m_Value[i]->value.oid;

memset(&m_ReadValue[i],NULL,500);
SnmpOidToStr(&oid,30,m_ReadValue[i]);
}
break;
case SNMP_SYNTAX_NULL:
case SNMP_SYNTAX_NOSUCHOBJECT:
case SNMP_SYNTAX_NOSUCHINSTANCE:
case SNMP_SYNTAX_ENDOFMIBVIEW:
{
smiBYTE empty;
empty = m_Value[i]->value.empty;
lpstr = "No Value Returned";

memset(&m_ReadValue[i],NULL,500);
strcpy(m_ReadValue[i],lpstr);
}
break;
default:
break;
}


if(strcmp(m_sOid[i],m_initOid[0]) == 0)
m_sDesr.SetWindowText(CString(m_ReadValue[i]));
else if (strcmp(m_sOid[i],m_initOid[1]) == 0)
m_sSysOid.SetWindowText(CString(m_ReadValue[i]));
else if (strcmp(m_sOid[i],m_initOid[2]) == 0)
m_sSysTime.SetWindowText(CString(m_ReadValue[i]));
else if (strcmp(m_sOid[i],m_initOid[3]) == 0)
m_sysContact.SetWindowText(m_ReadValue[i]);
else if (strcmp(m_sOid[i],m_initOid[4]) == 0)
m_sName.SetWindowText(m_ReadValue[i]);
else if (strcmp(m_sOid[i],m_initOid[5]) == 0)
m_sysLocation.SetWindowText(m_ReadValue[i]);
else if (strcmp(m_sOid[i],m_initOid[6]) == 0)
{
//SetWindowText(m_ReadValue[i]);
}
}
}

return 0;
}
flinming 2006-03-16
  • 打赏
  • 举报
回复
//////////////////////////////////////////////////////////////////////////
// SNMP初始化 //
//////////////////////////////////////////////////////////////////////////
void CSnmpManageDlg::Snmp_Init()
{
if(SnmpStartup(&m_nMajorVersion,&m_nMinorVersion,&m_nLevel,&m_nTranslateMode,
&m_nRetransmitMode) != SNMPAPI_SUCCESS)
{
AfxMessageBox("initilization failure");
}

//设置传输模式
if(SnmpSetTranslateMode(SNMPAPI_UNTRANSLATED_V2)!=SNMPAPI_SUCCESS)
AfxMessageBox("SetTranslateMode failure");

//设置重传模式
if(SnmpSetRetransmitMode(SNMPAPI_ON)!=SNMPAPI_SUCCESS)
AfxMessageBox("SetRetransmitMode failure");

m_SessionID = FALSE;

CString lpstr;
lpstr = "1.3.6.1.2.1.1.1.0";
strcpy(m_initOid[0],lpstr);

lpstr = "1.3.6.1.2.1.1.2.0";
strcpy(m_initOid[1],lpstr);

lpstr = "1.3.6.1.2.1.1.3.0";
strcpy(m_initOid[2],lpstr);

lpstr = "1.3.6.1.2.1.1.4.0";
strcpy(m_initOid[3],lpstr);

lpstr = "1.3.6.1.2.1.1.5.0";
strcpy(m_initOid[4],lpstr);

lpstr = "1.3.6.1.2.1.1.6.0";
strcpy(m_initOid[5],lpstr);

lpstr = "1.3.6.1.2.1.2.1.0";
strcpy(m_initOid[6],lpstr);
}

//////////////////////////////////////////////////////////////////////////
// SNMP结束初始化 //
//////////////////////////////////////////////////////////////////////////
void CSnmpManageDlg::Snmp_Uninit()
{
if(m_Session != NULL)
SnmpClose(m_Session);

SnmpCleanup();
}

//////////////////////////////////////////////////////////////////////////
// 创建会话 //
//////////////////////////////////////////////////////////////////////////
void CSnmpManageDlg::CreateSession (HWND hWnd,UINT wMsg)
{
if((m_Session = SnmpCreateSession(hWnd,wMsg,NULL,NULL)) == SNMPAPI_FAILURE)
AfxMessageBox("CreateSession failure");
}

//////////////////////////////////////////////////////////////////////////
// 创建变量捆绑列表 //
//////////////////////////////////////////////////////////////////////////
void CSnmpManageDlg::CreateVbl(LPCSTR name,smiLPVALUE pvalue)
{
smiOID m_Oid;
if(SnmpStrToOid(name,&m_Oid)==SNMPAPI_FAILURE)
AfxMessageBox("CreateVbl failure");

//创建变量捆绑列表
m_Hvbl = SnmpCreateVbl(m_Session,&m_Oid,pvalue);
if(m_Hvbl== SNMPAPI_FAILURE)
AfxMessageBox("CreateVbl failure");
}

//////////////////////////////////////////////////////////////////////////
// 添加到变量绑定列表 //
//////////////////////////////////////////////////////////////////////////
void CSnmpManageDlg::SetVbl(LPCSTR name)
{
smiOID m_Oid;
if(SnmpStrToOid(name,&m_Oid) == SNMPAPI_FAILURE)
AfxMessageBox("SetVbl failure--oid");

//添加到变量绑定列表
if(SnmpSetVb(m_Hvbl,0,&m_Oid,NULL) == SNMPAPI_FAILURE)
AfxMessageBox("SetVbl failure");
}

//////////////////////////////////////////////////////////////////////////
// 创建协议数据单元 //
//////////////////////////////////////////////////////////////////////////
void CSnmpManageDlg::CreatePdu(smiINT PDU_type,smiINT32 request_id,
smiINT error_status,smiINT error_index)
{
//创建协议数据单元
m_Hpdu = SnmpCreatePdu(m_Session,PDU_type,request_id,error_status,error_index,m_Hvbl);
if(m_Hpdu == SNMPAPI_FAILURE)
AfxMessageBox("CreatePdu failure");
else if (error_status > 0)
AfxMessageBox("Error: error_status=%d, error_index=%d\n",
error_status, error_index);
}

//////////////////////////////////////////////////////////////////////////
// SNMP发送函数
//////////////////////////////////////////////////////////////////////////
void CSnmpManageDlg::SnmpSend(LPCSTR address,const char * community)
{
HSNMP_ENTITY hAgent;

//创建实体句柄
if((hAgent = SnmpStrToEntity(m_Session,address)) == SNMPAPI_FAILURE)
AfxMessageBox("SendMsg failure--entity");

smiOCTETS contextName;
contextName.ptr = (unsigned char *)community;
contextName.len = lstrlen(community);
HSNMP_CONTEXT hView;

//创建上下文句柄
if((hView = SnmpStrToContext(m_Session,&contextName))==SNMPAPI_FAILURE)
AfxMessageBox("SendMsg failure--context");

if(SnmpSendMsg(m_Session,NULL,hAgent,hView,m_Hpdu)==SNMPAPI_FAILURE)
AfxMessageBox("SendMsg failure");

if(m_Hpdu != NULL)
SnmpFreePdu(m_Hpdu);

if(m_Hvbl!=NULL)
SnmpFreeVbl(m_Hvbl);

if(hAgent!=NULL)
SnmpFreeEntity(hAgent);

if(hView!=NULL)
SnmpFreeContext(hView);
}
oyljerry 2006-03-16
  • 打赏
  • 举报
回复
^_^,我说的就是指你用的是WinSnmp啊……
对应的资源还是要你自己检查一下,顺便看一下MSDN等文档,看是否提到对应的API需要注意释放资源什么的没
lps 2006-03-16
  • 打赏
  • 举报
回复
我做网络管理,lipinshengxp@hotmail.com 欢迎楼主和我交流
flinming 2006-03-16
  • 打赏
  • 举报
回复
不是吧,贴在发了差不多一个白天了,怎么都没有人解决问题?


牛人都到哪里去了。。。。。。。。。。。。。。。
striking 2006-03-16
  • 打赏
  • 举报
回复
good good study..~~
flinming 2006-03-16
  • 打赏
  • 举报
回复
晕倒,我用的就是winSNMP,只是不知道那边资源没有释放,结果导致内存一直增加
independently 2006-03-16
  • 打赏
  • 举报
回复
学习中~
flinming 2006-03-16
  • 打赏
  • 举报
回复
WinSNMP?看看去。。。好用不?
oyljerry 2006-03-16
  • 打赏
  • 举报
回复
用的WinSNMP 吧,看对应的时候资源什么的都释放了……

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧