在read()之前检查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

使用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();

您可以使用native()方法从boost::asio::ip::tcp::socket提取本机描述符,这应该可以很好地与您现有的代码一起工作。

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

最新更新