在aodv节点接收到路由请求时,它将检查它是否有到目的地的有效路由,如果它没有有效的路由,它将重新传播路由请求。我想在节点重播广播路由请求之前添加定时器。在定时器时间内,如果节点接收到具有相同ID的RREQ(即节点接收RREQ两次),则丢弃RREQ,否则重播RREQ。我不知道如何编写这部分的代码。 计时器 1的代码定时器在定义aodv.h如何使用ns2在aodv中添加定时器
class RouteRequestTimer : public Handler {
public:
RouteRequestTimer(AODV* a) : agent(a) { busy_ = 0; }
void handle(Event*);
void start(double time);
void stop(void);
inline int busy(void) { return busy_; }
private:
AODV *agent;
Event intr;
int busy_;
};
计时器被宣布在路由代理aodv.h
friend class RouteRequestTimer; RouteRequestTimer rrtimer;
在aodv.cc,实现手柄功能
void RouteRequestTimer::handle(Event*) { busy_ = 0; #define interval 0.5 fprintf (stderr, "This is a test for the usage of timer.\n"); Scheduler::instance().schedule(this, &intr, interval); } void RouteRequestTimer::start(double time) { Scheduler &s = Scheduler::instance(); assert(busy_ == 0); busy_ = 1; s.schedule(this, &intr, time); } void RouteRequestTimer::stop(void) { Scheduler &s = Scheduler::instance(); assert(busy_); s.cancel(&intr); busy_ = 0; }
计时器在AODV初始化。立方厘米
AODV::AODV(nsaddr_t id) : ..., rrtimer(this), ... { }
定时器在接收的路径请求
void AODV::recvRequest(packet *p){ … … … Scheduler::instance().schedule(&rrtimer, p->copy(), inerval); … }
然后我重新编译NS2和编译没有完成误差函数中使用。 当我使用AODV运行网络上的TCL代码,这个错误出现
调度:事件UID无效
请如何解决这个错误,以及如何检查收到的路由请求ID的计时器,如果接收到具有相同ID的RREQ,则丢弃该分组,否则将其转发。
在此先感谢
您的回答是非常有帮助的。如何在到期时间之前停止定时器。我需要在定时器时间(0.5)期间检查接收到的RREQ,如果节点接收到具有相同ID的RREQ,则丢弃该数据包并停止定时器。 – mona
要取消定时器,您必须调用调度器的“取消”功能。您可以为“MyTimer”类定义一个“停止”函数,并在期望的时间调用此函数以在计时器到期之前取消该计时器。 –