关于snmp++求教?

还要昵称啊我日 2012-08-28 05:27:51
最近在做关于snmp++的东西,需要用到异步模式的get去获取设备的信息,但是在使用的时候发现了一个很奇怪的问题,异步模式Get需要一个回调函数,我也写了,但是不会进入到回调函数中,只有snmp对象销毁的时候才会进入回调函数中。我抓包也看了,收到了返回的数据包。后来我在异步Get后面添加了阻塞模式的Get,然后就进入到回调函数中。
Snmp *snmp;
void GetFun(int reason, Snmp *session, Pdu &pdu, SnmpTarget &target, void *data);
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
snmp_version version = version1;
Snmp::socket_startup();
int retries=1;
unsigned long timeout=100;
u_short port= 161;
OctetStr community("public");
int status;

UdpAddress address("192.168.2.2");
CString strOid = "1.3.6.1.4.1.20353.2.1.1.85.1.0.0.23";
Oid oid(strOid);
Pdu pdu;
Vb vb;
vb.set_oid(oid);
pdu += vb;
address.set_port(port);
CTarget ctarget( address);
ctarget.set_version( version2c);
ctarget.set_retry( retries);
ctarget.set_timeout( timeout);
ctarget.set_readcommunity(community);
SnmpTarget *target;
target = &ctarget;
snmp = new Snmp(status);
status = snmp->get( pdu, *target,GetFun);
// snmp->get( pdu, *target);
// if (status == SNMP_CLASS_SUCCESS)
// {
// pdu.get_vb( vb,0);
//
// CString strval = vb.get_printable_value();
// AfxMessageBox(strval);
// }
return 0;
}
void GetFun(int reason, Snmp *session, Pdu &pdu, SnmpTarget &target, void *data)
{
Vb vb;
CString str1;
str1.Format("%d",reason);
AfxMessageBox(Snmp::error_msg(reason));
pdu.get_vb(vb,0);
CString strValue1;
strValue1 = vb.get_printable_value();
AfxMessageBox(strValue1);
}

那位能帮我看下到底是怎么回事啊
...全文
279 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
waterclean2005 2014-04-18
  • 打赏
  • 举报
回复
不需要全局state,在get操作前start_poll_thread就行了
卦星 2013-12-17
  • 打赏
  • 举报
回复
学习一下,刚刚开始snmp
  • 打赏
  • 举报
回复
谢谢楼上了
zbj333 2012-10-13
  • 打赏
  • 举报
回复
研究了Snmp++的源码,找到了解决方法:

1. snmp = new Snmp(status);不能声明为局部变量,在函数外进行初始化。使用异步调用不允许对snmp进行销毁,否则就出现你说的情况。(这种做法在同步调用时正常)

2. 声明后启动消息轮询,即snmp = new Snmp(status);snmp->start_poll_thread(1000);
这样可以正常进入回调函数,1000是超时时间

刚找到原因,未研究细理,希望对你有帮助。
zbj333 2012-10-12
  • 打赏
  • 举报
回复
同问,SNMP++是3.2版本,VS2010编译
程序是老程序了,之前用VC6编译运行都正常
ynwlgh 2012-08-29
  • 打赏
  • 举报
回复
我之前写过类似的一些代码.
得找找看在不在.
  • 打赏
  • 举报
回复
回1楼:之前就是开多个线程做的,但是这样速度还是不行的。查资料的时候看到了异步模式的,就想这么做。
问题是单独用异步Get就不会正常调用回调函数,再用一次阻塞Get才能调用,不清楚是什么原因。
回2楼:麻烦你找找看能找到没,最近比较着急这个,虽然现在用阻塞Get做,但是效率实在太差,做设备发现的,要挨个去获取数据,许多是不能获取到的,就要等到超时太慢了。
oyljerry 2012-08-29
  • 打赏
  • 举报
回复
开个线程去做Get

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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