at aodv当节点收到路由请求时,它将检查它是否具有到目的地的有效路由,如果它没有有效路由,它将重新广播路由请求。我想在节点重新广播路由请求之前添加定时器。在定时器时间期间,如果节点接收具有相同ID的RREQ(这意味着节点接收RREQ两次),则丢弃RREQ,否则重新广播RREQ。我不知道如何编写这部分的代码。 计时器的代码 1.计时器是在aodv.h中定义的
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.cc初始化
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 :(得分:1)
您必须按照以下步骤在ns2中实现计时器:
1)在aodv.h文件中定义你的计时器类,如下所示
class MyTimer : public Handler {
public:
MyTimer(AODV* a) : agent(a) {}
void handle(Event*);
private:
AODV *agent;
Event intr;
};
2)将此类的对象定义为aodv.h中AODV类的属性:
MyTimer mtimer;
3)将MyTimer类作为aodv.h中AODV的友元类
friend class MyTimer;
4)在AODV.cc中,您必须定义MyTimer的功能。在handle函数中,编写要在计时器到期时执行的代码:
void MovePacketToSendingBufferTimer::handle(Event* p) {
}
5)在AODV.cc中找到AODV类的构造函数并调用MyTimer类的构造函数:
AODV::AODV(nsaddr_t id) : Agent(PT_AODV),
mtimer(this){
///body of constructor
}
6)现在您的计时器已准备就绪。根据计时器的使用情况,您可以使用以下代码行在代码的任意位置调用处理程序:
Scheduler::instance().schedule(&mtimer, new Event(), 0.5);
执行MyTimer类的上述行处理程序后将在0.5秒后执行 这是ns2定时器的一个有用示例:ns2-timers