2013-04-22 58 views
0

我正在使用Microsoft WinSNMP API为Windows应用程序构建SNMP代理。目前,所有内容都适用于单项目getset-request以及get-next以允许步行定义的树(虽然有一些与此问题无关的注意事项)。如何测试WinSNMP中的PDU是否太大?

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

回答

0

的RFC确实需要你做你粘贴什么,

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

阅读第16页。

似乎没有被通过的WinSNMP API提供的功能,可以为你做这个,所以你必须编写自己的逻辑来处理它。

+0

我以为这是多么的可能。我正在构建PDU,如果数据太多,我会删除一些并重试。似乎工作:)干杯。 – icabod 2013-04-25 10:46:18

+0

如果它让你感觉更好,net-snmp(linux)目前只是放弃了,如果PDU太大,它就不会响应。我希望它做到了你正在建造的东西;他们必须以同样的方式来做。你可以对你认为的大小进行一些密集的计算,但是你本质上是在创建数据包来确定它的大小。所以繁琐的循环并不是那么糟糕。 – 2013-04-29 15:15:48