#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);