关于net-snmp中的U64类型(这不是一个简单的数值)

原创
2015/06/10 17:59
阅读数 4.8K

原由

[TOC]

在编写agent程序的时候,有一个地方是给管理端发送一个U64类型的数据的。即节点MIBS中有一个数据的类型是counter64的。使用mib2c生成的.c文件中有这么一句。

U64    devicepfBindth = 0;  /* XXX: set default value */

这致使我以为这个U64的类型是无符号的64位整形。结果编译的时候出问题了。

devicepfBindth.c:20:1: error: invalid initializer
 U64    devicepfBindth = 0;  /* XXX: set default value */
 ^

解决

那么只有先找到这个U64的类型了。 一番搜索终于在/net-snmp/include/net-snmp/library/int64.h文件中找到了

typedef struct counter64 U64;

看看counter的定义

counter:计数器是一个非负的整数,它递增至最大值,而后归零。SNMPv1中定义的计数器是32位的,即最大值为4294967295(2^32-1); Counter64:与Counter32相同,最大值为64位的最大值-1。

可以在..../net-snmp/include/net-snmp/library/asn1.h文件中找到struct counter64的定义。 定义在75行位置开始

    75	    struct counter64 {
    76	        u_long          high;
    77	        u_long          low;
    78	    };

知道了这个结构体的原型,那么就很好处理了。 也不需要我们多做处理,它已经提供了一下函数

    void            divBy10(U64, U64 *, unsigned int *);
    void            multBy10(U64, U64 *);
    void            incrByU16(U64 *, unsigned int);
    void            incrByU32(U64 *, unsigned int);
    
    void            zeroU64(U64 *);
    int             isZeroU64(const U64 *);
    
    void            printU64(char *, const U64 *);
    
    void            printI64(char *, const U64 *);
    int             read64(U64 *, const char *);
    
    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);
展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
1 评论
0 收藏
0
分享
返回顶部
顶部