2011-02-02 125 views
1

我有一個客戶端,使用此功能將數據我:接收使用boost :: ASIO壓縮數據

void CServerRetrieve::Send(char *buf, DWORD size, int flags) 
{ 
    unsigned char *zlib; 
    unsigned long szzlib; 
    m_zlib.Deflate((unsigned char*)buf, size + 1, &zlib, &szzlib); // include the terminating 0 char 
    char zbuf[5]; 
    zbuf[0] = 'Z'; 
    memcpy(&zbuf[1], &szzlib, 4); 
    send(m_Socket, zbuf, 5, flags); 
    send(m_Socket, (char*)zlib, szzlib, flags); 
    delete [] zlib; 
} 

我想收到使用boost :: ASIO這個數據,但我不知道是什麼類型的緩衝區我應該傳遞給socket.async_receive才能接收這些數據?

我試過std::vector<char>std::vector<std::string>,但是在我的緩衝區中沒有收到任何數據?

有人可以幫助我,我做錯了什麼?

void tcp_connection::start() 
{ 
    socket_.async_receive(boost::asio::buffer(buff), boost::bind(&tcp_connection::handle_read, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); 
} 

void tcp_connection::handle_read(const boost::system::error_code& err, size_t bytes_transferred) 
{ 
    if (!err || err == boost::asio::error::message_size) 
    { 
     size_t sz = buff.size(); //always 0! 
    } 
} 
+2

我們需要更多的代碼,這個..喜歡你的插座結合一個io_service以及是否已調用io_service對象::運行或io_service對象:: run_one或不 – Arunmu 2011-02-02 10:43:25

回答

1

您正在接收壓縮數據的事實對Boost.Asio無關緊要。假設你知道你即將收到的數據的大小,一個std::vector<char>就可以接收壓縮數據。在調用async_receive之前,您需要resize只要確保此緩衝區在調用完成處理程序之前不會超出範圍。這個概念在async_readdocumentation中解釋。

緩衝器到其中的數據將被讀

一種或多種緩衝劑。緩衝區大小的和 表示要從 流讀取的最大字節數 。雖然緩衝器 對象可以被複製爲必要,底層存儲器的 所有權 塊由調用者保持, 必須保證它們保持 有效,直到處理程序被調用

0

我假設buff是你的std :: vector?在這種情況下,async_receive之前,你應該跟你打算讀大小初始化此,像

buff.resize(5); 

你也應該考慮使用async_read如果你知道你要接收消息的大小。無論如何,你需要爲你的緩衝區設置一個大小。

相關問題