Home | History | Annotate | Download | only in asio
      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 
     22 namespace 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.
     27 class socket_base
     28 {
     29 public:
     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 
    425 protected:
    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