SNMP编程问题,无法获取返回的消息

lvs007 2013-04-26 11:03:41
也就是:stat = SnmpRecvMsg(hSession,&scrEntity,&dstEntity,&recvContext,&recvPdu);总是说消息队列为空,代码如下:
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.建立会话
session = SnmpCreateSession(NULL,NULL,CTestSnmpView::snmp_callback,this);
if(SNMPAPI_FAILURE == session){return ;}
//3.设置传输模式
SnmpSetTranslateMode(SNMPAPI_UNTRANSLATED_V1);
//4.创建实体,一个是本机的ip地址,另一个是接收方的ip地址
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,&sOid,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 = 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);
//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;
}
初学,望大神指点啊
...全文
249 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lvs007 2013-04-27
  • 打赏
  • 举报
回复
引用
这是什么语言,用的什么方式? 用sniffer看看包有没有发出,有没有回包?
用的是C++,发送成功了,就是没有消息返回
lvs007 2013-04-27
  • 打赏
  • 举报
回复
引用
你可以用sniffer 看看你发的信息是否正确 和snmpwalk发的相同内容对比下
谢谢你的帮忙,虽然我对sniffer一窍不通,但是还是感谢你给的提醒,貌似我已经发现错误了,服务器地址写错了,诶,那个悲催啊
shrekz 2013-04-27
  • 打赏
  • 举报
回复
你可以用sniffer 看看你发的信息是否正确 和snmpwalk发的相同内容对比下
lvs007 2013-04-26
  • 打赏
  • 举报
回复
用的是C++,发送成功了,就是没有消息返回
shrekz 2013-04-26
  • 打赏
  • 举报
回复
这是什么语言,用的什么方式? 用sniffer看看包有没有发出,有没有回包?

6,185

社区成员

发帖
与我相关
我的任务
社区描述
windows网络管理与配置
社区管理员
  • 网络管理与配置社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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