ns2中AODV协议HDR_CMN(p)的含义

刚开始看AODV协议就被两个函数难到:HDR_CMN(p)HDR_IP(p),经查功能都差不多,以HDR_CMN(p)为例说明。
代码:


struct hdr_cmn *ch = HDR_CMN(p);


结构体hdr_cmn的定义在:/ns-allinone-2.34/ns-2.34/common/packet.h570行。
HDR_CMN(p)
实际上是一个宏命令,在packet.h53行:


#define HDR_CMN(p)      (hdr_cmn::access(p))


hdr_cmn::access(p)
的定义在packet.h619行能找到:


inline static hdr_cmn* access(const Packet* p) {
         return (hdr_cmn*) p->access(offset_);
     }


这里实际上是调用的类Packetaccess(offset_)函数,该函数的定义在484行:


inline unsigned char* access(int off) const {
        if (off < 0)
            abort();
        return (&bits_[off]);
    }


bits_packet类的成员变量,代表包头数据,实际上是一个无符号字符串的起始指针,定义如下:


unsigned char* bits_;    // header bits


因此,&bits_[off]就好理解了,它应该是相对于包头off个字节地址偏移之后的指针。

这样看来,HDR_CMN(p)执行的结果应该是将包头数据偏移offset_个字节之后的指针强制转换成hdr_cmn*类型之后返回,offset_在结构体hdr_cmn中定义。

而同样的,HDR_IP(p)返回的也是packet中的偏移offset_字节的指针,只不过强制转换成了hdr_ip*类型,同时偏移量offset_在结构体hdr_ip中定义,与HDR_CMN(p)不同。

综上所述,HDR_CMN(p)HDR_IP(p)实际上都是返回的数据包中的数据指针,只不过偏移量不同而已,其实就是因为这两个结构体中的数据位于数据包的不同段,通过不同的偏移量取出。

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值