C++ 可变大小的数据包

C++ 可变大小的数据包,c++,networking,simulation,ns-3,C++,Networking,Simulation,Ns 3,我试图定义一个数据包,其长度在ns-3模拟期间确定(将其视为下行链路上发送的数据包,其中包含调度信息,其长度取决于网络中可以在模拟期间加入/离开网络的节点数)。有人知道我该怎么做吗 传统的解决方案是先发送长度,然后发送数据: +------------+---------------------+ |uint32|t n | n-4字节的数据| +------------+---------------------+ 要进行解码,请读取前四个字节,然后使用这些字节中的值确定还有多少数据。关于如

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

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

+------------+---------------------+
|uint32|t n | n-4字节的数据|
+------------+---------------------+

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

关于如何进行解码的最简单介绍如下

实际上,如果要扩展此代码以存储可变大小的数据结构,可以执行以下操作:

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;
};
类MyHeader:公共头
{
公众:
//新方法
无效数据(uint16_t数据);
std::vector GetData(void)const;
静态TypeId GetTypeId(void);
//从页眉重写
虚拟uint32_t GetSerializedSize(void)const;
虚空序列化(缓冲区::迭代器开始)常量;
虚拟uint32_t反序列化(缓冲区::迭代器启动);
虚拟空白打印(std::ostream&os)常数;
私人:
std::向量m_数据;
};
我将跳过明显的GetData/AppendData方法。相反,我们可以关注序列化/反序列化方法:

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;
}
uint32\u t
MyHeader::GetSerializedSize(void)const
{
//要存储的两个字节的数据
返回m_data.size()*2;
}
无效的
MyHeader::Serialize(缓冲区::迭代器开始)常量
{
start.WriteHtonU32(GetSerializedSize());
对于(std::vector::const_迭代器i=m_data.begin();i!=m_data.end();i++)
{
start.WriteHtonU16(*i);
}
}
uint32\u t
MyHeader::反序列化(缓冲区::迭代器开始)
{
uint32_t len=start.readntou32();
对于(uint32_t i=0;i
谢谢,但我的问题是如何定义类似于可变大小数组的数据包。请注意,新字段是根据数据包的长度添加到数据包中的?它们应该如何定义?@user2225868:将数据读入缓冲区并对其进行解析?我不知道,这是非常标准的C++程序…