Chinaunix首页 | 论坛 | 博客
  • 博客访问: 465126
  • 博文数量: 111
  • 博客积分: 2332
  • 博客等级: 大尉
  • 技术积分: 1187
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-29 11:22
文章分类

全部博文(111)

文章存档

2013年(9)

2012年(28)

2011年(17)

2010年(28)

2009年(29)

我的朋友

分类: C/C++

2011-12-05 18:27:23

在程序里用get命令,一次取的这三个oid的值.1.3.6.1.2.1.1.1.0.1.3.6.1.2.1.1.9.1.2.2.1.3.6.1.2.1.3.1.1.2.44.1.10.210.2.21,就只能得到第一个oid的值,后面的老是得不到。用tcpdump抓包看了之后,发现后面的两个都是只解析到了前九位,然后就发送出去了,这样agent端自然解析不出来。
然后我用snmpget命令来取这三个oid的值,发现都能够得到正确的值。
之后看了snmpget命令的源码,发现和我的程序流程上都是一样的,也没有加载什么特殊的mib库。
所以我就只能看自己的程序了。
然后我发现不管是用read_objid还是snmp_parse_oid都是不行。
最后用gdb一步一步的跟踪调试,发现anOID_len这个值永远都是9。
进一步跟踪源代码发现,不管是read_objid还是snmp_parse_oid都会调用mib.c里面的_add_strings_to_oid。在这里面会判断当前给的oid的长度是不是大于anOID_len,如果大于,就会报错的。不过不大于,就会继续解析,正确解析出来之后,会把anOID_len改成当前这个oid的长度。


这样问题也就发现了,我只是连着解析了三个oid,但是在解析之前,就把anOID_len初始化了一般,所以解析完第一个oid之后,anOID_len就变为9了,后面的两个oid的长度都大于9,所以不能正确解析,只能解析到前九位了。
解决方法自然也就出来了,就是在每次调用read_objid还是snmp_parse_oid之前都初始化一遍anOID_len。anOID_len = MAX_OID_LEN;

阅读(3067) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~