代码如下: 问题:无法获取返回的消息,也就是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; } |
[技术| 编程·课件·Linux] SNMP编程问题,SnmpRecvMsg无法获取消息
lvs007
· 发布于 2013-04-22 20:21
· 1296 次阅读
转载文章时务必注明原作者及原始链接,并注明「发表于 软院网 RuanYuan.Net 」,并不得对作品进行修改。
楼主相关话题