560 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			560 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | //
 | ||
|  | // socket_base.hpp
 | ||
|  | // ~~~~~~~~~~~~~~~
 | ||
|  | //
 | ||
|  | // Copyright (c) 2003-2023 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(my_context); | ||
|  |    * ... | ||
|  |    * asio::socket_base::broadcast option(true); | ||
|  |    * socket.set_option(option); | ||
|  |    * @endcode | ||
|  |    * | ||
|  |    * @par | ||
|  |    * Getting the current option value: | ||
|  |    * @code | ||
|  |    * asio::ip::udp::socket socket(my_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(my_context); | ||
|  |    * ... | ||
|  |    * asio::socket_base::debug option(true); | ||
|  |    * socket.set_option(option); | ||
|  |    * @endcode | ||
|  |    * | ||
|  |    * @par | ||
|  |    * Getting the current option value: | ||
|  |    * @code | ||
|  |    * asio::ip::tcp::socket socket(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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 for putting received out-of-band data inline.
 | ||
|  |   /**
 | ||
|  |    * Implements the SOL_SOCKET/SO_OOBINLINE socket option. | ||
|  |    * | ||
|  |    * @par Examples | ||
|  |    * Setting the option: | ||
|  |    * @code | ||
|  |    * asio::ip::tcp::socket socket(my_context); | ||
|  |    * ... | ||
|  |    * asio::socket_base::out_of_band_inline option(true); | ||
|  |    * socket.set_option(option); | ||
|  |    * @endcode | ||
|  |    * | ||
|  |    * @par | ||
|  |    * Getting the current option value: | ||
|  |    * @code | ||
|  |    * asio::ip::tcp::socket socket(my_context); | ||
|  |    * ... | ||
|  |    * asio::socket_base::out_of_band_inline option; | ||
|  |    * socket.get_option(option); | ||
|  |    * bool value = option.value(); | ||
|  |    * @endcode | ||
|  |    * | ||
|  |    * @par Concepts: | ||
|  |    * Socket_Option, Boolean_Socket_Option. | ||
|  |    */ | ||
|  | #if defined(GENERATING_DOCUMENTATION)
 | ||
|  |   typedef implementation_defined out_of_band_inline; | ||
|  | #else
 | ||
|  |   typedef asio::detail::socket_option::boolean< | ||
|  |     ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_OOBINLINE)> | ||
|  |       out_of_band_inline; | ||
|  | #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(my_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(my_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(my_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_listen_connections = implementation_defined; | ||
|  | #else
 | ||
|  |   ASIO_STATIC_CONSTANT(int, max_listen_connections | ||
|  |       = ASIO_OS_DEF(SOMAXCONN)); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #if !defined(ASIO_NO_DEPRECATED)
 | ||
|  |   /// (Deprecated: Use max_listen_connections.) 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
 | ||
|  | #endif // !defined(ASIO_NO_DEPRECATED)
 | ||
|  | 
 | ||
|  | protected: | ||
|  |   /// Protected destructor to prevent deletion through this type.
 | ||
|  |   ~socket_base() | ||
|  |   { | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | } // namespace asio
 | ||
|  | 
 | ||
|  | #include "asio/detail/pop_options.hpp"
 | ||
|  | 
 | ||
|  | #endif // ASIO_SOCKET_BASE_HPP
 |