boost::asio::udp 异步响应未完全收到
boost::asio::udp async response is not entirely received
说明
我的程序向服务器发送一个 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
正在发送
回应
您的问题是 strlen((char*)this->receiveBuffer.data())
。
strlen
接受以 nul 结尾的 C 字符串作为输入。所以遇到字节00
.
就停止计数
您似乎收到混合 binary/text 数据。您不能简单地将其作为字符串打印出来。
说明
我的程序向服务器发送一个 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
正在发送
回应
您的问题是 strlen((char*)this->receiveBuffer.data())
。
strlen
接受以 nul 结尾的 C 字符串作为输入。所以遇到字节00
.
您似乎收到混合 binary/text 数据。您不能简单地将其作为字符串打印出来。