Bei aodv Wenn der Knoten eine Routenanfrage erhält, prüft er, ob er eine gültige Route zum Ziel hat. Wenn er keine gültige Route hat, wird die Route erneut gesendet. Ich möchte Timer hinzufügen, bevor der Knoten die Route requircast.Während der Timer-Zeit, wenn der Knoten erhalten RREQ mit der gleichen ID (das bedeutet, der Knoten erhalten die RREQ zweimal) dann verwerfen die RREQ andernfalls erneut die RREQ. Ich weiß nicht, wie ich den Code dieses Teils schreiben soll. Der Code des Timers 1. Der Timer wurde in aodv.h definiertSo fügen Sie einen Timer in aodv mit ns2 hinzu
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_;
};
Der Timer wurde in der Routing-Agent erklärt aodv.h
friend class RouteRequestTimer; RouteRequestTimer rrtimer;
In aodv.cc, implementieren Sie den Griff Funktion
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; }
Der Timer bei AODV initialisiert wurde. cc
AODV::AODV(nsaddr_t id) : ..., rrtimer(this), ... { }
Der Timer wurde in der Funktion verwendet, die die Routenanfrage
void AODV::recvRequest(packet *p){ … … … Scheduler::instance().schedule(&rrtimer, p->copy(), inerval); … }
Dann habe ich ohne Fehler beendet neu kompilieren ns2 und die Zusammenstellung erhalten. Als ich den tcl-Code für das Netzwerk mit AODV ausführen, werden diese Fehler
Scheduler: Event UID nicht gültig
bitte, wie diese Fehler zu lösen und wie die empfangene Routenanfrage-ID auf dem Timer überprüfen Wenn ein RREQ mit der gleichen ID empfangen wird, verwerfen Sie das Paket, andernfalls leiten Sie es weiter.
Vielen Dank im Voraus
Ihre Antwort ist sehr hilfreich. Wie man den Timer vor der Ablaufzeit stoppt. Ich muss die empfangene RREQ während der Timer-Zeit (0,5) überprüfen, wenn der Knoten RREQ mit der gleichen ID empfängt, dann das Paket verwerfen und den Timer stoppen. – mona
Zum Abbrechen des Timers müssen Sie die Funktion "Cancel" des Schedulers aufrufen. Sie können eine "stop" -Funktion für die "MyTimer" -Klasse definieren und diese Funktion zum gewünschten Zeitpunkt aufrufen, um den Timer vor Ablauf abzubrechen. –