IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> NS3数据包时延计算 -> 正文阅读

[C++知识库]NS3数据包时延计算

如果要在接收端得到数据包的传输时延,那么就需要在接收端得到数据包的发送时间和数据包到达时间,后者非常简单,直接在收到包的时候

Simulator::Now ().GetSeconds ()

即可,而怎样得到数据包的发送时间呢。有三种方法:

  1. 创建跟踪源并使用回调来获取每个数据包的创建/发送时间和发送/接收时间。 然后你可以计算延迟
  2. 使用标签来标记数据包的创建/发送时间,并在收到时读取此标签并计算延迟
  3. 使用标头(或仅标头中的字段)包含创建/发送的时间,并在收到标头时读取该标头

这里介绍第二种方法,第二种方法在examples/stats/wifi-example-apps.cc中使用过,其建立了一个TimestampTag的标签类。单独拿出来的话是这样的

一、建立TimestampTag.h文件

#ifndef TIMESTAMPTAG_H
#define TIMESTAMPTAG_H



#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/application.h"

#include "ns3/stats-module.h"
#include <ostream>

using namespace  ns3;

class TimestampTag : public Tag {
public:
  static TypeId GetTypeId (void);
  virtual TypeId GetInstanceTypeId (void) const;

  virtual uint32_t GetSerializedSize (void) const;
  virtual void Serialize (TagBuffer i) const;
  virtual void Deserialize (TagBuffer i);

  // these are our accessors to our tag structure
  void SetTimestamp (Time time);
  Time GetTimestamp (void) const;

  void Print (std::ostream &os) const;

private:
  Time m_timestamp;

  // end class TimestampTag
};

#endif

二、建立TimestampTag.cc


#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include   "ns3/internet-module.h"
#include "ns3/application.h"
#include "ns3/stats-module.h"

#include "TimestampTag.h"

#include <ostream>

using namespace  ns3;

TypeId 
TimestampTag::GetTypeId (void)
{
  static TypeId tid = TypeId ("TimestampTag")
    .SetParent<Tag> ()
    .AddConstructor<TimestampTag> ()
    .AddAttribute ("Timestamp",
                   "Some momentous point in time!",
                   EmptyAttributeValue (),
                   MakeTimeAccessor (&TimestampTag::GetTimestamp),
                   MakeTimeChecker ())
  ;
  return tid;
}
TypeId 
TimestampTag::GetInstanceTypeId (void) const
{
  return GetTypeId ();
}

uint32_t 
TimestampTag::GetSerializedSize (void) const
{
  return 8;
}
void 
TimestampTag::Serialize (TagBuffer i) const
{
  int64_t t = m_timestamp.GetNanoSeconds ();
  i.Write ((const uint8_t *)&t, 8);
}
void 
TimestampTag::Deserialize (TagBuffer i)
{
  int64_t t;
  i.Read ((uint8_t *)&t, 8);
  m_timestamp = NanoSeconds (t);
}

void
TimestampTag::SetTimestamp (Time time)
{
  m_timestamp = time;
}
Time
TimestampTag::GetTimestamp (void) const
{
  return m_timestamp;
}

void 
TimestampTag::Print (std::ostream &os) const
{
  os << "t=" << m_timestamp;
}

三、建立wscript文件

def build(bld):
    obj = bld.create_ns3_module('BwProb', ['core','network','internet'])
    obj.source = [
        'model/TimestampTag.cc',
        ]
    headers = bld(features='ns3header')
    headers.module = 'BwProb'
    headers.source = [
        'model/TimestampTag.h',
        ]

然后将TimestampTag.cc和TimestampTag.h放在model文件夹下,建立个文件夹,文件夹的名字要与wscript文件中的create_ns3_module的一致,我这里是BwProb,将model文件夹和wscript文件放在进去,如:
在这里插入图片描述
然后

./waf  configure
./waf bulid

之后就能一直用了

四、计算时延

在发送数据包和接收数据包的文件中引用头文件#include "ns3/TimestampTags.h"
发出数据包之前:

      p = Create<Packet> (m_size);
   
      TimestampTag timestamp;
      timestamp.SetTimestamp(Simulator::Now());
      p->AddByteTag(timestamp);

接受数据包时:

TimestampTag timestamp;
packet->FindFirstMatchingByteTag (timestamp);
Time tx = timestamp.GetTimestamp();

//计算时延,并转换为double类型,方便计算
Time txdelay = Simulator::Now() - tx;
double delay = txdelay.ToDouble(Time::MS);

参考:https://groups.google.com/g/ns-3-users/c/4ZIBw4O0UfQ

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 18:17:37  更:2022-04-22 18:18:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:23:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码