1 | // |
2 | // socket_base.hpp |
3 | // ~~~~~~~~~~~~~~~ |
4 | // |
5 | // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) |
6 | // |
7 | // Distributed under the Boost Software License, Version 1.0. (See accompanying |
8 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
9 | // |
10 | |
11 | #ifndef BOOST_ASIO_SOCKET_BASE_HPP |
12 | #define BOOST_ASIO_SOCKET_BASE_HPP |
13 | |
14 | #if defined(_MSC_VER) && (_MSC_VER >= 1200) |
15 | # pragma once |
16 | #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) |
17 | |
18 | #include <boost/asio/detail/config.hpp> |
19 | #include <boost/asio/detail/io_control.hpp> |
20 | #include <boost/asio/detail/socket_option.hpp> |
21 | #include <boost/asio/detail/socket_types.hpp> |
22 | |
23 | #include <boost/asio/detail/push_options.hpp> |
24 | |
25 | namespace boost { |
26 | namespace asio { |
27 | |
28 | /// The socket_base class is used as a base for the basic_stream_socket and |
29 | /// basic_datagram_socket class templates so that we have a common place to |
30 | /// define the shutdown_type and enum. |
31 | class socket_base |
32 | { |
33 | public: |
34 | /// Different ways a socket may be shutdown. |
35 | enum shutdown_type |
36 | { |
37 | #if defined(GENERATING_DOCUMENTATION) |
38 | /// Shutdown the receive side of the socket. |
39 | shutdown_receive = implementation_defined, |
40 | |
41 | /// Shutdown the send side of the socket. |
42 | shutdown_send = implementation_defined, |
43 | |
44 | /// Shutdown both send and receive on the socket. |
45 | shutdown_both = implementation_defined |
46 | #else |
47 | shutdown_receive = BOOST_ASIO_OS_DEF(SHUT_RD), |
48 | shutdown_send = BOOST_ASIO_OS_DEF(SHUT_WR), |
49 | shutdown_both = BOOST_ASIO_OS_DEF(SHUT_RDWR) |
50 | #endif |
51 | }; |
52 | |
53 | /// Bitmask type for flags that can be passed to send and receive operations. |
54 | typedef int message_flags; |
55 | |
56 | #if defined(GENERATING_DOCUMENTATION) |
57 | /// Peek at incoming data without removing it from the input queue. |
58 | static const int message_peek = implementation_defined; |
59 | |
60 | /// Process out-of-band data. |
61 | static const int message_out_of_band = implementation_defined; |
62 | |
63 | /// Specify that the data should not be subject to routing. |
64 | static const int message_do_not_route = implementation_defined; |
65 | |
66 | /// Specifies that the data marks the end of a record. |
67 | static const int message_end_of_record = implementation_defined; |
68 | #else |
69 | BOOST_ASIO_STATIC_CONSTANT(int, |
70 | message_peek = BOOST_ASIO_OS_DEF(MSG_PEEK)); |
71 | BOOST_ASIO_STATIC_CONSTANT(int, |
72 | message_out_of_band = BOOST_ASIO_OS_DEF(MSG_OOB)); |
73 | BOOST_ASIO_STATIC_CONSTANT(int, |
74 | message_do_not_route = BOOST_ASIO_OS_DEF(MSG_DONTROUTE)); |
75 | BOOST_ASIO_STATIC_CONSTANT(int, |
76 | message_end_of_record = BOOST_ASIO_OS_DEF(MSG_EOR)); |
77 | #endif |
78 | |
79 | /// Socket option to permit sending of broadcast messages. |
80 | /** |
81 | * Implements the SOL_SOCKET/SO_BROADCAST socket option. |
82 | * |
83 | * @par Examples |
84 | * Setting the option: |
85 | * @code |
86 | * boost::asio::ip::udp::socket socket(io_service); |
87 | * ... |
88 | * boost::asio::socket_base::broadcast option(true); |
89 | * socket.set_option(option); |
90 | * @endcode |
91 | * |
92 | * @par |
93 | * Getting the current option value: |
94 | * @code |
95 | * boost::asio::ip::udp::socket socket(io_service); |
96 | * ... |
97 | * boost::asio::socket_base::broadcast option; |
98 | * socket.get_option(option); |
99 | * bool is_set = option.value(); |
100 | * @endcode |
101 | * |
102 | * @par Concepts: |
103 | * Socket_Option, Boolean_Socket_Option. |
104 | */ |
105 | #if defined(GENERATING_DOCUMENTATION) |
106 | typedef implementation_defined broadcast; |
107 | #else |
108 | typedef boost::asio::detail::socket_option::boolean< |
109 | BOOST_ASIO_OS_DEF(SOL_SOCKET), BOOST_ASIO_OS_DEF(SO_BROADCAST)> |
110 | broadcast; |
111 | #endif |
112 | |
113 | /// Socket option to enable socket-level debugging. |
114 | /** |
115 | * Implements the SOL_SOCKET/SO_DEBUG socket option. |
116 | * |
117 | * @par Examples |
118 | * Setting the option: |
119 | * @code |
120 | * boost::asio::ip::tcp::socket socket(io_service); |
121 | * ... |
122 | * boost::asio::socket_base::debug option(true); |
123 | * socket.set_option(option); |
124 | * @endcode |
125 | * |
126 | * @par |
127 | * Getting the current option value: |
128 | * @code |
129 | * boost::asio::ip::tcp::socket socket(io_service); |
130 | * ... |
131 | * boost::asio::socket_base::debug option; |
132 | * socket.get_option(option); |
133 | * bool is_set = option.value(); |
134 | * @endcode |
135 | * |
136 | * @par Concepts: |
137 | * Socket_Option, Boolean_Socket_Option. |
138 | */ |
139 | #if defined(GENERATING_DOCUMENTATION) |
140 | typedef implementation_defined debug; |
141 | #else |
142 | typedef boost::asio::detail::socket_option::boolean< |
143 | BOOST_ASIO_OS_DEF(SOL_SOCKET), BOOST_ASIO_OS_DEF(SO_DEBUG)> debug; |
144 | #endif |
145 | |
146 | /// Socket option to prevent routing, use local interfaces only. |
147 | /** |
148 | * Implements the SOL_SOCKET/SO_DONTROUTE socket option. |
149 | * |
150 | * @par Examples |
151 | * Setting the option: |
152 | * @code |
153 | * boost::asio::ip::udp::socket socket(io_service); |
154 | * ... |
155 | * boost::asio::socket_base::do_not_route option(true); |
156 | * socket.set_option(option); |
157 | * @endcode |
158 | * |
159 | * @par |
160 | * Getting the current option value: |
161 | * @code |
162 | * boost::asio::ip::udp::socket socket(io_service); |
163 | * ... |
164 | * boost::asio::socket_base::do_not_route option; |
165 | * socket.get_option(option); |
166 | * bool is_set = option.value(); |
167 | * @endcode |
168 | * |
169 | * @par Concepts: |
170 | * Socket_Option, Boolean_Socket_Option. |
171 | */ |
172 | #if defined(GENERATING_DOCUMENTATION) |
173 | typedef implementation_defined do_not_route; |
174 | #else |
175 | typedef boost::asio::detail::socket_option::boolean< |
176 | BOOST_ASIO_OS_DEF(SOL_SOCKET), BOOST_ASIO_OS_DEF(SO_DONTROUTE)> |
177 | do_not_route; |
178 | #endif |
179 | |
180 | /// Socket option to send keep-alives. |
181 | /** |
182 | * Implements the SOL_SOCKET/SO_KEEPALIVE socket option. |
183 | * |
184 | * @par Examples |
185 | * Setting the option: |
186 | * @code |
187 | * boost::asio::ip::tcp::socket socket(io_service); |
188 | * ... |
189 | * boost::asio::socket_base::keep_alive option(true); |
190 | * socket.set_option(option); |
191 | * @endcode |
192 | * |
193 | * @par |
194 | * Getting the current option value: |
195 | * @code |
196 | * boost::asio::ip::tcp::socket socket(io_service); |
197 | * ... |
198 | * boost::asio::socket_base::keep_alive option; |
199 | * socket.get_option(option); |
200 | * bool is_set = option.value(); |
201 | * @endcode |
202 | * |
203 | * @par Concepts: |
204 | * Socket_Option, Boolean_Socket_Option. |
205 | */ |
206 | #if defined(GENERATING_DOCUMENTATION) |
207 | typedef implementation_defined keep_alive; |
208 | #else |
209 | typedef boost::asio::detail::socket_option::boolean< |
210 | BOOST_ASIO_OS_DEF(SOL_SOCKET), BOOST_ASIO_OS_DEF(SO_KEEPALIVE)> keep_alive; |
211 | #endif |
212 | |
213 | /// Socket option for the send buffer size of a socket. |
214 | /** |
215 | * Implements the SOL_SOCKET/SO_SNDBUF socket option. |
216 | * |
217 | * @par Examples |
218 | * Setting the option: |
219 | * @code |
220 | * boost::asio::ip::tcp::socket socket(io_service); |
221 | * ... |
222 | * boost::asio::socket_base::send_buffer_size option(8192); |
223 | * socket.set_option(option); |
224 | * @endcode |
225 | * |
226 | * @par |
227 | * Getting the current option value: |
228 | * @code |
229 | * boost::asio::ip::tcp::socket socket(io_service); |
230 | * ... |
231 | * boost::asio::socket_base::send_buffer_size option; |
232 | * socket.get_option(option); |
233 | * int size = option.value(); |
234 | * @endcode |
235 | * |
236 | * @par Concepts: |
237 | * Socket_Option, Integer_Socket_Option. |
238 | */ |
239 | #if defined(GENERATING_DOCUMENTATION) |
240 | typedef implementation_defined send_buffer_size; |
241 | #else |
242 | typedef boost::asio::detail::socket_option::integer< |
243 | BOOST_ASIO_OS_DEF(SOL_SOCKET), BOOST_ASIO_OS_DEF(SO_SNDBUF)> |
244 | send_buffer_size; |
245 | #endif |
246 | |
247 | /// Socket option for the send low watermark. |
248 | /** |
249 | * Implements the SOL_SOCKET/SO_SNDLOWAT socket option. |
250 | * |
251 | * @par Examples |
252 | * Setting the option: |
253 | * @code |
254 | * boost::asio::ip::tcp::socket socket(io_service); |
255 | * ... |
256 | * boost::asio::socket_base::send_low_watermark option(1024); |
257 | * socket.set_option(option); |
258 | * @endcode |
259 | * |
260 | * @par |
261 | * Getting the current option value: |
262 | * @code |
263 | * boost::asio::ip::tcp::socket socket(io_service); |
264 | * ... |
265 | * boost::asio::socket_base::send_low_watermark option; |
266 | * socket.get_option(option); |
267 | * int size = option.value(); |
268 | * @endcode |
269 | * |
270 | * @par Concepts: |
271 | * Socket_Option, Integer_Socket_Option. |
272 | */ |
273 | #if defined(GENERATING_DOCUMENTATION) |
274 | typedef implementation_defined send_low_watermark; |
275 | #else |
276 | typedef boost::asio::detail::socket_option::integer< |
277 | BOOST_ASIO_OS_DEF(SOL_SOCKET), BOOST_ASIO_OS_DEF(SO_SNDLOWAT)> |
278 | send_low_watermark; |
279 | #endif |
280 | |
281 | /// Socket option for the receive buffer size of a socket. |
282 | /** |
283 | * Implements the SOL_SOCKET/SO_RCVBUF socket option. |
284 | * |
285 | * @par Examples |
286 | * Setting the option: |
287 | * @code |
288 | * boost::asio::ip::tcp::socket socket(io_service); |
289 | * ... |
290 | * boost::asio::socket_base::receive_buffer_size option(8192); |
291 | * socket.set_option(option); |
292 | * @endcode |
293 | * |
294 | * @par |
295 | * Getting the current option value: |
296 | * @code |
297 | * boost::asio::ip::tcp::socket socket(io_service); |
298 | * ... |
299 | * boost::asio::socket_base::receive_buffer_size option; |
300 | * socket.get_option(option); |
301 | * int size = option.value(); |
302 | * @endcode |
303 | * |
304 | * @par Concepts: |
305 | * Socket_Option, Integer_Socket_Option. |
306 | */ |
307 | #if defined(GENERATING_DOCUMENTATION) |
308 | typedef implementation_defined receive_buffer_size; |
309 | #else |
310 | typedef boost::asio::detail::socket_option::integer< |
311 | BOOST_ASIO_OS_DEF(SOL_SOCKET), BOOST_ASIO_OS_DEF(SO_RCVBUF)> |
312 | receive_buffer_size; |
313 | #endif |
314 | |
315 | /// Socket option for the receive low watermark. |
316 | /** |
317 | * Implements the SOL_SOCKET/SO_RCVLOWAT socket option. |
318 | * |
319 | * @par Examples |
320 | * Setting the option: |
321 | * @code |
322 | * boost::asio::ip::tcp::socket socket(io_service); |
323 | * ... |
324 | * boost::asio::socket_base::receive_low_watermark option(1024); |
325 | * socket.set_option(option); |
326 | * @endcode |
327 | * |
328 | * @par |
329 | * Getting the current option value: |
330 | * @code |
331 | * boost::asio::ip::tcp::socket socket(io_service); |
332 | * ... |
333 | * boost::asio::socket_base::receive_low_watermark option; |
334 | * socket.get_option(option); |
335 | * int size = option.value(); |
336 | * @endcode |
337 | * |
338 | * @par Concepts: |
339 | * Socket_Option, Integer_Socket_Option. |
340 | */ |
341 | #if defined(GENERATING_DOCUMENTATION) |
342 | typedef implementation_defined receive_low_watermark; |
343 | #else |
344 | typedef boost::asio::detail::socket_option::integer< |
345 | BOOST_ASIO_OS_DEF(SOL_SOCKET), BOOST_ASIO_OS_DEF(SO_RCVLOWAT)> |
346 | receive_low_watermark; |
347 | #endif |
348 | |
349 | /// Socket option to allow the socket to be bound to an address that is |
350 | /// already in use. |
351 | /** |
352 | * Implements the SOL_SOCKET/SO_REUSEADDR socket option. |
353 | * |
354 | * @par Examples |
355 | * Setting the option: |
356 | * @code |
357 | * boost::asio::ip::tcp::acceptor acceptor(io_service); |
358 | * ... |
359 | * boost::asio::socket_base::reuse_address option(true); |
360 | * acceptor.set_option(option); |
361 | * @endcode |
362 | * |
363 | * @par |
364 | * Getting the current option value: |
365 | * @code |
366 | * boost::asio::ip::tcp::acceptor acceptor(io_service); |
367 | * ... |
368 | * boost::asio::socket_base::reuse_address option; |
369 | * acceptor.get_option(option); |
370 | * bool is_set = option.value(); |
371 | * @endcode |
372 | * |
373 | * @par Concepts: |
374 | * Socket_Option, Boolean_Socket_Option. |
375 | */ |
376 | #if defined(GENERATING_DOCUMENTATION) |
377 | typedef implementation_defined reuse_address; |
378 | #else |
379 | typedef boost::asio::detail::socket_option::boolean< |
380 | BOOST_ASIO_OS_DEF(SOL_SOCKET), BOOST_ASIO_OS_DEF(SO_REUSEADDR)> |
381 | reuse_address; |
382 | #endif |
383 | |
384 | /// Socket option to specify whether the socket lingers on close if unsent |
385 | /// data is present. |
386 | /** |
387 | * Implements the SOL_SOCKET/SO_LINGER socket option. |
388 | * |
389 | * @par Examples |
390 | * Setting the option: |
391 | * @code |
392 | * boost::asio::ip::tcp::socket socket(io_service); |
393 | * ... |
394 | * boost::asio::socket_base::linger option(true, 30); |
395 | * socket.set_option(option); |
396 | * @endcode |
397 | * |
398 | * @par |
399 | * Getting the current option value: |
400 | * @code |
401 | * boost::asio::ip::tcp::socket socket(io_service); |
402 | * ... |
403 | * boost::asio::socket_base::linger option; |
404 | * socket.get_option(option); |
405 | * bool is_set = option.enabled(); |
406 | * unsigned short timeout = option.timeout(); |
407 | * @endcode |
408 | * |
409 | * @par Concepts: |
410 | * Socket_Option, Linger_Socket_Option. |
411 | */ |
412 | #if defined(GENERATING_DOCUMENTATION) |
413 | typedef implementation_defined linger; |
414 | #else |
415 | typedef boost::asio::detail::socket_option::linger< |
416 | BOOST_ASIO_OS_DEF(SOL_SOCKET), BOOST_ASIO_OS_DEF(SO_LINGER)> |
417 | linger; |
418 | #endif |
419 | |
420 | /// Socket option to report aborted connections on accept. |
421 | /** |
422 | * Implements a custom socket option that determines whether or not an accept |
423 | * operation is permitted to fail with boost::asio::error::connection_aborted. |
424 | * By default the option is false. |
425 | * |
426 | * @par Examples |
427 | * Setting the option: |
428 | * @code |
429 | * boost::asio::ip::tcp::acceptor acceptor(io_service); |
430 | * ... |
431 | * boost::asio::socket_base::enable_connection_aborted option(true); |
432 | * acceptor.set_option(option); |
433 | * @endcode |
434 | * |
435 | * @par |
436 | * Getting the current option value: |
437 | * @code |
438 | * boost::asio::ip::tcp::acceptor acceptor(io_service); |
439 | * ... |
440 | * boost::asio::socket_base::enable_connection_aborted option; |
441 | * acceptor.get_option(option); |
442 | * bool is_set = option.value(); |
443 | * @endcode |
444 | * |
445 | * @par Concepts: |
446 | * Socket_Option, Boolean_Socket_Option. |
447 | */ |
448 | #if defined(GENERATING_DOCUMENTATION) |
449 | typedef implementation_defined enable_connection_aborted; |
450 | #else |
451 | typedef boost::asio::detail::socket_option::boolean< |
452 | boost::asio::detail::custom_socket_option_level, |
453 | boost::asio::detail::enable_connection_aborted_option> |
454 | enable_connection_aborted; |
455 | #endif |
456 | |
457 | /// (Deprecated: Use non_blocking().) IO control command to |
458 | /// set the blocking mode of the socket. |
459 | /** |
460 | * Implements the FIONBIO IO control command. |
461 | * |
462 | * @par Example |
463 | * @code |
464 | * boost::asio::ip::tcp::socket socket(io_service); |
465 | * ... |
466 | * boost::asio::socket_base::non_blocking_io command(true); |
467 | * socket.io_control(command); |
468 | * @endcode |
469 | * |
470 | * @par Concepts: |
471 | * IO_Control_Command, Boolean_IO_Control_Command. |
472 | */ |
473 | #if defined(GENERATING_DOCUMENTATION) |
474 | typedef implementation_defined non_blocking_io; |
475 | #else |
476 | typedef boost::asio::detail::io_control::non_blocking_io non_blocking_io; |
477 | #endif |
478 | |
479 | /// IO control command to get the amount of data that can be read without |
480 | /// blocking. |
481 | /** |
482 | * Implements the FIONREAD IO control command. |
483 | * |
484 | * @par Example |
485 | * @code |
486 | * boost::asio::ip::tcp::socket socket(io_service); |
487 | * ... |
488 | * boost::asio::socket_base::bytes_readable command(true); |
489 | * socket.io_control(command); |
490 | * std::size_t bytes_readable = command.get(); |
491 | * @endcode |
492 | * |
493 | * @par Concepts: |
494 | * IO_Control_Command, Size_IO_Control_Command. |
495 | */ |
496 | #if defined(GENERATING_DOCUMENTATION) |
497 | typedef implementation_defined bytes_readable; |
498 | #else |
499 | typedef boost::asio::detail::io_control::bytes_readable bytes_readable; |
500 | #endif |
501 | |
502 | /// The maximum length of the queue of pending incoming connections. |
503 | #if defined(GENERATING_DOCUMENTATION) |
504 | static const int max_connections = implementation_defined; |
505 | #else |
506 | BOOST_ASIO_STATIC_CONSTANT(int, max_connections |
507 | = BOOST_ASIO_OS_DEF(SOMAXCONN)); |
508 | #endif |
509 | |
510 | protected: |
511 | /// Protected destructor to prevent deletion through this type. |
512 | ~socket_base() |
513 | { |
514 | } |
515 | }; |
516 | |
517 | } // namespace asio |
518 | } // namespace boost |
519 | |
520 | #include <boost/asio/detail/pop_options.hpp> |
521 | |
522 | #endif // BOOST_ASIO_SOCKET_BASE_HPP |
523 | |