Timer 计时器过期时ns2重播数据包

Timer 计时器过期时ns2重播数据包,timer,ns2,Timer,Ns2,当等待计时器过期时,我需要重播数据包,我遵循在中定义的步骤,定义代理和计时器类;交叉引用;代理构造函数中定时器对象的初始化;并最终为B_类抑制终止(事件*)。当执行到达 agent->rebroadcast((Packet*)p,0)它将中止,并显示以下消息“无效SDVCAST数据包类型”。从事件到数据包的转换是否导致问题 class SDVCAST; class B_suppression_Timer : public TimerHandler { friend class SDVC

当等待计时器过期时,我需要重播数据包,我遵循在中定义的步骤,定义代理和计时器类;交叉引用;代理构造函数中定时器对象的初始化;并最终为B_类抑制终止(事件*)。当执行到达
agent->rebroadcast((Packet*)p,0)它将中止,并显示以下消息“无效SDVCAST数据包类型”。从事件到数据包的转换是否导致问题

class SDVCAST;

class B_suppression_Timer : public TimerHandler {
    friend class SDVCAST;
public:
    B_suppression_Timer (SDVCAST *s){agent = s;};
    virtual void expire (Event *p);
private:
    SDVCAST *agent;
};

class SDVCAST: public Agent
{ //define object from timer  
  B_suppression_Timer  bstimer;
}
//initialized timer in Constructor of the SDVCAST
SDVCAST::SDVCAST(nsaddr_t id) : Agent(PT_SDVCAST),
                bstimer(this){
}

// start timer
void
SDVCAST::weightepersistence(Packet *p, double delay){
  bstimer.resched(delay);
}


// define expire of bstimer
void
B_suppression_Timer::expire(Event *p){
    agent->rebroadcast((Packet*)p, 0);
}

将新的数据包类型
PT_SDVCAST
添加到
common/packet.h

static const packet_t PT_ SDVCAST = 73;

        // insert new packet types here
static packet_t       PT_NTYPE = 74; // This MUST be the LAST one
.
.

                type == PT_SDVCAST)

.
.           
               name_[PT_SDVCAST]= "SDVCAST"
还可以将
SDVCAST
添加到
tcl/lib/ns packet.tcl
ns default.tcl
ns agent.tcl


编辑:“分段错误”的答案

“NS2数据包数据结构的实现不符合数学 ns2模拟中的数据包保留了所有的数据包头 用于NS2中实现的任何协议。例如,DSR路由 数据包可以保存DSDV、AODV,甚至PING应用程序头 因此,直到今天,ns2模拟中使用的数据包都有 标头大小约为40~64KB。并且不会删除任何数据包以释放 它保存到模拟结束的内存。对于典型的 模拟ns2中的100个节点交换了大约1M个数据包(共 当然,您可以重用已通过释放的数据包 Packet::free(Packet*)。要了解它的实现,请查看 文件common/packet{.h、.cc}),您可以持有其中的10%,100K个数据包, 您可以使用至少100K*64KB->6.4GB的内存,这是肯定的 会使您的计算机崩溃(即使它是超级服务器)。”

等等,等等,看


将新的数据包类型
PT_SDVCAST
添加到
common/packet.h

static const packet_t PT_ SDVCAST = 73;

        // insert new packet types here
static packet_t       PT_NTYPE = 74; // This MUST be the LAST one
.
.

                type == PT_SDVCAST)

.
.           
               name_[PT_SDVCAST]= "SDVCAST"
还可以将
SDVCAST
添加到
tcl/lib/ns packet.tcl
ns default.tcl
ns agent.tcl


编辑:“分段错误”的答案

“NS2数据包数据结构的实现不符合数学 ns2模拟中的数据包保留了所有的数据包头 用于NS2中实现的任何协议。例如,DSR路由 数据包可以保存DSDV、AODV,甚至PING应用程序头 因此,直到今天,ns2模拟中使用的数据包都有 标头大小约为40~64KB。并且不会删除任何数据包以释放 它保存到模拟结束的内存。对于典型的 模拟ns2中的100个节点交换了大约1M个数据包(共 当然,您可以重用已通过释放的数据包 Packet::free(Packet*)。要了解它的实现,请查看 文件common/packet{.h、.cc}),您可以持有其中的10%,100K个数据包, 您可以使用至少100K*64KB->6.4GB的内存,这是肯定的 会使您的计算机崩溃(即使它是超级服务器)。”

等等,等等,看


感谢您的回复,这些步骤已经完成。我测试了协议,所以发送和接收Hello消息工作正常。通过使用eclipse调试ns2,我发现从事件到数据包的转换是不正确的,不知道为什么!。因此,我必须转换到Handler类,并使用handle函数代替TimerHandler及其“expire”。错误消息“无效SDVCAST数据包类型”消失,但不幸的是,执行停止并接收分段错误消息。
分段错误
可能会在模拟过于复杂时出现,或者无法使用ns2处理。有时候操作系统的改变会有所帮助。我已经在Ubuntu 12.04上安装了ns 2.35。是的,没错,我正试图在DV Cast协议上实现安全层,它本身是复杂的。尽管通过多种功能降低了复杂性。我有必要使用计时器,我会怎么做?提前感谢。请查看我编辑的关于“分段错误”的回答。谢谢@Knud Larsen,我使用下一条语句:Scheduler::instance().schedule(&bstimer,p->copy(),timeout)转换为使用Handler类而不是TimerHandler;这个很好用。但我无法在计时器时间内检查计时器状态。感谢您的回复,此步骤已经完成。我测试了协议,所以发送和接收Hello消息工作正常。通过使用eclipse调试ns2,我发现从事件到数据包的转换是不正确的,不知道为什么!。因此,我必须转换到Handler类,并使用handle函数代替TimerHandler及其“expire”。错误消息“无效SDVCAST数据包类型”消失,但不幸的是,执行停止并接收分段错误消息。
分段错误
可能会在模拟过于复杂时出现,或者无法使用ns2处理。有时候操作系统的改变会有所帮助。我已经在Ubuntu 12.04上安装了ns 2.35。是的,没错,我正试图在DV Cast协议上实现安全层,它本身是复杂的。尽管通过多种功能降低了复杂性。我有必要使用计时器,我会怎么做?提前感谢。请查看我编辑的关于“分段错误”的回答。谢谢@Knud Larsen,我使用下一条语句:Scheduler::instance().schedule(&bstimer,p->copy(),timeout)转换为使用Handler类而不是TimerHandler;这个很好用。但我无法在计时器时间内检查计时器状态。