【问题标题】:Variable sized packet可变大小的数据包
【发布时间】:2013-04-17 22:47:40
【问题描述】:

我正在尝试定义一个数据包,其长度在 ns-3 模拟期间确定(将其视为在下行链路上发送的包含调度信息的数据包,其长度取决于网络中可以加入/离开的节点数模拟期间的网络)。有谁知道我该如何解决这个问题?

【问题讨论】:

    标签: c++ networking simulation ns-3


    【解决方案1】:

    传统的解决方案是先发送长度,后发送数据:

    +------------+---------------------+
    | uint32_t n | n - 4 bytes of data |
    +------------+---------------------+
    

    要解码,请读取前四个字节,然后使用这些字节中的值来确定还有多少数据。

    【讨论】:

    • 谢谢,但我的问题是如何定义这样一个类似于可变大小数组的数据包。注意到新字段是根据数据包的长度添加到数据包中的吗?应该如何定义?
    • @user2225868:将数据读入缓冲区并解析?我不知道,那是相当标准的 C++ 编程......
    【解决方案2】:

    如何做到这一点最简单的介绍是http://www.nsnam.org/support/faq/miscellaneous/#table

    在实践中,如果你想扩展这段代码来存储一个可变大小的数据结构,你可以这样做:

    class MyHeader : public Header
    {
    public:
      // new methods
      void AppendData (uint16_t data);
      std::vector<uint16_t> GetData (void) const;
    
      static TypeId GetTypeId (void);
      // overridden from Header
      virtual uint32_t GetSerializedSize (void) const;
      virtual void Serialize (Buffer::Iterator start) const;
      virtual uint32_t Deserialize (Buffer::Iterator start);
      virtual void Print (std::ostream &os) const;
    private:
      std::vector<uint16_t> m_data;
    };
    

    我将跳过明显的 GetData/AppendData 方法。相反,我们可以专注于 Serialize/Deserialize 方法:

    uint32_t 
    MyHeader::GetSerializedSize (void) const
    {
      // two bytes of data to store
      return m_data.size() * 2;
    }
    void 
    MyHeader::Serialize (Buffer::Iterator start) const
    {
      start.WriteHtonU32(GetSerializedSize());
      for (std::vector<uint16_t>::const_iterator i = m_data.begin(); i != m_data.end(); i++) 
        {
          start.WriteHtonU16 (*i);
        }
    }
    uint32_t 
    MyHeader::Deserialize (Buffer::Iterator start)
    {
      uint32_t len = start.ReadNtohU32 ();
      for (uint32_t i = 0; i < len; i++) {
        m_data.append(start.ReadNtohU16())
      }
      return 4+len*2;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-16
      • 2016-01-08
      • 1970-01-01
      • 2010-12-01
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      相关资源
      最近更新 更多