2015-12-26 33 views
3

我想使用boost序列化來使用套接字通過網絡發送結構。我看了他們的教程(http://www.boost.org/doc/libs/1_60_0/libs/serialization/doc/index.html),但它只顯示保存並加載到文件。套接字的提升序列化

我修改我的結構,包括序列化()函數和使用教程與我的套接字文件使用相同的技術嘗試,但沒有運氣:

#include <boost/archive/binary_oarchive.hpp> 
#include <boost/archive/binary_iarchive.hpp> 

int sock = socket()... 

boost::archive::binary_oarchive oa(sock); 
oa << mystruct; 

error: no matching function for call to ‘boost::archive::binary_oarchive::binary_oarchive(int&)’

因此很明顯,它不能用套接字這種方式工作。我用Google搜索,發現這個例子人們引用: http://www.boost.org/doc/libs/1_38_0/doc/html/boost_asio/example/serialization/server.cpp

但是,如果你看一下在這個例子代碼中的註釋:

// client. The connection::async_write() function will automatically 
// serialize the data structure for us. 

好了,我不想ASIO使用任何東西。我只想序列化數據(使用boost序列化),並通過標準套接字發送數據。

庫不是以這種方式使用的嗎?我如何使用標準套接字(不帶asio)的boost序列化?

+0

烏夫,我認爲你有一個巨大的概念混亂。據我所知,你打算通過網絡發送文件,不是嗎?所以,你應該首先讀取文件並使用它的流發送字節與套接字。將套接字描述符傳遞給binary_archive的構造函數沒有任何意義。 – perencia

+1

我在內存中有一個結構,我需要通過電線發送字節。我不能只發送&myStruct,sizeof(mystruct),因爲結構包含指針。我認爲在這種情況下序列化是正常的。 – James

回答

2

boost檔案類構造函數需要一個流或一個streambuf對象。您可以:

  • 構建/利用寫入網絡套接字的流類,例如, ASIO。
  • 特別是如果期望的文件大小很小,您可以將其序列化到內存(使用ostringstream),然後使用正常函數將結果數據從字符串寫入套接字。
+0

如果我想嘗試第二種方法,我會創建一個std :: ostringstream,然後將其提供給構造函數嗎?然後序列化後,只需調用read()來獲取字節? – James

+0

我想你必須從流中獲取字符串,然後將它後面的字符緩衝區寫入套接字。除非你有特殊要求否使用ASIO或其他答案中提到的boost:.iostreams庫,否則我會試着首先沿着這條路線走下去。 –

2

您可以使用boost::iostreams::file_descriptor。您可以使用boost::iostreams::streamboost::iostreams::stream_buf

或者,考慮boost::asio::ip::tcp::iostream來包裝整個原始套接字。

+0

除了tcp iostream的boost文檔沒有任何意義的事實之外,還有一個很好的答案。它沒有顯示如何從客戶端或服務器端或者從套接字或端點或任何其他地方創建一個。只是一些奇怪的模板,需要一堆參數,其中許多是無意義的。 – CashCow