SNMP常用數據操作


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM