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_;
};
La minuterie a été déclaré dans l'agent de routage aodv.h
friend class RouteRequestTimer; RouteRequestTimer rrtimer;
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; }
la minuterie a été initialisé à AODV. cc
AODV::AODV(nsaddr_t id) : ..., rrtimer(this), ... { }
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
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
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. –