经过对SNMP协议的学习,我们接下来对UCD-SNMP软件进行一个实例操作。那么前面我们已经讲述了有关于这个软件的一些基本内容,下面的网络管理程序我们将详细地剖析一下。
一个简单的SNMP网络管理程序
下面, 让我们先应用ucd-snmp写一个的SNMP网络程序, 从应用程序的角度尝试一下这个软件包的使用. 这个程序是如此地简单, 不支持任何命令行参数, 仅仅从代理程序获得关于系统的描述.
程序代码如下:
1) /* snmpapp.c - a simple SNMP application */
2) #include <ucd-snmp/ucd-snmp-config.h>;
3) #include <ucd-snmp/ucd-snmp-includes.h>;
4) #include <ucd-snmp/system.h>;
5) int main(int argc, char * argv[])
6) {
7) struct snmp_session session, *ss;
8) struct snmp_pdu *request, *response;
9)
10) oid myoid[MAX_OID_LEN];
11) size_t myoid_len = MAX_OID_LEN;
12) struct variable_list *vars;
13) int status;
14) init_snmp("snmpapp");
15) snmp_sess_init( &session );
16) session.version = SNMP_VERSION_1;
17) session.peername = "localhost";
18) session.community = "public";
19) session.community_len = strlen(session.community);
20) SOCK_STARTUP;
21) ss = snmp_open(&session);
22) request = snmp_pdu_create(SNMP_MSG_GET);
23) read_objid("system.sysDescr.0", myoid, &myoid_len);
24) snmp_add_null_var(request, myoid, myoid_len);
25) status = snmp_synch_response(ss, request, &response);
26) if (status == STAT_SUCCESS &&
27) response->;errstat == SNMP_ERR_NOERROR)
28) {
29) for(vars = response->;variables; vars; vars = vars->;next_variable)
30) print_variable(vars->;name, vars->;name_length, vars);
31) } else {
32) if (status == STAT_SUCCESS)
33) fprintf(stderr, "Error in packet\nReason: %s\n",
34) snmp_errstring(response->;errstat));
35) else
36) snmp_sess_perror("snmpget", ss);
37) }
38) if (response)
39) snmp_free_pdu(response);
40) snmp_close(ss);
41) SOCK_CLEANUP;
42) return (0);
43) }
#p#代码分析
第2-4行, 必须包含的头文件, 其中<ucd-snmp/system.h>;如果在<ucd-snmp/ucd-snmp-includes.h>;中已包含, 可以省略. 不过, 在头文件中有宏保护, 所以无所谓.
第7-13行, 定义程序所需要的变量.
第14行, 初始化SNMP库.
第15-19行, 初始化会话结构变量. 假定SNMP代理位于本机, community(如何翻译?)名public具有可读权限.
第20行和第41行, SOCK_STARTUP和SOCK_CLEANUP宏定义主要用于在win32平台初始化和清除winsock接口, 而在Unix/Linux环境不做任何事情.
第21行, 打开一个snmp会话. 在下面的会话过程中使用API snmp_open()返回的指针. 关于snmp_open(), 参见相应的man手册.
第22-24行, 创建一个SNMPv1 PDU, 并加入请求代码. 注意这里我们使用的是SNMP Get请求.(宏SNMP_MSG_GET表示).
第25行, 与SNMP代理进行通讯. 这里使用的是同步通讯机制.
第26-37行, 处理反馈. 注意消息及错误的处理方式.
第38-39行, 如果通讯成功, 反馈指针response非空, 必须由程序释放API分配的内存.
第40行, 关闭会话.
ucd-snmp API分为如下几类:
¨ snmp_api
¨ snmp_sess_api
¨ mib_api
¨ variables
¨ default_store
¨ read_config
¨ snmp_alarm
¨ snmp_trap_api
¨ anmp_agent_api
上面程序用到如下API: init_snmp(), snmp_sess_init(), snmp_open(), snmp_pdu_create(), read_objid(), snmp_add_null_var(), print_variable (), snmp_errstring(), snmp_sess_perror(), snmp_pdu_free(), snmp_close().
具体的API语义和语法, 参见相应的man手册或头文件.
在Rad Hat Linux 6.2环境中用如下命令编译该程序:gcc -g -I/usr/local/include -o snmpapp snmpapp.c -L/usr/local/lib -lsnmp
其中/usr/local为ucd-snmp 4.2.1的确省安装目录.
编译通过, 运行程序获得SNMP代理运行系统的描述. (在当前情况下, 当然是本机Red Hat Linux 6.2系统的描述). 当然, 必须事先在本机运行SNMP代理:# /usr/local/sbin/snmpd (必须是root用户)