提升ASIO,async_write:数据被忽略

时间:2013-09-02 08:11:25

标签: boost concurrency boost-asio

我正在编写多个服务器,他们必须从多个客户端监听并异步处理数据。

我做了一个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然后调用“删除指针”;发送包后?这是否可能,如果是这样,这不会导致问题吗?

我真的不知道该怎么做,有没有人有个主意? 感谢

0 个答案:

没有答案