簡體   English   中英

當沒有什么要閱讀時,了解boost :: asio async_read行為

[英]understand boost::asio async_read behavior when there is nothing to read

我試圖了解什么也沒讀的情況下,使用async_read會發生什么。

例如,客戶端創建與服務器的連接,然后啟動async_read() ,但該服務器不希望向該客戶端發送任何內容。 那會發生什么呢? 我應該收到EOF嗎?

Updata:我認為@ user786653是正確的。 我做了一個簡單的例子(見下文)。

#include <iostream>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/asio.hpp>

class test{
public:
test(boost::asio::io_service& io_service):_socket(io_service){
}

void handle_connect(){
    std::cout<<"entering test::handle_connect"<<std::endl;
    char reply[128];
        boost::asio::async_read(_socket, boost::asio::buffer(reply, sizeof(reply)),
                            [](boost::system::error_code ec, std::size_t /*length*/){
                std::cout<<"Read result:"<< ec<<" - "<<ec.message()<<std::endl;
            });
}

boost::asio::ip::tcp::socket & socket(){
    return _socket;
}

private:
boost::asio::ip::tcp::socket _socket;
};



int main() {
try {
boost::asio::io_service io_service;
boost::asio::ip::tcp::socket s(io_service);
boost::asio::ip::tcp::resolver resolver(io_service);
    boost::asio::ip::tcp::resolver::query query("127.0.0.1", "8000");
    boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
    boost::asio::ip::tcp::endpoint endpoint = *endpoint_iterator;

test t(io_service);
t.socket().async_connect(endpoint,boost::bind(&test::handle_connect, &t));

io_service.run();
} catch (std::exception& e) {
    std::cerr << "Exception: " << e.what() << "\n";
}
}

引用最新(1.68.0) 文檔

此函數用於從流中異步讀取一定數量的數據字節。 函數調用總是立即返回。 異步操作將繼續,直到滿足以下條件之一:

  • 提供的緩沖區已滿。 即,傳輸的字節等於緩沖區大小的總和。
  • 發生錯誤。

因此,在服務器關閉連接之前不會發生任何事情(導致錯誤)。

您可以自己測試一下:

#include <iostream>
#include <boost/asio.hpp>
int main() {
    try {
        boost::asio::io_context io_context;
        boost::asio::ip::tcp::socket s(io_context);
        boost::asio::ip::tcp::resolver resolver(io_context);
        boost::asio::connect(s, resolver.resolve("localhost", "8000"));
        char reply[128];
        async_read(s, boost::asio::buffer(reply, sizeof(reply)), [](boost::system::error_code ec, std::size_t /*length*/) {
                std::cout << "Read result: " << ec << " - " << ec.message() << "\n";
                });
        io_context.run();
    } catch (std::exception& e) {
        std::cerr << "Exception: " << e.what() << "\n";
    }
}

啟動在本地主機端口8000上沒有響應的服務器(或更改代碼)。 例如nc -l 8000python -m SimpleHTTPServer 然后運行程序並等待。 什么都沒發生。 現在停止服務器,在我的(Windows)機器上,結果是:

Read result: system:10054 - An existing connection was forcibly closed by the remote host

暫無
暫無

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

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