我试图定义一个数据包,其长度在ns-3模拟期间确定(将其视为在下行链路上发送的包含调度信息的数据包,调度信息的长度取决于网络中的节点数量在模拟期间加入/离开网络)。有没有人有任何想法我可以如何处理这个?可变大小的数据包
Q
可变大小的数据包
1
A
回答
0
传统的解决方法是首先发送的长度,然后由数据:
+------------+---------------------+
| uint32_t n | n - 4 bytes of data |
+------------+---------------------+
为了解码,读出的第一个四个字节,然后使用在这些字节的值,以确定有多少更多的数据有是。
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;
}
相关问题
- 1. 数据包大小
- 2. Java:使用NIO读取可变大小的数据包
- 3. 可变大小的数组
- 4. 半径的最大数据包大小
- 5. sonarqube mssql数据包大小
- 6. OPUS数据包大小
- 7. HTTP/SOAP数据包大小
- 8. 可变大小
- 9. C++数组可变大小的数组
- 10. 最大HTTP数据包大小
- 11. 发现最大数据包大小
- 12. FFmpeg av_read_frame和最大数据包大小
- 13. Android最大UDP数据包大小
- 14. BSD上的TCP数据包的大小
- 15. 在bss和数据段中的整数可变大小
- 16. Oracle中用于数字的可变大小数据类型
- 17. 数据包的字节大小
- 18. 获取ARP数据包的大小
- 19. 空UDP和TCP数据包的大小?
- 20. 可变大小的C++数组
- 21. 可变大小的数组结构
- 22. 可变大小的指针数组C++
- 23. 为可变大小的布尔数组
- 24. 创建可变大小的数组
- 25. Java:可变大小的数组int
- 26. 可变大小的位集
- 27. CGContext的可变大小
- 28. 可变大小的类 - C++
- 29. 我可以更改DBD :: mysql使用的数据包大小吗?
- 30. F#不可变大小的窗口数据结构
谢谢,但我的问题是如何定义这样的数据包,它就像一个可变大小的数组。请注意,新的字段会根据其长度添加到数据包中?他们应该如何界定? – user2225868
@ user2225868:将数据读入缓冲区并解析它?我不知道,这是非常标准的C++编程... –