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

Windows 如何在WinSNMP中测试PDU是否太大?,windows,snmp,winsnmp,Windows,Snmp,Winsnmp,我正在使用Microsoft为Windows应用程序构建SNMP代理。目前,所有功能都适用于单个项目get和set request,也适用于get next,以允许遍历定义的树(尽管有一些与此问题无关的警告) 我现在看的是multi-itemget和get-bulk 我当前的过程是遍历请求项的列表(PDU中的varbindlist),分别处理每个项,有效地导致内部get。将结果添加到VBL中,设置到PDU中,然后将其发送回SNMP管理器,同时考虑无效请求等 我的问题是,我应该如何处理“过多”数据

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

我现在看的是multi-item
get
get-bulk

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

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

get请求的情况下,这不是问题-如果不能返回所有请求的数据,则会失败:因此尝试发送,如果错误报告
SNMPAPI\u TL\u PDU\u太大
,则发送默认的“error”PDU

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

我能看到的处理这个问题的唯一方法是删除一个项目并重试的冗长循环。类似于以下内容(为了简洁起见,删除了一些细节):

//创建一个空的varbindlist
vbl=SnmpCreateVbl(会话,NULL,NULL);
//将所有项目添加到列表中
SnmpSetVb(vbl,&oid,&value);//对于每个OID/值对
//创建PDU
pdu=SnmpCreatePdu(会话,SNMP_pdu_响应,…,vbl);
布尔重试;
做{
重试=错误;
smint failed=SnmpSendMsg(会话,…,pdu);
if(failed&&SNMPAPI\u TL\u PDU\u TOO\u BIG==SnmpGetLastError()){
//数据太多,请删除最后一个vb
SnmpDeleteVb(vbl,SnmpCountVbl(vbl));
SnmpSetPduData(pdu,…,vbl);
重试=真;
};
}while(重试);
这似乎不是一个最佳的方法——那么有没有其他我错过的方法呢



顺便说一句,我知道诸如net snmp之类的库,但我的问题是针对Microsoft API的。

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

阅读第16页


WinSNMP API似乎没有一个函数可以为您实现这一点,因此您必须编写自己的逻辑来处理它。

我认为这就是它的基本原理。我正在构建PDU,如果数据太多,我会删除一点,然后重试。似乎有效:)干杯。如果它让你感觉更好,NetSNMP(linux)目前只是放弃,如果PDU太大,它不会响应。我希望它能像你所建造的那样;他们必须以同样的方式来做。您可以对您认为的大小进行一些密集的计算,但您实际上是在创建数据包来解决这个问题。所以这个乏味的循环并不坏。