Цитирование из последней (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 8000
или python -m SimpleHTTPServer
. Затем запустите программу и подождите. Ничего не произошло. Теперь остановите сервер, на моем (Windows) компьютере это приводит к:
Read result: system:10054 - An existing connection was forcibly closed by the remote host