0

再会!

我正在尝试使用 boost:asio 编写异步服务器。一切正常,直到服务器尝试同时从 2 个客户端读取数据。来自一个客户端的数据按预期读取,但来自其他客户端的数据混淆了。

数据包的结构:4 字节 - 消息长度,其余 - 消息

一些代码:

#define MEM_FN(x)       boost::bind(&tcp_connection::x, shared_from_this()) 
#define MEM_FN1(x,y)    boost::bind(&tcp_connection::x, shared_from_this(), y)
#define MEM_FN2(x,y,z)  boost::bind(&tcp_connection::x, shared_from_this(), y, z)

void tcp_connection::do_read()
{
  msg_size = 0;
  async_read(socket_, boost::asio::buffer(read_buffer_, 4),
           MEM_FN2(read_len, _1, _2), MEM_FN2(on_len, _1, _2));
}
void tcp_connection::do_read(size_t size)
{
  async_read(socket_, boost::asio::buffer(read_buffer_, size),
           MEM_FN2(read_msg, _1, _2), MEM_FN2(on_read, _1, _2));
}

size_t tcp_connection::read_len(const error_code& err, size_t bytes)
{
  if(err) { qDebug() << "ERROR(read_len): " << err.message().data(); return 0; }
  if(bytes == 4 && msg_size == 0)
  {
    QByteArray a;
    a.push_back(read_buffer_[0]); a.push_back(read_buffer_[1]);
    a.push_back(read_buffer_[2]); a.push_back(read_buffer_[3]);
    QDataStream in(&a, QIODevice::ReadOnly);
    int size;
    in >> size;
    msg_size = size;
    return 0;
  }
  return 1;
}
size_t tcp_connection::read_msg(const error_code& err, size_t bytes)
{
  if(err) { qDebug() << "ERROR(read_msg): " << err.message().data(); return 0; }
  if(bytes < msg_size)
  {
    return 1;
  } else return 0;
}
void tcp_connection::on_len(const error_code & err, size_t)
{
    if(err) { qDebug() << "Need to drop connection(on_len)"; stop(); }
    if(!started_) return;
    if(msg_size > 0 && msg_size < 20010) do_read(msg_size);
    else do_read();
}

有什么建议可以解决这个问题吗?

PS忘记加一个很重要的方法:在read_len完成时调用on_len

4

0 回答 0