我正在编写一个新代理,可以在一个与至少四个节点连接的主机中使用。 并且具有流量生成器的主机将在延迟之后将数据包发送到客户端 它将再次发送给主持人。信息计算将在主机中进行。 但是,在我的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);
}
}
我曾尝试在ip header中修改saddr()和daddr()字段
当我跟踪recv包的两个字段时,值为0和1
我认为它们代表了两个节点。
所以我交换了两个值,所以src地址和dest地址将交换
,数据包将被发送回主机。
但它会导致Seg错误..
答案 0 :(得分:0)
我已经解决了这个问题
我为收到的数据包添加了ip标头
hdr_ip* ip=hdr_ip::access(pkt);
ip.daddr()=1; // this int represent the node in your tcl script
然而,我还有另一个问题
使用我的tcl脚本时会崩溃
使用valgrind后,该程序可以帮助您检测内存泄漏
我知道这个问题有多愚蠢,
我猜是跟踪格式导致此错误
即。我没有强迫正确的&#34; Trace :: format&#34;对于我的新数据包类型
我没有像我这样在我的tcl脚本中评论跟踪文件代码
set nf [open out.nam w]
$nf nametrace-all $nf
...
...
当我评论这些代码时(包括程序&#34;完成&#34;)
一切正常!数据包可以发送到指定节点而没有Segment Fault
希望这可以帮助那些像我一样有问题的人