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が受信された場合、パケットを破棄し、そうでなければそれを転送する。事前
あなたの答えは非常に役に立ちます。有効期限までにタイマーを停止する方法。ノードが同じIDを持つRREQを受信した後、パケットを破棄してタイマーを停止すると、受信したRREQをタイマー時間(0.5)の間にチェックする必要があります。 – mona
タイマをキャンセルするには、スケジューラの「キャンセル」機能を呼び出す必要があります。 「MyTimer」クラスの「停止」機能を定義し、この機能を呼び出して、有効期限前にタイマーをキャンセルすることができます。 –