(转)关于Ping协议的添加

这个协议网上有很多资料,在这里就不贴源码了,我想说说我在编译过程中遇到的问题,整理整理思路。

首先,这个协议简单易懂,一个节点在设定的时间发包,接收结点收到后,计算rtt的值,并回传一个echo包给接收结点。最后rtt的值利用tcl.eval这个函数记录在out[]数组当中。

那么我在编译过程中,遇到了两个问题,首先是说off_ip_未定义。这个错误的解决方法是,先定义off_ip_。即:

int off_ip_=hdr_ip::offset();

第二个问题是说no match for 'operator >>' in ' hdrip->src_>> *(Address::instance().NodeShift_[1],...

查了很多资料,后来发现可能是因为版本原因,必须写成:hdrip->src_.addr_>> Address::instance().NodeShift_[1],
   (Scheduler::instance().clock()-hdr->send_time) * 1000);

这样编译就通过了。

 

实际上,Ns2.29已经添加了Ping 协议。在/apps/文件夹中,大家可以直接写脚本测试。

最后转点关于send这个函数的问题吧,这也是我写协议的时候没明白的。

 

 

因为Agent/Ping 未定义send的OTCL method,故会通过cmd机制调用 PingAgent::command,参数

为"send"
// Send the packet
   send(pkt, 0);
而send会通过父类Agent 关于send的实现为:
void send(Packet* p, Handler* h) { target_->recv(p, h); }
这时即调用子类PingAgent的recv函数。
在PingAgent的recv函数中,有一个tcl.eval(out)调用,此时,out的值即包含 recv,所以,最终会调用

测试脚本中添加的otcl 过程 recv. 
不知明白否?其实,你跟踪一下代码流就可以知道整个流程,甚至是out的具体值了

posted on 2013-05-06 15:37  原来...  阅读(309)  评论(0编辑  收藏  举报

导航