[英]how to send packet back?
我正在编写一个新的代理,该代理可以在与至少四个节点连接的一台主机中使用。 带有流量生成器的主机将把数据包发送到客户端,经过延迟后,它将再次发送到主机。 信息计算将在主机中。 但是,在我的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标头中的saddr()和daddr()字段
当我跟踪recv数据包的两个字段时,其值为0和1
我认为它们代表了两个节点。
所以我交换了两个值,所以src地址和dest地址将交换
数据包将被发送回主机。
但这会导致段故障..
我已经解决了这个问题
我为收到的数据包添加了ip标头
hdr_ip* ip=hdr_ip::access(pkt);
ip.daddr()=1; // this int represent the node in your tcl script
但是,我还有另一个问题
使用我的tcl脚本时它将崩溃
使用valgrind之后,该程序可以帮助您检测内存泄漏
我知道这个问题有多愚蠢,
我想是跟踪格式导致此错误
即。 我没有为我的新数据包类型强制使用正确的“ Trace :: format”
而且我没有像这样在我的tcl脚本中注释跟踪文件代码
set nf [open out.nam w]
$nf nametrace-all $nf
...
...
当我注释这些代码时(包括过程“完成”)
一切正常! 数据包可以发送到指定的节点并且没有段故障
希望这可以帮助像我一样有相同问题的人
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.