|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514 |
- //
- // socket_base.hpp
- // ~~~~~~~~~~~~~~~
- //
- // 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)
- //
-
- #ifndef ASIO_SOCKET_BASE_HPP
- #define ASIO_SOCKET_BASE_HPP
-
- #if defined(_MSC_VER) && (_MSC_VER >= 1200)
- # pragma once
- #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
-
- #include "asio/detail/config.hpp"
- #include "asio/detail/io_control.hpp"
- #include "asio/detail/socket_option.hpp"
- #include "asio/detail/socket_types.hpp"
-
- #include "asio/detail/push_options.hpp"
-
- namespace asio {
-
- /// The socket_base class is used as a base for the basic_stream_socket and
- /// basic_datagram_socket class templates so that we have a common place to
- /// define the shutdown_type and enum.
- class socket_base
- {
- public:
- /// Different ways a socket may be shutdown.
- enum shutdown_type
- {
- #if defined(GENERATING_DOCUMENTATION)
- /// Shutdown the receive side of the socket.
- shutdown_receive = implementation_defined,
-
- /// Shutdown the send side of the socket.
- shutdown_send = implementation_defined,
-
- /// Shutdown both send and receive on the socket.
- shutdown_both = implementation_defined
- #else
- shutdown_receive = ASIO_OS_DEF(SHUT_RD),
- shutdown_send = ASIO_OS_DEF(SHUT_WR),
- shutdown_both = ASIO_OS_DEF(SHUT_RDWR)
- #endif
- };
-
- /// Bitmask type for flags that can be passed to send and receive operations.
- typedef int message_flags;
-
- #if defined(GENERATING_DOCUMENTATION)
- /// Peek at incoming data without removing it from the input queue.
- static const int message_peek = implementation_defined;
-
- /// Process out-of-band data.
- static const int message_out_of_band = implementation_defined;
-
- /// Specify that the data should not be subject to routing.
- static const int message_do_not_route = implementation_defined;
-
- /// Specifies that the data marks the end of a record.
- static const int message_end_of_record = implementation_defined;
- #else
- ASIO_STATIC_CONSTANT(int,
- message_peek = ASIO_OS_DEF(MSG_PEEK));
- ASIO_STATIC_CONSTANT(int,
- message_out_of_band = ASIO_OS_DEF(MSG_OOB));
- ASIO_STATIC_CONSTANT(int,
- message_do_not_route = ASIO_OS_DEF(MSG_DONTROUTE));
- ASIO_STATIC_CONSTANT(int,
- message_end_of_record = ASIO_OS_DEF(MSG_EOR));
- #endif
-
- /// Wait types.
- /**
- * For use with basic_socket::wait() and basic_socket::async_wait().
- */
- enum wait_type
- {
- /// Wait for a socket to become ready to read.
- wait_read,
-
- /// Wait for a socket to become ready to write.
- wait_write,
-
- /// Wait for a socket to have error conditions pending.
- wait_error
- };
-
- /// Socket option to permit sending of broadcast messages.
- /**
- * Implements the SOL_SOCKET/SO_BROADCAST socket option.
- *
- * @par Examples
- * Setting the option:
- * @code
- * asio::ip::udp::socket socket(io_context);
- * ...
- * asio::socket_base::broadcast option(true);
- * socket.set_option(option);
- * @endcode
- *
- * @par
- * Getting the current option value:
- * @code
- * asio::ip::udp::socket socket(io_context);
- * ...
- * asio::socket_base::broadcast option;
- * socket.get_option(option);
- * bool is_set = option.value();
- * @endcode
- *
- * @par Concepts:
- * Socket_Option, Boolean_Socket_Option.
- */
- #if defined(GENERATING_DOCUMENTATION)
- typedef implementation_defined broadcast;
- #else
- typedef asio::detail::socket_option::boolean<
- ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_BROADCAST)>
- broadcast;
- #endif
-
- /// Socket option to enable socket-level debugging.
- /**
- * Implements the SOL_SOCKET/SO_DEBUG socket option.
- *
- * @par Examples
- * Setting the option:
- * @code
- * asio::ip::tcp::socket socket(io_context);
- * ...
- * asio::socket_base::debug option(true);
- * socket.set_option(option);
- * @endcode
- *
- * @par
- * Getting the current option value:
- * @code
- * asio::ip::tcp::socket socket(io_context);
- * ...
- * asio::socket_base::debug option;
- * socket.get_option(option);
- * bool is_set = option.value();
- * @endcode
- *
- * @par Concepts:
- * Socket_Option, Boolean_Socket_Option.
- */
- #if defined(GENERATING_DOCUMENTATION)
- typedef implementation_defined debug;
- #else
- typedef asio::detail::socket_option::boolean<
- ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_DEBUG)> debug;
- #endif
-
- /// Socket option to prevent routing, use local interfaces only.
- /**
- * Implements the SOL_SOCKET/SO_DONTROUTE socket option.
- *
- * @par Examples
- * Setting the option:
- * @code
- * asio::ip::udp::socket socket(io_context);
- * ...
- * asio::socket_base::do_not_route option(true);
- * socket.set_option(option);
- * @endcode
- *
- * @par
- * Getting the current option value:
- * @code
- * asio::ip::udp::socket socket(io_context);
- * ...
- * asio::socket_base::do_not_route option;
- * socket.get_option(option);
- * bool is_set = option.value();
- * @endcode
- *
- * @par Concepts:
- * Socket_Option, Boolean_Socket_Option.
- */
- #if defined(GENERATING_DOCUMENTATION)
- typedef implementation_defined do_not_route;
- #else
- typedef asio::detail::socket_option::boolean<
- ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_DONTROUTE)>
- do_not_route;
- #endif
-
- /// Socket option to send keep-alives.
- /**
- * Implements the SOL_SOCKET/SO_KEEPALIVE socket option.
- *
- * @par Examples
- * Setting the option:
- * @code
- * asio::ip::tcp::socket socket(io_context);
- * ...
- * asio::socket_base::keep_alive option(true);
- * socket.set_option(option);
- * @endcode
- *
- * @par
- * Getting the current option value:
- * @code
- * asio::ip::tcp::socket socket(io_context);
- * ...
- * asio::socket_base::keep_alive option;
- * socket.get_option(option);
- * bool is_set = option.value();
- * @endcode
- *
- * @par Concepts:
- * Socket_Option, Boolean_Socket_Option.
- */
- #if defined(GENERATING_DOCUMENTATION)
- typedef implementation_defined keep_alive;
- #else
- typedef asio::detail::socket_option::boolean<
- ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_KEEPALIVE)> keep_alive;
- #endif
-
- /// Socket option for the send buffer size of a socket.
- /**
- * Implements the SOL_SOCKET/SO_SNDBUF socket option.
- *
- * @par Examples
- * Setting the option:
- * @code
- * asio::ip::tcp::socket socket(io_context);
- * ...
- * asio::socket_base::send_buffer_size option(8192);
- * socket.set_option(option);
- * @endcode
- *
- * @par
- * Getting the current option value:
- * @code
- * asio::ip::tcp::socket socket(io_context);
- * ...
- * asio::socket_base::send_buffer_size option;
- * socket.get_option(option);
- * int size = option.value();
- * @endcode
- *
- * @par Concepts:
- * Socket_Option, Integer_Socket_Option.
- */
- #if defined(GENERATING_DOCUMENTATION)
- typedef implementation_defined send_buffer_size;
- #else
- typedef asio::detail::socket_option::integer<
- ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_SNDBUF)>
- send_buffer_size;
- #endif
-
- /// Socket option for the send low watermark.
- /**
- * Implements the SOL_SOCKET/SO_SNDLOWAT socket option.
- *
- * @par Examples
- * Setting the option:
- * @code
- * asio::ip::tcp::socket socket(io_context);
- * ...
- * asio::socket_base::send_low_watermark option(1024);
- * socket.set_option(option);
- * @endcode
- *
- * @par
- * Getting the current option value:
- * @code
- * asio::ip::tcp::socket socket(io_context);
- * ...
- * asio::socket_base::send_low_watermark option;
- * socket.get_option(option);
- * int size = option.value();
- * @endcode
- *
- * @par Concepts:
- * Socket_Option, Integer_Socket_Option.
- */
- #if defined(GENERATING_DOCUMENTATION)
- typedef implementation_defined send_low_watermark;
- #else
- typedef asio::detail::socket_option::integer<
- ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_SNDLOWAT)>
- send_low_watermark;
- #endif
-
- /// Socket option for the receive buffer size of a socket.
- /**
- * Implements the SOL_SOCKET/SO_RCVBUF socket option.
- *
- * @par Examples
- * Setting the option:
- * @code
- * asio::ip::tcp::socket socket(io_context);
- * ...
- * asio::socket_base::receive_buffer_size option(8192);
- * socket.set_option(option);
- * @endcode
- *
- * @par
- * Getting the current option value:
- * @code
- * asio::ip::tcp::socket socket(io_context);
- * ...
- * asio::socket_base::receive_buffer_size option;
- * socket.get_option(option);
- * int size = option.value();
- * @endcode
- *
- * @par Concepts:
- * Socket_Option, Integer_Socket_Option.
- */
- #if defined(GENERATING_DOCUMENTATION)
- typedef implementation_defined receive_buffer_size;
- #else
- typedef asio::detail::socket_option::integer<
- ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_RCVBUF)>
- receive_buffer_size;
- #endif
-
- /// Socket option for the receive low watermark.
- /**
- * Implements the SOL_SOCKET/SO_RCVLOWAT socket option.
- *
- * @par Examples
- * Setting the option:
- * @code
- * asio::ip::tcp::socket socket(io_context);
- * ...
- * asio::socket_base::receive_low_watermark option(1024);
- * socket.set_option(option);
- * @endcode
- *
- * @par
- * Getting the current option value:
- * @code
- * asio::ip::tcp::socket socket(io_context);
- * ...
- * asio::socket_base::receive_low_watermark option;
- * socket.get_option(option);
- * int size = option.value();
- * @endcode
- *
- * @par Concepts:
- * Socket_Option, Integer_Socket_Option.
- */
- #if defined(GENERATING_DOCUMENTATION)
- typedef implementation_defined receive_low_watermark;
- #else
- typedef asio::detail::socket_option::integer<
- ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_RCVLOWAT)>
- receive_low_watermark;
- #endif
-
- /// Socket option to allow the socket to be bound to an address that is
- /// already in use.
- /**
- * Implements the SOL_SOCKET/SO_REUSEADDR socket option.
- *
- * @par Examples
- * Setting the option:
- * @code
- * asio::ip::tcp::acceptor acceptor(io_context);
- * ...
- * asio::socket_base::reuse_address option(true);
- * acceptor.set_option(option);
- * @endcode
- *
- * @par
- * Getting the current option value:
- * @code
- * asio::ip::tcp::acceptor acceptor(io_context);
- * ...
- * asio::socket_base::reuse_address option;
- * acceptor.get_option(option);
- * bool is_set = option.value();
- * @endcode
- *
- * @par Concepts:
- * Socket_Option, Boolean_Socket_Option.
- */
- #if defined(GENERATING_DOCUMENTATION)
- typedef implementation_defined reuse_address;
- #else
- typedef asio::detail::socket_option::boolean<
- ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_REUSEADDR)>
- reuse_address;
- #endif
-
- /// Socket option to specify whether the socket lingers on close if unsent
- /// data is present.
- /**
- * Implements the SOL_SOCKET/SO_LINGER socket option.
- *
- * @par Examples
- * Setting the option:
- * @code
- * asio::ip::tcp::socket socket(io_context);
- * ...
- * asio::socket_base::linger option(true, 30);
- * socket.set_option(option);
- * @endcode
- *
- * @par
- * Getting the current option value:
- * @code
- * asio::ip::tcp::socket socket(io_context);
- * ...
- * asio::socket_base::linger option;
- * socket.get_option(option);
- * bool is_set = option.enabled();
- * unsigned short timeout = option.timeout();
- * @endcode
- *
- * @par Concepts:
- * Socket_Option, Linger_Socket_Option.
- */
- #if defined(GENERATING_DOCUMENTATION)
- typedef implementation_defined linger;
- #else
- typedef asio::detail::socket_option::linger<
- ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_LINGER)>
- linger;
- #endif
-
- /// Socket option to report aborted connections on accept.
- /**
- * Implements a custom socket option that determines whether or not an accept
- * operation is permitted to fail with asio::error::connection_aborted.
- * By default the option is false.
- *
- * @par Examples
- * Setting the option:
- * @code
- * asio::ip::tcp::acceptor acceptor(io_context);
- * ...
- * asio::socket_base::enable_connection_aborted option(true);
- * acceptor.set_option(option);
- * @endcode
- *
- * @par
- * Getting the current option value:
- * @code
- * asio::ip::tcp::acceptor acceptor(io_context);
- * ...
- * asio::socket_base::enable_connection_aborted option;
- * acceptor.get_option(option);
- * bool is_set = option.value();
- * @endcode
- *
- * @par Concepts:
- * Socket_Option, Boolean_Socket_Option.
- */
- #if defined(GENERATING_DOCUMENTATION)
- typedef implementation_defined enable_connection_aborted;
- #else
- typedef asio::detail::socket_option::boolean<
- asio::detail::custom_socket_option_level,
- asio::detail::enable_connection_aborted_option>
- enable_connection_aborted;
- #endif
-
- /// IO control command to get the amount of data that can be read without
- /// blocking.
- /**
- * Implements the FIONREAD IO control command.
- *
- * @par Example
- * @code
- * asio::ip::tcp::socket socket(io_context);
- * ...
- * asio::socket_base::bytes_readable command(true);
- * socket.io_control(command);
- * std::size_t bytes_readable = command.get();
- * @endcode
- *
- * @par Concepts:
- * IO_Control_Command, Size_IO_Control_Command.
- */
- #if defined(GENERATING_DOCUMENTATION)
- typedef implementation_defined bytes_readable;
- #else
- typedef asio::detail::io_control::bytes_readable bytes_readable;
- #endif
-
- /// The maximum length of the queue of pending incoming connections.
- #if defined(GENERATING_DOCUMENTATION)
- static const int max_connections = implementation_defined;
- #else
- ASIO_STATIC_CONSTANT(int, max_connections
- = ASIO_OS_DEF(SOMAXCONN));
- #endif
-
- protected:
- /// Protected destructor to prevent deletion through this type.
- ~socket_base()
- {
- }
- };
-
- } // namespace asio
-
- #include "asio/detail/pop_options.hpp"
-
- #endif // ASIO_SOCKET_BASE_HPP
|