Как я могу получить обратный вызов, когда есть некоторые данные для чтения в потоке boost.asio, не считывая их в буфер? - PullRequest
3 голосов
/ 12 января 2010

Похоже, что после повышения 1.40.0 произошли изменения в том, как работает вызов async_read_some().

Ранее вы могли передать null_buffer и получить обратный вызов, когда были данные для чтения, но без каркаса, считывающего данные в любой буфер (потому что его не было! ). Это в основном позволяло вам писать код, который действовал как вызов select(), где вам сообщали, когда в вашем сокете были какие-то данные.

В новом коде поведение было изменено для работы следующим образом:

Если общий размер всех буферов в последовательности mb равен 0, асинхронная операция чтения должна завершиться немедленно и передать 0 в качестве аргумента обработчику, который указывает количество прочитанных байтов.

Это означает, что мой старый (и, кстати, метод, показанный в этом официальном примере ) способ обнаружения данных в сокете больше не работает. Для меня проблема в том, что мне нужен способ обнаружения этого, потому что я наложил свои собственные потоковые классы поверх потоков сокетов asio, и поэтому я не могу просто читать данные из сокетов, которые будут ожидать мои потоки. Единственный обходной путь, о котором я могу подумать сейчас, - это прочитать один байт, сохранить его, а когда мои потоковые классы затем запросят несколько байтов, вернуть этот байт, если он установлен: не очень.

Кто-нибудь знает лучший способ реализовать такое поведение с помощью последнего кода boost.asio?

1 Ответ

1 голос
/ 31 января 2010

Мой быстрый тест с официальным примером с boost-1.41 работает ... Так что я думаю, что он все еще должен работать (если вы используете null_buffers)

...