2016-07-30 16 views
0

at aodvノードがルート要求を受信すると、有効なルートがない場合はルート要求を再ブロードキャストします。ノードがルート要求を再ブロードキャストする前にタイマーを追加したい。ノードが同じIDでRREQを受信した場合(ノードがRREQを2回受信することを意味する)、RREQを破棄する。私はこの部分のコードを書く方法を知らない。 タイマ1のコードタイマがaodv.hns2を使用して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_; 
    }; 
で定義された
  • タイマが

    friend class RouteRequestTimer; 
    RouteRequestTimer rrtimer; 
    
  • aodv.hルーティングエージェントに宣言されました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), ... { 
    } 
    
  • タイマーccが

    void 
    AODV::recvRequest(packet *p){ 
    … 
    … 
    … 
    Scheduler::instance().schedule(&rrtimer, p->copy(), inerval); 
    … 
    } 
    
  • は、その後、私はNS2を再コンパイルルート要求とエラーなしで完了し、コンパイルを受け取る機能で使用しました。 私はAODVを使用してネットワークのTCLのコードを実行すると、このエラーが表示され

    スケジューラ:イベントUIDが有効でない

    してくださいどのようにこのエラーを解決する方法と、タイマーで受信した経路要求IDをチェックします同じIDを有するRREQが受信された場合、パケットを破棄し、そうでなければそれを転送する。事前

    答えて

    1

    ありがとうございますNS2でタイマーを実装するために次の手順を実行しなければなりません。

    1)

    class MyTimer : public Handler { 
        public: 
        MyTimer(AODV* a) : agent(a) {} 
        void handle(Event*); 
        private: 
        AODV *agent; 
        Event intr; 
    }; 
    

    2に従うようaodv.hファイルであなたのTimerクラスを定義します)このクラスのオブジェクトは、aodv.hのAODVクラスのプロパティとして定義します。

    3)あなたがMyTimerの機能を定義しなければなりませんAODV.ccで)aodv.h

    friend class MyTimer; 
    

    4にAODVのフレンドクラスとして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)今すぐタイマーを使用できます。これは便利です 後MyTimerクラスの上の行ハンドラの実行に

    Scheduler::instance().schedule(&mtimer, new Event(), 0.5); 
    

    は0.5秒で実行されます:タイマーの使用状況に基づいて、あなたのコード行を使用して、コードの任意の場所でハンドラを呼び出すことができますns2タイマーの例:ns2-timers

    +1

    あなたの答えは非常に役に立ちます。有効期限までにタイマーを停止する方法。ノードが同じIDを持つRREQを受信した後、パケットを破棄してタイマーを停止すると、受信したRREQをタイマー時間(0.5)の間にチェックする必要があります。 – mona

    +0

    タイマをキャンセルするには、スケジューラの「キャンセル」機能を呼び出す必要があります。 「MyTimer」クラスの「停止」機能を定義し、この機能を呼び出して、有効期限前にタイマーをキャンセルすることができます。 –

    関連する問題