Проверьте, присутствуют ли данные буфера boost :: asio перед чтением () - PullRequest
0 голосов
/ 19 июля 2011

Я пытаюсь портировать часть программного обеспечения, которую я написал с сокетами Unix, на версию с сокетами TCP, используя boost :: asio.Программа предназначена для запуска на компьютере с Linux.

В более ранней версии кода (с использованием сокетов Unix) я использовал простую проверку, чтобы увидеть, есть ли новые данные в буфере сокетов, а затем продолжил счтение предсказуемо структурированных данных:

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

Есть ли способ сделать что-то подобное с boost :: asio?Или какие-нибудь лучшие альтернативы?

Заранее спасибо CB

Ответы [ 2 ]

3 голосов
/ 19 июля 2011

Используйте 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 голосов
/ 19 июля 2011

Вы можете извлечь собственный дескриптор из boost::asio::ip::tcp::socket, используя native() метод , который должен прекрасно работать с вашим существующим кодом.

Хотя, я подвергаю сомнению вашу мотивацию сделать это. Реактор событий Asio реализует механику опроса, используя epoll на Linux . Не должно быть необходимости опрашивать сокет для чтения или записи вне цикла событий io_service.

...