在read()之前检查boost :: asio缓冲区数据是否存在

时间:2011-07-19 14:02:25

标签: c++ sockets boost boost-asio

我正在尝试使用boost :: asio将我用Unix套接字编写的软件移植到带有TCP套接字的版本。该程序旨在在Linux机器上运行。

在早期版本的代码中(使用Unix套接字)我使用了一个简单的检查来查看套接字缓冲区上是否有新数据,然后继续读取可预测的结构化数据:

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

有没有办法用boost :: asio做类似的事情? 还是一些更好的选择?

提前谢谢你 CB

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:2)

您可以使用boost::asio::ip::tcp::socket methodnative()中提取原生描述符,这对您的现有代码应该可以正常使用。

尽管如此,我怀疑你这样做的动机。 Asio事件反应器使用Linux上的epoll实现轮询机制。不需要轮询套接字以便在io_service事件循环之外进行读取或写入。