2014-04-04 69 views
5

我正在尋找一種方法,通過一個帶有Boost Asio的套接字來發送由自定義數據結構組成的數據包。目前我明白你可以用標準的boost asio緩衝區發送一個字符串(在boost :: asio :: write(..)方法中)。在Boost Asio緩衝區中封裝結構

是否可以將填充的結構中的數據發送到服務器或客戶端?如果是的話,我該如何做,因爲我找不到這方面的文件。

+0

@AndrewBarber笑@關閉了這個問題 - 我不完全同意這太寬泛本身(它的標記[標籤:升壓ASIO]畢竟,並提到他知道如何使用_boost ASIO' buffer'_)。我的答案鏈接到他無法找到的文檔部分。但我看到你缺少的東西 - 上下文和示例代碼:) – sehe

+0

@sehe嗯......當然,我明白了。重啓! –

回答

5

您可以按位複製POD對象。只要T是POD結構,Asio就接受boost/std array<T, N>T[]vector<T>緩衝區。

否則,您可以使用Boost Serialization來序列化您的數據。

最後,在Boost Spirit中有一些支持二進制文件(二進制雙字(big-endian/little-endian),二進制浮點數)。

更新例子:

#include <memory> 
#include <boost/asio.hpp> 

int main() 
{ 
    struct { float a, b; } arr[10]; 

    auto mutable_buffer = boost::asio::buffer(arr); 
} 

看到它Live On Coliru

+0

因此,例如我可以使用新創建的結構作爲緩衝區?如果我有以下幾點:'struct {float:{pos_l;}}; float pos2; }' – Dries

+0

那麼,有可能直接說:從指針p的n個字節?或者是該複製是強制性的? – Deduplicator

+0

如果使用'boost :: asio :: buffer(...)',則沒有副本。 **編輯**在coliru上添加了一個實例 – sehe

0

這裏一些適用於m的例子E:

void callback(STRUCT_A& s) 
{ 
    f_strand.post(boost::bind(f, boost::asio::buffer(&s, sizeof(s)))); 
} 

void f(boost::asio::mutable_buffers_1 v) 
{ 
    STRUCT_A *a = boost::asio_buffer_cast<STRUCT_A*>(v); 
} 
相關問題