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 ASIO_SOCKET_BASE_HPP
12#define ASIO_SOCKET_BASE_HPP
13
14
15#include "asio/detail/config.hpp"
16#include "asio/detail/io_control.hpp"
17#include "asio/detail/socket_option.hpp"
18#include "asio/detail/socket_types.hpp"
19
20#include "asio/detail/push_options.hpp"
21
22namespace asio {
23
24/// The socket_base class is used as a base for the basic_stream_socket and
25/// basic_datagram_socket class templates so that we have a common place to
26/// define the shutdown_type and enum.
27class socket_base
28{
29public:
30  /// Different ways a socket may be shutdown.
31  enum shutdown_type
32  {
33    shutdown_receive = ASIO_OS_DEF(SHUT_RD),
34    shutdown_send = ASIO_OS_DEF(SHUT_WR),
35    shutdown_both = ASIO_OS_DEF(SHUT_RDWR)
36  };
37
38  /// Bitmask type for flags that can be passed to send and receive operations.
39  typedef int message_flags;
40
41  ASIO_STATIC_CONSTANT(int,
42      message_peek = ASIO_OS_DEF(MSG_PEEK));
43  ASIO_STATIC_CONSTANT(int,
44      message_out_of_band = ASIO_OS_DEF(MSG_OOB));
45  ASIO_STATIC_CONSTANT(int,
46      message_do_not_route = ASIO_OS_DEF(MSG_DONTROUTE));
47  ASIO_STATIC_CONSTANT(int,
48      message_end_of_record = ASIO_OS_DEF(MSG_EOR));
49
50  /// Socket option to permit sending of broadcast messages.
51  /**
52   * Implements the SOL_SOCKET/SO_BROADCAST socket option.
53   *
54   * @par Examples
55   * Setting the option:
56   * @code
57   * asio::ip::udp::socket socket(io_service);
58   * ...
59   * asio::socket_base::broadcast option(true);
60   * socket.set_option(option);
61   * @endcode
62   *
63   * @par
64   * Getting the current option value:
65   * @code
66   * asio::ip::udp::socket socket(io_service);
67   * ...
68   * asio::socket_base::broadcast option;
69   * socket.get_option(option);
70   * bool is_set = option.value();
71   * @endcode
72   *
73   * @par Concepts:
74   * Socket_Option, Boolean_Socket_Option.
75   */
76  typedef asio::detail::socket_option::boolean<
77    ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_BROADCAST)>
78      broadcast;
79
80  /// Socket option to enable socket-level debugging.
81  /**
82   * Implements the SOL_SOCKET/SO_DEBUG socket option.
83   *
84   * @par Examples
85   * Setting the option:
86   * @code
87   * asio::ip::tcp::socket socket(io_service);
88   * ...
89   * asio::socket_base::debug option(true);
90   * socket.set_option(option);
91   * @endcode
92   *
93   * @par
94   * Getting the current option value:
95   * @code
96   * asio::ip::tcp::socket socket(io_service);
97   * ...
98   * asio::socket_base::debug option;
99   * socket.get_option(option);
100   * bool is_set = option.value();
101   * @endcode
102   *
103   * @par Concepts:
104   * Socket_Option, Boolean_Socket_Option.
105   */
106  typedef asio::detail::socket_option::boolean<
107    ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_DEBUG)> debug;
108
109  /// Socket option to prevent routing, use local interfaces only.
110  /**
111   * Implements the SOL_SOCKET/SO_DONTROUTE socket option.
112   *
113   * @par Examples
114   * Setting the option:
115   * @code
116   * asio::ip::udp::socket socket(io_service);
117   * ...
118   * asio::socket_base::do_not_route option(true);
119   * socket.set_option(option);
120   * @endcode
121   *
122   * @par
123   * Getting the current option value:
124   * @code
125   * asio::ip::udp::socket socket(io_service);
126   * ...
127   * asio::socket_base::do_not_route option;
128   * socket.get_option(option);
129   * bool is_set = option.value();
130   * @endcode
131   *
132   * @par Concepts:
133   * Socket_Option, Boolean_Socket_Option.
134   */
135  typedef asio::detail::socket_option::boolean<
136    ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_DONTROUTE)>
137      do_not_route;
138
139  /// Socket option to send keep-alives.
140  /**
141   * Implements the SOL_SOCKET/SO_KEEPALIVE socket option.
142   *
143   * @par Examples
144   * Setting the option:
145   * @code
146   * asio::ip::tcp::socket socket(io_service);
147   * ...
148   * asio::socket_base::keep_alive option(true);
149   * socket.set_option(option);
150   * @endcode
151   *
152   * @par
153   * Getting the current option value:
154   * @code
155   * asio::ip::tcp::socket socket(io_service);
156   * ...
157   * asio::socket_base::keep_alive option;
158   * socket.get_option(option);
159   * bool is_set = option.value();
160   * @endcode
161   *
162   * @par Concepts:
163   * Socket_Option, Boolean_Socket_Option.
164   */
165  typedef asio::detail::socket_option::boolean<
166    ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_KEEPALIVE)> keep_alive;
167
168  /// Socket option for the send buffer size of a socket.
169  /**
170   * Implements the SOL_SOCKET/SO_SNDBUF socket option.
171   *
172   * @par Examples
173   * Setting the option:
174   * @code
175   * asio::ip::tcp::socket socket(io_service);
176   * ...
177   * asio::socket_base::send_buffer_size option(8192);
178   * socket.set_option(option);
179   * @endcode
180   *
181   * @par
182   * Getting the current option value:
183   * @code
184   * asio::ip::tcp::socket socket(io_service);
185   * ...
186   * asio::socket_base::send_buffer_size option;
187   * socket.get_option(option);
188   * int size = option.value();
189   * @endcode
190   *
191   * @par Concepts:
192   * Socket_Option, Integer_Socket_Option.
193   */
194  typedef asio::detail::socket_option::integer<
195    ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_SNDBUF)>
196      send_buffer_size;
197
198  /// Socket option for the send low watermark.
199  /**
200   * Implements the SOL_SOCKET/SO_SNDLOWAT socket option.
201   *
202   * @par Examples
203   * Setting the option:
204   * @code
205   * asio::ip::tcp::socket socket(io_service);
206   * ...
207   * asio::socket_base::send_low_watermark option(1024);
208   * socket.set_option(option);
209   * @endcode
210   *
211   * @par
212   * Getting the current option value:
213   * @code
214   * asio::ip::tcp::socket socket(io_service);
215   * ...
216   * asio::socket_base::send_low_watermark option;
217   * socket.get_option(option);
218   * int size = option.value();
219   * @endcode
220   *
221   * @par Concepts:
222   * Socket_Option, Integer_Socket_Option.
223   */
224  typedef asio::detail::socket_option::integer<
225    ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_SNDLOWAT)>
226      send_low_watermark;
227
228  /// Socket option for the receive buffer size of a socket.
229  /**
230   * Implements the SOL_SOCKET/SO_RCVBUF socket option.
231   *
232   * @par Examples
233   * Setting the option:
234   * @code
235   * asio::ip::tcp::socket socket(io_service);
236   * ...
237   * asio::socket_base::receive_buffer_size option(8192);
238   * socket.set_option(option);
239   * @endcode
240   *
241   * @par
242   * Getting the current option value:
243   * @code
244   * asio::ip::tcp::socket socket(io_service);
245   * ...
246   * asio::socket_base::receive_buffer_size option;
247   * socket.get_option(option);
248   * int size = option.value();
249   * @endcode
250   *
251   * @par Concepts:
252   * Socket_Option, Integer_Socket_Option.
253   */
254  typedef asio::detail::socket_option::integer<
255    ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_RCVBUF)>
256      receive_buffer_size;
257
258  /// Socket option for the receive low watermark.
259  /**
260   * Implements the SOL_SOCKET/SO_RCVLOWAT socket option.
261   *
262   * @par Examples
263   * Setting the option:
264   * @code
265   * asio::ip::tcp::socket socket(io_service);
266   * ...
267   * asio::socket_base::receive_low_watermark option(1024);
268   * socket.set_option(option);
269   * @endcode
270   *
271   * @par
272   * Getting the current option value:
273   * @code
274   * asio::ip::tcp::socket socket(io_service);
275   * ...
276   * asio::socket_base::receive_low_watermark option;
277   * socket.get_option(option);
278   * int size = option.value();
279   * @endcode
280   *
281   * @par Concepts:
282   * Socket_Option, Integer_Socket_Option.
283   */
284  typedef asio::detail::socket_option::integer<
285    ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_RCVLOWAT)>
286      receive_low_watermark;
287
288  /// Socket option to allow the socket to be bound to an address that is
289  /// already in use.
290  /**
291   * Implements the SOL_SOCKET/SO_REUSEADDR socket option.
292   *
293   * @par Examples
294   * Setting the option:
295   * @code
296   * asio::ip::tcp::acceptor acceptor(io_service);
297   * ...
298   * asio::socket_base::reuse_address option(true);
299   * acceptor.set_option(option);
300   * @endcode
301   *
302   * @par
303   * Getting the current option value:
304   * @code
305   * asio::ip::tcp::acceptor acceptor(io_service);
306   * ...
307   * asio::socket_base::reuse_address option;
308   * acceptor.get_option(option);
309   * bool is_set = option.value();
310   * @endcode
311   *
312   * @par Concepts:
313   * Socket_Option, Boolean_Socket_Option.
314   */
315  typedef asio::detail::socket_option::boolean<
316    ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_REUSEADDR)>
317      reuse_address;
318
319  /// Socket option to specify whether the socket lingers on close if unsent
320  /// data is present.
321  /**
322   * Implements the SOL_SOCKET/SO_LINGER socket option.
323   *
324   * @par Examples
325   * Setting the option:
326   * @code
327   * asio::ip::tcp::socket socket(io_service);
328   * ...
329   * asio::socket_base::linger option(true, 30);
330   * socket.set_option(option);
331   * @endcode
332   *
333   * @par
334   * Getting the current option value:
335   * @code
336   * asio::ip::tcp::socket socket(io_service);
337   * ...
338   * asio::socket_base::linger option;
339   * socket.get_option(option);
340   * bool is_set = option.enabled();
341   * unsigned short timeout = option.timeout();
342   * @endcode
343   *
344   * @par Concepts:
345   * Socket_Option, Linger_Socket_Option.
346   */
347  typedef asio::detail::socket_option::linger<
348    ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_LINGER)>
349      linger;
350
351  /// Socket option to report aborted connections on accept.
352  /**
353   * Implements a custom socket option that determines whether or not an accept
354   * operation is permitted to fail with asio::error::connection_aborted.
355   * By default the option is false.
356   *
357   * @par Examples
358   * Setting the option:
359   * @code
360   * asio::ip::tcp::acceptor acceptor(io_service);
361   * ...
362   * asio::socket_base::enable_connection_aborted option(true);
363   * acceptor.set_option(option);
364   * @endcode
365   *
366   * @par
367   * Getting the current option value:
368   * @code
369   * asio::ip::tcp::acceptor acceptor(io_service);
370   * ...
371   * asio::socket_base::enable_connection_aborted option;
372   * acceptor.get_option(option);
373   * bool is_set = option.value();
374   * @endcode
375   *
376   * @par Concepts:
377   * Socket_Option, Boolean_Socket_Option.
378   */
379  typedef asio::detail::socket_option::boolean<
380    asio::detail::custom_socket_option_level,
381    asio::detail::enable_connection_aborted_option>
382    enable_connection_aborted;
383
384  /// (Deprecated: Use non_blocking().) IO control command to
385  /// set the blocking mode of the socket.
386  /**
387   * Implements the FIONBIO IO control command.
388   *
389   * @par Example
390   * @code
391   * asio::ip::tcp::socket socket(io_service);
392   * ...
393   * asio::socket_base::non_blocking_io command(true);
394   * socket.io_control(command);
395   * @endcode
396   *
397   * @par Concepts:
398   * IO_Control_Command, Boolean_IO_Control_Command.
399   */
400  typedef asio::detail::io_control::non_blocking_io non_blocking_io;
401
402  /// IO control command to get the amount of data that can be read without
403  /// blocking.
404  /**
405   * Implements the FIONREAD IO control command.
406   *
407   * @par Example
408   * @code
409   * asio::ip::tcp::socket socket(io_service);
410   * ...
411   * asio::socket_base::bytes_readable command(true);
412   * socket.io_control(command);
413   * std::size_t bytes_readable = command.get();
414   * @endcode
415   *
416   * @par Concepts:
417   * IO_Control_Command, Size_IO_Control_Command.
418   */
419  typedef asio::detail::io_control::bytes_readable bytes_readable;
420
421  /// The maximum length of the queue of pending incoming connections.
422  ASIO_STATIC_CONSTANT(int, max_connections
423      = ASIO_OS_DEF(SOMAXCONN));
424
425protected:
426  /// Protected destructor to prevent deletion through this type.
427  ~socket_base()
428  {
429  }
430};
431
432} // namespace asio
433
434#include "asio/detail/pop_options.hpp"
435
436#endif // ASIO_SOCKET_BASE_HPP
437