Повышаю. Asio включает классы, которые реализуют iostreams поверх розеток. Они скрывают сложности, связанные с разрешением конечных точек, независимостью протокола и т. д. Чтобы создать соединение, можно просто написать:
ip::tcp::iostream stream("www.boost.org", "http");
if (!stream)
{
}
Класс iostream также может использоваться в сочетании с акцептором для создания простых серверов. Например:
io_service ios;
ip::tcp::endpoint endpoint(tcp::v4(), 80);
ip::tcp::acceptor acceptor(ios, endpoint);
for (;;)
{
ip::tcp::iostream stream;
acceptor.accept(*stream.rdbuf());
...
}
Сроки могут быть установлены путем вызова<expires_at()
>или<expires_from_now()
>, чтобы установить крайний срок. Любые операции сокетов, которые происходят после истечения крайнего срока, помещают iostream в «плохое» состояние.
Например, простая клиентская программа:
ip::tcp::iostream stream;
stream.expires_from_now(boost::posix_time::seconds(60));
stream.connect("www.boost.org", "http");
stream << "GET /LICENSE_1_0.txt HTTP/1.0\r\n";
stream << "Host: www.boost.org\r\n";
stream << "Accept: */*\r\n";
stream << "Connection: close\r\n\r\n";
stream.flush();
std::cout << stream.rdbuf();
Не получится, если все операции сокетов вместе взятые займут более 60 секунд.
Если ошибка действительно произошла, функция iostream<error()
>может быть использована для извлечения кода ошибки из последнего системного вызова:
if (!stream)
{
std::cout << "Error: " << stream.error().message() << "\n";
}
ip::tcp::iostream,basic_socket_iostreamПримеры йостримов.
Эти шаблоны iostream поддерживают только<char
>, а не<wchar_t
>и не выполняют никакого преобразования кода.