繁体   English   中英

如何发回封包?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM