CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  网络编程

SNMP开发问题

楼主flinming(flinming)2006-03-16 09:58:05 在 VC/MFC / 网络编程 提问

在SNMP开发种,发现不断读取值,系统内存会不断增加,不知道做过相关开发的朋友是否有遇到类似的问题。。。。。。 问题点数:200、回复次数:19Top

1 楼flinming(flinming)回复于 2006-03-16 10:03:03 得分 0

//////////////////////////////////////////////////////////////////////////  
  // 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);  
  }Top

2 楼flinming(flinming)回复于 2006-03-16 10:03:22 得分 0

//////////////////////////////////////////////////////////////////////////  
  // 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;  
  }Top

3 楼fisker0303(天塌了,地陷了,小花狗不见了.)回复于 2006-03-16 11:33:40 得分 10

好长啊,先关注下...Top

4 楼LongLongAgoImBoy(ThereIsAMe)回复于 2006-03-16 12:15:26 得分 10

好啊,学习学习!Top

5 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2006-03-16 13:14:06 得分 50

用的WinSNMP   吧,看对应的时候资源什么的都释放了……Top

6 楼flinming(flinming)回复于 2006-03-16 14:20:31 得分 0

WinSNMP?看看去。。。好用不?Top

7 楼independently(我是风筝高高飞)回复于 2006-03-16 14:24:07 得分 0

学习中~Top

8 楼flinming(flinming)回复于 2006-03-16 14:40:43 得分 0

晕倒,我用的就是winSNMP,只是不知道那边资源没有释放,结果导致内存一直增加Top

9 楼striking(庸人自扰)回复于 2006-03-16 17:26:40 得分 10

good   good   study..~~Top

10 楼flinming(flinming)回复于 2006-03-16 18:33:25 得分 0

不是吧,贴在发了差不多一个白天了,怎么都没有人解决问题?  
   
   
  牛人都到哪里去了。。。。。。。。。。。。。。。Top

11 楼lps(lps)回复于 2006-03-16 20:30:11 得分 50

我做网络管理,lipinshengxp@hotmail.com   欢迎楼主和我交流Top

12 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2006-03-16 20:55:35 得分 0

^_^,我说的就是指你用的是WinSnmp啊……  
  对应的资源还是要你自己检查一下,顺便看一下MSDN等文档,看是否提到对应的API需要注意释放资源什么的没  
  Top

13 楼najzni(najzni)回复于 2006-03-16 23:10:34 得分 70

你的资源没有释放。使用的资源要成对释放。  
  比如这里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分配的内存。  
  Top

14 楼najzni(najzni)回复于 2006-03-16 23:16:38 得分 0

你可以参考一下msdn中的snmputil那个例子。应该是你程序中的某些winsnmp变量没释放完。Top

15 楼flinming(flinming)回复于 2006-03-17 14:32:02 得分 0

问题解决。。。。。。。。。Top

16 楼flinming(flinming)回复于 2006-03-17 14:32:59 得分 0

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");  
  }Top

17 楼flinming(flinming)回复于 2006-03-17 14:33:14 得分 0

//////////////////////////////////////////////////////////////////////////  
  // 创建协议数据单元 //  
  //////////////////////////////////////////////////////////////////////////  
  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;  
  }Top

18 楼flinming(flinming)回复于 2006-03-17 14:35:15 得分 0

以上是解决的代码,提供大家参考。。。。。。。  
  Top

19 楼MyPro(活到老,学到老!)回复于 2006-03-23 13:08:48 得分 0

长知识!公司正要让写一个SNMP相关的东西,可以参考一下啊!现在这方面成系统的东西太少了,简直无从下手!Top

相关问题

  • 关于SNMP AGENT的开发
  • SNMP网络管理软件开发
  • SNMP管理程序开发求助!
  • 有没有用PowerTCP开发过snmp
  • 请问snmp管理端用什么软件开发?
  • 请教SNMP Agent(代理)开发的相关知识?
  • 关于snmp: westhawk.co.uk公司的java snmp开发包,接受Trap初始化异常:Socket
  • 开发
  • 毕业设计是开发snmp网管软件?我想用java做请问我该如何下手啊?
  • 要用java开发snmp网管软件,用哪种软件包比较方便?(急急急)

关键词

  • snmp
  • 内存
  • lpstr
  • initoid
  • hsnmp
  • ppdu
  • winsnmp
  • strcpy
  • 释放
  • snmpapi

得分解答快速导航

  • 帖主:flinming
  • fisker0303
  • LongLongAgoImBoy
  • oyljerry
  • striking
  • lps
  • najzni

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo