在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,則丟棄該分組,否則將其轉發。
在此先感謝
您的回答是非常有幫助的。如何在到期時間之前停止定時器。我需要在定時器時間(0.5)期間檢查接收到的RREQ,如果節點接收到具有相同ID的RREQ,則丟棄該數據包並停止定時器。 – mona
要取消定時器,您必須調用調度器的「取消」功能。您可以爲「MyTimer」類定義一個「停止」函數,並在期望的時間調用此函數以在計時器到期之前取消該計時器。 –