您好,我是omnet ++的新手。我正在尝试在omnet ++中实现简单的广播服务,而不使用inet。我在环形拓扑中有6个节点。 node [0]是源,node [3]是目的地。因此,想法是node [0]应该创建消息并通过其网关进行广播,直到到达目标为止,并在到达目标时将其删除。
我在下面附加了我的代码。我不确定这里是否存在逻辑错误,因为我可以编译代码。另外我不确定我是否在前进函数中正确使用了msg-> getArrivalGateId(),理想情况下,我将需要getIndex()函数。请让我知道我该如何解决。感谢您提供任何反馈意见。
void broadcast::initialize()
{
if (getIndex() == 0) {
MyMessage *msg = generateMessage();
scheduleAt(0.0, msg);
}
}
MyMessage *broadcast::generateMessage()
{
// Produce source and destination addresses.
int source = getIndex(); // our module index
//int n = getVectorSize(); // module vector size
int destination = (3);
int hopcount = 3;
char msgname[20];
sprintf(msgname, "Hello from-%d-to-%d, ", source, destination);
// Create message object and set source and destination field.
MyMessage *msg = new MyMessage(msgname);
msg->setSource(source);
msg->setDestination(destination);
msg->setHopcount(hopcount);
return msg;
}
void broadcast::handleMessage(cMessage *msg)
{
MyMessage *bmsg = check_and_cast<MyMessage *>(msg);
if (bmsg->getDestination() == getIndex()) {
delete bmsg;
// Generate another one.
EV << "Generating another message: ";
MyMessage *bmsg = generateMessage();
EV << bmsg << endl;
forwardMessage(bmsg);
}
else {
forwardMessage(bmsg);
}
}
void broadcast::forwardMessage(MyMessage *msg)
{
// Increment hop count.
// msg->setHopcount(msg->getHopcount()+1);
int size = gateSize("gate");
int baseId = gateBaseId("gate$o");
for (int i = 0; i < size; i++){
if(i != msg->getArrivalGateId()) {
EV << "Forwarding message " << msg ;
send(msg, baseId+i);
}
}
}
**事件#1 t = 0 routing.node [0](广播,id = 2)在selfmsg上,您好,从0到3,(MyMessage,id = 0)
send()/ sendDelayed():无法从0到3发送消息(MyMessage),您好,它当前处于计划事件中,正在两个模块之间进行-在模块(广播)routing.node中[0](id = 2),在t = 0时,事件#1 errorsnap
答案 0 :(得分:0)
gateId和gateIndex是两个完全不同的东西,不应混用。该ID是不透明的标识符,您不能承担任何责任。也就是说,您不应添加,减去ID并假定其有效。
您说对了,您应该使用getIndex函数。通常,到达消息的索引可作为msg->getArrivalGate()->getIndex()
使用。然后使用send(msg, "gate$o", index)
方法发送特定的门。