Net-SNMP将OID中定长字符串编码为变长字符串问题求助
Net-SNMP 5.8 Agent 定长字符串索引OID带长度问题解决
一、MIB定义正确性确认
你定义的SYNTAX OCTET STRING(SIZE (18))作为索引类型完全符合RFC 2578规范。根据RFC 2578第7.7节:
定长字符串索引(明确指定固定SIZE值)编码时无需在OID中加入长度子标识符,直接将每个八位字节作为独立子标识符即可;而无IMPLIED关键字的变长字符串才需要先编码长度,再编码每个字节。
你的MIB定义没问题,问题出在Net-SNMP Agent的索引编码逻辑上。
二、代码层面修正方案
你当前用snmp_set_var_value处理索引的方式有误,这个函数是用来设置变量的值,而非构造索引OID。针对定长字符串索引,需要改用专门的索引构造逻辑:
使用
snmp_add_var_index函数(推荐)
这个函数会根据传入的类型和长度自动处理索引编码,定长场景下不会插入长度子标识符:// 假设index_str是你的18字节定长索引字符串 snmp_add_var_index(varbind, ASN_OCTET_STR, index_str, 18);手动构造OID(精细控制场景)
如果需要更灵活的OID构造,可直接拼接索引字节作为子标识符:oid oid_buf[OID_LENGTH]; int oid_len = BASE_OID_LENGTH; // 复制基础OID到缓冲区 memcpy(oid_buf, base_oid, BASE_OID_LENGTH * sizeof(oid)); // 逐个添加18个字节作为OID子标识符 for (int i = 0; i < 18; i++) { oid_buf[oid_len++] = (unsigned char)index_str[i]; } // 设置varbind的OID snmp_set_var_objid(varbind, oid_buf, oid_len);
三、索引类型调整方案(可选)
如果代码修改成本较高,可优化MIB定义让Net-SNMP更明确识别定长属性:
将定长字符串封装为独立的TEXTUAL-CONVENTION:
MyFixedIndex ::= TEXTUAL-CONVENTION DISPLAY-HINT "18a" STATUS current DESCRIPTION "18字节定长索引字符串" SYNTAX OCTET STRING(SIZE (18))
之后表索引直接使用MyFixedIndex类型,Net-SNMP的MIB编译器会更准确识别定长规则,自动修正编码逻辑。
内容的提问来源于stack exchange,提问作者WakkaTrout
相关产品推荐
相关产品推荐

