C语言代码实现CManager 应实现 GetAValue 接口:该接口封装 SNMP 的 GetRequest 方法,发送一个 OID ,获取结果后返回这个 OID 对应的值。 · CManager 应实现 GetTable 接口:该接口封装 SNMP 的 GetNextRequest 方法,发送一组 OID ,获取结果后返回这个组所有 OID 对应的值。 ·编写测试程序,对上述两个功能分别进行测试
时间: 2024-03-22 18:37:26 浏览: 116
好的,我理解了你的问题。下面是对应的 C 语言代码实现,其中使用了 net-snmp 库来实现对 SNMP 的访问:
```c
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#define OID_LEN_MAX 128
// GetAValue 接口实现
int GetAValue(const char* oid_str, char* value_str, size_t value_len) {
netsnmp_session session, *ss;
netsnmp_pdu *pdu, *response;
oid anOID[OID_LEN_MAX];
size_t anOID_len;
int status, count = 0;
// 初始化 session
snmp_sess_init(&session);
session.peername = strdup("localhost");
session.version = SNMP_VERSION_2c;
session.community = "public";
session.community_len = strlen(session.community);
// 解析 OID
anOID_len = OID_LEN_MAX;
if (!snmp_parse_oid(oid_str, anOID, &anOID_len)) {
snmp_perror(oid_str);
return -1;
}
// 创建 PDU
pdu = snmp_pdu_create(SNMP_MSG_GET);
snmp_add_null_var(pdu, anOID, anOID_len);
// 发送请求
ss = snmp_open(&session);
if (!ss) {
snmp_sess_perror("snmp_open", &session);
return -1;
}
status = snmp_synch_response(ss, pdu, &response);
if (status != STAT_SUCCESS || !response) {
if (ss->s_snmp_errno) {
snmp_perror("snmp_synch_response");
} else {
fprintf(stderr, "%s\n", "Error in packet");
}
return -1;
}
// 解析结果
for (netsnmp_variable_list* vars = response->variables; vars; vars = vars->next_variable) {
char buf[64];
snprint_variable(buf, sizeof(buf), vars->name, vars->name_length, vars);
if (count > 0) {
strncat(value_str, ",", value_len - strlen(value_str));
}
strncat(value_str, buf, value_len - strlen(value_str));
count++;
}
// 释放资源
snmp_free_pdu(response);
snmp_close(ss);
return count;
}
// GetTable 接口实现
int GetTable(const char* oid_str, char* table_str, size_t table_len) {
netsnmp_session session, *ss;
netsnmp_pdu *pdu, *response;
oid anOID[OID_LEN_MAX];
size_t anOID_len;
int status, count = 0;
// 初始化 session
snmp_sess_init(&session);
session.peername = strdup("localhost");
session.version = SNMP_VERSION_2c;
session.community = "public";
session.community_len = strlen(session.community);
// 解析 OID
anOID_len = OID_LEN_MAX;
if (!snmp_parse_oid(oid_str, anOID, &anOID_len)) {
snmp_perror(oid_str);
return -1;
}
// 创建 PDU
pdu = snmp_pdu_create(SNMP_MSG_GETNEXT);
snmp_add_null_var(pdu, anOID, anOID_len);
// 发送请求
ss = snmp_open(&session);
if (!ss) {
snmp_sess_perror("snmp_open", &session);
return -1;
}
while ((status = snmp_synch_response(ss, pdu, &response)) == STAT_SUCCESS && response) {
// 解析结果
for (netsnmp_variable_list* vars = response->variables; vars; vars = vars->next_variable) {
char buf[64];
snprint_variable(buf, sizeof(buf), vars->name, vars->name_length, vars);
if (count > 0) {
strncat(table_str, ",", table_len - strlen(table_str));
}
strncat(table_str, buf, table_len - strlen(table_str));
count++;
}
// 更新 PDU
snmp_free_pdu(pdu);
pdu = snmp_pdu_create(SNMP_MSG_GETNEXT);
snmp_add_null_var(pdu, response->variables->name, response->variables->name_length);
// 释放资源
snmp_free_pdu(response);
}
if (status != STAT_SUCCESS) {
if (ss->s_snmp_errno) {
snmp_perror("snmp_synch_response");
} else {
fprintf(stderr, "%s\n", "Error in packet");
}
}
// 释放资源
snmp_close(ss);
return count;
}
// 测试程序
int main() {
char value_str[1024];
int count = GetAValue("1.3.6.1.2.1.1.5.0", value_str, sizeof(value_str));
if (count > 0) {
printf("GetAValue: %s\n", value_str);
} else {
printf("GetAValue failed\n");
}
char table_str[1024];
count = GetTable("1.3.6.1.2.1.2.2.1.2", table_str, sizeof(table_str));
if (count > 0) {
printf("GetTable: %s\n", table_str);
} else {
printf("GetTable failed\n");
}
return 0;
}
```
注意:在运行测试程序之前,需要先启动 SNMP 代理,例如使用以下命令启动一个简单的 SNMP 代理:
```
snmpd -f -L -DALL
```
阅读全文