Compruebe si boost :: asio buffer data está presente antes de leer ()

Estoy tratando de portar un software que escribí con sockets Unix a una versión con sockets TCP, usando boost :: asio. El progtwig está diseñado para ejecutarse en una máquina Linux.

En la versión anterior del código (usando sockets de Unix) usé una comprobación simple para ver si había datos nuevos en el búfer de socket, y luego continué con la lectura de datos estructurados de manera predecible:

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

¿Hay alguna manera de hacer algo similar con boost :: asio? ¿O algunas alternativas mejores?

Gracias de antemano CB

Use bytes_readable , esto implementa lo que quiere.

Implementa el comando de control IO FIONREAD.

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

Puede extraer el descriptor nativo de un boost::asio::ip::tcp::socket usando el método native() , que debería funcionar bien con su código existente.

Aunque, cuestiono su motivación para hacer esto. El reactor de eventos Asio implementa mecanismos de sondeo utilizando epoll en Linux . No debería haber necesidad de sondear un socket para leer o escribir fuera del bucle de eventos io_service .