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 非常に重要なメソッドを 1 つ追加するのを忘れていました: read_len が終了すると on_len が呼び出されます

4

0 に答える 0