Asio includes classes that implement iostreams on top of sockets. These hide away the complexities associated with endpoint resolution, protocol independence, etc. To create a connection one might simply write:
ip::tcp::iostream stream("www.boost.org", "http"); if (!stream) { // Can't connect. }
The iostream class can also be used in conjunction with an acceptor to create simple servers. For example:
io_context ioc; ip::tcp::endpoint endpoint(tcp::v4(), 80); ip::tcp::acceptor acceptor(ios, endpoint); for (;;) { ip::tcp::iostream stream; acceptor.accept(stream.socket()); ... }
Timeouts may be set by calling expires_at()
or expires_from_now()
to establish a deadline. Any socket operations
that occur past the deadline will put the iostream into a "bad"
state.
For example, a simple client program like this:
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();
will fail if all the socket operations combined take longer than 60 seconds.
If an error does occur, the iostream's error()
member function may be used to retrieve
the error code from the most recent system call:
if (!stream) { std::cout << "Error: " << stream.error().message() << "\n"; }
ip::tcp::iostream, basic_socket_iostream, iostreams examples.
These iostream templates only support char
,
not wchar_t
, and do not perform
any code conversion.