请教一个asio的问题, 关于async_read读超大的数据包


#1
typedef struct MqttContext{
    Uint8 head[5]; //读header 和 不超过4字节的长度 size
    
    unique_ptr< vector<Uint8> > pdata;
    std::function< void (const boost::system::error_code& ec, MqttMessage messge)> func;
    
} *pMqttContext;


    void do_read_remainder(std::shared_ptr<MqttContext> context, size_t readed_n,  MQTTHeader header, size_t size) {

        if (size <= SOCKET_RECV_BUFFER_SIZE ) { //小于系统缓冲区长度, 一次读完
            
            boost::asio::async_read(this->_socket, buffer(std::begin(*context->pdata)+readed_n, size ), [context](const boost::system::error_code& ec, size_t length){
                if(!ec) {
                
                    //解码
                    
                } else {
                    context->func(ec, *(MqttMessage*)nullptr);
                }
            
            });
        } else { //否则 递归读多次
            
            boost::asio::async_read(this->_socket, buffer(), <#ReadHandler &&handler#>)
            
        
        }
        
    }
接受的数据包可能最大为0x0fffffff, 超过系统的socket缓冲区, 所以我试图接收多次. 

asio::async_read(this->_socket, 
                            //buffer的部分, 我能否控制读到的数据从缓冲区的第 eaded_n 位开始填充size个字节. 
                            buffer(std::begin(*context->pdata)+readed_n, size ),  
                           [context](const boost::system::error_code& ec, size_t length)
                          {});


#2

我了解到这个问题其实可以用buffer(char* p, size_t n) 或用一个临时缓冲区copy组包搞定, 看看能不能用最小代价解决这个问题


#3

你的asio用的有问题,哪有投递多次async_read的用法呀。。。


#4

我当时想着socket的缓冲区大小的系统参数和效率, 所以就决定把过大的数据切割到符合尺寸再批量发送. 不知这样效率和一次发送大笔数据哪个更高


#5

你这异步都写错了,前次async_read无错误继续读就继续回调async_read 或者设置超大的buffer,没读完就不触发回调