在程序里用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;

09-21 05:07