2011-07-19 47 views
0

我試圖將使用boost :: asio的一個軟件寫入帶有TCP套接字的版本。該程序旨在運行在Linux機器上。在讀取之前檢查boost :: asio緩衝區數據是否存在()

在代碼的早期版本(使用Unix套接字),我用一個簡單的檢查,看看是否有在套接字緩衝區的新數據,然後用讀預見的結構化數據出發:

ioctl(s_c, FIONREAD, &socketstatus); 
    while (socketstatus > 0) 
    {// do receive stuff 
    ioctl(s_c, FIONREAD, &socketstatus);} 

是有什麼辦法可以用boost :: asio做類似的事情嗎? 還是更好的選擇?

預先感謝您 CB

+1

您是否已經通過升壓ASIO的很好的收集閱讀[實例](http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/examples.html)和boost asio [教程](http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/tutorial.html)?也許你會在那裏找到答案。 – jenseb

回答

3

使用bytes_readable,這實現你想要的。

執行FIONREAD IO控制命令。

boost::asio::ip::tcp::socket socket(io_service); 
... 
boost::asio::socket_base::bytes_readable command(true); 
socket.io_control(command); 
std::size_t bytes_readable = command.get(); 
+0

就是這樣!真的感謝 –

2

可以使用native()method,這應該只是與您現有的代碼罰款中提取從boost::asio::ip::tcp::socket本地描述符。

雖然,我質疑你這樣做的動機。 Asio事件反應器在Linux上使用epoll實現輪詢機制。應該不需要輪詢在io_service事件循環之外讀取或寫入套接字。

+0

哪種感覺應該沒有必要?我的目標是僅在數據可用時纔讀取固定數量的數據。有沒有更聰明的方法來做到這一點? –

+0

@Carlo'io_service'爲你進行輪詢。當您通過'async_read'或'async_write'請求的完成條件滿足時,調用完成處理程序。 –

相關問題