上下文:我正在使用 c++ net-snmp 库构建一个 snmp 子代理。我正在努力为设置请求添加数据验证。这样做时,我需要等待设置请求中的值写入硬件。当子代理等待硬件已正确更新的消息时,子代理将循环休眠(5 秒后退出,不会收到硬件回调的消息)。
问题: 我在这个实现中注意到的问题是,当子代理休眠时间超过约 1 秒时,我会看到一个 net-snmp 错误
dropping bad AgentX request (wrong mode 2)
。当我调整睡眠时间时,我看到多个相同的错误消息。所以这似乎与代理的睡眠有关。
备注: 我已与wireshark确认,我使用的mib浏览器仅发送1组请求。通过子代理上的日志,我可以确认在成功设置请求时,添加此睡眠周期会导致此错误消息,从而导致设置请求失败并出现 GENERAL_ERROR。
我使用的是net-snmp v5.9.3。
我可以确认,如果没有这个睡眠循环,设置的请求将在我的子代理中成功返回(因为我们始终假设该值已成功更新到硬件)。
错误
dropping bad AgentX request (wrong mode 2)
将在设置请求结束时显示在控制台中(当它应该成功时)
这就是睡眠循环的样子
while (callbackNotRecieved && elapsedTime.count() <= setRequestTimeout) {
std::this_thread::sleep_for(std::chrono::milliseconds(_sleepTimer)); // sleep for 1 second
callbackNotRecieved = CheckCallback();
currentTime = std::chrono::system_clock::now();
elapsedTime = std::chrono::duration_cast<std::chrono::milliseconds>(currentTime - startingTime);
}
我在其他论坛上看到过这个问题,但没有解决
我对解决此问题/调试此问题的所有想法持开放态度。我没有发布任何子代理代码,因为我不确定哪些部分是相关的,因为子代理确实可以工作,这似乎是一个非常隐蔽的错误。如果有人想查看一些可能有用的代码片段,我可以更新这篇文章。
我正在使用 yocto 环境来构建 net-snmp,因此我可以在我的解决方案中包含一个补丁来解决此问题。我生成的补丁非常简单。它删除了这一行,这将发送agentx_error。
尽管我并不完全意识到这样做的影响。应用此补丁后,我可以在 MODE_SET_ACTION 的子代理请求处理程序中休眠。我观察到应用此补丁时的行为是,当代理处于睡眠状态时,net-snmp 将继续发送请求,直到它及时通过。我不确定那是什么/为什么,但是通过日志记录,我可以看到我的子代理在初始请求之后处理同一集请求的 2-3 个版本。这似乎没有引起问题,因为在第二个/第三个/等等设置请求中,我的子代理不会休眠等待值更新,因为它已经更新了。
我还在 github 中提出了一个 net-snmp 问题,希望能引起更多人对这个错误的关注。因为我不认为这是子代理方面的错误。 https://github.com/net-snmp/net-snmp/issues/691