良い一日!
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 が呼び出されます