Boost :: asio :: async_read не останавливается при условии - PullRequest
3 голосов
/ 21 апреля 2011

У меня есть проблема с boost :: asio :: async_read

Вот мой код

void TCPConnection::listenForRead() {

    boost::asio::async_read(m_socket, 
                            boost::asio::buffer(m_inbound_data),
                            boost::asio::transfer_at_least(64),
                            boost::bind(&TCPConnection::handle_read, 
                                        shared_from_this(),
                                        boost::asio::placeholders::error)
                            );
}

А вот обработчик:

void TCPConnection::handle_read(const boost::system::error_code& error) {
    if (error) {
        std::cout << "Error read: " << error.category().name() << " -- " << error.value() << std::endl;
    } else {

        std::string archive_data(&m_inbound_data[0], m_inbound_data.size()); 

        std::cout << "Message received: " << archive_data << std::endl;
        listenForRead();
    }
}

С

std::vector<char> m_inbound_data;

Я получаю бесконечный цикл на консоли, когда клиент подключается:

«Сообщение получено:» // Нет следов сообщения

Если я распечатаю длину данных,это всегда в 0.

Я соединяюсь с: telnet localhost 4242

Кто-нибудь знает почему?Разве это не должно ждать по крайней мере 64 символа?

Ответы [ 2 ]

6 голосов
/ 21 апреля 2011

Boost.Asio никогда не изменит размер вашего буфера.

Когда вы создаете буфер из std::vector<char>, размер буфера равен размеру вектора.Не указывайте его размер, это будет буфер нулевой длины.

Функтор transfer_at_least возвращает true, если в буфере находится хотя бы N байтов или буфер заполненВ случае буфера нулевой длины он всегда заполнен, поэтому всегда возвращает true.

2 голосов
/ 04 января 2012

Чтобы согласиться с ответом Дауфика:

Вы можете инициализировать массив символов, как вы это сделали:

 char data[64]

Или, если вы все еще хотите использовать вектор, вы можете инициализировать вектор такопределенный размер:

std::vector<char> data(64)

           or

std::vector<char> data;
data.resize(64);
...