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

===============>>#1 票数:0

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

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

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

===============>>#2 票数:0

有关如何执行此操作的最简单的介绍是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;
}

  ask by user2225868 translate from so

未解决问题?本站智能推荐: