代码如下:
问题:无法获取返回的消息,也就是stat = SnmpRecvMsg(hSession,&scrEntity,&dstEntity,&recvContext,&recvPdu);总是说消息队列为空。
希望大神指点啊!

// CTestSnmpView 消息处理程序
void CTestSnmpView::getUserNumber(HWND h)
{
SNMPAPI_STATUS stat ;
smiUINT32 majorVersion = 0;
smiUINT32 minorVersion = 0;
smiUINT32 level = 0;
smiUINT32 translateMode = 0;
smiUINT32 retransmitMode = 0;
SNMPAPI_STATUS startResult = SnmpStartup(&majorVersion,&minorVersion,&level,&translateMode,&retransmitMode);
if(SNMPAPI_SUCCESS != startResult){
  return ;
}
//2.建立会话,WM_SNMP_INCOMING
//HWND * hwnd =(HWND*) AfxGetMainWnd();
//session = SnmpOpen(hwnd,SNMP_MSGrel);
session = SnmpCreateSession(NULL,NULL,CTestSnmpView::snmp_callback,this);
if(SNMPAPI_FAILURE == session){
  return ;
}
//session = SnmpCreateSession(NULL, 0, CSNMPManager::snmp_callbacknext, this);
//3.设置传输模式
::SnmpSetTranslateMode(SNMPAPI_UNTRANSLATED_V1);
//4.创建实体,一个是本机的ip地址,另一个是接收方的ip地址
CString sendstr = _T("127.0.0.1");
CString revstr = _T("192.168.1.1");
HSNMP_ENTITY customEntity = SnmpStrToEntity(session,"127.0.0.1");
HSNMP_ENTITY revEntity = SnmpStrToEntity(session,"192.168.1.1");
if(SNMPAPI_FAILURE == customEntity || SNMPAPI_FAILURE == revEntity){
  return ;
}
//5.设置重传模式,设置为启动重传模式
SnmpSetRetransmitMode(SNMPAPI_ON);
//6.设置超时时间
SnmpSetTimeout(customEntity,1000);
//7.设置重传次数
SnmpSetRetry(customEntity,5);
//8.创建上下文句柄
smiOCTETS community;
community.ptr = (unsigned char *)"public";
community.len = 6;
::HSNMP_CONTEXT context = SnmpStrToContext(session,&community);
if(context == SNMPAPI_FAILURE){
  return ;
}
//9.创建变量绑定列表
smiOID sOid;
SnmpStrToOid("1.3.6.1.2.1.1.1.0",&sOid);
//::HSNMP_VBL vb = SnmpCreateVbl(session,NULL,NULL);
::HSNMP_VBL vb = SnmpCreateVbl(session,&sOid,NULL);
//10.追加绑定列表
//::SnmpSetVb(vb,0,NULL,NULL);
//11.创建PDU
::HSNMP_PDU pdu = SnmpCreatePdu(session,SNMP_PDU_GET,2,NULL,NULL,vb);
//12.发送PDU
stat = SnmpSendMsg(session,customEntity,revEntity,context,pdu);
if(stat == SNMPAPI_FAILURE){
  return ;
}
//
SnmpFreeDescriptor(SNMP_SYNTAX_OID,(smiLPOPAQUE)&sOid);
SnmpFreeEntity(customEntity);
SnmpFreeEntity(revEntity);
SnmpFreeContext(context);
SnmpFreeVbl(vb);
SnmpFreePdu(pdu);

}
SNMPAPI_STATUS CALLBACK CTestSnmpView::snmp_callback(HSNMP_SESSION hSession,
HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam,LPVOID lpClientData)
{
/**接收消息,并且处理
1.
*/
HSNMP_ENTITY scrEntity;
HSNMP_ENTITY dstEntity;
HSNMP_CONTEXT recvContext;
HSNMP_PDU recvPdu;
SNMPAPI_STATUS stat ;
//stat = 0;
stat = SnmpRecvMsg(hSession,&scrEntity,&dstEntity,&recvContext,&recvPdu);
if (stat != SNMPAPI_SUCCESS){
  return NULL;  
}
//2.提取数据报
smiINT pdu_type = 0;
smiINT32 request_id = 0;
smiINT error_status = 0;
smiINT error_index = 0;
HSNMP_VBL vblist = NULL;
stat = SnmpGetPduData(recvPdu,&pdu_type,&request_id,&error_status,&error_index,&vblist);
//if (stat != SNMPAPI_SUCCESS) return ;
//3.计算返回列表数目
int count = SnmpCountVbl(vblist);
//4.取回返回结果
smiLPOID name = NULL;
smiLPVALUE value = NULL;
for(int i=0;i<count;i++){
  SnmpGetVb(vblist,i,name,value);
  
}
//5.释放句柄,回收内存
SnmpClose(hSession);
SnmpCleanup();
return NULL;
}
共收到 2 条回复
lvs007 · #2 · 2013-4-24 12:45:35  回复 支持 反对
大神顶起啊
lvs007 · #3 · 2013-4-25 12:17:21  回复 支持 反对
没有人知道吗
回帖
B Color Image Link Quote Code Smilies
Command + Enter
快速回复 返回顶部 返回列表