代码分析

第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用户)


相关内容