2014-05-11 5 views
0

Я пишу новый агент, который можно использовать в одном хосте, связанном, по крайней мере, с четырьмя узлами. И хост с генератором трафика отправит пакет клиенту, после задержки он будет отправлен снова на хост. И расчет информации будет у хозяина. Однако в моем test.tcl (только два узла) пакет, полученный в клиенте, кажется, не отправить обратно на хост.Как отправить пакет обратно?

Может ли кто-нибудь дать мне руку? Неправильно ли была функция отправки? Должен ли я назначить IP-заголовок или переменную target_ или что-либо другое для отправки моего пакета?


AgentCPU.h

#ifndef ns_cpu_h 
#define ns_cpu_h 

#include <tclcl.h> 
#include "agent.h" 
#include "config.h" 
#include "packet.h" 
#include "trafgen.h" 


#define SAMPLERATE 8000 
struct hdr_task { 
    int total_time; 
    int size_; 
    int number; 
    int& size() { return size_;} 
    static int offset_; 
    inline static int& offset() { return offset_; } 
    inline static hdr_task* access (const Packet* p) { 
     return (hdr_task*) p->access(offset_); 
    } 
}; 
class AgentCPU : public Agent { 

public: 
    AgentCPU(); 
    virtual void recv(Packet *, Handler *); 

    virtual void sendmsg(int nbytes, const char *flags = 0); 

private: 
    double busy_time_; 
    float execute_time_; 
    float execute_time_exp; 
    double record_packet_Time_; 
    int npkts_; 
}; 

#endif 

AgentCPU.cc

#include "AgentCPU.h" 
#include "packet.h" 
#include "random.h" 
#include "ip.h" 
int hdr_task::offset_; 

static class TASKHeaderClass : public PacketHeaderClass { 
public: 
TASKHeaderClass() 
    :PacketHeaderClass("PacketHeader/TASKHEAD",sizeof(hdr_task)) { 
      bind_offset(&hdr_task::offset_); 
} 
} class_task_hdr; 

static class CPUClass : public TclClass { 
public: 
    CPUClass() : TclClass("Agent/AgentCPU") {} 
    TclObject* create(int, const char*const*) { 
     return (new AgentCPU()); 
    } 
} class_cpu_agent; 

AgentCPU::AgentCPU() : Agent(PT_TASK) 
{ 
    npkts_=0; 
    record_packet_Time_=0.0; 

bind("packetSize_",&size_); 
    bind("record_packet_Time_",&record_packet_Time_); 
    bind("npkt_",&npkts_); 
} 

void AgentCPU::sendmsg(int nbytes, const char* flags) 
{ 
    Packet *pkt =allocpkt(); 
    test++; 

    hdr_cmn *ch = hdr_cmn::access(pkt); 
    hdr_ip *iph= hdr_ip::access(pkt); 
    hdr_task *task= hdr_task::access(pkt); 

    task->number=Random::exponential(5000); 
    task->state=0; 
    task->total_time=0; 

    target_->recv(pkt); 
    idle(); 
} 
void AgentCPU::recv(Packet* pkt, Handler*) 
{ 
    hdr_task *task= hdr_task::access(pkt); 
    if(task->state==1) 
{ 
     if(task->number >2500) 
     { 
      task -> total_time += 2500; 
      task -> number -=2500; 
      task -> state=0; 

//   printf("exe 2500 and the packet exe number is %d\n",task->number); 
      target_->recv(pkt, (Handler*)0); 
     } 
     else 
     { 
      task ->total_time += task->number ; 
      task ->number =0; 

      ++npkts_; 
      record_packet_Time_+= task ->total_time; 
      Tcl& tcl =Tcl::instance(); 
      Packet::free(pkt); 
     } 
    } 
    else if (task->state==0) 
    { 
     int hold_time =Random::exponential(2000); 
     task->total_time += hold_time; 
     task->state=1; 
     Scheduler& s =Scheduler::instance(); 
     double delay = Random::exponential(0.2); 
     s.schedule(target_,pkt,delay); 

    } 
} 

Я попытался Модифицированное на saddr() и daddr() поле в заголовке IP

, когда я проследил второе поле пакета recv, и значение равно 0 и 1

Я думаю, что они представляют собой два узла.

Так я обменять два значения, так что адрес ЦСИ и адрес Dest обменяются

и пакет будет отправлен обратно на хост.

Но это приводит к неисправности односегментной ..

+0

возможно дубликат [как получить доступ значения в TCL скрипт из .CC файлов] (HTTP://stackoverflow.com/questions/23579525/how-to-access-value-in-tcl-script-from-cc-files) –

+0

мм ... это мой последний вопрос, и у меня появилась новая ошибка. – user3500804

ответ

0

Я решил эту проблему

я добавил заголовок IP-пакета для я получил

hdr_ip* ip=hdr_ip::access(pkt); 
ip.daddr()=1; // this int represent the node in your tcl script 

Однако, у меня есть еще одна проблема

Это сбой при использовании моего сценария tcl

после использовать Valgrind, программа, которая может помочь вам обнаружить утечку памяти

Я знаю, как глупо это вопрос,

Я думаю, формат трассировки вызывает эту ошибку

т.е.. Я не impelment правильный «Трассировка :: формат» для моего нового типа Packet

И я не комментировать код файла трассировки в моем TCL сценария как этого

set nf [open out.nam w] 
$nf nametrace-all $nf 
... 
... 

И когда я комментирую эту коду (включаю процедура «финиш»)

Все работает!Пакет может отправить на указанный узел и сегмента не Fault

Надеется, что это может помочь кому-то, кто имеет такой же вопрос, как я

Смежные вопросы