Check if boost::asio buffer data is present before

2019-08-30 07:58发布

问题:

I'm trying to port a piece of software I wrote with Unix sockets to a version with TCP sockets, using boost::asio. The program is intended to run on a Linux machine.

In the earlier version of the code (using Unix sockets) I used a simple check to see if there was new data on the socket buffer, and then proceeding with reading predictably structured data:

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

Is there any way to do something similar with boost::asio? Or some better alternatives?

Thank you in advance CB

回答1:

Use bytes_readable, this implements what you want.

Implements the FIONREAD IO control command.

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:

You can extract the native descriptor from a boost::asio::ip::tcp::socket using the native() method, which should work just fine with your existing code.

Though, I question your motivation for doing this. The Asio event reactor implements polling mechanics using epoll on Linux. There should be no need to poll a socket for reading or writing outside of the io_service event loop.