snmp使用snmp::get或者snmp::get_next失败如何恢复
时间: 2023-10-01 18:12:18 浏览: 100
如果使用 snmp::get 或者 snmp::get_next 失败,可以尝试以下解决方法:
1. 检查网络连接是否正常,并确保 SNMP 服务已经启动;
2. 检查 SNMP 设备的参数配置是否正确,比如 SNMP 版本、密码等等;
3. 重启 SNMP 服务或者重启整个设备,可能会有一些临时性的 SNMP 错误导致服务不可用;
4. 尝试使用其它的 SNMP 工具测试设备是否能够正常访问,比如 SnmpWalk 等等;
5. 如果以上方法都无效,建议联系设备厂商寻求帮助。
相关问题
使用getCMD函数发起SNMP请求
`getCmd`函数是PySNMP库中的一个函数,用于发起SNMP的GET请求。它的基本语法如下:
```python
from pysnmp.hlapi import *
error_indication, error_status, error_index, var_binds = next(
getCmd(SnmpEngine(),
CommunityData('public'),
UdpTransportTarget(('localhost', 161)),
ContextData(),
ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)))
)
```
在上述代码中,我们使用`getCmd`函数发起了一个SNMP的GET请求。参数说明如下:
- `SnmpEngine()`:SNMP引擎对象,用于发送SNMP请求。
- `CommunityData('public')`:SNMP社区字符串,用于认证访问权限。
- `UdpTransportTarget(('localhost', 161))`:目标主机和端口号,指定要发送SNMP请求的服务器。
- `ContextData()`:上下文数据对象,用于传递额外的上下文信息(可选)。
- `ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0))`:要获取的OID对象。
`getCmd`函数返回一个生成器,我们可以使用`next`函数来获取生成器的下一个值,即SNMP响应。响应的结果存储在`error_indication`、`error_status`、`error_index`和`var_binds`变量中。
请注意,上述代码中使用的是默认的SNMP版本(SNMPv2c)和默认的端口号(161)。你可以根据需要修改这些参数。此外,还可以使用`ObjectType`对象指定要获取的多个OID对象,以一次性获取多个值。
能基于C语言帮我写一段net-snmp的get实现吗
当然可以!以下是一个基于 C 语言的 net-snmp 的 get 操作的示例代码:
```c
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
int main(int argc, char **argv) {
// 初始化 net-snmp 库
init_snmp("snmpapp");
// 定义 SNMP session
netsnmp_session session, *ss;
snmp_sess_init(&session);
session.peername = strdup("hostname"); // 替换为目标设备的 IP 地址或主机名
session.version = SNMP_VERSION_2c;
session.community = strdup("public"); // 替换为设备的 SNMP community 字符串
session.community_len = strlen(session.community);
// 建立 SNMP 会话
SOCK_STARTUP;
ss = snmp_open(&session);
if (!ss) {
snmp_perror("snmp_open");
SOCK_CLEANUP;
exit(1);
}
// 构造 OID
oid anOID[MAX_OID_LEN];
size_t anOID_len = MAX_OID_LEN;
if (!snmp_parse_oid("1.3.6.1.2.1.1.1.0", anOID, &anOID_len)) {
snmp_perror("snmp_parse_oid");
snmp_close(ss);
SOCK_CLEANUP;
exit(1);
}
// 发送 SNMP Get 请求
netsnmp_pdu *pdu;
pdu = snmp_pdu_create(SNMP_MSG_GET);
snmp_add_null_var(pdu, anOID, anOID_len);
if (snmp_synch_response(ss, pdu, &response) != STAT_SUCCESS) {
snmp_perror("snmp_synch_response");
snmp_close(ss);
SOCK_CLEANUP;
exit(1);
}
// 处理响应
if (response && response->errstat == SNMP_ERR_NOERROR) {
for (var = response->variables; var; var = var->next_variable) {
print_variable(var->name, var->name_length, var);
}
} else {
if (response) {
fprintf(stderr, "Error in packet: %s\n", snmp_errstring(response->errstat));
} else {
snmp_sess_perror("snmp_synch_response", ss);
}
}
// 清理资源
if (response) {
snmp_free_pdu(response);
}
snmp_close(ss);
SOCK_CLEANUP;
return 0;
}
```
这段代码演示了如何使用 net-snmp 库进行 SNMP Get 请求。你需要根据实际情况修改其中的目标设备的 IP 地址(`peername`)和 SNMP community 字符串(`community`),以及 OID 字符串(`snmp_parse_oid`)。
请注意,这只是一个简单的示例,你可能需要根据你的需求对代码进行进一步扩展和优化。同时,为了成功编译和运行这段代码,你需要安装 net-snmp 库及其开发包,并在编译时链接正确的库文件。
希望这个示例对你有所帮助!如果有任何问题,请随时提问。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)