c++ - 使用 SNMPv2 和 c++ 编写 getBulkRequest 函数

标签 c++ qt format snmp

我正在编写一个 getBulkRequest 函数,它应该允许我一次性请求一个信息列表。

现在,我想做一些简单的事情,使用 GetBulkRequest 通过在 getBulkRequest 中将“Non-Repetition”设置为“0”来按顺序获取 NextRequest。

  • 我写的格式是否正确?
  • 对于Oid,是否只需要输入一个Oid(Bulk的第一项)?
  • 如果我希望获得从指定的 Oid 开始的批量请求,以及第一个之后的以下 4 个项目,我是否只需将“Max-Repetition”设置为 5?

这是我正在使用的格式,任何人都可以告诉我我这样做是否正确:

switch(pdyType) {
 case PdyType::GET_BULK_REQUEST:
for (QStringList::ConstIterator iter = oids.begin(); iter != oids.end(); ++iter)
{

  QByteArray keyHolder;

  //value
  keyHolder.push_front(QByteArray(1, 0x00));
  keyHolder.push_front(QByteArray(1, DataType::DATA_NULL));

  //object identifier
  QByteArray temp = encodeoid(*iter);
  keyHolder.push_front(temp);
  keyHolder.push_front(encodeLengthField(temp.size()));
  keyHolder.push_front(QByteArray(1, DataType::OBJECT_ID));

  //varbind
  keyHolder.push_front(encodeLengthField(keyHolder.size()));
  keyHolder.push_front(QByteArray(1, DataType::SEQUENCE));

  datagram.push_front(keyHolder);
}

//max-repetitions
datagram.push_front(QByteArray(1, 5);
datagram.push_front(QByteArray(1, 1);
datagram.push_front(QByteArray(1, DataType::INTEGER);

//varbind list
datagram.push_front(QByteArray(encodeLengthField(datagram.size());
datagram.push_front(QByteArray(1, DataType::SEQUENCE);

//non-repeaters
datagram.push_front(QByteArray(1, 0);
datagram.push_front(QByteArray(1, 1);
datagram.push_front(QByteArray(1, DataType::INTEGER);

//requestId
datagram.push_front(QByteArray(1, requestId));
datagram.push_front(QByteArray(1, 1);
datagram.push_front(QByteArray(1, DataType::INTEGER);

//pdu
datagram.push_front(QByteArray(encodeLengthField(datagram.size()));
datagram.push_front(QByteArray(1, (unsigned char)pduType);

//community string
datagram.push_front(QByteArray(community.toLocal8Bit()));
datagram.push_front(QByteArray(encodeLengthField(community.size());
datagram.push_front(QByteArray(1, DataType::OCTET_STRING);

//version
datagram.push_front(QByteArray(1, 0));
datagram.push_front(QByteArray(1, 1);
datagram.push_front(QByteArray(1, DataType::INTEGER);

//message type
datagram.push_front(QByteArray(encodeLengthField(datagram.size()));
datagram.push_front(QByteArray(1, DataType::SEQUENCE);
break;


default:
 break;
 }
 return datagram;

通过 QUdpSocket::writeDatagram 设置 getBulkRequest 的格式是否正确?

我希望我能够清楚地表达我的问题。因为我不太确定目前发生了什么,所以我正在尝试阅读更多内容。

最佳答案

Q:对于Oid,是否只需要输入一个Oid(Bulk的第一项)?

A:可以,只需要设置第一个OID即可。

问:如果我希望获得从指定的 Oid 开始的批量请求,以及第一个之后的以下 4 个项目,我是否只需将“Max-Repetition”设置为 5?

答:是的。 5 是您需要为最大重复设置的最小值,但您可以设置为更大的值(例如 10)。您处理响应的方式是遍历响应 PDU 并一次获取每个 OID。

希望这对您有所帮助。

关于c++ - 使用 SNMPv2 和 c++ 编写 getBulkRequest 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37801580/

相关文章:

c++ - 无效部署异常

2 种功能类型的 C++ Mixins

qt - 使用 Qt 安装程序框架脚本记录控制台输出

java - 未使用 QAndroidJniObject 调用的三个函数之一

qt - 使用 fontconfig 支持为 Linux x86 构建 Qt

iphone - objective-c/iPhone : How do I extract the actual unicode date format strings for the current region?

Java:不可解析的日期异常

numpy - 如何控制 NumPy float64 标量的显示精度?

c++ - 如何在不使用静态变量的情况下从递归函数调用另一个函数一次?

c++ - 使用 decltype() 声明函数签名