Boost ASIO,异步写入:忽略数据

Boost ASIO,异步写入:忽略数据,boost,concurrency,boost-asio,Boost,Concurrency,Boost Asio,我正在编写多个服务器的代码,这些服务器必须侦听多个客户端并异步处理数据 我做了一个服务器基类,我派生用于添加packethandling函数,以及一些通知程序,我从会话类调用 void TcpSession::handle_read(const boost::system::error_code& e, std::size_t bytes_transferred) { if (!e) { if (bytes_transferred < 4 |

我正在编写多个服务器的代码,这些服务器必须侦听多个客户端并异步处理数据

我做了一个服务器基类,我派生用于添加packethandling函数,以及一些通知程序,我从会话类调用

    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)));
    }
}
问题是,我的write函数似乎在来自其他会话的async_write中“崩溃”,导致响应未发送,并且我的客户端处于无限等待状态。 我尝试应用Asio文档中HTTP Server 3示例中的“strand”/线程池,但没有任何更改

我还使用发件箱尝试了以下示例:

同样的问题,所以我想它来自其他地方。缓冲区必须保持完整,但我的MOutPacket是“在堆栈上”分配的,我是否应该在发送数据包后创建指向MOutPacket的指针,然后调用“delete pointer;”?这可能吗?如果可能,这不会引起问题吗

我真的不知道该怎么办,有人有主意吗?
谢谢

什么是
MOutPacket p
p.packet()
live的返回值有多长时间?MOutPacket是一个类,它在堆栈上被调用,并直接发送到会话的send函数,但由于async\u send立即返回,我猜它会在之后被直接销毁。我能做些什么来避免这种情况?您的缓冲区应该至少和异步操作一样长。请注意,
buffer
函数不复制其参数,而只是将其类型调整为
ConstBufferSequence
概念。因此,重新设计管理此缓冲区的方式。我现在做的是:在send()函数中,我创建一个指针,将MOutPacket作为参数复制,然后在绑定到handle_write时,放置相同的指针,以便在异步操作结束时清除它。然而,handle_read()现在有一个问题,我是否应该为接收后操作创建一个指向read_缓冲区副本的指针?因为它似乎有问题,我明白了。这个问题似乎与您发布的代码无关——也许问题出在其他地方。确保始终正确链接
async\u read
/
read\u处理程序
,在
handle\u error
收到错误时放置一些消息。
    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)));
        }