SNMP编程问题,无法获取返回的消息
也就是: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;
}
初学,望大神指点啊
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;
}
初学,望大神指点啊
...全文
相关推荐
snmp监控设备时获取设备oid工具
获取设备的OID通常需要使用SNMP工具。这些工具可以发送SNMP GET请求到目标设备,然后设备会返回对应的OID值。这些值可以用于监控设备状态,比如CPU和内存使用率。
利用snmp协议获取机器设备信息 代码
总的来说,通过SNMP协议和Java编程,你可以实现跨平台地远程获取和管理网络设备的各种信息,这对于网络运维和自动化监控至关重要。了解并熟练掌握这一技术,将有助于提升网络管理效率和问题排查能力。
Java使用SNMP4J实现snmp trap接口发送消息_20170808_LK
当网络设备发生特定事件时,如接口故障、内存溢出等,设备会自动向预设的管理站发送Trap消息,以便管理员能及时了解并处理问题。
SNMP_WALK获取SNMP协议oid的非常好用的工具
`使用说明.txt`文件则是工具的使用指南,通常会包含如何启动工具、如何构造OID查询、如何解析返回的数据等关键信息。
使用Java进行SNMP编程-SNMP4J-代码实例
Java中的SNMP编程是网络管理员和服务器监控人员常用的技术之一。


