Я пытаюсь определить пакет, длина которого определяется во время моделирования ns-3 (под ним подразумевается пакет, отправляемый по нисходящей линии связи, содержащий информацию о расписании, длина которого зависит от количества узлов в сети, которые могут присоединиться / покинуть сеть во время моделирование). Кто-нибудь знает, как я мог бы подойти к этому?
Традиционное решение — сначала послать длину, а затем данные:
+------------+---------------------+
| uint32_t n | n - 4 bytes of data |
+------------+---------------------+
Чтобы декодировать, прочитайте первые четыре байта, а затем используйте значение в этих байтах, чтобы определить, сколько данных больше.
Самое простое введение о том, как это сделать, это 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. Вместо этого мы можем сосредоточиться на методах сериализации / десериализации:
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;
}