2011-07-19 48 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'请求的完成条件满足时,调用完成处理程序。 –

相关问题