summaryrefslogtreecommitdiff
path: root/libs/asio/doc/overview/bsd_sockets.qbk
blob: 43ddc9dc8e6b366aa69c5353a844806b326bcd9a (plain)
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
[/
 / Copyright (c) 2003-2015 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:bsd_sockets The BSD Socket API and Boost.Asio]

The Boost.Asio library includes a low-level socket interface based on the BSD socket
API, which is widely implemented and supported by extensive literature. It is
also used as the basis for networking APIs in other languages, like Java. This
low-level interface is designed to support the development of efficient and
scalable applications. For example, it permits programmers to exert finer
control over the number of system calls, avoid redundant data copying, minimise
the use of resources like threads, and so on.

Unsafe and error prone aspects of the BSD socket API not included. For example,
the use of `int` to represent all sockets lacks type safety. The socket
representation in Boost.Asio uses a distinct type for each protocol, e.g. for TCP one
would use `ip::tcp::socket`, and for UDP one uses `ip::udp::socket`.

The following table shows the mapping between the BSD socket API and Boost.Asio:

[table
  [
    [BSD Socket API Elements]
    [Equivalents in Boost.Asio]
  ]
  [
    [socket descriptor - `int` (POSIX) or `SOCKET` (Windows)]
    [ For TCP: [link boost_asio.reference.ip__tcp.socket ip::tcp::socket],
               [link boost_asio.reference.ip__tcp.acceptor ip::tcp::acceptor]

      For UDP: [link boost_asio.reference.ip__udp.socket ip::udp::socket]

               [link boost_asio.reference.basic_socket basic_socket],
               [link boost_asio.reference.basic_stream_socket basic_stream_socket],
               [link boost_asio.reference.basic_datagram_socket basic_datagram_socket],
               [link boost_asio.reference.basic_raw_socket basic_raw_socket] ]
  ]
  [
    [`in_addr`,
     `in6_addr`]
    [          [link boost_asio.reference.ip__address ip::address],
               [link boost_asio.reference.ip__address ip::address_v4],
               [link boost_asio.reference.ip__address ip::address_v6] ]
  ]
  [
    [`sockaddr_in`,
     `sockaddr_in6`]
    [ For TCP: [link boost_asio.reference.ip__tcp.endpoint ip::tcp::endpoint]
    
      For UDP: [link boost_asio.reference.ip__udp.endpoint ip::udp::endpoint]

               [link boost_asio.reference.ip__basic_endpoint ip::basic_endpoint] ]
  ]
  [
    [`accept()`]
    [ For TCP: [link boost_asio.reference.basic_socket_acceptor.accept ip::tcp::acceptor::accept()]

               [link boost_asio.reference.basic_socket_acceptor.accept basic_socket_acceptor::accept()] ]
  ]
  [
    [`bind()`]
    [ For TCP: [link boost_asio.reference.basic_socket.bind ip::tcp::acceptor::bind()],
               [link boost_asio.reference.basic_socket.bind ip::tcp::socket::bind()]

      For UDP: [link boost_asio.reference.basic_socket.bind ip::udp::socket::bind()]

               [link boost_asio.reference.basic_socket.bind basic_socket::bind()] ]
  ]
  [
    [`close()`]
    [ For TCP: [link boost_asio.reference.basic_socket.close ip::tcp::acceptor::close()],
               [link boost_asio.reference.basic_socket.close ip::tcp::socket::close()]

      For UDP: [link boost_asio.reference.basic_socket.close ip::udp::socket::close()]

               [link boost_asio.reference.basic_socket.close basic_socket::close()] ]
  ]
  [
    [`connect()`]
    [ For TCP: [link boost_asio.reference.basic_socket.connect ip::tcp::socket::connect()]

      For UDP: [link boost_asio.reference.basic_socket.connect ip::udp::socket::connect()]

               [link boost_asio.reference.basic_socket.connect basic_socket::connect()] ]
  ]
  [
    [`getaddrinfo()`,
     `gethostbyaddr()`,
     `gethostbyname()`,
     `getnameinfo()`,
     `getservbyname()`,
     `getservbyport()`]
    [ For TCP: [link boost_asio.reference.ip__basic_resolver.resolve ip::tcp::resolver::resolve()],
               [link boost_asio.reference.ip__basic_resolver.async_resolve ip::tcp::resolver::async_resolve()]

      For UDP: [link boost_asio.reference.ip__basic_resolver.resolve ip::udp::resolver::resolve()],
               [link boost_asio.reference.ip__basic_resolver.async_resolve ip::udp::resolver::async_resolve()]

               [link boost_asio.reference.ip__basic_resolver.resolve ip::basic_resolver::resolve()],
               [link boost_asio.reference.ip__basic_resolver.async_resolve ip::basic_resolver::async_resolve()] ]
  ]
  [
    [`gethostname()`]
    [          [link boost_asio.reference.ip__host_name ip::host_name()] ]
  ]
  [
    [`getpeername()`]
    [ For TCP: [link boost_asio.reference.basic_socket.remote_endpoint ip::tcp::socket::remote_endpoint()]

      For UDP: [link boost_asio.reference.basic_socket.remote_endpoint ip::udp::socket::remote_endpoint()]

               [link boost_asio.reference.basic_socket.remote_endpoint basic_socket::remote_endpoint()] ]
  ]
  [
    [`getsockname()`]
    [ For TCP: [link boost_asio.reference.basic_socket.local_endpoint ip::tcp::acceptor::local_endpoint()],
               [link boost_asio.reference.basic_socket.local_endpoint ip::tcp::socket::local_endpoint()]

      For UDP: [link boost_asio.reference.basic_socket.local_endpoint ip::udp::socket::local_endpoint()]

               [link boost_asio.reference.basic_socket.local_endpoint basic_socket::local_endpoint()] ]
  ]
  [
    [`getsockopt()`]
    [ For TCP: [link boost_asio.reference.basic_socket.get_option ip::tcp::acceptor::get_option()],
               [link boost_asio.reference.basic_socket.get_option ip::tcp::socket::get_option()]

      For UDP: [link boost_asio.reference.basic_socket.get_option ip::udp::socket::get_option()]

               [link boost_asio.reference.basic_socket.get_option basic_socket::get_option()] ]
  ]
  [
    [`inet_addr()`,
     `inet_aton()`,
     `inet_pton()`]
    [          [link boost_asio.reference.ip__address.from_string ip::address::from_string()],
               [link boost_asio.reference.ip__address.from_string ip::address_v4::from_string()],
               [link boost_asio.reference.ip__address.from_string ip_address_v6::from_string()] ]
  ]
  [
    [`inet_ntoa()`,
     `inet_ntop()`]
    [          [link boost_asio.reference.ip__address.to_string ip::address::to_string()],
               [link boost_asio.reference.ip__address.to_string ip::address_v4::to_string()],
               [link boost_asio.reference.ip__address.to_string ip_address_v6::to_string()] ]
  ]
  [
    [`ioctl()`]
    [ For TCP: [link boost_asio.reference.basic_socket.io_control ip::tcp::socket::io_control()]

      For UDP: [link boost_asio.reference.basic_socket.io_control ip::udp::socket::io_control()]

               [link boost_asio.reference.basic_socket.io_control basic_socket::io_control()] ]
  ]
  [
    [`listen()`]
    [ For TCP: [link boost_asio.reference.basic_socket_acceptor.listen ip::tcp::acceptor::listen()]

               [link boost_asio.reference.basic_socket_acceptor.listen basic_socket_acceptor::listen()] ]
  ]
  [
    [`poll()`,
     `select()`,
     `pselect()`]
    [          [link boost_asio.reference.io_service.run io_service::run()],
               [link boost_asio.reference.io_service.run_one io_service::run_one()],
               [link boost_asio.reference.io_service.poll io_service::poll()],
               [link boost_asio.reference.io_service.poll_one io_service::poll_one()]

      Note: in conjunction with asynchronous operations. ]
  ]
  [
    [`readv()`,
     `recv()`,
     `read()`]
    [ For TCP: [link boost_asio.reference.basic_stream_socket.read_some ip::tcp::socket::read_some()],
               [link boost_asio.reference.basic_stream_socket.async_read_some ip::tcp::socket::async_read_some()],
               [link boost_asio.reference.basic_stream_socket.receive ip::tcp::socket::receive()],
               [link boost_asio.reference.basic_stream_socket.async_receive ip::tcp::socket::async_receive()]

      For UDP: [link boost_asio.reference.basic_datagram_socket.receive ip::udp::socket::receive()],
               [link boost_asio.reference.basic_datagram_socket.async_receive ip::udp::socket::async_receive()]

               [link boost_asio.reference.basic_stream_socket.read_some basic_stream_socket::read_some()],
               [link boost_asio.reference.basic_stream_socket.async_read_some basic_stream_socket::async_read_some()],
               [link boost_asio.reference.basic_stream_socket.receive basic_stream_socket::receive()],
               [link boost_asio.reference.basic_stream_socket.async_receive basic_stream_socket::async_receive()],
               [link boost_asio.reference.basic_datagram_socket.receive basic_datagram_socket::receive()],
               [link boost_asio.reference.basic_datagram_socket.async_receive basic_datagram_socket::async_receive()] ]
  ]
  [
    [`recvfrom()`]
    [ For UDP: [link boost_asio.reference.basic_datagram_socket.receive_from ip::udp::socket::receive_from()],
               [link boost_asio.reference.basic_datagram_socket.async_receive_from ip::udp::socket::async_receive_from()]

               [link boost_asio.reference.basic_datagram_socket.receive_from basic_datagram_socket::receive_from()],
               [link boost_asio.reference.basic_datagram_socket.async_receive_from basic_datagram_socket::async_receive_from()] ]
  ]
  [
    [`send()`,
     `write()`,
     `writev()`]
    [ For TCP: [link boost_asio.reference.basic_stream_socket.write_some ip::tcp::socket::write_some()],
               [link boost_asio.reference.basic_stream_socket.async_write_some ip::tcp::socket::async_write_some()],
               [link boost_asio.reference.basic_stream_socket.send ip::tcp::socket::send()],
               [link boost_asio.reference.basic_stream_socket.async_send ip::tcp::socket::async_send()]

      For UDP: [link boost_asio.reference.basic_datagram_socket.send ip::udp::socket::send()],
               [link boost_asio.reference.basic_datagram_socket.async_send ip::udp::socket::async_send()]

               [link boost_asio.reference.basic_stream_socket.write_some basic_stream_socket::write_some()],
               [link boost_asio.reference.basic_stream_socket.async_write_some basic_stream_socket::async_write_some()],
               [link boost_asio.reference.basic_stream_socket.send basic_stream_socket::send()],
               [link boost_asio.reference.basic_stream_socket.async_send basic_stream_socket::async_send()],
               [link boost_asio.reference.basic_datagram_socket.send basic_datagram_socket::send()],
               [link boost_asio.reference.basic_datagram_socket.async_send basic_datagram_socket::async_send()] ]
  ]
  [
    [`sendto()`]
    [ For UDP: [link boost_asio.reference.basic_datagram_socket.send_to ip::udp::socket::send_to()],
               [link boost_asio.reference.basic_datagram_socket.async_send_to ip::udp::socket::async_send_to()]

               [link boost_asio.reference.basic_datagram_socket.send_to basic_datagram_socket::send_to()],
               [link boost_asio.reference.basic_datagram_socket.async_send_to basic_datagram_socket::async_send_to()] ]
  ]
  [
    [`setsockopt()`]
    [ For TCP: [link boost_asio.reference.basic_socket.set_option ip::tcp::acceptor::set_option()],
               [link boost_asio.reference.basic_socket.set_option ip::tcp::socket::set_option()]

      For UDP: [link boost_asio.reference.basic_socket.set_option ip::udp::socket::set_option()]

               [link boost_asio.reference.basic_socket.set_option basic_socket::set_option()] ]
  ]
  [
    [`shutdown()`]
    [ For TCP: [link boost_asio.reference.basic_socket.shutdown ip::tcp::socket::shutdown()]

      For UDP: [link boost_asio.reference.basic_socket.shutdown ip::udp::socket::shutdown()]

               [link boost_asio.reference.basic_socket.shutdown basic_socket::shutdown()] ]
  ]
  [
    [`sockatmark()`]
    [ For TCP: [link boost_asio.reference.basic_socket.at_mark ip::tcp::socket::at_mark()]

               [link boost_asio.reference.basic_socket.at_mark basic_socket::at_mark()] ]
  ]
  [
    [`socket()`]
    [ For TCP: [link boost_asio.reference.basic_socket.open ip::tcp::acceptor::open()],
               [link boost_asio.reference.basic_socket.open ip::tcp::socket::open()]

      For UDP: [link boost_asio.reference.basic_socket.open ip::udp::socket::open()]

               [link boost_asio.reference.basic_socket.open basic_socket::open()] ]
  ]
  [
    [`socketpair()`]
    [          [link boost_asio.reference.local__connect_pair local::connect_pair()]

      Note: POSIX operating systems only. ]
  ]
]

[endsect]