2013-04-17 29 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; 
}