小编awe*_*ome的帖子

boost :: asio异步操作和资源

所以我创建了一个socket类,它使用boost :: asio库来进行异步读写.它有效,但我有几个问题.

这是一个基本的代码示例:

class Socket
{
public:
    void doRead()
    {
        m_sock->async_receive_from(boost::asio::buffer(m_recvBuffer), m_from, boost::bind(&Socket::handleRecv, this, boost::asio::placeholders::error(), boost::asio::placeholders::bytes_transferred()));
    }

    void handleRecv(boost::system::error_code e, int bytes)
    {
        if (e.value() || !bytes)
        {
            handle_error();
            return;
        }
        //do something with data read
        do_something(m_recvBuffer);

        doRead(); //read another packet
    }

protected:
    boost::array<char, 1024> m_recvBuffer;
    boost::asio::ip::udp::endpoint m_from;
};
Run Code Online (Sandbox Code Playgroud)

程序似乎会读取数据包,处理它,然后准备读取另一个数据包.简单.但是,如果我设置一个线程池呢?下一次调用应该doRead()在处理读取数据之前还是之后?似乎如果它被放在之前do_something(),程序可以立即开始读取另一个数据包,如果它被放在后面,那么线程就会做任何事情do_something(),这可能需要一段时间.如果我把它放在doRead()处理之前,这是否意味着在m_readBuffer我处理它时数据可能会改变?

另外,如果我正在使用async_send_to(),我是否应该将要发送的数据复制到临时缓冲区中,因为实际发送可能要么在数据超出范围之后才会发生?即

void send()
{
    char data[] = {1, 2, 3, 4, 5};
    m_sock->async_send_to(boost::buffer(&data[0], 5), someEndpoint, someHandler);
} …
Run Code Online (Sandbox Code Playgroud)

c++ boost asynchronous boost-asio

5
推荐指数
1
解决办法
1063
查看次数

标签 统计

asynchronous ×1

boost ×1

boost-asio ×1

c++ ×1