我正在使用 Microsoft WinSNMP API为 Windows 应用程序构建 SNMP 代理。目前,一切都适用于单项get
和set-request
,也适用get-next
于允许行走定义的树(尽管有一些与此问题无关的警告)。
我现在正在研究多项目get
和get-bulk
.
我目前的程序是遍历请求的项目列表(varbindlist
PDU 中的),单独处理每个项目,有效地导致内部get
. 结果添加到 VBL,设置到 PDU,然后发送回 SNMP 管理器,考虑到无效请求等。
我的问题是我应该如何处理“太多”数据(无法放入单个传输层消息的数据)?或者更准确地说,有没有办法在不实际尝试传输的情况下测试数据是否“太大”?我在 API 中看到的唯一方法是尝试发送,检查错误,然后重试。
在这种情况下,get-request
这不是问题 - 如果您无法返回所有请求的数据,您将失败:因此尝试发送,如果错误报告为SNMPAPI_TL_PDU_TOO_BIG
,则发送默认的“错误”PDU。
但是,允许响应bulk-get
返回部分结果。
我能看到处理此问题的唯一方法是删除项目并重试的繁琐(?)循环。类似于以下内容(为简洁起见,删除了一些细节):
// Create an empty varbindlist
vbl = SnmpCreateVbl(session, NULL, NULL);
// Add all items to the list
SnmpSetVb(vbl, &oid, &value); // for each OID/Value pair
// Create the PDU
pdu = SnmpCreatePdu(session, SNMP_PDU_RESPONSE, ..., vbl);
bool retry;
do {
retry = false;
smiINT failed = SnmpSendMsg(session, ..., pdu);
if (failed && SNMPAPI_TL_PDU_TOO_BIG == SnmpGetLastError()) {
// too much data, delete the last vb
SnmpDeleteVb(vbl, SnmpCountVbl(vbl));
SnmpSetPduData(pdu, ..., vbl);
retry = true;
};
} while(retry);
这似乎不是一种最佳方法 - 那么我错过了另一种方法吗?
作为旁注,我知道诸如 net-snmp 之类的库,但我的问题是针对 Microsoft API 的。