我正在编写多个服务器,他们必须从多个客户端监听并异步处理数据。
我做了一个Server基类,我派生用于添加数据包处理函数,以及我从会话类调用的一些通知程序。
void TcpSession::handle_read(const boost::system::error_code& e, std::size_t bytes_transferred)
{
if (!e)
{
if (bytes_transferred < 4 || bytes_transferred >= 65535)
return;
ptrServer->NotifyPacketReceive(this, *(MPacketBody*)&buffer_);
socket_.async_read_some(boost::asio::buffer(buffer_),
strand_.wrap(boost::bind(&TcpSession::handle_read, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred)));
}
}
我的NotifyPacketReceive位于派生类中,它将检查数据包的一个标识符并处理数据。之后执行的所有函数都包含要发送的数据包,我这样做
void DerivatedServerClass::Request(TcpSession* session, MPacketBody packet)
// called from DerivatedServerClass::NotifyPacketReceive
{
MOutPacket response(12);
// fill response with data
session->send(response);
}
void TcpSession::send(MOutPacket p)
{
boost::asio::async_write(socket_, boost::asio::buffer(p.packet(), p.size()),
strand_.wrap(boost::bind(&TcpSession::handle_write, shared_from_this(),
boost::asio::placeholders::error)));
}
问题是我的写入函数似乎与其他会话中的async_write“崩溃”,导致响应未发送且我的客户端处于无限等待状态。 我试图像在Asio文档中的HTTP Server 3示例中那样应用“strand”/线程池,但没有任何改变。
我也尝试使用发件箱中的示例:boost asio async_write : how to not interleaving async_write calls?
同样的问题,所以我想它来自其他地方。缓冲区必须保持不变,但我的MOutPacket是“在堆栈上”,如果我指向MOutPacket然后调用“删除指针”;发送包后?这是否可能,如果是这样,这不会导致问题吗?
我真的不知道该怎么做,有没有人有个主意? 感谢