如何找出从每个发件人收到的数据包的数量

How to find out the number of received packets from each sender

在带有 INET 框架的 OMNET++ 中,我想知道每次发送收到了多少数据包 node.I 找到了下面的代码。谁能告诉我下面代码中“it->second++”命令的功能是什么?

std::map<L3Address, uint64_t> recPkt;
auto it = recPkt.find(senderAddr);
if (it == recPkt.end())
    recPkt[senderAddr] = 1;
else
    it->second++;

此外,谁能建议如何显示每个节点接收到的数据包数。

itstd::map 的一个元素的迭代器。迭代器类似于指针。 it 指向一对:<L3Address, uint64_t>。大概发送者的地址是这对的第一个元素,第二个是接收包的数量。
这对的第一个元素可以使用 it->first 获得,而第二个元素可以通过 it->second 获得。 操作 recPkt.find(senderAddr) 检查 recPkt 是否包含地址为 senderAddr:

的条目
  • 如果不是,it指向recPkt.end(),则创建一个新条目并将1设置为值(因为刚刚收到第一个数据包),
  • 如果 senderAddr 的条目已经存在,则使用 it->second++
  • 递增此元素(计数器)的第二个值

要将接收到的数据包的当前值显示到内部日志 window 可以使用:

for (auto it : recPkt) {
   EV << "From address " << it.first << " received " << it.second << " packets." << std::endl;   
}

但是,更好的方法是将这些值写入统计信息。最好的地方是模块的 finish() 方法:

void YourModule::finish() {
   // ..
   for (auto it : recPkt) {
      std::string name = "Received packet from ";
      name += it.first.str(); // address
      recordScalar(name, it.second);  
    } 
}

参考:C++ Reference, std::map

编辑

还有一件事。 recPkt 的声明即行:

std::map<L3Address, uint64_t> recPkt;

必须在您的 class 中。 recPkt 不能在使用前声明。