簡體   English   中英

Boost::Asio::Read 未填充緩沖區

[英]Boost::Asio::Read is not populating buffer

這是我的服務器類,它在連接時呈現異步事件以將字符串發送到我的客戶端。

消息肯定會發送到客戶端,因為 writehandler 被成功調用,沒有任何錯誤:

class Server {
private:

    void writeHandler(ServerConnection connection, const boost::system::error_code &error_code,
                      std::size_t bytes_transferred) {

        if (!(error_code)) {
            std::cout << "SENT "<<bytes_transferred <<" BYTES"<< std::endl;
        }
    }

    void renderWriteEvent(ServerConnection connection, const std::string& str) {
        std::cout << "RENDERING WRITE EVENT" << std::endl;
        connection->write = str;
        boost::asio::async_write(connection->socket, boost::asio::buffer(connection->write),
                                 boost::bind(&Server::writeHandler, this, connection,
                                             boost::asio::placeholders::error,
                                             boost::asio::placeholders::bytes_transferred));
    }
    

};

現在在客戶端,成功連接到服務器后,我調用

        void renderRead(){
        std::cout<<"Available Bytes: "<<socket.available()<<std::endl;
        std::string foo;


        boost::system::error_code error_code;
        std::size_t x = socket.read_some(boost::asio::buffer(foo), error_code);
        std::cout<<error_code.message()<<std::endl;

        std::cout<<"Bytes read: "<<x<<std::endl;
        std::cout<<"Available Bytes: "<<socket.available()<<std::endl;
        std::cout<<foo<<std::endl;
        //boost::asio::async_read(socket, boost::asio::buffer(read_string), boost::bind(&Client::readHandler, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
    }

輸出“可用字節:12”

然后,在調用boost::asio::read ,我讀取了 0 個字節,並且沒有錯誤。 我不明白出了什么問題。 讀取后,socket流中可供讀取的字節數仍然打印為12

這里的一個關鍵點是read_some()不分配任何內存,它填充提供給它的內存。 對於您的代碼,這意味着 ASIO 只會替換foo已經存在的數據,並且永遠不會超出這些范圍。

但是你有std::string foo; ,這是一個默認構造的字符串,也就是一個字符串。

所以 ASIO 正在填充你傳遞的緩沖區就好了。 但是,您傳遞給它的是一個沒有空間的緩沖區。 ASIO 盡可能地填充它:0 字節。

您可以通過將以下內容添加到您的代碼中來自行測試:

std::string foo;
std::cout << "Available room in buffer: "<< foo.size() << std::endl;

解決方法是傳遞一個已分配內存的緩沖區。 可以使用長度初始化字符串,但使用稍后將其解釋為string_view的原始字節塊更為明確。

constexpr std::size_t buffer_size = 32;

std::array<char, buffer_size> foo;
std::size_t x = socket.read_some(boost::asio::buffer(foo), error_code);

//...

std::string_view message(foo.data(), x);
std::cout << message << std::endl;


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM