File: iostreams.qbk

package info (click to toggle)
boost1.74 1.74.0-9
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 464,084 kB
  • sloc: cpp: 3,338,324; xml: 131,293; python: 33,088; ansic: 14,336; asm: 4,034; sh: 3,351; makefile: 1,193; perl: 1,036; yacc: 478; php: 212; ruby: 102; lisp: 24; sql: 13; csh: 6
file content (72 lines) | stat: -rw-r--r-- 2,154 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
[/
 / Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com)
 /
 / Distributed under the Boost Software License, Version 1.0. (See accompanying
 / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 /]

[section:iostreams Socket Iostreams]

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

[heading See Also]

[link boost_asio.reference.ip__tcp.iostream ip::tcp::iostream],
[link boost_asio.reference.basic_socket_iostream basic_socket_iostream],
[link boost_asio.examples.cpp03_examples.iostreams iostreams examples].

[heading Notes]

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

[endsect]