【问题标题】:Check if boost::asio buffer data is present before read()在 read() 之前检查 boost::asio 缓冲区数据是否存在
【发布时间】:2023-03-19 06:32:01
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • 您是否已经阅读了 boost asio examples 和 boost asio tutorial 的非常好的合集?也许你会在那里找到答案。

标签: c++ sockets boost boost-asio


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以使用native() methodboost::asio::ip::tcp::socket 中提取本机描述符,这应该可以与您现有的代码一起使用。

    不过,我质疑您这样做的动机。 Asio 事件反应器在Linux 上使用epoll 实现轮询机制。在io_service 事件循环之外,无需轮询套接字以进行读取或写入。

    【讨论】:

    • 在什么意义上不需要?我的目标是仅在数据可用时读取固定数量的数据。有没有更聪明的方法来做到这一点?
    • @Carlo io_service 为您进行投票。当您使用async_readasync_write 请求的完成条件得到满足时,将调用完成处理程序。
    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2022-12-03
    • 2014-05-17
    • 2013-05-27
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    相关资源
    最近更新 更多