UCD-SNMP代碼示例精講
經過對SNMP協議的學習,我們接下來對UCD-SNMP軟件進行一個實例操作。那么前面我們已經講述了有關于這個軟件的一些基本內容,下面的網絡管理程序我們將詳細地剖析一下。
一個簡單的SNMP網絡管理程序
下面, 讓我們先應用ucd-snmp寫一個的SNMP網絡程序, 從應用程序的角度嘗試一下這個軟件包的使用. 這個程序是如此地簡單, 不支持任何命令行參數, 僅僅從代理程序獲得關于系統(tǒng)的描述.
程序代碼如下:
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環(huán)境不做任何事情.
第21行, 打開一個snmp會話. 在下面的會話過程中使用API snmp_open()返回的指針. 關于snmp_open(), 參見相應的man手冊.
第22-24行, 創(chuàng)建一個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環(huán)境中用如下命令編譯該程序:gcc -g -I/usr/local/include -o snmpapp snmpapp.c -L/usr/local/lib -lsnmp
其中/usr/local為ucd-snmp 4.2.1的確省安裝目錄.
編譯通過, 運行程序獲得SNMP代理運行系統(tǒng)的描述. (在當前情況下, 當然是本機Red Hat Linux 6.2系統(tǒng)的描述). 當然, 必須事先在本機運行SNMP代理:# /usr/local/sbin/snmpd (必須是root用戶)