OMNeT++中如何回复根节点报文同时仅向子节点发消息避免误发至根
你当前的代码在发送l2消息时会遍历所有out出口,包含了通往根节点的出口,只需要排除该出口即可,修改步骤如下:
- 调整
senderId的作用域,将其定义在处理确认报文的逻辑外层,方便后续发送新消息时调用 - 发送
l2消息的循环中,跳过对应根节点的出口索引
修改后的完整代码如下:
// 先定义senderId,初始值设为无效值-1 int senderId = -1; cGate * sender = msg->getSenderGate(); for (cModule::GateIterator i(this); !i.end(); i++) { cGate *gate = i(); std::string gateStr = gate->getName(); if (gateStr == "out" && gate->getPathEndGate()->getOwnerModule() == sender->getOwnerModule() ) { senderId = gate->getIndex(); cMessage *reply=new cMessage("reply"); send(reply, "out", senderId); } } // 发送l2消息时跳过senderId对应的出口 for (int i = 0; i < gateSize("out"); i++) { // 跳过通往根节点的出口 if (i == senderId) continue; cMessage *l2 = new cMessage ("l2"); send(l2, "out", i); }
上述代码中senderId对应的就是你收到消息时,通往消息发送方(根节点/父节点)的出口索引,发送新消息时直接跳过该索引即可避免把l2消息发往根节点,同时不影响向其他子节点发送消息。
内容的提问来源于stack exchange,提问作者hzeb
相关产品推荐
相关产品推荐

