2016-07-30 54 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」類定義一個「停止」函數,並在期望的時間調用此函數以在計時器到期之前取消該計時器。 –