再会!
我正在尝试使用 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