SNMP常用數據操作
snmp編程中常見的數據類型基本上就是integer32/oct_str(字節數組)/counter64/timeticks/dateAndTime這些。很多其它的比如TruthValue這樣的數據在編程的時候一般都比較少用,而且一般都有對應的替代。
Counter32類型
Counter32其實對應C語言中的32位無符號整型(0~2^32-1)。在snmpv1中它的解釋是:“計數器是一個非負的整數,它遞增至最大值,而后歸零”。
對counter32的操作,在32位機器上,其一般使用unsigned int來表示。是比較簡單的數據類型,所以無需使用特別的操作。
Counter64類型
Counter64對應64位的計數器,它表示的范圍(0~2^64-1)就比counter32大多了,在net-snmp中提供了對它操作的相關函數。
Net-snmp中並沒有直接使用C語言中的64位無符號整型,而是使用了一個結構體來表示
struct counter64 { u_long high; u_long low; };
為什么這么做呢?這個不好說,可能是為了操作方便吧。在snmp++中定義了一個類Counter64來提供對這個數據類型的操作,它也是如同此處將其分為高位部分(hipart)和低位(lopart)部分。
同時還定義了一些用於操作counter64數據類型的函數。
typedef struct counter64 U64; #define I64CHARSZ 21 void divBy10(U64, U64 *, unsigned int *); void multBy10(U64, U64 *); void incrByU16(U64 *, unsigned int); void incrByU32(U64 *, unsigned int); NETSNMP_IMPORT void zeroU64(U64 *); int isZeroU64(const U64 *); NETSNMP_IMPORT void printU64(char *, const U64 *); NETSNMP_IMPORT void printI64(char *, const U64 *); int read64(U64 *, const char *); NETSNMP_IMPORT void u64Subtract(const U64 * pu64one, const U64 * pu64two, U64 * pu64out); void u64Incr(U64 * pu64out, const U64 * pu64one); void u64UpdateCounter(U64 * pu64out, const U64 * pu64one, const U64 * pu64two); void u64Copy(U64 * pu64one, const U64 * pu64two); int netsnmp_c64_check_for_32bit_wrap(U64 *old_val, U64 *new_val, int adjust); NETSNMP_IMPORT int netsnmp_c64_check32_and_update(struct counter64 *prev_val, struct counter64 *new_val, struct counter64 *old_prev_val, int *need_wrap_check);
在net-snmp中對Counter64數據的操作應該使用下面的函數來進行,而不用直接使用unsigned long long等原生的數據類型。為什么要這么做呢?因為這涉及到將counter64數據的解析轉換等操作。
具體可見asn_build_unsigned_int64函數,它在net-snmp-5.7.3\snmplib\asn1.c文件中。
u_char * asn_build_unsigned_int64(u_char * data, size_t * datalength, u_char type, const struct counter64 * cp, size_t countersize)
time ticks類型
time ticks:是一個時間單位,表示以0.01秒為單位計算的時間;
這其實就是一個32位無符號整型。這里要注意一下的是它的單位,在使用的時候應該進行單位換算。
DateAndTime類型
這是一個用來表示時間的數據類型,長度為11個字節。
在snmp中有具體的規定,每一個字節表示什么。
以前解釋過它,這里就不詳述的了。可用看這里http://www.cnblogs.com/oloroso/p/4595127.html