Похоже, что после повышения 1.40.0 произошли изменения в том, как работает вызов async_read_some()
.
Ранее вы могли передать null_buffer
и получить обратный вызов, когда были данные для чтения, но без каркаса, считывающего данные в любой буфер (потому что его не было! ). Это в основном позволяло вам писать код, который действовал как вызов select()
, где вам сообщали, когда в вашем сокете были какие-то данные.
В новом коде поведение было изменено для работы следующим образом:
Если общий размер всех буферов в последовательности mb равен 0, асинхронная операция чтения должна завершиться немедленно и передать 0 в качестве аргумента обработчику, который указывает количество прочитанных байтов.
Это означает, что мой старый (и, кстати, метод, показанный в этом официальном примере ) способ обнаружения данных в сокете больше не работает. Для меня проблема в том, что мне нужен способ обнаружения этого, потому что я наложил свои собственные потоковые классы поверх потоков сокетов asio, и поэтому я не могу просто читать данные из сокетов, которые будут ожидать мои потоки. Единственный обходной путь, о котором я могу подумать сейчас, - это прочитать один байт, сохранить его, а когда мои потоковые классы затем запросят несколько байтов, вернуть этот байт, если он установлен: не очень.
Кто-нибудь знает лучший способ реализовать такое поведение с помощью последнего кода boost.asio?