ns3可以根据数据包的序列号自己统计丢包,统计方法如下:
发送端
//添加头文件
#include "ns3/packet-loss-counter.h"
//在生成数据包时,添加包头
SeqTsHeader seqTs;
seqTs.SetSeq (m_sent);
Ptr<Packet> p = Create<Packet> (m_size-(8+4)); // 8+4 : the size of the seqTs header
p->AddHeader (seqTs);
接收端
//添加头文件
#include "ns3/packet-loss-counter.h"
//定义全局变量
PacketLossCounter m_lossCounter; //!< Lost packet counter
//收到数据包后,读取包头标号
SeqTsHeader seqTs;
packet->RemoveHeader (seqTs);
uint32_t currentSequenceNumber = seqTs.GetSeq (); //记录数据包序号
m_lossCounter.NotifyReceived (currentSequenceNumber);
//结束运行时
std::cout << "Total number of Packet lossed " << m_lossCounter.GetLost() << std::endl;
不过这种方法有个缺点,就是m_lossCounter只记录到目前为止接受序列中断层数据包,比如你发了五个数据包,收到的序列为0 1 2 4,那么显示丢包数为1,如果收到的序列为0 1 2 3,则不显示丢包。如果你要显示这类数据包的丢包数据的话,可以这样:
非断层丢包统计
大致思路是定义队列丢包为TraceSources,一旦发生丢包,就回调统计函数,进行丢包统计
//在main函数前定义全局变量及函数
uint32_t i = 0; //定义丢包数变量
static void DropCounter(Ptr<const QueueDiscItem> queue)
{
i++;
std::cout << "Total Drop Packet: "<< i << " at " << Simulator::Now ().GetSeconds () << " " <<std::endl;
}
//在main函数中,丢包回调丢包统计函数
//不过需要提前知道在那个节点上产生丢包
Config::ConnectWithoutContext ("/NodeList/0/$ns3::TrafficControlLayer/RootQueueDiscList/0/Drop", MakeCallback(&DropCounter));
不过这种方法需要知道在哪个节点上丢包的,这个可以在这里看
//在脚本里添加这句话
CommandLine cmd;
cmd.Parse(argc, argv);
//运行时
./waf --run scratch/filename --vis
出现图形化界面后,右键点击"show interface statistics" 如果收包和发包数不匹配就说明丢包了。
如果有不对的地方,别骂别骂…
以上,顺心顺意~!!!
|