You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
520 lines
14 KiB
520 lines
14 KiB
// |
|
// socket_base.hpp |
|
// ~~~~~~~~~~~~~~~ |
|
// |
|
// Copyright (c) 2003-2011 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 BOOST_ASIO_SOCKET_BASE_HPP |
|
#define BOOST_ASIO_SOCKET_BASE_HPP |
|
|
|
#if defined(_MSC_VER) && (_MSC_VER >= 1200) |
|
# pragma once |
|
#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) |
|
|
|
#include <boost/asio/detail/config.hpp> |
|
#include <boost/detail/workaround.hpp> |
|
#include <boost/asio/detail/io_control.hpp> |
|
#include <boost/asio/detail/socket_option.hpp> |
|
#include <boost/asio/detail/socket_types.hpp> |
|
|
|
#include <boost/asio/detail/push_options.hpp> |
|
|
|
namespace boost { |
|
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 = boost::asio::detail::shutdown_receive, |
|
shutdown_send = boost::asio::detail::shutdown_send, |
|
shutdown_both = boost::asio::detail::shutdown_both |
|
#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 |
|
BOOST_STATIC_CONSTANT(int, |
|
message_peek = boost::asio::detail::message_peek); |
|
BOOST_STATIC_CONSTANT(int, |
|
message_out_of_band = boost::asio::detail::message_out_of_band); |
|
BOOST_STATIC_CONSTANT(int, |
|
message_do_not_route = boost::asio::detail::message_do_not_route); |
|
BOOST_STATIC_CONSTANT(int, |
|
message_end_of_record = boost::asio::detail::message_end_of_record); |
|
#endif |
|
|
|
/// Socket option to permit sending of broadcast messages. |
|
/** |
|
* Implements the SOL_SOCKET/SO_BROADCAST socket option. |
|
* |
|
* @par Examples |
|
* Setting the option: |
|
* @code |
|
* boost::asio::ip::udp::socket socket(io_service); |
|
* ... |
|
* boost::asio::socket_base::broadcast option(true); |
|
* socket.set_option(option); |
|
* @endcode |
|
* |
|
* @par |
|
* Getting the current option value: |
|
* @code |
|
* boost::asio::ip::udp::socket socket(io_service); |
|
* ... |
|
* boost::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 boost::asio::detail::socket_option::boolean< |
|
SOL_SOCKET, 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 |
|
* boost::asio::ip::tcp::socket socket(io_service); |
|
* ... |
|
* boost::asio::socket_base::debug option(true); |
|
* socket.set_option(option); |
|
* @endcode |
|
* |
|
* @par |
|
* Getting the current option value: |
|
* @code |
|
* boost::asio::ip::tcp::socket socket(io_service); |
|
* ... |
|
* boost::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 boost::asio::detail::socket_option::boolean< |
|
SOL_SOCKET, 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 |
|
* boost::asio::ip::udp::socket socket(io_service); |
|
* ... |
|
* boost::asio::socket_base::do_not_route option(true); |
|
* socket.set_option(option); |
|
* @endcode |
|
* |
|
* @par |
|
* Getting the current option value: |
|
* @code |
|
* boost::asio::ip::udp::socket socket(io_service); |
|
* ... |
|
* boost::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 boost::asio::detail::socket_option::boolean< |
|
SOL_SOCKET, 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 |
|
* boost::asio::ip::tcp::socket socket(io_service); |
|
* ... |
|
* boost::asio::socket_base::keep_alive option(true); |
|
* socket.set_option(option); |
|
* @endcode |
|
* |
|
* @par |
|
* Getting the current option value: |
|
* @code |
|
* boost::asio::ip::tcp::socket socket(io_service); |
|
* ... |
|
* boost::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 boost::asio::detail::socket_option::boolean< |
|
SOL_SOCKET, 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 |
|
* boost::asio::ip::tcp::socket socket(io_service); |
|
* ... |
|
* boost::asio::socket_base::send_buffer_size option(8192); |
|
* socket.set_option(option); |
|
* @endcode |
|
* |
|
* @par |
|
* Getting the current option value: |
|
* @code |
|
* boost::asio::ip::tcp::socket socket(io_service); |
|
* ... |
|
* boost::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 boost::asio::detail::socket_option::integer< |
|
SOL_SOCKET, 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 |
|
* boost::asio::ip::tcp::socket socket(io_service); |
|
* ... |
|
* boost::asio::socket_base::send_low_watermark option(1024); |
|
* socket.set_option(option); |
|
* @endcode |
|
* |
|
* @par |
|
* Getting the current option value: |
|
* @code |
|
* boost::asio::ip::tcp::socket socket(io_service); |
|
* ... |
|
* boost::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 boost::asio::detail::socket_option::integer< |
|
SOL_SOCKET, 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 |
|
* boost::asio::ip::tcp::socket socket(io_service); |
|
* ... |
|
* boost::asio::socket_base::receive_buffer_size option(8192); |
|
* socket.set_option(option); |
|
* @endcode |
|
* |
|
* @par |
|
* Getting the current option value: |
|
* @code |
|
* boost::asio::ip::tcp::socket socket(io_service); |
|
* ... |
|
* boost::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 boost::asio::detail::socket_option::integer< |
|
SOL_SOCKET, 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 |
|
* boost::asio::ip::tcp::socket socket(io_service); |
|
* ... |
|
* boost::asio::socket_base::receive_low_watermark option(1024); |
|
* socket.set_option(option); |
|
* @endcode |
|
* |
|
* @par |
|
* Getting the current option value: |
|
* @code |
|
* boost::asio::ip::tcp::socket socket(io_service); |
|
* ... |
|
* boost::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 boost::asio::detail::socket_option::integer< |
|
SOL_SOCKET, 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 |
|
* boost::asio::ip::tcp::acceptor acceptor(io_service); |
|
* ... |
|
* boost::asio::socket_base::reuse_address option(true); |
|
* acceptor.set_option(option); |
|
* @endcode |
|
* |
|
* @par |
|
* Getting the current option value: |
|
* @code |
|
* boost::asio::ip::tcp::acceptor acceptor(io_service); |
|
* ... |
|
* boost::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 boost::asio::detail::socket_option::boolean< |
|
SOL_SOCKET, 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 |
|
* boost::asio::ip::tcp::socket socket(io_service); |
|
* ... |
|
* boost::asio::socket_base::linger option(true, 30); |
|
* socket.set_option(option); |
|
* @endcode |
|
* |
|
* @par |
|
* Getting the current option value: |
|
* @code |
|
* boost::asio::ip::tcp::socket socket(io_service); |
|
* ... |
|
* boost::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 boost::asio::detail::socket_option::linger< |
|
SOL_SOCKET, 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 boost::asio::error::connection_aborted. |
|
* By default the option is false. |
|
* |
|
* @par Examples |
|
* Setting the option: |
|
* @code |
|
* boost::asio::ip::tcp::acceptor acceptor(io_service); |
|
* ... |
|
* boost::asio::socket_base::enable_connection_aborted option(true); |
|
* acceptor.set_option(option); |
|
* @endcode |
|
* |
|
* @par |
|
* Getting the current option value: |
|
* @code |
|
* boost::asio::ip::tcp::acceptor acceptor(io_service); |
|
* ... |
|
* boost::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 boost::asio::detail::socket_option::boolean< |
|
boost::asio::detail::custom_socket_option_level, |
|
boost::asio::detail::enable_connection_aborted_option> |
|
enable_connection_aborted; |
|
#endif |
|
|
|
/// (Deprecated: Use non_blocking().) IO control command to |
|
/// set the blocking mode of the socket. |
|
/** |
|
* Implements the FIONBIO IO control command. |
|
* |
|
* @par Example |
|
* @code |
|
* boost::asio::ip::tcp::socket socket(io_service); |
|
* ... |
|
* boost::asio::socket_base::non_blocking_io command(true); |
|
* socket.io_control(command); |
|
* @endcode |
|
* |
|
* @par Concepts: |
|
* IO_Control_Command, Boolean_IO_Control_Command. |
|
*/ |
|
#if defined(GENERATING_DOCUMENTATION) |
|
typedef implementation_defined non_blocking_io; |
|
#else |
|
typedef boost::asio::detail::io_control::non_blocking_io non_blocking_io; |
|
#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 |
|
* boost::asio::ip::tcp::socket socket(io_service); |
|
* ... |
|
* boost::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 boost::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 |
|
BOOST_STATIC_CONSTANT(int, max_connections = SOMAXCONN); |
|
#endif |
|
|
|
protected: |
|
/// Protected destructor to prevent deletion through this type. |
|
~socket_base() |
|
{ |
|
} |
|
|
|
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) |
|
private: |
|
// Workaround to enable the empty base optimisation with Borland C++. |
|
char dummy_; |
|
#endif |
|
}; |
|
|
|
} // namespace asio |
|
} // namespace boost |
|
|
|
#include <boost/asio/detail/pop_options.hpp> |
|
|
|
#endif // BOOST_ASIO_SOCKET_BASE_HPP
|
|
|