2013-04-17 43 views
1

我试图定义一个数据包,其长度在ns-3模拟期间确定(将其视为在下行链路上发送的包含调度信息的数据包,调度信息的长度取决于网络中的节点数量在模拟期间加入/离开网络)。有没有人有任何想法我可以如何处理这个?可变大小的数据包

回答

0

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

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

为了解码,读出的第一个四个字节,然后使用在这些字节的值,以确定有多少更多的数据有是。

+0

谢谢,但我的问题是如何定义这样的数据包,它就像一个可变大小的数组。请注意,新的字段会根据其长度添加到数据包中?他们应该如何界定? – user2225868

+0

@ user2225868:将数据读入缓冲区并解析它?我不知道,这是非常标准的C++编程... –

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; 
}