2016-07-30 15 views
0

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_; 
    }; 
  1. Der Timer wurde in der Routing-Agent erklärt aodv.h

    friend class RouteRequestTimer; 
    RouteRequestTimer rrtimer; 
    
  2. 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; 
    } 
    
  3. Der Timer bei AODV initialisiert wurde. cc

    AODV::AODV(nsaddr_t id) : ..., rrtimer(this), ... { 
    } 
    
  4. 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

Antwort

1

Sie diese Schritte folgen müssen einen Timer in ns2 zu implementieren:

1) Definieren Sie Ihre Timer-Klasse in der aodv.h Datei als

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

2) folgen Definieren Sie ein Objekt dieser Klasse als eine Eigenschaft der AODV-Klasse in der aodv.h:

MyTimer mtimer; 

3) Machen Sie MyTimer Klasse als Freund Klasse des AODV in aodv.h

friend class MyTimer; 

4) In der AODV.cc Sie die Funktionalität von MyTimer definieren. In der Griff Funktion schreiben Sie den Code, den Sie bei Timer Ablauf ausgeführt werden soll:

void MovePacketToSendingBufferTimer::handle(Event* p) { 

} 

5) Im AODV.cc den Konstruktor von AODV Klasse finden und den Konstruktor der MyTimer Klasse aufrufen:

AODV::AODV(nsaddr_t id) : Agent(PT_AODV), 
      mtimer(this){ 
      ///body of constructor 
} 

6) Jetzt ist Ihr Timer einsatzbereit.Basierend auf dem Timer Nutzung können Sie den Handler an jeder beliebigen Stelle des Codes mit dieser Codezeile aufrufen:

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

mit der Ausführung von oben Linie Handler von MyTimer Klasse wird von 0,5 Sekunden ausgeführt werden, nachdem ist dies eine nützliche Beispiel für ns2-Timer: ns2-timers

+1

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

+0

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. –

Verwandte Themen