У меня есть собственный сокет posix, который я пытаюсь асинхронно прочитать с помощью boost :: asio :: async_read. Однако, когда я делаю это:
// io_stream and fd are passed by reference to this function
asio::posix::stream_descriptor stream(io_stream);
stream.assign(fd);
boost::system::error_code ec;
asio::async_read(stream, buffer,
asio::transfer_at_least(1),
boost::bind(doRead,
asio::placeholders::error,
asio::placeholders::bytes_transferred));
size_t count = io_service.run_one(ec);
Переменная count установлена в 0, обработчик doRead никогда не вызывается, и ec не содержит ошибок. Однако, если я заменю асинхронное чтение синхронным чтением:
size_t count = asio::read(stream, buffer,
asio::transfer_at_least(1));
Это работает, и я получаю ожидаемое количество данных обратно в переменную count.
Мои тестовые случаи с использованием fd, созданного "int pipe (int pipefd [2])"; и передача данных через эту работу нормально с asio :: async_read, поэтому я думаю, что это может быть несколько вариантов:
- Некоторые данные о том, что собственный дескриптор, который я передаю, каким-то образом не совместимы с async_read, поэтому он молча терпит неудачу. Я пытался создать его с блокировкой вкл / выкл безрезультатно.
- io_service и posix :: stream_descriptor - некоторые из них, так как они не связаны, поэтому io_service никогда не пытается запустить чтение. Может ли это быть из-за того, что я передал io_service по ссылке? (И в течение нескольких потоков, если на то пошло?)