我正在尋找一種方法,通過一個帶有Boost Asio的套接字來發送由自定義數據結構組成的數據包。目前我明白你可以用標準的boost asio緩衝區發送一個字符串(在boost :: asio :: write(..)方法中)。在Boost Asio緩衝區中封裝結構
是否可以將填充的結構中的數據發送到服務器或客戶端?如果是的話,我該如何做,因爲我找不到這方面的文件。
我正在尋找一種方法,通過一個帶有Boost Asio的套接字來發送由自定義數據結構組成的數據包。目前我明白你可以用標準的boost asio緩衝區發送一個字符串(在boost :: asio :: write(..)方法中)。在Boost Asio緩衝區中封裝結構
是否可以將填充的結構中的數據發送到服務器或客戶端?如果是的話,我該如何做,因爲我找不到這方面的文件。
您可以按位複製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);
}
因此,例如我可以使用新創建的結構作爲緩衝區?如果我有以下幾點:'struct {float:{pos_l;}}; float pos2; }' – Dries
那麼,有可能直接說:從指針p的n個字節?或者是該複製是強制性的? – Deduplicator
如果使用'boost :: asio :: buffer(...)',則沒有副本。 **編輯**在coliru上添加了一個實例 – sehe
您還可以使用協議緩衝區用於這一目的,並不難在配置
這裏一些適用於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);
}
@AndrewBarber笑@關閉了這個問題 - 我不完全同意這太寬泛本身(它的標記[標籤:升壓ASIO]畢竟,並提到他知道如何使用_boost ASIO' buffer'_)。我的答案鏈接到他無法找到的文檔部分。但我看到你缺少的東西 - 上下文和示例代碼:) – sehe
@sehe嗯......當然,我明白了。重啓! –