Asynchronous 使用asio async_read()时出现问题

Asynchronous 使用asio async_read()时出现问题,asynchronous,boost-asio,Asynchronous,Boost Asio,你好 我正在尝试使用boost:asio编写异步服务器。在服务器尝试同时从两个客户端读取数据之前,一切正常。来自一个客户机的数据按其假设的方式读取,但来自另一个客户机的数据混淆了 数据包结构:4字节-消息长度,剩余-消息长度 一些代码: #define MEM_FN(x) boost::bind(&tcp_connection::x, shared_from_this()) #define MEM_FN1(x,y) boost::bind(&tcp_conne

你好

我正在尝试使用boost:asio编写异步服务器。在服务器尝试同时从两个客户端读取数据之前,一切正常。来自一个客户机的数据按其假设的方式读取,但来自另一个客户机的数据混淆了

数据包结构: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();
}
#定义MEM_FN(x)boost::bind(&tcp_connection::x,从_this()共享)
#定义MEM_FN1(x,y)boost::bind(&tcp_connection::x,shared_from_this(),y)
#定义MEM_FN2(x,y,z)boost::bind(&tcp_connection::x,shared_from_this(),y,z)
无效tcp_连接::do_read()
{
msg_size=0;
异步读取(套接字,boost::asio::buffer(读取缓冲区,4),
MEM_FN2(read_len,_1,_2),MEM_FN2(on_len,_1,_2));
}
无效tcp\u连接::执行读取(大小\u t大小)
{
异步读取(套接字、boost::asio::buffer(读取、缓冲、大小),
MEM_FN2(读取消息,_1,_2),MEM_FN2(读取时,_1,_2));
}
大小\u t tcp\u连接::读取长度(常量错误\u代码和错误,大小\u t字节)
{
if(err){qDebug()大小;
msg_size=尺寸;
返回0;
}
返回1;
}
大小\u t tcp\u连接::读取\u消息(常量错误\u代码和错误,大小\u t字节)
{

如果(err){qDebug()什么调用
do\u read(size\u t)
?我希望
read\u len
能这样做,但事实并非如此。请确保在另一个
async\u read
(针对同一个套接字)时,永远不要调用
async\u read
正在进行中。谢谢,伊戈尔,愚蠢的错误)现在一切都正常了。)你说你正在从两个不同的客户端读取,因此你必须使用两个不同的缓冲区,以便两个客户端同时读取。。。