【问题标题】:How should I test if a PDU is too big in WinSNMP?我应该如何测试 WinSNMP 中的 PDU 是否太大?
【发布时间】:2013-04-22 16:42:29
【问题描述】:

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

我现在正在查看多项目 getget-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 的。

【问题讨论】:

    标签: windows snmp winsnmp


    【解决方案1】:

    RFC 确实要求您执行粘贴的操作,

    https://www.rfc-editor.org/rfc/rfc3416

    阅读第 16 页。

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

    【讨论】:

    • 我认为这就是它的样子。我正在构建 PDU,如果数据太多,我会删除一点并重试。似乎工作:) 干杯。
    • 如果它让你感觉更好,net-snmp (linux) 目前只是放弃并且如果 PDU 太大则不响应。我希望它能做你正在建造的东西;他们将不得不这样做。您可以对您认为的大小进行一些严格的计算,但无论如何您实际上是在创建数据包以计算出它。所以繁琐的循环还不错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 2012-07-25
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    相关资源
    最近更新 更多