如何在WinSNMP中测试PDU是否太大?

时间:2013-04-22 16:42:29

标签: windows snmp winsnmp

我正在使用Microsoft WinSNMP API为Windows应用程序构建SNMP代理。目前,所有内容都适用于单项getset-request,也适用于get-next以允许遍历已定义的树(尽管有一些与此问题无关的警告)。

我现在正在查看多项get以及get-bulk

我当前的程序是遍历请求项目列表(PDU中的varbindlist),单独处理每个项目,有效地导致内部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的。

1 个答案:

答案 0 :(得分:0)

RFC确实要求你做你粘贴的事情,

http://tools.ietf.org/html/rfc3416

阅读第16页。

似乎没有WinSNMP API公开的功能可以为您执行此操作,因此您必须编写自己的逻辑来处理它。