2016-07-30 21 views
0

在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,则丢弃该分组,否则将其转发。

    在此先感谢

    回答

    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的aodv.h

    friend class MyTimer; 
    

    4)在AODV.cc你必须定义MyTimer的功能。在处理函数编写要执行的计时器到期代码:

    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

    +1

    您的回答是非常有帮助的。如何在到期时间之前停止定时器。我需要在定时器时间(0.5)期间检查接收到的RREQ,如果节点接收到具有相同ID的RREQ,则丢弃该数据包并停止定时器。 – mona

    +0

    要取消定时器,您必须调用调度器的“取消”功能。您可以为“MyTimer”类定义一个“停止”函数,并在期望的时间调用此函数以在计时器到期之前取消该计时器。 –