#### Socket Iostreams

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";
    }

###### See Also

ip::tcp::iostream, basic_socket_iostream, iostreams examples.

###### Notes

These iostream templates only support `char`, not `wchar_t`, and do not perform any code conversion.