Асинхронный ответ boost :: asio :: udp получен не полностью

Моя программа отправляет датаграмму udp на сервер. С помощью wireshark я вижу запрос и ответ от сервера (79 байт).

void Query::start_send(const std::string data, const QueryType queryType) {
boost::shared_ptr<std::string> message(new std::string(data));
socket.async_send_to(boost::asio::buffer(*message), endPoint,
boost::bind(&Query::handler_send, this, message,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
this->queryType = queryType;
}
void Query::start_receive() {
socket.async_receive_from(
boost::asio::buffer(receiveBuffer, receiveBuffer.max_size()), endPoint,
boost::bind(&Query::handler_receive, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void Query::handler_receive(const boost::system::error_code& error, std::size_t bytes_transferred)
{
if (!error || error == boost::asio::error::message_size) {
std::cout << "Bytes transferred " << bytes_transferred << std::endl << strlen((char*)this->receiveBuffer.data()) << std::endl;
}
else {
std::cout << "Receive failed" << std::endl << error.value() << std::endl << error.message() << std::endl;
}
}
Bytes transferred 79
11

Значение bytes_transferred является правильным, но мой буфер ответов (вектор символов) «receiveBuffer» содержит только 11 байт вместо 79 байт.

Отправка

Wireshark отправка дейтаграммы

отклик

Wireshark получает датаграмму

0

Решение

Ваша проблема с strlen((char*)this->receiveBuffer.data()),

strlen принимает C-строку с нулевым символом в конце в качестве входных данных. Таким образом, он перестает считать, когда он встречает байт 00,

Вы, кажется, получаете смешанные двоичные / текстовые данные. Вы не можете просто распечатать его как строку.

2

Другие решения

Других решений пока нет …