我正在编写多个服务器,这些服务器必须从多个客户端监听并异步处理数据。
我做了一个服务器基类,我派生它以添加数据包处理函数,以及我从会话类调用的一些通知器。
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)));
}
问题是我的 write 函数似乎与其他会话的 async_write “崩溃”,导致未发送响应并且我的客户端处于无限等待状态。我尝试像 Asio 文档中的 HTTP Server 3 Example 一样应用“strand”/线程池,但没有任何改变。
我还使用发件箱尝试了此处的示例:boost asio async_write :如何不交错 async_write 调用?
同样的问题,所以我想它来自其他地方。缓冲区必须保持完整,但我的 MOutPacket 是在“堆栈上”分配的,我应该创建一个指向 MOutPacket 的指针然后调用“删除指针”;发送数据包后?这甚至可能吗?如果是这样,这不会引起问题吗?
我真的不知道该怎么办,有人有想法吗?谢谢