吐槽ns2

一年前接触ns2到现在,中间断断续续,或为了学而看,或为了用而学,大概入了门。写这个的目的其一是为了开始自己的博客之旅,虽然是一些浅显的东西,总有些感想。其二是想把一些走过的弯路说说,因为ns2实在让我吃过不少的苦,因此不吐不快,题为吐槽正为此意。

第一篇:坑爹的代码习惯。

如果你是从java/c#转过来看的ns2,你可能会跟我有同样的感受。看下边这段代码:

static class AODVHeaderClass : public PacketHeaderClass {
public:
        AODVHeaderClass() : PacketHeaderClass("PacketHeader/AODV",
                                              sizeof(hdr_all_aodv)) {
	  bind_offset(&hdr_aodv::offset_);
	} 
} class_rtProtoAODV_hdr;

第一次看到这段代码,我那个兴奋啊,他妈的,学了好久的静态类从来没见过,没想到竟然在这儿看到啦。但是,再看你总觉得不太对,然后你就发现他奶奶的这是一个静态对象,坑爹啊,将类声明定义和对象的定义放在一行里。这他妈的难道是C++的编程习惯,然后你翻开C++ primer看到stanley lippman老爷子已经说过:




注:这里纯属对于当时迷惑不解的气愤,代码中这样写有时候显得更简练。先这样,有时间接着写第二篇。

第二篇:Packet分组传输

如果看的是ns2手册(我看的网友翻译的中文版),就像探险一样,一度以为柳暗花明来一村,却桃花潭水又一层。手册讲分类器细致入微,你看代码却是云里雾里。我在写路由层agent时,有三个东西一直困扰我,一个是target_另一个是classify 的find方法再就是packet的实现。而坑爹的手册竟然是点到为止。

1. packet 从路由层发送时,一般会用Schedule(target_ ,..)的方式,这主要是考虑到delay(个人观点),我将它修改为,target_->recv,然后它直接调用的是ll.cc的recv,说明这个target_其实ll的一个指针。至于它啥时候初始化的,我没有注意,但是可以用tcl直接设置。例如:

set ll [$node_($i) set ll_(0)]
$ll up-target $agent
$agent target $ll

2.而从下层往上层传的时候,就是用uptarget_啦,但是一般这里要经过分类器,通过classify 的find方法再查找。classify find方法就与ns2初始化时,tcl与c++绑定部分有关,为每个对象建立shadow并且为每个对象建立hash值,以便以后查找,这个不太影响,我也没有深究。

3.packet类的实现方式,其实就是一个很像智能指针的模式,即通过一个计数器,记录有几个packet对象使用这块内存。说白了层层之间只不过再传递指针而已,根本不用复制packet,即计数器不会增加。最后自己的agent将它free掉就行了。
4.最坑爹的就是这个free,千万不要写free(p),会直接查找到原来c中malloc和free,而且不知道为什么它也不出错,靠,所以一定要Packet::free(p),毕竟在类的作用域外,其实这是基础,写错了只能怪自己大意啦。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值