sea*_*ste 5 c++ boost boost-asio
我有一个 C++ 服务器,它使用 boost::asio 进行读/写操作 - 写出消息工作正常 - 但由于某种原因我无法读取工作
我从客户端发送给它的消息是 15 16 位无符号短裤 - 我的测试消息是这样的:
1, 34, 7, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0
Run Code Online (Sandbox Code Playgroud)
现在在服务器上,我经常看到这样的事情。读取经常被分解和/或乘以 256
这是一次发送两次
reading length = 8: [1 34 7 0 0 0 0 0]
reading length = 3: [1024 0 0]
reading length = 3: [0 0 0]
reading length = 8: [1 34 7 0 0 0 0 0]
reading length = 6: [1024 0 0 0 0 0]
Run Code Online (Sandbox Code Playgroud)
这是第二次运行发送两次
reading length = 8: [1 34 7 0 0 0 0 0]
reading length = 6: [1024 0 0 0 0 0]
reading length = 6: [1 34 7 0 0 0]
reading length = 1: [0]
reading length = 0: []
reading length = 0: []
reading length = 2: [0 0]
reading length = 2: [0 0]
reading length = 1: [0]
Run Code Online (Sandbox Code Playgroud)
这是第三次发送一次(我不知道这里发生了什么)
reading length = 14: [256 8704 1792 0 0 0 0 0 1024 0 0 0 0 0]
Run Code Online (Sandbox Code Playgroud)
这是实际的服务器读取代码
void Session::start(void) {
msg_interface->add_msg_listener(this);
_socket.async_read_some(
boost::asio::buffer(_read_data_buffer, READ_DATA_BUFFER_LENGTH),
boost::bind(&Session::handle_read, this, boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void Session::handle_read(const boost::system::error_code& error, std::size_t bytes_transferred) {
if (error) {
msg_interface->remove_msg_listener(this);
delete this;
} else {
if (bytes_transferred != 0) {
// print what we've received
const int length = bytes_transferred / sizeof(uint16_t);
std::cout << "reading length = " << length << ": [";
for (int i = 0; i < length; i++) {
const uint16_t data = ntohs(_read_data_buffer[i]);
std::cout << data;
if (i != length - 1) {
std::cout << " ";
}
}
std::cout << "]" << std::endl;
}
_socket.async_read_some(
boost::asio::buffer(_read_data_buffer, READ_DATA_BUFFER_LENGTH),
boost::bind(&Session::handle_read, this, boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
}
Run Code Online (Sandbox Code Playgroud)
变量如下
const int READ_DATA_BUFFER_LENGTH = 1024;
class AbstractSession {
protected:
uint16_t _read_data_buffer[READ_DATA_BUFFER_LENGTH];
...
Run Code Online (Sandbox Code Playgroud)
有一件事 - 我使用相同的 IO 服务在收到消息时写入消息(服务器正在与旧接口通信并将其收到的消息发送给所有客户端)并从客户端读取消息。对两者使用相同的 io 服务会导致这种情况发生吗?
关于我应该怎么做来解决这个问题的任何想法?
小智 4
你的代码做了它应该做的事情——它读取尽可能多的数据。这就是函数async_read_some名称以“some”结尾的原因 - 它读取“some”字节并且不承诺执行更多操作。文档还说明了以下内容:
如果需要确保在异步操作完成之前读取请求的数据量,请考虑使用 async_read 函数。
这看起来就像你的情况,除非你重新工作你的接收器来处理部分读取。