2016-07-30 1 views
0

A aodv Lorsque le nœud reçoit une demande d'itinéraire, il vérifie s'il a un itinéraire valide vers la destination, s'il n'a pas d'itinéraire valide, il rediffusera la demande d'itinéraire. Je souhaite ajouter un temporisateur avant que le nœud rediffuse la demande de routage. Au cours du temps de temporisation, si le nœud reçoit le code RREQ avec le même ID (ce qui signifie que le nœud reçoit le RREQ deux fois), ignorez le RREQ sinon rediffusez le RREQ. Je ne sais pas comment écrire le code de cette partie. Le code de minuterie 1. La minuterie a été défini dans aodv.hComment ajouter un temporisateur dans aodv en utilisant ns2

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. La minuterie a été déclaré dans l'agent de routage aodv.h

    friend class RouteRequestTimer; 
    RouteRequestTimer rrtimer; 
    
  2. en aodv.cc, mettre en œuvre la fonction poignée

    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. la minuterie a été initialisé à AODV. cc

    AODV::AODV(nsaddr_t id) : ..., rrtimer(this), ... { 
    } 
    
  4. La minuterie a été utilisé à la fonction qui reçoivent la demande d'itinéraire

    void 
    AODV::recvRequest(packet *p){ 
    … 
    … 
    … 
    Scheduler::instance().schedule(&rrtimer, p->copy(), inerval); 
    … 
    } 
    

Je recompiler NS2 et la compilation terminée sans erreur. Quand je lance le code tcl pour le réseau en utilisant AODV, cette erreur apparaît

planificateur: UID événement non valide

s'il vous plaît comment résoudre cette erreur et comment vérifier l'ID de demande d'itinéraire reçue sur la minuterie , si un RREQ avec le même identifiant est reçu, alors rejeter le paquet sinon le transférer.

Merci à l'avance

Répondre

1

Vous devez suivre ces étapes pour mettre en œuvre une minuterie NS2:

1) Définir votre classe de minuterie au fichier aodv.h que suivre

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

2) Définissez un objet de cette classe en tant que propriété de la classe AODV dans le fichier aodv.h:

MyTimer mtimer; 

3) Faire la classe MyTimer en tant que classe d'ami de la AODV dans aodv.h

friend class MyTimer; 

4) Dans le AODV.cc vous devez définir la fonctionnalité de MyTimer. Dans la fonction poignée écrire le code que vous voulez exécuter à l'expiration de la minuterie:

void MovePacketToSendingBufferTimer::handle(Event* p) { 

} 

5) Dans le AODV.cc trouver le constructeur de la classe AODV et appeler le constructeur de la classe MyTimer:

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

6) Maintenant Votre minuterie est prête à l'emploi.Basé sur l'utilisation de la minuterie, vous pouvez appeler le gestionnaire à un endroit quelconque de votre code avec cette ligne de code:

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

avec l'exécution du gestionnaire de ligne au-dessus de la classe MyTimer exécutera à 0,5 seconde après c'est utile exemple de minuteries ns2: ns2-timers

+1

Votre réponse est très utile. Comment arrêter la minuterie avant l'heure d'expiration. J'ai besoin de vérifier le RREQ reçu pendant le temps de la minuterie (0.5), si le noeud reçoit RREQ avec le même identifiant puis rejeter le paquet et arrêter le minuteur. – mona

+0

Pour l'annulation de la minuterie, vous devez appeler la fonction "annuler" du planificateur. Vous pouvez définir une fonction "stop" pour la classe "MyTimer" et appeler cette fonction à l'heure souhaitée pour annuler la temporisation avant son expiration. –