Boost::asio::async_read не останавливается при условии

#c #boost #boost-asio

#c #boost #boost-asio

Вопрос:

У меня возникла некоторая проблема с 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(amp;TCPConnection::handle_read, 
                                        shared_from_this(),
                                        boost::asio::placeholders::error)
                            );
}
  

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

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

        std::string archive_data(amp;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 символа?

Комментарии:

1. Что это за тип m_inbound_data и каков его размер

2. std::vector<char> m_inbound_data;

Ответ №1:

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

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

Если вы не зададите ему размер, это будет буфер нулевой длины.

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

Комментарии:

1. Спасибо! С данными символа [64] он действительно ожидает.

Ответ №2:

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

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

  char data[64]
  

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

 std::vector<char> data(64)

           or

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