首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何测试WinSNMP中的PDU是否太大?

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

Stack Overflow用户
提问于 2013-04-22 16:42:29
回答 1查看 874关注 0票数 0

我正在使用Microsoft为WinSNMP API应用程序构建一个SNMP。目前,所有东西都适用于单项getset-requestget-next也允许遍历定义的树(尽管有一些与这个问题无关的警告)。

我现在看的是多项getget-bulk

我的当前过程是迭代请求项的列表(PDU中的varbindlist ),单独处理每个条目,有效地导致内部get。结果被添加到VBL中,设置到PDU中,然后发送回SNMP管理器,同时考虑到无效请求等。

我的问题是,我应该如何处理“太多”的数据(不能适应单个传输层消息的数据)?或者更准确地说,是否有一种方法可以测试数据是否“太大”而不实际试图传输?我在API中看到的唯一方法是尝试发送、检查错误,然后再试一次。

get-request的情况下,这不是问题--如果不能返回所有请求的数据,则失败:因此尝试发送,如果错误报告为SNMPAPI_TL_PDU_TOO_BIG,则发送一个默认的" error“PDU。

但是,允许对bulk-get的响应返回部分结果。

我唯一能看到的处理这件事的方法是乏味的(?)循环删除项并重试。类似于以下内容的内容(为了简洁起见删除了一些细节):

代码语言:javascript
复制
// 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之类的库,但我的问题是针对Microsoft的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-24 07:13:48

RFC确实要求你做你想做的事,

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

读第16页。

似乎没有一个由WinSNMP API公开的函数可以为您做到这一点,所以您必须编写自己的逻辑来处理它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16152331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档