[/
 / Copyright (c) 2003-2021 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)
 /]

[section:reference Reference]

[xinclude quickref.xml]

[include requirements/asynchronous_operations.qbk]
[include requirements/read_write_operations.qbk]
[include requirements/synchronous_socket_operations.qbk]
[include requirements/asynchronous_socket_operations.qbk]
[include requirements/AcceptableProtocol.qbk]
[include requirements/AcceptHandler.qbk]
[include requirements/AsyncRandomAccessReadDevice.qbk]
[include requirements/AsyncRandomAccessWriteDevice.qbk]
[include requirements/AsyncReadStream.qbk]
[include requirements/AsyncWriteStream.qbk]
[include requirements/BufferedHandshakeHandler.qbk]
[include requirements/CompletionCondition.qbk]
[include requirements/CompletionHandler.qbk]
[include requirements/ConnectCondition.qbk]
[include requirements/ConnectHandler.qbk]
[include requirements/ConstBufferSequence.qbk]
[include requirements/DynamicBuffer.qbk]
[include requirements/DynamicBuffer_v1.qbk]
[include requirements/DynamicBuffer_v2.qbk]
[include requirements/Endpoint.qbk]
[include requirements/EndpointSequence.qbk]
[include requirements/ExecutionContext.qbk]
[include requirements/Executor.qbk]
[include requirements/GettableSerialPortOption.qbk]
[include requirements/GettableSocketOption.qbk]
[include requirements/Handler.qbk]
[include requirements/HandshakeHandler.qbk]
[include requirements/InternetProtocol.qbk]
[include requirements/IoControlCommand.qbk]
[include requirements/IoObjectService.qbk]
[include requirements/IteratorConnectHandler.qbk]
[include requirements/LegacyCompletionHandler.qbk]
[include requirements/MoveAcceptHandler.qbk]
[include requirements/MutableBufferSequence.qbk]
[include requirements/OperationState.qbk]
[include requirements/ProtoAllocator.qbk]
[include requirements/Protocol.qbk]
[include requirements/RangeConnectHandler.qbk]
[include requirements/ReadHandler.qbk]
[include requirements/Receiver.qbk]
[include requirements/ResolveHandler.qbk]
[include requirements/Scheduler.qbk]
[include requirements/Sender.qbk]
[include requirements/Service.qbk]
[include requirements/SettableSerialPortOption.qbk]
[include requirements/SettableSocketOption.qbk]
[include requirements/ShutdownHandler.qbk]
[include requirements/SignalHandler.qbk]
[include requirements/SyncRandomAccessReadDevice.qbk]
[include requirements/SyncRandomAccessWriteDevice.qbk]
[include requirements/SyncReadStream.qbk]
[include requirements/SyncWriteStream.qbk]
[include requirements/TimeTraits.qbk]
[include requirements/WaitHandler.qbk]
[include requirements/WaitTraits.qbk]
[include requirements/WriteHandler.qbk]



[section:any_io_executor any_io_executor]

[indexterm1 asio.indexterm.any_io_executor..any_io_executor] 
Polymorphic executor type for use with I/O objects. 


  typedef execution::any_executor<...> any_io_executor;


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__any_executor.any_executor [*any_executor]] [constructor]]
    [Default constructor. 
     [hr]
     Construct in an empty state. Equivalent effects to default constructor. 
     [hr]
     Copy constructor. 
     [hr]
     Move constructor. 
     [hr]
     Construct to point to the same target as another any_executor. 
     [hr]
     Construct a polymorphic wrapper for the specified executor. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor.execute [*execute]]]
    [Execute the function on the target executor. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor.operator_bool [*operator bool]]]
    [Determine whether the wrapper has a target executor. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor.operator_eq_ [*operator=]]]
    [Assignment operator. 
     [hr]
     Move assignment operator. 
     [hr]
     Assignment operator that sets the polymorphic wrapper to the empty state. 
     [hr]
     Assignment operator to create a polymorphic wrapper for the specified executor. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor.prefer [*prefer]]]
    [Obtain a polymorphic wrapper with the specified property. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor.query [*query]]]
    [Obtain the value associated with the specified property. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor.require [*require]]]
    [Obtain a polymorphic wrapper with the specified property. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor.swap [*swap]]]
    [Swap targets with another polymorphic wrapper. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor.target [*target]]]
    [Get a pointer to the target executor. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor.target_type [*target_type]]]
    [Get the type of the target executor. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor._any_executor [*~any_executor]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__any_executor.operator_not__eq_ [*operator!=]]]
    [Inequality operator. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor.operator_eq__eq_ [*operator==]]]
    [Equality operator. ]
  ]
  
]


The `any_io_executor` type is a polymorphic executor that supports the set of properties required by I/O objects. It is defined as the [link asio.reference.execution__any_executor `execution::any_executor`] class template parameterised as follows: 

   execution::any_executor<
     execution::context_as_t<execution_context&>,
     execution::blocking_t::never_t,
     execution::prefer_only<execution::blocking_t::possibly_t>,
     execution::prefer_only<execution::outstanding_work_t::tracked_t>,
     execution::prefer_only<execution::outstanding_work_t::untracked_t>,
     execution::prefer_only<execution::relationship_t::fork_t>,
     execution::prefer_only<execution::relationship_t::continuation_t>
   > 




[heading Requirements]

['Header: ][^asio/any_io_executor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:asio_handler_allocate asio_handler_allocate]

[indexterm1 asio.indexterm.asio_handler_allocate..asio_handler_allocate] 
(Deprecated: Use the [link asio.reference.associated_allocator `associated_allocator`] trait.) Default allocation function for handlers. 


  asio_handler_allocate_is_deprecated asio_handler_allocate(
      std::size_t size,
      ... );


Asynchronous operations may need to allocate temporary objects. Since asynchronous operations have a handler function object, these temporary objects can be said to be associated with the handler.

Implement asio\_handler\_allocate and asio\_handler\_deallocate for your own handlers to provide custom allocation for these temporary objects.

The default implementation of these allocation hooks uses `operator new` and `operator delete`.


[heading Remarks]
      
All temporary objects associated with a handler will be deallocated before the upcall to the handler is performed. This allows the same memory to be reused for a subsequent asynchronous operation initiated by the handler.


[heading Example]
  


   class my_handler;

   void* asio_handler_allocate(std::size_t size, my_handler* context)
   {
     return ::operator new(size);
   }

   void asio_handler_deallocate(void* pointer, std::size_t size,
       my_handler* context)
   {
     ::operator delete(pointer);
   }






[heading Requirements]

['Header: ][^asio/handler_alloc_hook.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:asio_handler_deallocate asio_handler_deallocate]

[indexterm1 asio.indexterm.asio_handler_deallocate..asio_handler_deallocate] 
Default deallocation function for handlers. 


  asio_handler_deallocate_is_deprecated asio_handler_deallocate(
      void * pointer,
      std::size_t size,
      ... );


Implement asio\_handler\_allocate and asio\_handler\_deallocate for your own handlers to provide custom allocation for the associated temporary objects.

The default implementation of these allocation hooks uses `operator new` and `operator delete`.




[heading Requirements]

['Header: ][^asio/handler_alloc_hook.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:asio_handler_invoke asio_handler_invoke]

[indexterm1 asio.indexterm.asio_handler_invoke..asio_handler_invoke] 
(Deprecated: Use the [link asio.reference.associated_executor `associated_executor`] trait.) Default invoke function for handlers. 


Default handler invocation hook used for non-const function objects. 

  template<
      typename Function>
  asio_handler_invoke_is_deprecated ``[link asio.reference.asio_handler_invoke.overload1 asio_handler_invoke]``(
      Function & function,
      ... );
  ``  [''''&raquo;''' [link asio.reference.asio_handler_invoke.overload1 more...]]``

Default handler invocation hook used for const function objects. 

  template<
      typename Function>
  asio_handler_invoke_is_deprecated ``[link asio.reference.asio_handler_invoke.overload2 asio_handler_invoke]``(
      const Function & function,
      ... );
  ``  [''''&raquo;''' [link asio.reference.asio_handler_invoke.overload2 more...]]``

Completion handlers for asynchronous operations are invoked by the [link asio.reference.io_context `io_context`] associated with the corresponding object (e.g. a socket or deadline\_timer). Certain guarantees are made on when the handler may be invoked, in particular that a handler can only be invoked from a thread that is currently calling `run()` on the corresponding [link asio.reference.io_context `io_context`] object. Handlers may subsequently be invoked through other objects (such as [link asio.reference.io_context__strand `io_context::strand`] objects) that provide additional guarantees.

When asynchronous operations are composed from other asynchronous operations, all intermediate handlers should be invoked using the same method as the final handler. This is required to ensure that user-defined objects are not accessed in a way that may violate the guarantees. This hooking function ensures that the invoked method used for the final handler is accessible at each intermediate step.

Implement asio\_handler\_invoke for your own handlers to specify a custom invocation strategy.

This default implementation invokes the function object like so: 

   function(); 


If necessary, the default implementation makes a copy of the function object so that the non-const operator() can be used.


[heading Example]
  


   class my_handler;

   template <typename Function>
   void asio_handler_invoke(Function function, my_handler* context)
   {
     context->strand_.dispatch(function);
   }






[heading Requirements]

['Header: ][^asio/handler_invoke_hook.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 asio_handler_invoke (1 of 2 overloads)]


Default handler invocation hook used for non-const function objects. 


  template<
      typename Function>
  asio_handler_invoke_is_deprecated asio_handler_invoke(
      Function & function,
      ... );



[endsect]



[section:overload2 asio_handler_invoke (2 of 2 overloads)]


Default handler invocation hook used for const function objects. 


  template<
      typename Function>
  asio_handler_invoke_is_deprecated asio_handler_invoke(
      const Function & function,
      ... );



[endsect]


[endsect]


[section:asio_handler_is_continuation asio_handler_is_continuation]

[indexterm1 asio.indexterm.asio_handler_is_continuation..asio_handler_is_continuation] 
Default continuation function for handlers. 


  bool asio_handler_is_continuation(
      ... );


Asynchronous operations may represent a continuation of the asynchronous control flow associated with the current handler. The implementation can use this knowledge to optimise scheduling of the handler.

Implement asio\_handler\_is\_continuation for your own handlers to indicate when a handler represents a continuation.

The default implementation of the continuation hook returns `false`.


[heading Example]
  


   class my_handler;

   bool asio_handler_is_continuation(my_handler* context)
   {
     return true;
   }






[heading Requirements]

['Header: ][^asio/handler_continuation_hook.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:associated_allocator associated_allocator]


Traits type used to obtain the allocator associated with an object. 


  template<
      typename T,
      typename Allocator = std::allocator<void>>
  struct associated_allocator


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.associated_allocator.type [*type]]]
    [If T has a nested type allocator_type, T::allocator_type. Otherwise Allocator. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.associated_allocator.get [*get]] [static]]
    [If T has a nested type allocator_type, returns t.get_allocator(). Otherwise returns a. ]
  ]
  
]

A program may specialise this traits type if the `T` template parameter in the specialisation is a user-defined type. The template parameter `Allocator` shall be a type meeting the Allocator requirements.

Specialisations shall meet the following requirements, where `t` is a const reference to an object of type `T`, and `a` is an object of type `Allocator`.


* Provide a nested typedef `type` that identifies a type meeting the Allocator requirements.


* Provide a noexcept static member function named `get`, callable as `get(t)` and with return type `type`.


* Provide a noexcept static member function named `get`, callable as `get(t,a)` and with return type `type`. 



[heading Requirements]

['Header: ][^asio/associated_allocator.hpp]

['Convenience header: ][^asio.hpp]


[section:get associated_allocator::get]

[indexterm2 asio.indexterm.associated_allocator.get..get..associated_allocator] 
If `T` has a nested type `allocator_type`, returns `t.get_allocator()`. Otherwise returns `a`. 


  static type get(
      const T & t,
      const Allocator & a = Allocator());



[endsect]



[section:type associated_allocator::type]

[indexterm2 asio.indexterm.associated_allocator.type..type..associated_allocator] 
If `T` has a nested type `allocator_type`, `T::allocator_type`. Otherwise `Allocator`. 


  typedef see_below type;



[heading Requirements]

['Header: ][^asio/associated_allocator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:associated_executor associated_executor]


Traits type used to obtain the executor associated with an object. 


  template<
      typename T,
      typename ``[link asio.reference.Executor1 Executor]`` = system_executor>
  struct associated_executor


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.associated_executor.type [*type]]]
    [If T has a nested type executor_type, T::executor_type. Otherwise Executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.associated_executor.get [*get]] [static]]
    [If T has a nested type executor_type, returns t.get_executor(). Otherwise returns ex. ]
  ]
  
]

A program may specialise this traits type if the `T` template parameter in the specialisation is a user-defined type. The template parameter `Executor` shall be a type meeting the Executor requirements.

Specialisations shall meet the following requirements, where `t` is a const reference to an object of type `T`, and `e` is an object of type `Executor`.


* Provide a nested typedef `type` that identifies a type meeting the Executor requirements.


* Provide a noexcept static member function named `get`, callable as `get(t)` and with return type `type`.


* Provide a noexcept static member function named `get`, callable as `get(t,e)` and with return type `type`. 



[heading Requirements]

['Header: ][^asio/associated_executor.hpp]

['Convenience header: ][^asio.hpp]


[section:get associated_executor::get]

[indexterm2 asio.indexterm.associated_executor.get..get..associated_executor] 
If `T` has a nested type `executor_type`, returns `t.get_executor()`. Otherwise returns `ex`. 


  static type get(
      const T & t,
      const Executor & ex = Executor());



[endsect]



[section:type associated_executor::type]

[indexterm2 asio.indexterm.associated_executor.type..type..associated_executor] 
If `T` has a nested type `executor_type`, `T::executor_type`. Otherwise `Executor`. 


  typedef see_below type;



[heading Requirements]

['Header: ][^asio/associated_executor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:async_completion async_completion]


Helper template to deduce the handler type from a CompletionToken, capture a local copy of the handler, and then create an [link asio.reference.async_result `async_result`] for the handler. 


  template<
      typename CompletionToken,
      typename Signature>
  struct async_completion


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.async_completion.completion_handler_type [*completion_handler_type]]]
    [The real handler type to be used for the asynchronous operation. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.async_completion.async_completion [*async_completion]] [constructor]]
    [Constructor. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.async_completion.completion_handler [*completion_handler]]]
    [A copy of, or reference to, a real handler object. ]
  ]

  [
    [[link asio.reference.async_completion.result [*result]]]
    [The result of the asynchronous operation's initiating function. ]
  ]

]

[heading Requirements]

['Header: ][^asio/async_result.hpp]

['Convenience header: ][^asio.hpp]


[section:async_completion async_completion::async_completion]

[indexterm2 asio.indexterm.async_completion.async_completion..async_completion..async_completion] 
Constructor. 


  async_completion(
      CompletionToken & token);


The constructor creates the concrete completion handler and makes the link between the handler and the asynchronous result. 


[endsect]



[section:completion_handler async_completion::completion_handler]

[indexterm2 asio.indexterm.async_completion.completion_handler..completion_handler..async_completion] 
A copy of, or reference to, a real handler object. 


  conditional< is_same< CompletionToken, completion_handler_type >::value, completion_handler_type &, completion_handler_type >::type completion_handler;



[endsect]



[section:completion_handler_type async_completion::completion_handler_type]

[indexterm2 asio.indexterm.async_completion.completion_handler_type..completion_handler_type..async_completion] 
The real handler type to be used for the asynchronous operation. 


  typedef asio::async_result< typename decay< CompletionToken >::type, Signature >::completion_handler_type completion_handler_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.async_result.completion_handler_type [*completion_handler_type]]]
    [The concrete completion handler type for the specific signature. ]
  
  ]

  [

    [[link asio.reference.async_result.return_type [*return_type]]]
    [The return type of the initiating function. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.async_result.async_result [*async_result]] [constructor]]
    [Construct an async result from a given handler. ]
  ]
  
  [
    [[link asio.reference.async_result.get [*get]]]
    [Obtain the value to be returned from the initiating function. ]
  ]
  
  [
    [[link asio.reference.async_result.initiate [*initiate]] [static]]
    [Initiate the asynchronous operation that will produce the result, and obtain the value to be returned from the initiating function. ]
  ]
  
]

The [link asio.reference.async_result `async_result`] traits class is used for determining:


* the concrete completion handler type to be called at the end of the asynchronous operation;


* the initiating function return type; and


* how the return value of the initiating function is obtained.

The trait allows the handler and return types to be determined at the point where the specific completion handler signature is known.

This template may be specialised for user-defined completion token types. The primary template assumes that the CompletionToken is the completion handler. 


[heading Requirements]

['Header: ][^asio/async_result.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:result async_completion::result]

[indexterm2 asio.indexterm.async_completion.result..result..async_completion] 
The result of the asynchronous operation's initiating function. 


  async_result< typename decay< CompletionToken >::type, Signature > result;



[endsect]



[endsect]


[section:async_compose async_compose]

[indexterm1 asio.indexterm.async_compose..async_compose] 
Launch an asynchronous operation with a stateful implementation. 


  template<
      typename CompletionToken,
      typename Signature,
      typename Implementation,
      typename... IoObjectsOrExecutors>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_compose(
      Implementation && implementation,
      CompletionToken & token,
      IoObjectsOrExecutors &&... io_objects_or_executors);


The async\_compose function simplifies the implementation of composed asynchronous operations automatically wrapping a stateful function object with a conforming intermediate completion handler.


[heading Parameters]
    

[variablelist
  
[[implementation][A function object that contains the implementation of the composed asynchronous operation. The first argument to the function object is a non-const reference to the enclosing intermediate completion handler. The remaining arguments are any arguments that originate from the completion handlers of any asynchronous operations performed by the implementation.]]

[[token][The completion token.]]

[[io_objects_or_executors][Zero or more I/O objects or I/O executors for which outstanding work must be maintained.]]

]


[heading Example:]
  




   struct async_echo_implementation
   {
     tcp::socket& socket_;
     asio::mutable_buffer buffer_;
     enum { starting, reading, writing } state_;

     template <typename Self>
     void operator()(Self& self,
         asio::error_code error = {},
         std::size_t n = 0)
     {
       switch (state_)
       {
       case starting:
         state_ = reading;
         socket_.async_read_some(
             buffer_, std::move(self));
         break;
       case reading:
         if (error)
         {
           self.complete(error, 0);
         }
         else
         {
           state_ = writing;
           asio::async_write(socket_, buffer_,
               asio::transfer_exactly(n),
               std::move(self));
         }
         break;
       case writing:
         self.complete(error, n);
         break;
       }
     }
   };

   template <typename CompletionToken>
   auto async_echo(tcp::socket& socket,
       asio::mutable_buffer buffer,
       CompletionToken&& token) ->
     typename asio::async_result<
       typename std::decay<CompletionToken>::type,
         void(asio::error_code, std::size_t)>::return_type
   {
     return asio::async_compose<CompletionToken,
       void(asio::error_code, std::size_t)>(
         async_echo_implementation{socket, buffer,
           async_echo_implementation::starting},
         token, socket);
   } 




[heading Requirements]

['Header: ][^asio/compose.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:async_connect async_connect]

[indexterm1 asio.indexterm.async_connect..async_connect] 
The `async_connect` function is a composed asynchronous operation that establishes a socket connection by trying each endpoint in a sequence. 


Asynchronously establishes a socket connection by trying each endpoint in a sequence. 

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename ``[link asio.reference.EndpointSequence EndpointSequence]``,
      typename ``[link asio.reference.RangeConnectHandler RangeConnectHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_connect.overload1 async_connect]``(
      basic_socket< Protocol, Executor > & s,
      const EndpointSequence & endpoints,
      RangeConnectHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_connect.overload1 more...]]``

(Deprecated: Use range overload.) Asynchronously establishes a socket connection by trying each endpoint in a sequence. 

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator,
      typename ``[link asio.reference.IteratorConnectHandler IteratorConnectHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_connect.overload2 async_connect]``(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      IteratorConnectHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_connect.overload2 more...]]``

Asynchronously establishes a socket connection by trying each endpoint in a sequence. 

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator,
      typename ``[link asio.reference.IteratorConnectHandler IteratorConnectHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_connect.overload3 async_connect]``(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      Iterator end,
      IteratorConnectHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.async_connect.overload3 more...]]``

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename ``[link asio.reference.EndpointSequence EndpointSequence]``,
      typename ``[link asio.reference.ConnectCondition ConnectCondition]``,
      typename ``[link asio.reference.RangeConnectHandler RangeConnectHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_connect.overload4 async_connect]``(
      basic_socket< Protocol, Executor > & s,
      const EndpointSequence & endpoints,
      ConnectCondition connect_condition,
      RangeConnectHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_connect.overload4 more...]]``

(Deprecated: Use range overload.) Asynchronously establishes a socket connection by trying each endpoint in a sequence. 

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator,
      typename ``[link asio.reference.ConnectCondition ConnectCondition]``,
      typename ``[link asio.reference.IteratorConnectHandler IteratorConnectHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_connect.overload5 async_connect]``(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      ConnectCondition connect_condition,
      IteratorConnectHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_connect.overload5 more...]]``

Asynchronously establishes a socket connection by trying each endpoint in a sequence. 

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator,
      typename ``[link asio.reference.ConnectCondition ConnectCondition]``,
      typename ``[link asio.reference.IteratorConnectHandler IteratorConnectHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_connect.overload6 async_connect]``(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      Iterator end,
      ConnectCondition connect_condition,
      IteratorConnectHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.async_connect.overload6 more...]]``

[heading Requirements]

['Header: ][^asio/connect.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 async_connect (1 of 6 overloads)]


Asynchronously establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename ``[link asio.reference.EndpointSequence EndpointSequence]``,
      typename ``[link asio.reference.RangeConnectHandler RangeConnectHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_connect(
      basic_socket< Protocol, Executor > & s,
      const EndpointSequence & endpoints,
      RangeConnectHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);


This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's `async_connect` member function, once for each endpoint in the sequence, until a connection is successfully established.


[heading Parameters]
    

[variablelist
  
[[s][The socket to be connected. If the socket is already open, it will be closed.]]

[[endpoints][A sequence of endpoints.]]

[[handler][The handler to be called when the connect operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation. if the sequence is empty, set to
     // asio::error::not_found. Otherwise, contains the
     // error from the last connection attempt.
     const asio::error_code& error,

     // On success, the successfully connected endpoint.
     // Otherwise, a default-constructed endpoint.
     const typename Protocol::endpoint& endpoint
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  


   tcp::resolver r(my_context);
   tcp::resolver::query q("host", "service");
   tcp::socket s(my_context);

   // ...

   r.async_resolve(q, resolve_handler);

   // ...

   void resolve_handler(
       const asio::error_code& ec,
       tcp::resolver::results_type results)
   {
     if (!ec)
     {
       asio::async_connect(s, results, connect_handler);
     }
   }

   // ...

   void connect_handler(
       const asio::error_code& ec,
       const tcp::endpoint& endpoint)
   {
     // ...
   } 







[endsect]



[section:overload2 async_connect (2 of 6 overloads)]


(Deprecated: Use range overload.) Asynchronously establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator,
      typename ``[link asio.reference.IteratorConnectHandler IteratorConnectHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_connect(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      IteratorConnectHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);


This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's `async_connect` member function, once for each endpoint in the sequence, until a connection is successfully established.


[heading Parameters]
    

[variablelist
  
[[s][The socket to be connected. If the socket is already open, it will be closed.]]

[[begin][An iterator pointing to the start of a sequence of endpoints.]]

[[handler][The handler to be called when the connect operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation. if the sequence is empty, set to
     // asio::error::not_found. Otherwise, contains the
     // error from the last connection attempt.
     const asio::error_code& error,

     // On success, an iterator denoting the successfully
     // connected endpoint. Otherwise, the end iterator.
     Iterator iterator
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
This overload assumes that a default constructed object of type `Iterator` represents the end of the sequence. This is a valid assumption for iterator types such as `asio::ip::tcp::resolver::iterator`. 




[endsect]



[section:overload3 async_connect (3 of 6 overloads)]


Asynchronously establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator,
      typename ``[link asio.reference.IteratorConnectHandler IteratorConnectHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_connect(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      Iterator end,
      IteratorConnectHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's `async_connect` member function, once for each endpoint in the sequence, until a connection is successfully established.


[heading Parameters]
    

[variablelist
  
[[s][The socket to be connected. If the socket is already open, it will be closed.]]

[[begin][An iterator pointing to the start of a sequence of endpoints.]]

[[end][An iterator pointing to the end of a sequence of endpoints.]]

[[handler][The handler to be called when the connect operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation. if the sequence is empty, set to
     // asio::error::not_found. Otherwise, contains the
     // error from the last connection attempt.
     const asio::error_code& error,

     // On success, an iterator denoting the successfully
     // connected endpoint. Otherwise, the end iterator.
     Iterator iterator
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  


   std::vector<tcp::endpoint> endpoints = ...;
   tcp::socket s(my_context);
   asio::async_connect(s,
       endpoints.begin(), endpoints.end(),
       connect_handler);

   // ...

   void connect_handler(
       const asio::error_code& ec,
       std::vector<tcp::endpoint>::iterator i)
   {
     // ...
   } 







[endsect]



[section:overload4 async_connect (4 of 6 overloads)]


Asynchronously establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename ``[link asio.reference.EndpointSequence EndpointSequence]``,
      typename ``[link asio.reference.ConnectCondition ConnectCondition]``,
      typename ``[link asio.reference.RangeConnectHandler RangeConnectHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_connect(
      basic_socket< Protocol, Executor > & s,
      const EndpointSequence & endpoints,
      ConnectCondition connect_condition,
      RangeConnectHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);


This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's `async_connect` member function, once for each endpoint in the sequence, until a connection is successfully established.


[heading Parameters]
    

[variablelist
  
[[s][The socket to be connected. If the socket is already open, it will be closed.]]

[[endpoints][A sequence of endpoints.]]

[[connect_condition][A function object that is called prior to each connection attempt. The signature of the function object must be: 
``
   bool connect_condition(
       const asio::error_code& ec,
       const typename Protocol::endpoint& next); 
``
The `ec` parameter contains the result from the most recent connect operation. Before the first connection attempt, `ec` is always set to indicate success. The `next` parameter is the next endpoint to be tried. The function object should return true if the next endpoint should be tried, and false if it should be skipped.]]

[[handler][The handler to be called when the connect operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation. if the sequence is empty, set to
     // asio::error::not_found. Otherwise, contains the
     // error from the last connection attempt.
     const asio::error_code& error,

     // On success, an iterator denoting the successfully
     // connected endpoint. Otherwise, the end iterator.
     Iterator iterator
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  
The following connect condition function object can be used to output information about the individual connection attempts: 

   struct my_connect_condition
   {
     bool operator()(
         const asio::error_code& ec,
         const::tcp::endpoint& next)
     {
       if (ec) std::cout << "Error: " << ec.message() << std::endl;
       std::cout << "Trying: " << next << std::endl;
       return true;
     }
   }; 


It would be used with the `asio::connect` function as follows: 

   tcp::resolver r(my_context);
   tcp::resolver::query q("host", "service");
   tcp::socket s(my_context);

   // ...

   r.async_resolve(q, resolve_handler);

   // ...

   void resolve_handler(
       const asio::error_code& ec,
       tcp::resolver::results_type results)
   {
     if (!ec)
     {
       asio::async_connect(s, results,
           my_connect_condition(),
           connect_handler);
     }
   }

   // ...

   void connect_handler(
       const asio::error_code& ec,
       const tcp::endpoint& endpoint)
   {
     if (ec)
     {
       // An error occurred.
     }
     else
     {
       std::cout << "Connected to: " << endpoint << std::endl;
     }
   } 







[endsect]



[section:overload5 async_connect (5 of 6 overloads)]


(Deprecated: Use range overload.) Asynchronously establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator,
      typename ``[link asio.reference.ConnectCondition ConnectCondition]``,
      typename ``[link asio.reference.IteratorConnectHandler IteratorConnectHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_connect(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      ConnectCondition connect_condition,
      IteratorConnectHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);


This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's `async_connect` member function, once for each endpoint in the sequence, until a connection is successfully established.


[heading Parameters]
    

[variablelist
  
[[s][The socket to be connected. If the socket is already open, it will be closed.]]

[[begin][An iterator pointing to the start of a sequence of endpoints.]]

[[connect_condition][A function object that is called prior to each connection attempt. The signature of the function object must be: 
``
   bool connect_condition(
       const asio::error_code& ec,
       const typename Protocol::endpoint& next); 
``
The `ec` parameter contains the result from the most recent connect operation. Before the first connection attempt, `ec` is always set to indicate success. The `next` parameter is the next endpoint to be tried. The function object should return true if the next endpoint should be tried, and false if it should be skipped.]]

[[handler][The handler to be called when the connect operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation. if the sequence is empty, set to
     // asio::error::not_found. Otherwise, contains the
     // error from the last connection attempt.
     const asio::error_code& error,

     // On success, an iterator denoting the successfully
     // connected endpoint. Otherwise, the end iterator.
     Iterator iterator
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
This overload assumes that a default constructed object of type `Iterator` represents the end of the sequence. This is a valid assumption for iterator types such as `asio::ip::tcp::resolver::iterator`. 




[endsect]



[section:overload6 async_connect (6 of 6 overloads)]


Asynchronously establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator,
      typename ``[link asio.reference.ConnectCondition ConnectCondition]``,
      typename ``[link asio.reference.IteratorConnectHandler IteratorConnectHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_connect(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      Iterator end,
      ConnectCondition connect_condition,
      IteratorConnectHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's `async_connect` member function, once for each endpoint in the sequence, until a connection is successfully established.


[heading Parameters]
    

[variablelist
  
[[s][The socket to be connected. If the socket is already open, it will be closed.]]

[[begin][An iterator pointing to the start of a sequence of endpoints.]]

[[end][An iterator pointing to the end of a sequence of endpoints.]]

[[connect_condition][A function object that is called prior to each connection attempt. The signature of the function object must be: 
``
   bool connect_condition(
       const asio::error_code& ec,
       const typename Protocol::endpoint& next); 
``
The `ec` parameter contains the result from the most recent connect operation. Before the first connection attempt, `ec` is always set to indicate success. The `next` parameter is the next endpoint to be tried. The function object should return true if the next endpoint should be tried, and false if it should be skipped.]]

[[handler][The handler to be called when the connect operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation. if the sequence is empty, set to
     // asio::error::not_found. Otherwise, contains the
     // error from the last connection attempt.
     const asio::error_code& error,

     // On success, an iterator denoting the successfully
     // connected endpoint. Otherwise, the end iterator.
     Iterator iterator
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  
The following connect condition function object can be used to output information about the individual connection attempts: 

   struct my_connect_condition
   {
     bool operator()(
         const asio::error_code& ec,
         const::tcp::endpoint& next)
     {
       if (ec) std::cout << "Error: " << ec.message() << std::endl;
       std::cout << "Trying: " << next << std::endl;
       return true;
     }
   }; 


It would be used with the `asio::connect` function as follows: 

   tcp::resolver r(my_context);
   tcp::resolver::query q("host", "service");
   tcp::socket s(my_context);

   // ...

   r.async_resolve(q, resolve_handler);

   // ...

   void resolve_handler(
       const asio::error_code& ec,
       tcp::resolver::iterator i)
   {
     if (!ec)
     {
       tcp::resolver::iterator end;
       asio::async_connect(s, i, end,
           my_connect_condition(),
           connect_handler);
     }
   }

   // ...

   void connect_handler(
       const asio::error_code& ec,
       tcp::resolver::iterator i)
   {
     if (ec)
     {
       // An error occurred.
     }
     else
     {
       std::cout << "Connected to: " << i->endpoint() << std::endl;
     }
   } 







[endsect]


[endsect]


[section:async_initiate async_initiate]

[indexterm1 asio.indexterm.async_initiate..async_initiate] 

  template<
      typename CompletionToken,
      completion_signature Signature,
      typename Initiation,
      typename... Args>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_initiate(
      Initiation && initiation,
      CompletionToken & ,
      Args &&... args);


[heading Requirements]

['Header: ][^asio/async_result.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:async_read async_read]

[indexterm1 asio.indexterm.async_read..async_read] 
The `async_read` function is a composed asynchronous operation that reads a certain amount of data from a stream before completion. 


Start an asynchronous operation to read a certain amount of data from a stream. 

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read.overload1 async_read]``(
      AsyncReadStream & s,
      const MutableBufferSequence & buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_read.overload1 more...]]``

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read.overload2 async_read]``(
      AsyncReadStream & s,
      const MutableBufferSequence & buffers,
      CompletionCondition completion_condition,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_read.overload2 more...]]``

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read.overload3 async_read]``(
      AsyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_read.overload3 more...]]``

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read.overload4 async_read]``(
      AsyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      CompletionCondition completion_condition,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_read.overload4 more...]]``

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename Allocator,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read.overload5 async_read]``(
      AsyncReadStream & s,
      basic_streambuf< Allocator > & b,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.async_read.overload5 more...]]``

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read.overload6 async_read]``(
      AsyncReadStream & s,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.async_read.overload6 more...]]``

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read.overload7 async_read]``(
      AsyncReadStream & s,
      DynamicBuffer_v2 buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_read.overload7 more...]]``

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read.overload8 async_read]``(
      AsyncReadStream & s,
      DynamicBuffer_v2 buffers,
      CompletionCondition completion_condition,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_read.overload8 more...]]``

[heading Requirements]

['Header: ][^asio/read.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 async_read (1 of 8 overloads)]


Start an asynchronous operation to read a certain amount of data from a stream. 


  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read(
      AsyncReadStream & s,
      const MutableBufferSequence & buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);


This function is used to asynchronously read a certain number of bytes of data from a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async\_read\_some function, and is known as a ['composed operation]. The program must ensure that the stream performs no other read operations (such as async\_read, the stream's async\_read\_some function, or any other composed operations that perform reads) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the AsyncReadStream concept.]]

[[buffers][One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the stream. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.

     std::size_t bytes_transferred           // Number of bytes copied into the
                                             // buffers. If an error occurred,
                                             // this will be the  number of
                                             // bytes successfully transferred
                                             // prior to the error.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  
To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::async_read(s, asio::buffer(data, size), handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::async_read(
       s, buffers,
       asio::transfer_all(),
       handler); 







[endsect]



[section:overload2 async_read (2 of 8 overloads)]


Start an asynchronous operation to read a certain amount of data from a stream. 


  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read(
      AsyncReadStream & s,
      const MutableBufferSequence & buffers,
      CompletionCondition completion_condition,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);


This function is used to asynchronously read a certain number of bytes of data from a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.


* The completion\_condition function object returns 0.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the AsyncReadStream concept.]]

[[buffers][One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the stream. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[completion_condition][The function object to be called to determine whether the read operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest async_read_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the stream's async\_read\_some function.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.

     std::size_t bytes_transferred           // Number of bytes copied into the
                                             // buffers. If an error occurred,
                                             // this will be the  number of
                                             // bytes successfully transferred
                                             // prior to the error.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  
To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::async_read(s,
       asio::buffer(data, size),
       asio::transfer_at_least(32),
       handler); 


See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload3 async_read (3 of 8 overloads)]


Start an asynchronous operation to read a certain amount of data from a stream. 


  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read(
      AsyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to asynchronously read a certain number of bytes of data from a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* The specified dynamic buffer sequence is full (that is, it has reached maximum size).


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async\_read\_some function, and is known as a ['composed operation]. The program must ensure that the stream performs no other read operations (such as async\_read, the stream's async\_read\_some function, or any other composed operations that perform reads) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the AsyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.

     std::size_t bytes_transferred           // Number of bytes copied into the
                                             // buffers. If an error occurred,
                                             // this will be the  number of
                                             // bytes successfully transferred
                                             // prior to the error.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::async_read(
       s, buffers,
       asio::transfer_all(),
       handler); 







[endsect]



[section:overload4 async_read (4 of 8 overloads)]


Start an asynchronous operation to read a certain amount of data from a stream. 


  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read(
      AsyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      CompletionCondition completion_condition,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to asynchronously read a certain number of bytes of data from a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* The specified dynamic buffer sequence is full (that is, it has reached maximum size).


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's async\_read\_some function, and is known as a ['composed operation]. The program must ensure that the stream performs no other read operations (such as async\_read, the stream's async\_read\_some function, or any other composed operations that perform reads) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the AsyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[completion_condition][The function object to be called to determine whether the read operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest async_read_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the stream's async\_read\_some function.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.

     std::size_t bytes_transferred           // Number of bytes copied into the
                                             // buffers. If an error occurred,
                                             // this will be the  number of
                                             // bytes successfully transferred
                                             // prior to the error.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`]. ]]

]




[endsect]



[section:overload5 async_read (5 of 8 overloads)]


Start an asynchronous operation to read a certain amount of data from a stream. 


  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename Allocator,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read(
      AsyncReadStream & s,
      basic_streambuf< Allocator > & b,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously read a certain number of bytes of data from a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* The supplied buffer is full (that is, it has reached maximum size).


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async\_read\_some function, and is known as a ['composed operation]. The program must ensure that the stream performs no other read operations (such as async\_read, the stream's async\_read\_some function, or any other composed operations that perform reads) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the AsyncReadStream concept.]]

[[b][A [link asio.reference.basic_streambuf `basic_streambuf`] object into which the data will be read. Ownership of the streambuf is retained by the caller, which must guarantee that it remains valid until the handler is called.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.

     std::size_t bytes_transferred           // Number of bytes copied into the
                                             // buffers. If an error occurred,
                                             // this will be the  number of
                                             // bytes successfully transferred
                                             // prior to the error.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::async_read(
       s, b,
       asio::transfer_all(),
       handler); 







[endsect]



[section:overload6 async_read (6 of 8 overloads)]


Start an asynchronous operation to read a certain amount of data from a stream. 


  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read(
      AsyncReadStream & s,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously read a certain number of bytes of data from a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* The supplied buffer is full (that is, it has reached maximum size).


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's async\_read\_some function, and is known as a ['composed operation]. The program must ensure that the stream performs no other read operations (such as async\_read, the stream's async\_read\_some function, or any other composed operations that perform reads) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the AsyncReadStream concept.]]

[[b][A [link asio.reference.basic_streambuf `basic_streambuf`] object into which the data will be read. Ownership of the streambuf is retained by the caller, which must guarantee that it remains valid until the handler is called.]]

[[completion_condition][The function object to be called to determine whether the read operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest async_read_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the stream's async\_read\_some function.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.

     std::size_t bytes_transferred           // Number of bytes copied into the
                                             // buffers. If an error occurred,
                                             // this will be the  number of
                                             // bytes successfully transferred
                                             // prior to the error.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`]. ]]

]




[endsect]



[section:overload7 async_read (7 of 8 overloads)]


Start an asynchronous operation to read a certain amount of data from a stream. 


  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read(
      AsyncReadStream & s,
      DynamicBuffer_v2 buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to asynchronously read a certain number of bytes of data from a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* The specified dynamic buffer sequence is full (that is, it has reached maximum size).


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async\_read\_some function, and is known as a ['composed operation]. The program must ensure that the stream performs no other read operations (such as async\_read, the stream's async\_read\_some function, or any other composed operations that perform reads) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the AsyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.

     std::size_t bytes_transferred           // Number of bytes copied into the
                                             // buffers. If an error occurred,
                                             // this will be the  number of
                                             // bytes successfully transferred
                                             // prior to the error.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::async_read(
       s, buffers,
       asio::transfer_all(),
       handler); 







[endsect]



[section:overload8 async_read (8 of 8 overloads)]


Start an asynchronous operation to read a certain amount of data from a stream. 


  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read(
      AsyncReadStream & s,
      DynamicBuffer_v2 buffers,
      CompletionCondition completion_condition,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to asynchronously read a certain number of bytes of data from a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* The specified dynamic buffer sequence is full (that is, it has reached maximum size).


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's async\_read\_some function, and is known as a ['composed operation]. The program must ensure that the stream performs no other read operations (such as async\_read, the stream's async\_read\_some function, or any other composed operations that perform reads) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the AsyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[completion_condition][The function object to be called to determine whether the read operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest async_read_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the stream's async\_read\_some function.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.

     std::size_t bytes_transferred           // Number of bytes copied into the
                                             // buffers. If an error occurred,
                                             // this will be the  number of
                                             // bytes successfully transferred
                                             // prior to the error.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`]. ]]

]




[endsect]


[endsect]

[section:async_read_at async_read_at]

[indexterm1 asio.indexterm.async_read_at..async_read_at] 
The `async_read_at` function is a composed asynchronous operation that reads a certain amount of data at the specified offset. 


Start an asynchronous operation to read a certain amount of data at the specified offset. 

  template<
      typename ``[link asio.reference.AsyncRandomAccessReadDevice AsyncRandomAccessReadDevice]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read_at.overload1 async_read_at]``(
      AsyncRandomAccessReadDevice & d,
      uint64_t offset,
      const MutableBufferSequence & buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.async_read_at.overload1 more...]]``

  template<
      typename ``[link asio.reference.AsyncRandomAccessReadDevice AsyncRandomAccessReadDevice]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read_at.overload2 async_read_at]``(
      AsyncRandomAccessReadDevice & d,
      uint64_t offset,
      const MutableBufferSequence & buffers,
      CompletionCondition completion_condition,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.async_read_at.overload2 more...]]``

  template<
      typename ``[link asio.reference.AsyncRandomAccessReadDevice AsyncRandomAccessReadDevice]``,
      typename Allocator,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read_at.overload3 async_read_at]``(
      AsyncRandomAccessReadDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.async_read_at.overload3 more...]]``

  template<
      typename ``[link asio.reference.AsyncRandomAccessReadDevice AsyncRandomAccessReadDevice]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read_at.overload4 async_read_at]``(
      AsyncRandomAccessReadDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.async_read_at.overload4 more...]]``

[heading Requirements]

['Header: ][^asio/read_at.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 async_read_at (1 of 4 overloads)]


Start an asynchronous operation to read a certain amount of data at the specified offset. 


  template<
      typename ``[link asio.reference.AsyncRandomAccessReadDevice AsyncRandomAccessReadDevice]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_at(
      AsyncRandomAccessReadDevice & d,
      uint64_t offset,
      const MutableBufferSequence & buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously read a certain number of bytes of data from a random access device at the specified offset. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.


* An error occurred.

This operation is implemented in terms of zero or more calls to the device's async\_read\_some\_at function.


[heading Parameters]
    

[variablelist
  
[[d][The device from which the data is to be read. The type must support the AsyncRandomAccessReadDevice concept.]]

[[offset][The offset at which the data will be read.]]

[[buffers][One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the device. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation.
     const asio::error_code& error,

     // Number of bytes copied into the buffers. If an error
     // occurred, this will be the number of bytes successfully
     // transferred prior to the error.
     std::size_t bytes_transferred
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  
To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::async_read_at(d, 42, asio::buffer(data, size), handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::async_read_at(
       d, 42, buffers,
       asio::transfer_all(),
       handler); 







[endsect]



[section:overload2 async_read_at (2 of 4 overloads)]


Start an asynchronous operation to read a certain amount of data at the specified offset. 


  template<
      typename ``[link asio.reference.AsyncRandomAccessReadDevice AsyncRandomAccessReadDevice]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_at(
      AsyncRandomAccessReadDevice & d,
      uint64_t offset,
      const MutableBufferSequence & buffers,
      CompletionCondition completion_condition,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously read a certain number of bytes of data from a random access device at the specified offset. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.


* The completion\_condition function object returns 0.


[heading Parameters]
    

[variablelist
  
[[d][The device from which the data is to be read. The type must support the AsyncRandomAccessReadDevice concept.]]

[[offset][The offset at which the data will be read.]]

[[buffers][One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the device. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[completion_condition][The function object to be called to determine whether the read operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest async_read_some_at operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the device's async\_read\_some\_at function.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation.
     const asio::error_code& error,

     // Number of bytes copied into the buffers. If an error
     // occurred, this will be the number of bytes successfully
     // transferred prior to the error.
     std::size_t bytes_transferred
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  
To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::async_read_at(d, 42,
       asio::buffer(data, size),
       asio::transfer_at_least(32),
       handler); 


See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload3 async_read_at (3 of 4 overloads)]


Start an asynchronous operation to read a certain amount of data at the specified offset. 


  template<
      typename ``[link asio.reference.AsyncRandomAccessReadDevice AsyncRandomAccessReadDevice]``,
      typename Allocator,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_at(
      AsyncRandomAccessReadDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously read a certain number of bytes of data from a random access device at the specified offset. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* An error occurred.

This operation is implemented in terms of zero or more calls to the device's async\_read\_some\_at function.


[heading Parameters]
    

[variablelist
  
[[d][The device from which the data is to be read. The type must support the AsyncRandomAccessReadDevice concept.]]

[[offset][The offset at which the data will be read.]]

[[b][A [link asio.reference.basic_streambuf `basic_streambuf`] object into which the data will be read. Ownership of the streambuf is retained by the caller, which must guarantee that it remains valid until the handler is called.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation.
     const asio::error_code& error,

     // Number of bytes copied into the buffers. If an error
     // occurred, this will be the number of bytes successfully
     // transferred prior to the error.
     std::size_t bytes_transferred
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::async_read_at(
       d, 42, b,
       asio::transfer_all(),
       handler); 







[endsect]



[section:overload4 async_read_at (4 of 4 overloads)]


Start an asynchronous operation to read a certain amount of data at the specified offset. 


  template<
      typename ``[link asio.reference.AsyncRandomAccessReadDevice AsyncRandomAccessReadDevice]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_at(
      AsyncRandomAccessReadDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously read a certain number of bytes of data from a random access device at the specified offset. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the device's async\_read\_some\_at function.


[heading Parameters]
    

[variablelist
  
[[d][The device from which the data is to be read. The type must support the AsyncRandomAccessReadDevice concept.]]

[[offset][The offset at which the data will be read.]]

[[b][A [link asio.reference.basic_streambuf `basic_streambuf`] object into which the data will be read. Ownership of the streambuf is retained by the caller, which must guarantee that it remains valid until the handler is called.]]

[[completion_condition][The function object to be called to determine whether the read operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest async_read_some_at operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the device's async\_read\_some\_at function.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation.
     const asio::error_code& error,

     // Number of bytes copied into the buffers. If an error
     // occurred, this will be the number of bytes successfully
     // transferred prior to the error.
     std::size_t bytes_transferred
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`]. ]]

]




[endsect]


[endsect]

[section:async_read_until async_read_until]

[indexterm1 asio.indexterm.async_read_until..async_read_until] 
The `async_read_until` function is a composed asynchronous operation that reads data into a dynamic buffer sequence, or into a streambuf, until it contains a delimiter, matches a regular expression, or a function object indicates a match. 


Start an asynchronous operation to read data into a dynamic buffer sequence until it contains a specified delimiter. 

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read_until.overload1 async_read_until]``(
      AsyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      char delim,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_read_until.overload1 more...]]``

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read_until.overload2 async_read_until]``(
      AsyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      string_view delim,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_read_until.overload2 more...]]``

Start an asynchronous operation to read data into a dynamic buffer sequence until some part of its data matches a regular expression. 

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read_until.overload3 async_read_until]``(
      AsyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      const boost::regex & expr,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_read_until.overload3 more...]]``

Start an asynchronous operation to read data into a dynamic buffer sequence until a function object indicates a match. 

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename MatchCondition,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read_until.overload4 async_read_until]``(
      AsyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      MatchCondition match_condition,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_match_condition< MatchCondition >::value &&is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_read_until.overload4 more...]]``

Start an asynchronous operation to read data into a streambuf until it contains a specified delimiter. 

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename Allocator,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read_until.overload5 async_read_until]``(
      AsyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      char delim,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.async_read_until.overload5 more...]]``

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename Allocator,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read_until.overload6 async_read_until]``(
      AsyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      string_view delim,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.async_read_until.overload6 more...]]``

Start an asynchronous operation to read data into a streambuf until some part of its data matches a regular expression. 

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename Allocator,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read_until.overload7 async_read_until]``(
      AsyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      const boost::regex & expr,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.async_read_until.overload7 more...]]``

Start an asynchronous operation to read data into a streambuf until a function object indicates a match. 

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename Allocator,
      typename MatchCondition,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read_until.overload8 async_read_until]``(
      AsyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      MatchCondition match_condition,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_match_condition< MatchCondition >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_read_until.overload8 more...]]``

Start an asynchronous operation to read data into a dynamic buffer sequence until it contains a specified delimiter. 

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read_until.overload9 async_read_until]``(
      AsyncReadStream & s,
      DynamicBuffer_v2 buffers,
      char delim,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_read_until.overload9 more...]]``

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read_until.overload10 async_read_until]``(
      AsyncReadStream & s,
      DynamicBuffer_v2 buffers,
      string_view delim,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_read_until.overload10 more...]]``

Start an asynchronous operation to read data into a dynamic buffer sequence until some part of its data matches a regular expression. 

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read_until.overload11 async_read_until]``(
      AsyncReadStream & s,
      DynamicBuffer_v2 buffers,
      const boost::regex & expr,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_read_until.overload11 more...]]``

Start an asynchronous operation to read data into a dynamic buffer sequence until a function object indicates a match. 

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename MatchCondition,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_read_until.overload12 async_read_until]``(
      AsyncReadStream & s,
      DynamicBuffer_v2 buffers,
      MatchCondition match_condition,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_match_condition< MatchCondition >::value &&is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_read_until.overload12 more...]]``

[heading Requirements]

['Header: ][^asio/read_until.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 async_read_until (1 of 12 overloads)]


Start an asynchronous operation to read data into a dynamic buffer sequence until it contains a specified delimiter. 


  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_until(
      AsyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      char delim,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to asynchronously read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains the specified delimiter. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* The get area of the dynamic buffer sequence contains the specified delimiter.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async\_read\_some function, and is known as a ['composed operation]. If the dynamic buffer sequence's get area already contains the delimiter, this asynchronous operation completes immediately. The program must ensure that the stream performs no other read operations (such as async\_read, async\_read\_until, the stream's async\_read\_some function, or any other composed operations that perform reads) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the AsyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[delim][The delimiter character.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation.
     const asio::error_code& error,

     // The number of bytes in the dynamic buffer sequence's
     // get area up to and including the delimiter.
     // 0 if an error occurred.
     std::size_t bytes_transferred
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
After a successful async\_read\_until operation, the dynamic buffer sequence may contain additional data beyond the delimiter. An application will typically leave that data in the dynamic buffer sequence for a subsequent async\_read\_until operation to examine.


[heading Example]
  
To asynchronously read data into a `std::string` until a newline is encountered: 

   std::string data;
   ...
   void handler(const asio::error_code& e, std::size_t size)
   {
     if (!e)
     {
       std::string line = data.substr(0, n);
       data.erase(0, n);
       ...
     }
   }
   ...
   asio::async_read_until(s, data, '\n', handler); 


After the `async_read_until` operation completes successfully, the buffer `data` contains the delimiter: 

   { 'a', 'b', ..., 'c', '\n', 'd', 'e', ... } 


The call to `substr` then extracts the data up to and including the delimiter, so that the string `line` contains: 

   { 'a', 'b', ..., 'c', '\n' } 


After the call to `erase`, the remaining data is left in the buffer `data` as follows: 

   { 'd', 'e', ... } 


This data may be the start of a new line, to be extracted by a subsequent `async_read_until` operation. 




[endsect]



[section:overload2 async_read_until (2 of 12 overloads)]


Start an asynchronous operation to read data into a dynamic buffer sequence until it contains a specified delimiter. 


  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_until(
      AsyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      string_view delim,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to asynchronously read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains the specified delimiter. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* The get area of the dynamic buffer sequence contains the specified delimiter.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async\_read\_some function, and is known as a ['composed operation]. If the dynamic buffer sequence's get area already contains the delimiter, this asynchronous operation completes immediately. The program must ensure that the stream performs no other read operations (such as async\_read, async\_read\_until, the stream's async\_read\_some function, or any other composed operations that perform reads) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the AsyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[delim][The delimiter string.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation.
     const asio::error_code& error,

     // The number of bytes in the dynamic buffer sequence's
     // get area up to and including the delimiter.
     // 0 if an error occurred.
     std::size_t bytes_transferred
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
After a successful async\_read\_until operation, the dynamic buffer sequence may contain additional data beyond the delimiter. An application will typically leave that data in the dynamic buffer sequence for a subsequent async\_read\_until operation to examine.


[heading Example]
  
To asynchronously read data into a `std::string` until a CR-LF sequence is encountered: 

   std::string data;
   ...
   void handler(const asio::error_code& e, std::size_t size)
   {
     if (!e)
     {
       std::string line = data.substr(0, n);
       data.erase(0, n);
       ...
     }
   }
   ...
   asio::async_read_until(s, data, "\r\n", handler); 


After the `async_read_until` operation completes successfully, the string `data` contains the delimiter: 

   { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } 


The call to `substr` then extracts the data up to and including the delimiter, so that the string `line` contains: 

   { 'a', 'b', ..., 'c', '\r', '\n' } 


After the call to `erase`, the remaining data is left in the string `data` as follows: 

   { 'd', 'e', ... } 


This data may be the start of a new line, to be extracted by a subsequent `async_read_until` operation. 




[endsect]



[section:overload3 async_read_until (3 of 12 overloads)]


Start an asynchronous operation to read data into a dynamic buffer sequence until some part of its data matches a regular expression. 


  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_until(
      AsyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      const boost::regex & expr,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to asynchronously read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains some data that matches a regular expression. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* A substring of the dynamic buffer sequence's get area matches the regular expression.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async\_read\_some function, and is known as a ['composed operation]. If the dynamic buffer sequence's get area already contains data that matches the regular expression, this asynchronous operation completes immediately. The program must ensure that the stream performs no other read operations (such as async\_read, async\_read\_until, the stream's async\_read\_some function, or any other composed operations that perform reads) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the AsyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[expr][The regular expression.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation.
     const asio::error_code& error,

     // The number of bytes in the dynamic buffer
     // sequence's get area up to and including the
     // substring that matches the regular expression.
     // 0 if an error occurred.
     std::size_t bytes_transferred
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
After a successful async\_read\_until operation, the dynamic buffer sequence may contain additional data beyond that which matched the regular expression. An application will typically leave that data in the dynamic buffer sequence for a subsequent async\_read\_until operation to examine.


[heading Example]
  
To asynchronously read data into a `std::string` until a CR-LF sequence is encountered: 

   std::string data;
   ...
   void handler(const asio::error_code& e, std::size_t size)
   {
     if (!e)
     {
       std::string line = data.substr(0, n);
       data.erase(0, n);
       ...
     }
   }
   ...
   asio::async_read_until(s, data,
       boost::regex("\r\n"), handler); 


After the `async_read_until` operation completes successfully, the string `data` contains the data which matched the regular expression: 

   { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } 


The call to `substr` then extracts the data up to and including the match, so that the string `line` contains: 

   { 'a', 'b', ..., 'c', '\r', '\n' } 


After the call to `erase`, the remaining data is left in the string `data` as follows: 

   { 'd', 'e', ... } 


This data may be the start of a new line, to be extracted by a subsequent `async_read_until` operation. 




[endsect]



[section:overload4 async_read_until (4 of 12 overloads)]


Start an asynchronous operation to read data into a dynamic buffer sequence until a function object indicates a match. 


  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename MatchCondition,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_until(
      AsyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      MatchCondition match_condition,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_match_condition< MatchCondition >::value &&is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to asynchronously read data into the specified dynamic buffer sequence until a user-defined match condition function object, when applied to the data contained in the dynamic buffer sequence, indicates a successful match. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* The match condition function object returns a std::pair where the second element evaluates to true.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async\_read\_some function, and is known as a ['composed operation]. If the match condition function object already indicates a match, this asynchronous operation completes immediately. The program must ensure that the stream performs no other read operations (such as async\_read, async\_read\_until, the stream's async\_read\_some function, or any other composed operations that perform reads) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the AsyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[match_condition][The function object to be called to determine whether a match exists. The signature of the function object must be: 
``
   pair<iterator, bool> match_condition(iterator begin, iterator end);
``
where `iterator` represents the type: 
``
   buffers_iterator<typename DynamicBuffer_v1::const_buffers_type>
``
The iterator parameters `begin` and `end` define the range of bytes to be scanned to determine whether there is a match. The `first` member of the return value is an iterator marking one-past-the-end of the bytes that have been consumed by the match function. This iterator is used to calculate the `begin` parameter for any subsequent invocation of the match condition. The `second` member of the return value is true if a match has been found, false otherwise.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation.
     const asio::error_code& error,

     // The number of bytes in the dynamic buffer sequence's
     // get area that have been fully consumed by the match
     // function. O if an error occurred.
     std::size_t bytes_transferred
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
After a successful async\_read\_until operation, the dynamic buffer sequence may contain additional data beyond that which matched the function object. An application will typically leave that data in the dynamic buffer sequence for a subsequent async\_read\_until operation to examine.

The default implementation of the `is_match_condition` type trait evaluates to true for function pointers and function objects with a `result_type` typedef. It must be specialised for other user-defined function objects.


[heading Examples]
  
To asynchronously read data into a `std::string` until whitespace is encountered: 

   typedef asio::buffers_iterator<
       asio::const_buffers_1> iterator;

   std::pair<iterator, bool>
   match_whitespace(iterator begin, iterator end)
   {
     iterator i = begin;
     while (i != end)
       if (std::isspace(*i++))
         return std::make_pair(i, true);
     return std::make_pair(i, false);
   }
   ...
   void handler(const asio::error_code& e, std::size_t size);
   ...
   std::string data;
   asio::async_read_until(s, data, match_whitespace, handler);




To asynchronously read data into a `std::string` until a matching character is found: 

   class match_char
   {
   public:
     explicit match_char(char c) : c_(c) {}

     template <typename Iterator>
     std::pair<Iterator, bool> operator()(
         Iterator begin, Iterator end) const
     {
       Iterator i = begin;
       while (i != end)
         if (c_ == *i++)
           return std::make_pair(i, true);
       return std::make_pair(i, false);
     }

   private:
     char c_;
   };

   namespace asio {
     template <> struct is_match_condition<match_char>
       : public boost::true_type {};
   } // namespace asio
   ...
   void handler(const asio::error_code& e, std::size_t size);
   ...
   std::string data;
   asio::async_read_until(s, data, match_char('a'), handler);





[endsect]



[section:overload5 async_read_until (5 of 12 overloads)]


Start an asynchronous operation to read data into a streambuf until it contains a specified delimiter. 


  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename Allocator,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_until(
      AsyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      char delim,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously read data into the specified streambuf until the streambuf's get area contains the specified delimiter. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* The get area of the streambuf contains the specified delimiter.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async\_read\_some function, and is known as a ['composed operation]. If the streambuf's get area already contains the delimiter, this asynchronous operation completes immediately. The program must ensure that the stream performs no other read operations (such as async\_read, async\_read\_until, the stream's async\_read\_some function, or any other composed operations that perform reads) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the AsyncReadStream concept.]]

[[b][A streambuf object into which the data will be read. Ownership of the streambuf is retained by the caller, which must guarantee that it remains valid until the handler is called.]]

[[delim][The delimiter character.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation.
     const asio::error_code& error,

     // The number of bytes in the streambuf's get
     // area up to and including the delimiter.
     // 0 if an error occurred.
     std::size_t bytes_transferred
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
After a successful async\_read\_until operation, the streambuf may contain additional data beyond the delimiter. An application will typically leave that data in the streambuf for a subsequent async\_read\_until operation to examine.


[heading Example]
  
To asynchronously read data into a streambuf until a newline is encountered: 

   asio::streambuf b;
   ...
   void handler(const asio::error_code& e, std::size_t size)
   {
     if (!e)
     {
       std::istream is(&b);
       std::string line;
       std::getline(is, line);
       ...
     }
   }
   ...
   asio::async_read_until(s, b, '\n', handler); 


After the `async_read_until` operation completes successfully, the buffer `b` contains the delimiter: 

   { 'a', 'b', ..., 'c', '\n', 'd', 'e', ... } 


The call to `std::getline` then extracts the data up to and including the newline (which is discarded), so that the string `line` contains: 

   { 'a', 'b', ..., 'c' } 


The remaining data is left in the buffer `b` as follows: 

   { 'd', 'e', ... } 


This data may be the start of a new line, to be extracted by a subsequent `async_read_until` operation. 




[endsect]



[section:overload6 async_read_until (6 of 12 overloads)]


Start an asynchronous operation to read data into a streambuf until it contains a specified delimiter. 


  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename Allocator,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_until(
      AsyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      string_view delim,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously read data into the specified streambuf until the streambuf's get area contains the specified delimiter. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* The get area of the streambuf contains the specified delimiter.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async\_read\_some function, and is known as a ['composed operation]. If the streambuf's get area already contains the delimiter, this asynchronous operation completes immediately. The program must ensure that the stream performs no other read operations (such as async\_read, async\_read\_until, the stream's async\_read\_some function, or any other composed operations that perform reads) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the AsyncReadStream concept.]]

[[b][A streambuf object into which the data will be read. Ownership of the streambuf is retained by the caller, which must guarantee that it remains valid until the handler is called.]]

[[delim][The delimiter string.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation.
     const asio::error_code& error,

     // The number of bytes in the streambuf's get
     // area up to and including the delimiter.
     // 0 if an error occurred.
     std::size_t bytes_transferred
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
After a successful async\_read\_until operation, the streambuf may contain additional data beyond the delimiter. An application will typically leave that data in the streambuf for a subsequent async\_read\_until operation to examine.


[heading Example]
  
To asynchronously read data into a streambuf until a newline is encountered: 

   asio::streambuf b;
   ...
   void handler(const asio::error_code& e, std::size_t size)
   {
     if (!e)
     {
       std::istream is(&b);
       std::string line;
       std::getline(is, line);
       ...
     }
   }
   ...
   asio::async_read_until(s, b, "\r\n", handler); 


After the `async_read_until` operation completes successfully, the buffer `b` contains the delimiter: 

   { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } 


The call to `std::getline` then extracts the data up to and including the newline (which is discarded), so that the string `line` contains: 

   { 'a', 'b', ..., 'c', '\r' } 


The remaining data is left in the buffer `b` as follows: 

   { 'd', 'e', ... } 


This data may be the start of a new line, to be extracted by a subsequent `async_read_until` operation. 




[endsect]



[section:overload7 async_read_until (7 of 12 overloads)]


Start an asynchronous operation to read data into a streambuf until some part of its data matches a regular expression. 


  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename Allocator,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_until(
      AsyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      const boost::regex & expr,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously read data into the specified streambuf until the streambuf's get area contains some data that matches a regular expression. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* A substring of the streambuf's get area matches the regular expression.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async\_read\_some function, and is known as a ['composed operation]. If the streambuf's get area already contains data that matches the regular expression, this asynchronous operation completes immediately. The program must ensure that the stream performs no other read operations (such as async\_read, async\_read\_until, the stream's async\_read\_some function, or any other composed operations that perform reads) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the AsyncReadStream concept.]]

[[b][A streambuf object into which the data will be read. Ownership of the streambuf is retained by the caller, which must guarantee that it remains valid until the handler is called.]]

[[expr][The regular expression.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation.
     const asio::error_code& error,

     // The number of bytes in the streambuf's get
     // area up to and including the substring
     // that matches the regular. expression.
     // 0 if an error occurred.
     std::size_t bytes_transferred
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
After a successful async\_read\_until operation, the streambuf may contain additional data beyond that which matched the regular expression. An application will typically leave that data in the streambuf for a subsequent async\_read\_until operation to examine.


[heading Example]
  
To asynchronously read data into a streambuf until a CR-LF sequence is encountered: 

   asio::streambuf b;
   ...
   void handler(const asio::error_code& e, std::size_t size)
   {
     if (!e)
     {
       std::istream is(&b);
       std::string line;
       std::getline(is, line);
       ...
     }
   }
   ...
   asio::async_read_until(s, b, boost::regex("\r\n"), handler); 


After the `async_read_until` operation completes successfully, the buffer `b` contains the data which matched the regular expression: 

   { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } 


The call to `std::getline` then extracts the data up to and including the newline (which is discarded), so that the string `line` contains: 

   { 'a', 'b', ..., 'c', '\r' } 


The remaining data is left in the buffer `b` as follows: 

   { 'd', 'e', ... } 


This data may be the start of a new line, to be extracted by a subsequent `async_read_until` operation. 




[endsect]



[section:overload8 async_read_until (8 of 12 overloads)]


Start an asynchronous operation to read data into a streambuf until a function object indicates a match. 


  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename Allocator,
      typename MatchCondition,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_until(
      AsyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      MatchCondition match_condition,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_match_condition< MatchCondition >::value >::type *  = 0);


This function is used to asynchronously read data into the specified streambuf until a user-defined match condition function object, when applied to the data contained in the streambuf, indicates a successful match. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* The match condition function object returns a std::pair where the second element evaluates to true.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async\_read\_some function, and is known as a ['composed operation]. If the match condition function object already indicates a match, this asynchronous operation completes immediately. The program must ensure that the stream performs no other read operations (such as async\_read, async\_read\_until, the stream's async\_read\_some function, or any other composed operations that perform reads) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the AsyncReadStream concept.]]

[[b][A streambuf object into which the data will be read.]]

[[match_condition][The function object to be called to determine whether a match exists. The signature of the function object must be: 
``
   pair<iterator, bool> match_condition(iterator begin, iterator end);
``
where `iterator` represents the type: 
``
   buffers_iterator<basic_streambuf<Allocator>::const_buffers_type>
``
The iterator parameters `begin` and `end` define the range of bytes to be scanned to determine whether there is a match. The `first` member of the return value is an iterator marking one-past-the-end of the bytes that have been consumed by the match function. This iterator is used to calculate the `begin` parameter for any subsequent invocation of the match condition. The `second` member of the return value is true if a match has been found, false otherwise.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation.
     const asio::error_code& error,

     // The number of bytes in the streambuf's get
     // area that have been fully consumed by the
     // match function. O if an error occurred.
     std::size_t bytes_transferred
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
After a successful async\_read\_until operation, the streambuf may contain additional data beyond that which matched the function object. An application will typically leave that data in the streambuf for a subsequent async\_read\_until operation to examine.

The default implementation of the `is_match_condition` type trait evaluates to true for function pointers and function objects with a `result_type` typedef. It must be specialised for other user-defined function objects.


[heading Examples]
  
To asynchronously read data into a streambuf until whitespace is encountered: 

   typedef asio::buffers_iterator<
       asio::streambuf::const_buffers_type> iterator;

   std::pair<iterator, bool>
   match_whitespace(iterator begin, iterator end)
   {
     iterator i = begin;
     while (i != end)
       if (std::isspace(*i++))
         return std::make_pair(i, true);
     return std::make_pair(i, false);
   }
   ...
   void handler(const asio::error_code& e, std::size_t size);
   ...
   asio::streambuf b;
   asio::async_read_until(s, b, match_whitespace, handler);




To asynchronously read data into a streambuf until a matching character is found: 

   class match_char
   {
   public:
     explicit match_char(char c) : c_(c) {}

     template <typename Iterator>
     std::pair<Iterator, bool> operator()(
         Iterator begin, Iterator end) const
     {
       Iterator i = begin;
       while (i != end)
         if (c_ == *i++)
           return std::make_pair(i, true);
       return std::make_pair(i, false);
     }

   private:
     char c_;
   };

   namespace asio {
     template <> struct is_match_condition<match_char>
       : public boost::true_type {};
   } // namespace asio
   ...
   void handler(const asio::error_code& e, std::size_t size);
   ...
   asio::streambuf b;
   asio::async_read_until(s, b, match_char('a'), handler);





[endsect]



[section:overload9 async_read_until (9 of 12 overloads)]


Start an asynchronous operation to read data into a dynamic buffer sequence until it contains a specified delimiter. 


  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_until(
      AsyncReadStream & s,
      DynamicBuffer_v2 buffers,
      char delim,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to asynchronously read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains the specified delimiter. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* The get area of the dynamic buffer sequence contains the specified delimiter.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async\_read\_some function, and is known as a ['composed operation]. If the dynamic buffer sequence's get area already contains the delimiter, this asynchronous operation completes immediately. The program must ensure that the stream performs no other read operations (such as async\_read, async\_read\_until, the stream's async\_read\_some function, or any other composed operations that perform reads) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the AsyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[delim][The delimiter character.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation.
     const asio::error_code& error,

     // The number of bytes in the dynamic buffer sequence's
     // get area up to and including the delimiter.
     // 0 if an error occurred.
     std::size_t bytes_transferred
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
After a successful async\_read\_until operation, the dynamic buffer sequence may contain additional data beyond the delimiter. An application will typically leave that data in the dynamic buffer sequence for a subsequent async\_read\_until operation to examine.


[heading Example]
  
To asynchronously read data into a `std::string` until a newline is encountered: 

   std::string data;
   ...
   void handler(const asio::error_code& e, std::size_t size)
   {
     if (!e)
     {
       std::string line = data.substr(0, n);
       data.erase(0, n);
       ...
     }
   }
   ...
   asio::async_read_until(s, data, '\n', handler); 


After the `async_read_until` operation completes successfully, the buffer `data` contains the delimiter: 

   { 'a', 'b', ..., 'c', '\n', 'd', 'e', ... } 


The call to `substr` then extracts the data up to and including the delimiter, so that the string `line` contains: 

   { 'a', 'b', ..., 'c', '\n' } 


After the call to `erase`, the remaining data is left in the buffer `data` as follows: 

   { 'd', 'e', ... } 


This data may be the start of a new line, to be extracted by a subsequent `async_read_until` operation. 




[endsect]



[section:overload10 async_read_until (10 of 12 overloads)]


Start an asynchronous operation to read data into a dynamic buffer sequence until it contains a specified delimiter. 


  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_until(
      AsyncReadStream & s,
      DynamicBuffer_v2 buffers,
      string_view delim,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to asynchronously read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains the specified delimiter. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* The get area of the dynamic buffer sequence contains the specified delimiter.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async\_read\_some function, and is known as a ['composed operation]. If the dynamic buffer sequence's get area already contains the delimiter, this asynchronous operation completes immediately. The program must ensure that the stream performs no other read operations (such as async\_read, async\_read\_until, the stream's async\_read\_some function, or any other composed operations that perform reads) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the AsyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[delim][The delimiter string.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation.
     const asio::error_code& error,

     // The number of bytes in the dynamic buffer sequence's
     // get area up to and including the delimiter.
     // 0 if an error occurred.
     std::size_t bytes_transferred
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
After a successful async\_read\_until operation, the dynamic buffer sequence may contain additional data beyond the delimiter. An application will typically leave that data in the dynamic buffer sequence for a subsequent async\_read\_until operation to examine.


[heading Example]
  
To asynchronously read data into a `std::string` until a CR-LF sequence is encountered: 

   std::string data;
   ...
   void handler(const asio::error_code& e, std::size_t size)
   {
     if (!e)
     {
       std::string line = data.substr(0, n);
       data.erase(0, n);
       ...
     }
   }
   ...
   asio::async_read_until(s, data, "\r\n", handler); 


After the `async_read_until` operation completes successfully, the string `data` contains the delimiter: 

   { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } 


The call to `substr` then extracts the data up to and including the delimiter, so that the string `line` contains: 

   { 'a', 'b', ..., 'c', '\r', '\n' } 


After the call to `erase`, the remaining data is left in the string `data` as follows: 

   { 'd', 'e', ... } 


This data may be the start of a new line, to be extracted by a subsequent `async_read_until` operation. 




[endsect]



[section:overload11 async_read_until (11 of 12 overloads)]


Start an asynchronous operation to read data into a dynamic buffer sequence until some part of its data matches a regular expression. 


  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_until(
      AsyncReadStream & s,
      DynamicBuffer_v2 buffers,
      const boost::regex & expr,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to asynchronously read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains some data that matches a regular expression. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* A substring of the dynamic buffer sequence's get area matches the regular expression.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async\_read\_some function, and is known as a ['composed operation]. If the dynamic buffer sequence's get area already contains data that matches the regular expression, this asynchronous operation completes immediately. The program must ensure that the stream performs no other read operations (such as async\_read, async\_read\_until, the stream's async\_read\_some function, or any other composed operations that perform reads) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the AsyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[expr][The regular expression.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation.
     const asio::error_code& error,

     // The number of bytes in the dynamic buffer
     // sequence's get area up to and including the
     // substring that matches the regular expression.
     // 0 if an error occurred.
     std::size_t bytes_transferred
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
After a successful async\_read\_until operation, the dynamic buffer sequence may contain additional data beyond that which matched the regular expression. An application will typically leave that data in the dynamic buffer sequence for a subsequent async\_read\_until operation to examine.


[heading Example]
  
To asynchronously read data into a `std::string` until a CR-LF sequence is encountered: 

   std::string data;
   ...
   void handler(const asio::error_code& e, std::size_t size)
   {
     if (!e)
     {
       std::string line = data.substr(0, n);
       data.erase(0, n);
       ...
     }
   }
   ...
   asio::async_read_until(s, data,
       boost::regex("\r\n"), handler); 


After the `async_read_until` operation completes successfully, the string `data` contains the data which matched the regular expression: 

   { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } 


The call to `substr` then extracts the data up to and including the match, so that the string `line` contains: 

   { 'a', 'b', ..., 'c', '\r', '\n' } 


After the call to `erase`, the remaining data is left in the string `data` as follows: 

   { 'd', 'e', ... } 


This data may be the start of a new line, to be extracted by a subsequent `async_read_until` operation. 




[endsect]



[section:overload12 async_read_until (12 of 12 overloads)]


Start an asynchronous operation to read data into a dynamic buffer sequence until a function object indicates a match. 


  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename MatchCondition,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_until(
      AsyncReadStream & s,
      DynamicBuffer_v2 buffers,
      MatchCondition match_condition,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_match_condition< MatchCondition >::value &&is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to asynchronously read data into the specified dynamic buffer sequence until a user-defined match condition function object, when applied to the data contained in the dynamic buffer sequence, indicates a successful match. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* The match condition function object returns a std::pair where the second element evaluates to true.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async\_read\_some function, and is known as a ['composed operation]. If the match condition function object already indicates a match, this asynchronous operation completes immediately. The program must ensure that the stream performs no other read operations (such as async\_read, async\_read\_until, the stream's async\_read\_some function, or any other composed operations that perform reads) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the AsyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[match_condition][The function object to be called to determine whether a match exists. The signature of the function object must be: 
``
   pair<iterator, bool> match_condition(iterator begin, iterator end);
``
where `iterator` represents the type: 
``
   buffers_iterator<typename DynamicBuffer_v2::const_buffers_type>
``
The iterator parameters `begin` and `end` define the range of bytes to be scanned to determine whether there is a match. The `first` member of the return value is an iterator marking one-past-the-end of the bytes that have been consumed by the match function. This iterator is used to calculate the `begin` parameter for any subsequent invocation of the match condition. The `second` member of the return value is true if a match has been found, false otherwise.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation.
     const asio::error_code& error,

     // The number of bytes in the dynamic buffer sequence's
     // get area that have been fully consumed by the match
     // function. O if an error occurred.
     std::size_t bytes_transferred
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
After a successful async\_read\_until operation, the dynamic buffer sequence may contain additional data beyond that which matched the function object. An application will typically leave that data in the dynamic buffer sequence for a subsequent async\_read\_until operation to examine.

The default implementation of the `is_match_condition` type trait evaluates to true for function pointers and function objects with a `result_type` typedef. It must be specialised for other user-defined function objects.


[heading Examples]
  
To asynchronously read data into a `std::string` until whitespace is encountered: 

   typedef asio::buffers_iterator<
       asio::const_buffers_1> iterator;

   std::pair<iterator, bool>
   match_whitespace(iterator begin, iterator end)
   {
     iterator i = begin;
     while (i != end)
       if (std::isspace(*i++))
         return std::make_pair(i, true);
     return std::make_pair(i, false);
   }
   ...
   void handler(const asio::error_code& e, std::size_t size);
   ...
   std::string data;
   asio::async_read_until(s, data, match_whitespace, handler);




To asynchronously read data into a `std::string` until a matching character is found: 

   class match_char
   {
   public:
     explicit match_char(char c) : c_(c) {}

     template <typename Iterator>
     std::pair<Iterator, bool> operator()(
         Iterator begin, Iterator end) const
     {
       Iterator i = begin;
       while (i != end)
         if (c_ == *i++)
           return std::make_pair(i, true);
       return std::make_pair(i, false);
     }

   private:
     char c_;
   };

   namespace asio {
     template <> struct is_match_condition<match_char>
       : public boost::true_type {};
   } // namespace asio
   ...
   void handler(const asio::error_code& e, std::size_t size);
   ...
   std::string data;
   asio::async_read_until(s, data, match_char('a'), handler);





[endsect]


[endsect]

[section:async_result async_result]


An interface for customising the behaviour of an initiating function. 


  template<
      typename CompletionToken,
      typename Signature>
  class async_result


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.async_result.completion_handler_type [*completion_handler_type]]]
    [The concrete completion handler type for the specific signature. ]
  
  ]

  [

    [[link asio.reference.async_result.return_type [*return_type]]]
    [The return type of the initiating function. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.async_result.async_result [*async_result]] [constructor]]
    [Construct an async result from a given handler. ]
  ]
  
  [
    [[link asio.reference.async_result.get [*get]]]
    [Obtain the value to be returned from the initiating function. ]
  ]
  
  [
    [[link asio.reference.async_result.initiate [*initiate]] [static]]
    [Initiate the asynchronous operation that will produce the result, and obtain the value to be returned from the initiating function. ]
  ]
  
]

The [link asio.reference.async_result `async_result`] traits class is used for determining:


* the concrete completion handler type to be called at the end of the asynchronous operation;


* the initiating function return type; and


* how the return value of the initiating function is obtained.

The trait allows the handler and return types to be determined at the point where the specific completion handler signature is known.

This template may be specialised for user-defined completion token types. The primary template assumes that the CompletionToken is the completion handler. 

[heading Requirements]

['Header: ][^asio/async_result.hpp]

['Convenience header: ][^asio.hpp]


[section:async_result async_result::async_result]

[indexterm2 asio.indexterm.async_result.async_result..async_result..async_result] 
Construct an async result from a given handler. 


  async_result(
      completion_handler_type & h);


When using a specalised [link asio.reference.async_result `async_result`], the constructor has an opportunity to initialise some state associated with the completion handler, which is then returned from the initiating function. 


[endsect]



[section:completion_handler_type async_result::completion_handler_type]

[indexterm2 asio.indexterm.async_result.completion_handler_type..completion_handler_type..async_result] 
The concrete completion handler type for the specific signature. 


  typedef CompletionToken completion_handler_type;



[heading Requirements]

['Header: ][^asio/async_result.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:get async_result::get]

[indexterm2 asio.indexterm.async_result.get..get..async_result] 
Obtain the value to be returned from the initiating function. 


  return_type get();



[endsect]



[section:initiate async_result::initiate]

[indexterm2 asio.indexterm.async_result.initiate..initiate..async_result] 
Initiate the asynchronous operation that will produce the result, and obtain the value to be returned from the initiating function. 


  template<
      typename Initiation,
      typename RawCompletionToken,
      typename... Args>
  static return_type initiate(
      Initiation && initiation,
      RawCompletionToken && token,
      Args &&... args);



[endsect]



[section:return_type async_result::return_type]

[indexterm2 asio.indexterm.async_result.return_type..return_type..async_result] 
The return type of the initiating function. 


  typedef void return_type;



[heading Requirements]

['Header: ][^asio/async_result.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_ async_result< std::packaged_task< Result(Args...)>, Signature >]


Partial specialisation of `async_result` for `std::packaged_task`. 


  template<
      typename Result,
      typename... Args,
      typename Signature>
  class async_result< std::packaged_task< Result(Args...)>, Signature >


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_.completion_handler_type [*completion_handler_type]]]
    [The packaged task is the concrete completion handler type. ]
  
  ]

  [

    [[link asio.reference.async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_.return_type [*return_type]]]
    [The return type of the initiating function is the future obtained from the packaged task. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_.async_result [*async_result]]]
    [The constructor extracts the future from the packaged task. ]
  ]
  
  [
    [[link asio.reference.async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_.get [*get]]]
    [Returns the packaged task's future. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/packaged_task.hpp]

['Convenience header: ][^asio.hpp]


[section:async_result async_result< std::packaged_task< Result(Args...)>, Signature >::async_result]

[indexterm2 asio.indexterm.async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_.async_result..async_result..async_result< std::packaged_task< Result(Args\.\.\.)>, Signature >] 
The constructor extracts the future from the packaged task. 


  async_result(
      completion_handler_type & h);



[endsect]



[section:completion_handler_type async_result< std::packaged_task< Result(Args...)>, Signature >::completion_handler_type]

[indexterm2 asio.indexterm.async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_.completion_handler_type..completion_handler_type..async_result< std::packaged_task< Result(Args\.\.\.)>, Signature >] 
The packaged task is the concrete completion handler type. 


  typedef std::packaged_task< Result(Args...)> completion_handler_type;



[heading Requirements]

['Header: ][^asio/packaged_task.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:get async_result< std::packaged_task< Result(Args...)>, Signature >::get]

[indexterm2 asio.indexterm.async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_.get..get..async_result< std::packaged_task< Result(Args\.\.\.)>, Signature >] 
Returns the packaged task's future. 


  return_type get();



[endsect]



[section:return_type async_result< std::packaged_task< Result(Args...)>, Signature >::return_type]

[indexterm2 asio.indexterm.async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_.return_type..return_type..async_result< std::packaged_task< Result(Args\.\.\.)>, Signature >] 
The return type of the initiating function is the future obtained from the packaged task. 


  typedef std::future< Result > return_type;



[heading Requirements]

['Header: ][^asio/packaged_task.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:async_write async_write]

[indexterm1 asio.indexterm.async_write..async_write] 
The `async_write` function is a composed asynchronous operation that writes a certain amount of data to a stream before completion. 


Start an asynchronous operation to write all of the supplied data to a stream. 

  template<
      typename ``[link asio.reference.AsyncWriteStream AsyncWriteStream]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_write.overload1 async_write]``(
      AsyncWriteStream & s,
      const ConstBufferSequence & buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_write.overload1 more...]]``

Start an asynchronous operation to write a certain amount of data to a stream. 

  template<
      typename ``[link asio.reference.AsyncWriteStream AsyncWriteStream]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_write.overload2 async_write]``(
      AsyncWriteStream & s,
      const ConstBufferSequence & buffers,
      CompletionCondition completion_condition,
      WriteHandler && handler,
      typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_write.overload2 more...]]``

Start an asynchronous operation to write all of the supplied data to a stream. 

  template<
      typename ``[link asio.reference.AsyncWriteStream AsyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_write.overload3 async_write]``(
      AsyncWriteStream & s,
      DynamicBuffer_v1 && buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_write.overload3 more...]]``

Start an asynchronous operation to write a certain amount of data to a stream. 

  template<
      typename ``[link asio.reference.AsyncWriteStream AsyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_write.overload4 async_write]``(
      AsyncWriteStream & s,
      DynamicBuffer_v1 && buffers,
      CompletionCondition completion_condition,
      WriteHandler && handler,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_write.overload4 more...]]``

Start an asynchronous operation to write all of the supplied data to a stream. 

  template<
      typename ``[link asio.reference.AsyncWriteStream AsyncWriteStream]``,
      typename Allocator,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_write.overload5 async_write]``(
      AsyncWriteStream & s,
      basic_streambuf< Allocator > & b,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.async_write.overload5 more...]]``

Start an asynchronous operation to write a certain amount of data to a stream. 

  template<
      typename ``[link asio.reference.AsyncWriteStream AsyncWriteStream]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_write.overload6 async_write]``(
      AsyncWriteStream & s,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition,
      WriteHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.async_write.overload6 more...]]``

Start an asynchronous operation to write all of the supplied data to a stream. 

  template<
      typename ``[link asio.reference.AsyncWriteStream AsyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_write.overload7 async_write]``(
      AsyncWriteStream & s,
      DynamicBuffer_v2 buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_write.overload7 more...]]``

Start an asynchronous operation to write a certain amount of data to a stream. 

  template<
      typename ``[link asio.reference.AsyncWriteStream AsyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_write.overload8 async_write]``(
      AsyncWriteStream & s,
      DynamicBuffer_v2 buffers,
      CompletionCondition completion_condition,
      WriteHandler && handler,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_write.overload8 more...]]``

[heading Requirements]

['Header: ][^asio/write.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 async_write (1 of 8 overloads)]


Start an asynchronous operation to write all of the supplied data to a stream. 


  template<
      typename ``[link asio.reference.AsyncWriteStream AsyncWriteStream]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_write(
      AsyncWriteStream & s,
      const ConstBufferSequence & buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);


This function is used to asynchronously write a certain number of bytes of data to a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async\_write\_some function, and is known as a ['composed operation]. The program must ensure that the stream performs no other write operations (such as async\_write, the stream's async\_write\_some function, or any other composed operations that perform writes) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the AsyncWriteStream concept.]]

[[buffers][One or more buffers containing the data to be written. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.

     std::size_t bytes_transferred           // Number of bytes written from the
                                             // buffers. If an error occurred,
                                             // this will be less than the sum
                                             // of the buffer sizes.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  
To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::async_write(s, asio::buffer(data, size), handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 async_write (2 of 8 overloads)]


Start an asynchronous operation to write a certain amount of data to a stream. 


  template<
      typename ``[link asio.reference.AsyncWriteStream AsyncWriteStream]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_write(
      AsyncWriteStream & s,
      const ConstBufferSequence & buffers,
      CompletionCondition completion_condition,
      WriteHandler && handler,
      typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);


This function is used to asynchronously write a certain number of bytes of data to a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's async\_write\_some function, and is known as a ['composed operation]. The program must ensure that the stream performs no other write operations (such as async\_write, the stream's async\_write\_some function, or any other composed operations that perform writes) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the AsyncWriteStream concept.]]

[[buffers][One or more buffers containing the data to be written. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[completion_condition][The function object to be called to determine whether the write operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest async_write_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the stream's async\_write\_some function.]]

[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.

     std::size_t bytes_transferred           // Number of bytes written from the
                                             // buffers. If an error occurred,
                                             // this will be less than the sum
                                             // of the buffer sizes.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  
To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::async_write(s,
       asio::buffer(data, size),
       asio::transfer_at_least(32),
       handler); 


See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload3 async_write (3 of 8 overloads)]


Start an asynchronous operation to write all of the supplied data to a stream. 


  template<
      typename ``[link asio.reference.AsyncWriteStream AsyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_write(
      AsyncWriteStream & s,
      DynamicBuffer_v1 && buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to asynchronously write a certain number of bytes of data to a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* All of the data in the supplied dynamic buffer sequence has been written.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async\_write\_some function, and is known as a ['composed operation]. The program must ensure that the stream performs no other write operations (such as async\_write, the stream's async\_write\_some function, or any other composed operations that perform writes) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the AsyncWriteStream concept.]]

[[buffers][The dynamic buffer sequence from which data will be written. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called. Successfully written data is automatically consumed from the buffers.]]

[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.

     std::size_t bytes_transferred           // Number of bytes written from the
                                             // buffers. If an error occurred,
                                             // this will be less than the sum
                                             // of the buffer sizes.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`]. ]]

]




[endsect]



[section:overload4 async_write (4 of 8 overloads)]


Start an asynchronous operation to write a certain amount of data to a stream. 


  template<
      typename ``[link asio.reference.AsyncWriteStream AsyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_write(
      AsyncWriteStream & s,
      DynamicBuffer_v1 && buffers,
      CompletionCondition completion_condition,
      WriteHandler && handler,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to asynchronously write a certain number of bytes of data to a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* All of the data in the supplied dynamic buffer sequence has been written.


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's async\_write\_some function, and is known as a ['composed operation]. The program must ensure that the stream performs no other write operations (such as async\_write, the stream's async\_write\_some function, or any other composed operations that perform writes) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the AsyncWriteStream concept.]]

[[buffers][The dynamic buffer sequence from which data will be written. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called. Successfully written data is automatically consumed from the buffers.]]

[[completion_condition][The function object to be called to determine whether the write operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest async_write_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the stream's async\_write\_some function.]]

[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.

     std::size_t bytes_transferred           // Number of bytes written from the
                                             // buffers. If an error occurred,
                                             // this will be less than the sum
                                             // of the buffer sizes.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`]. ]]

]




[endsect]



[section:overload5 async_write (5 of 8 overloads)]


Start an asynchronous operation to write all of the supplied data to a stream. 


  template<
      typename ``[link asio.reference.AsyncWriteStream AsyncWriteStream]``,
      typename Allocator,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_write(
      AsyncWriteStream & s,
      basic_streambuf< Allocator > & b,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously write a certain number of bytes of data to a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* All of the data in the supplied [link asio.reference.basic_streambuf `basic_streambuf`] has been written.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async\_write\_some function, and is known as a ['composed operation]. The program must ensure that the stream performs no other write operations (such as async\_write, the stream's async\_write\_some function, or any other composed operations that perform writes) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the AsyncWriteStream concept.]]

[[b][A [link asio.reference.basic_streambuf `basic_streambuf`] object from which data will be written. Ownership of the streambuf is retained by the caller, which must guarantee that it remains valid until the handler is called.]]

[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.

     std::size_t bytes_transferred           // Number of bytes written from the
                                             // buffers. If an error occurred,
                                             // this will be less than the sum
                                             // of the buffer sizes.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`]. ]]

]




[endsect]



[section:overload6 async_write (6 of 8 overloads)]


Start an asynchronous operation to write a certain amount of data to a stream. 


  template<
      typename ``[link asio.reference.AsyncWriteStream AsyncWriteStream]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_write(
      AsyncWriteStream & s,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition,
      WriteHandler && handler);


This function is used to asynchronously write a certain number of bytes of data to a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* All of the data in the supplied [link asio.reference.basic_streambuf `basic_streambuf`] has been written.


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's async\_write\_some function, and is known as a ['composed operation]. The program must ensure that the stream performs no other write operations (such as async\_write, the stream's async\_write\_some function, or any other composed operations that perform writes) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the AsyncWriteStream concept.]]

[[b][A [link asio.reference.basic_streambuf `basic_streambuf`] object from which data will be written. Ownership of the streambuf is retained by the caller, which must guarantee that it remains valid until the handler is called.]]

[[completion_condition][The function object to be called to determine whether the write operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest async_write_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the stream's async\_write\_some function.]]

[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.

     std::size_t bytes_transferred           // Number of bytes written from the
                                             // buffers. If an error occurred,
                                             // this will be less than the sum
                                             // of the buffer sizes.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`]. ]]

]




[endsect]



[section:overload7 async_write (7 of 8 overloads)]


Start an asynchronous operation to write all of the supplied data to a stream. 


  template<
      typename ``[link asio.reference.AsyncWriteStream AsyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_write(
      AsyncWriteStream & s,
      DynamicBuffer_v2 buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to asynchronously write a certain number of bytes of data to a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* All of the data in the supplied dynamic buffer sequence has been written.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async\_write\_some function, and is known as a ['composed operation]. The program must ensure that the stream performs no other write operations (such as async\_write, the stream's async\_write\_some function, or any other composed operations that perform writes) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the AsyncWriteStream concept.]]

[[buffers][The dynamic buffer sequence from which data will be written. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called. Successfully written data is automatically consumed from the buffers.]]

[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.

     std::size_t bytes_transferred           // Number of bytes written from the
                                             // buffers. If an error occurred,
                                             // this will be less than the sum
                                             // of the buffer sizes.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`]. ]]

]




[endsect]



[section:overload8 async_write (8 of 8 overloads)]


Start an asynchronous operation to write a certain amount of data to a stream. 


  template<
      typename ``[link asio.reference.AsyncWriteStream AsyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_write(
      AsyncWriteStream & s,
      DynamicBuffer_v2 buffers,
      CompletionCondition completion_condition,
      WriteHandler && handler,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to asynchronously write a certain number of bytes of data to a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* All of the data in the supplied dynamic buffer sequence has been written.


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's async\_write\_some function, and is known as a ['composed operation]. The program must ensure that the stream performs no other write operations (such as async\_write, the stream's async\_write\_some function, or any other composed operations that perform writes) until this operation completes.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the AsyncWriteStream concept.]]

[[buffers][The dynamic buffer sequence from which data will be written. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called. Successfully written data is automatically consumed from the buffers.]]

[[completion_condition][The function object to be called to determine whether the write operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest async_write_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the stream's async\_write\_some function.]]

[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.

     std::size_t bytes_transferred           // Number of bytes written from the
                                             // buffers. If an error occurred,
                                             // this will be less than the sum
                                             // of the buffer sizes.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`]. ]]

]




[endsect]


[endsect]

[section:async_write_at async_write_at]

[indexterm1 asio.indexterm.async_write_at..async_write_at] 
The `async_write_at` function is a composed asynchronous operation that writes a certain amount of data at the specified offset before completion. 


Start an asynchronous operation to write all of the supplied data at the specified offset. 

  template<
      typename ``[link asio.reference.AsyncRandomAccessWriteDevice AsyncRandomAccessWriteDevice]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_write_at.overload1 async_write_at]``(
      AsyncRandomAccessWriteDevice & d,
      uint64_t offset,
      const ConstBufferSequence & buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.async_write_at.overload1 more...]]``

Start an asynchronous operation to write a certain amount of data at the specified offset. 

  template<
      typename ``[link asio.reference.AsyncRandomAccessWriteDevice AsyncRandomAccessWriteDevice]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_write_at.overload2 async_write_at]``(
      AsyncRandomAccessWriteDevice & d,
      uint64_t offset,
      const ConstBufferSequence & buffers,
      CompletionCondition completion_condition,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.async_write_at.overload2 more...]]``

Start an asynchronous operation to write all of the supplied data at the specified offset. 

  template<
      typename ``[link asio.reference.AsyncRandomAccessWriteDevice AsyncRandomAccessWriteDevice]``,
      typename Allocator,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_write_at.overload3 async_write_at]``(
      AsyncRandomAccessWriteDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.async_write_at.overload3 more...]]``

Start an asynchronous operation to write a certain amount of data at the specified offset. 

  template<
      typename ``[link asio.reference.AsyncRandomAccessWriteDevice AsyncRandomAccessWriteDevice]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.async_write_at.overload4 async_write_at]``(
      AsyncRandomAccessWriteDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.async_write_at.overload4 more...]]``

[heading Requirements]

['Header: ][^asio/write_at.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 async_write_at (1 of 4 overloads)]


Start an asynchronous operation to write all of the supplied data at the specified offset. 


  template<
      typename ``[link asio.reference.AsyncRandomAccessWriteDevice AsyncRandomAccessWriteDevice]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_write_at(
      AsyncRandomAccessWriteDevice & d,
      uint64_t offset,
      const ConstBufferSequence & buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously write a certain number of bytes of data to a random access device at a specified offset. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.


* An error occurred.

This operation is implemented in terms of zero or more calls to the device's async\_write\_some\_at function, and is known as a ['composed operation]. The program must ensure that the device performs no ['overlapping] write operations (such as async\_write\_at, the device's async\_write\_some\_at function, or any other composed operations that perform writes) until this operation completes. Operations are overlapping if the regions defined by their offsets, and the numbers of bytes to write, intersect.


[heading Parameters]
    

[variablelist
  
[[d][The device to which the data is to be written. The type must support the AsyncRandomAccessWriteDevice concept.]]

[[offset][The offset at which the data will be written.]]

[[buffers][One or more buffers containing the data to be written. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation.
     const asio::error_code& error,

     // Number of bytes written from the buffers. If an error
     // occurred, this will be less than the sum of the buffer sizes.
     std::size_t bytes_transferred
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  
To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::async_write_at(d, 42, asio::buffer(data, size), handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 async_write_at (2 of 4 overloads)]


Start an asynchronous operation to write a certain amount of data at the specified offset. 


  template<
      typename ``[link asio.reference.AsyncRandomAccessWriteDevice AsyncRandomAccessWriteDevice]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_write_at(
      AsyncRandomAccessWriteDevice & d,
      uint64_t offset,
      const ConstBufferSequence & buffers,
      CompletionCondition completion_condition,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously write a certain number of bytes of data to a random access device at a specified offset. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the device's async\_write\_some\_at function, and is known as a ['composed operation]. The program must ensure that the device performs no ['overlapping] write operations (such as async\_write\_at, the device's async\_write\_some\_at function, or any other composed operations that perform writes) until this operation completes. Operations are overlapping if the regions defined by their offsets, and the numbers of bytes to write, intersect.


[heading Parameters]
    

[variablelist
  
[[d][The device to which the data is to be written. The type must support the AsyncRandomAccessWriteDevice concept.]]

[[offset][The offset at which the data will be written.]]

[[buffers][One or more buffers containing the data to be written. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[completion_condition][The function object to be called to determine whether the write operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest async_write_some_at operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the device's async\_write\_some\_at function.]]

[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation.
     const asio::error_code& error,

     // Number of bytes written from the buffers. If an error
     // occurred, this will be less than the sum of the buffer sizes.
     std::size_t bytes_transferred
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  
To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::async_write_at(d, 42,
       asio::buffer(data, size),
       asio::transfer_at_least(32),
       handler); 


See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload3 async_write_at (3 of 4 overloads)]


Start an asynchronous operation to write all of the supplied data at the specified offset. 


  template<
      typename ``[link asio.reference.AsyncRandomAccessWriteDevice AsyncRandomAccessWriteDevice]``,
      typename Allocator,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_write_at(
      AsyncRandomAccessWriteDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously write a certain number of bytes of data to a random access device at a specified offset. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* All of the data in the supplied [link asio.reference.basic_streambuf `basic_streambuf`] has been written.


* An error occurred.

This operation is implemented in terms of zero or more calls to the device's async\_write\_some\_at function, and is known as a ['composed operation]. The program must ensure that the device performs no ['overlapping] write operations (such as async\_write\_at, the device's async\_write\_some\_at function, or any other composed operations that perform writes) until this operation completes. Operations are overlapping if the regions defined by their offsets, and the numbers of bytes to write, intersect.


[heading Parameters]
    

[variablelist
  
[[d][The device to which the data is to be written. The type must support the AsyncRandomAccessWriteDevice concept.]]

[[offset][The offset at which the data will be written.]]

[[b][A [link asio.reference.basic_streambuf `basic_streambuf`] object from which data will be written. Ownership of the streambuf is retained by the caller, which must guarantee that it remains valid until the handler is called.]]

[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation.
     const asio::error_code& error,

     // Number of bytes written from the buffers. If an error
     // occurred, this will be less than the sum of the buffer sizes.
     std::size_t bytes_transferred
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`]. ]]

]




[endsect]



[section:overload4 async_write_at (4 of 4 overloads)]


Start an asynchronous operation to write a certain amount of data at the specified offset. 


  template<
      typename ``[link asio.reference.AsyncRandomAccessWriteDevice AsyncRandomAccessWriteDevice]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_write_at(
      AsyncRandomAccessWriteDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously write a certain number of bytes of data to a random access device at a specified offset. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:


* All of the data in the supplied [link asio.reference.basic_streambuf `basic_streambuf`] has been written.


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the device's async\_write\_some\_at function, and is known as a ['composed operation]. The program must ensure that the device performs no ['overlapping] write operations (such as async\_write\_at, the device's async\_write\_some\_at function, or any other composed operations that perform writes) until this operation completes. Operations are overlapping if the regions defined by their offsets, and the numbers of bytes to write, intersect.


[heading Parameters]
    

[variablelist
  
[[d][The device to which the data is to be written. The type must support the AsyncRandomAccessWriteDevice concept.]]

[[offset][The offset at which the data will be written.]]

[[b][A [link asio.reference.basic_streambuf `basic_streambuf`] object from which data will be written. Ownership of the streambuf is retained by the caller, which must guarantee that it remains valid until the handler is called.]]

[[completion_condition][The function object to be called to determine whether the write operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest async_write_some_at operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the device's async\_write\_some\_at function.]]

[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation.
     const asio::error_code& error,

     // Number of bytes written from the buffers. If an error
     // occurred, this will be less than the sum of the buffer sizes.
     std::size_t bytes_transferred
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`]. ]]

]




[endsect]


[endsect]

[section:awaitable awaitable]


The return type of a coroutine or asynchronous operation. 


  template<
      typename T,
      typename ``[link asio.reference.Executor1 Executor]`` = any_io_executor>
  class awaitable


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.awaitable.executor_type [*executor_type]]]
    [The executor type that will be used for the coroutine. ]
  
  ]

  [

    [[link asio.reference.awaitable.value_type [*value_type]]]
    [The type of the awaited value. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.awaitable.awaitable [*awaitable]] [constructor]]
    [Default constructor. 
     [hr]
     Move constructor. ]
  ]
  
  [
    [[link asio.reference.awaitable.valid [*valid]]]
    [Checks if the awaitable refers to a future result. ]
  ]
  
  [
    [[link asio.reference.awaitable._awaitable [*~awaitable]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/awaitable.hpp]

['Convenience header: ][^asio.hpp]

[section:awaitable awaitable::awaitable]

[indexterm2 asio.indexterm.awaitable.awaitable..awaitable..awaitable] 
Default constructor. 


  constexpr ``[link asio.reference.awaitable.awaitable.overload1 awaitable]``();
  ``  [''''&raquo;''' [link asio.reference.awaitable.awaitable.overload1 more...]]``


Move constructor. 


  ``[link asio.reference.awaitable.awaitable.overload2 awaitable]``(
      awaitable && other);
  ``  [''''&raquo;''' [link asio.reference.awaitable.awaitable.overload2 more...]]``


[section:overload1 awaitable::awaitable (1 of 2 overloads)]


Default constructor. 


  constexpr awaitable();



[endsect]



[section:overload2 awaitable::awaitable (2 of 2 overloads)]


Move constructor. 


  awaitable(
      awaitable && other);



[endsect]


[endsect]


[section:executor_type awaitable::executor_type]

[indexterm2 asio.indexterm.awaitable.executor_type..executor_type..awaitable] 
The executor type that will be used for the coroutine. 


  typedef Executor executor_type;



[heading Requirements]

['Header: ][^asio/awaitable.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:valid awaitable::valid]

[indexterm2 asio.indexterm.awaitable.valid..valid..awaitable] 
Checks if the awaitable refers to a future result. 


  bool valid() const;



[endsect]



[section:value_type awaitable::value_type]

[indexterm2 asio.indexterm.awaitable.value_type..value_type..awaitable] 
The type of the awaited value. 


  typedef T value_type;



[heading Requirements]

['Header: ][^asio/awaitable.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:_awaitable awaitable::~awaitable]

[indexterm2 asio.indexterm.awaitable._awaitable..~awaitable..awaitable] 
Destructor. 


  ~awaitable();



[endsect]



[endsect]

[section:bad_executor bad_executor]


Exception thrown when trying to access an empty polymorphic executor. 


  class bad_executor :
    public std::exception


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.bad_executor.bad_executor [*bad_executor]] [constructor]]
    [Constructor. ]
  ]
  
  [
    [[link asio.reference.bad_executor.what [*what]]]
    [Obtain message associated with exception. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/executor.hpp]

['Convenience header: ][^asio.hpp]


[section:bad_executor bad_executor::bad_executor]

[indexterm2 asio.indexterm.bad_executor.bad_executor..bad_executor..bad_executor] 
Constructor. 


  bad_executor();



[endsect]



[section:what bad_executor::what]

[indexterm2 asio.indexterm.bad_executor.what..what..bad_executor] 
Obtain message associated with exception. 


  virtual const char * what() const;



[endsect]



[endsect]

[section:basic_datagram_socket basic_datagram_socket]


Provides datagram-oriented socket functionality. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``>
  class basic_datagram_socket :
    public basic_socket< Protocol, Executor >


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_datagram_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_datagram_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_receive [*async_receive]]]
    [Start an asynchronous receive on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_receive_from [*async_receive_from]]]
    [Start an asynchronous receive. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_send [*async_send]]]
    [Start an asynchronous send on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_send_to [*async_send_to]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.basic_datagram_socket [*basic_datagram_socket]] [constructor]]
    [Construct a basic_datagram_socket without opening it. 
     [hr]
     Construct and open a basic_datagram_socket. 
     [hr]
     Construct a basic_datagram_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_datagram_socket on an existing native socket. 
     [hr]
     Move-construct a basic_datagram_socket from another. 
     [hr]
     Move-construct a basic_datagram_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_datagram_socket from another. 
     [hr]
     Move-assign a basic_datagram_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.receive [*receive]]]
    [Receive some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.receive_from [*receive_from]]]
    [Receive a datagram with the endpoint of the sender. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.send [*send]]]
    [Send some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.send_to [*send_to]]]
    [Send a datagram to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket._basic_datagram_socket [*~basic_datagram_socket]] [destructor]]
    [Destroys the socket. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_datagram_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_datagram_socket `basic_datagram_socket`] class template provides asynchronous and blocking datagram-oriented socket functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/basic_datagram_socket.hpp]

['Convenience header: ][^asio.hpp]

[section:assign basic_datagram_socket::assign]

[indexterm2 asio.indexterm.basic_datagram_socket.assign..assign..basic_datagram_socket] 
Assign an existing native socket to the socket. 


  void ``[link asio.reference.basic_datagram_socket.assign.overload1 assign]``(
      const protocol_type & protocol,
      const native_handle_type & native_socket);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.assign.overload1 more...]]``

  void ``[link asio.reference.basic_datagram_socket.assign.overload2 assign]``(
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.assign.overload2 more...]]``


[section:overload1 basic_datagram_socket::assign (1 of 2 overloads)]


['Inherited from basic_socket.]


Assign an existing native socket to the socket. 


  void assign(
      const protocol_type & protocol,
      const native_handle_type & native_socket);



[endsect]



[section:overload2 basic_datagram_socket::assign (2 of 2 overloads)]


['Inherited from basic_socket.]


Assign an existing native socket to the socket. 


  void assign(
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      asio::error_code & ec);



[endsect]


[endsect]


[section:async_connect basic_datagram_socket::async_connect]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_datagram_socket.async_connect..async_connect..basic_datagram_socket] 
Start an asynchronous connect. 


  template<
      typename ``[link asio.reference.ConnectHandler ConnectHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_connect(
      const endpoint_type & peer_endpoint,
      ConnectHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously connect a socket to the specified remote endpoint. The function call always returns immediately.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.


[heading Parameters]
    

[variablelist
  
[[peer_endpoint][The remote endpoint to which the socket will be connected. Copies will be made of the endpoint object as required.]]

[[handler][The handler to be called when the connection operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error // Result of operation
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  


   void connect_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Connect succeeded.
     }
   }

   ...

   asio::ip::tcp::socket socket(my_context);
   asio::ip::tcp::endpoint endpoint(
       asio::ip::address::from_string("1.2.3.4"), 12345);
   socket.async_connect(endpoint, connect_handler);







[endsect]


[section:async_receive basic_datagram_socket::async_receive]

[indexterm2 asio.indexterm.basic_datagram_socket.async_receive..async_receive..basic_datagram_socket] 
Start an asynchronous receive on a connected socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_datagram_socket.async_receive.overload1 async_receive]``(
      const MutableBufferSequence & buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.async_receive.overload1 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_datagram_socket.async_receive.overload2 async_receive]``(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.async_receive.overload2 more...]]``


[section:overload1 basic_datagram_socket::async_receive (1 of 2 overloads)]


Start an asynchronous receive on a connected socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_receive(
      const MutableBufferSequence & buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously receive data from the datagram socket. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes received.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
The async\_receive operation can only be used with a connected socket. Use the async\_receive\_from function to receive data on an unconnected datagram socket.


[heading Example]
  
To receive into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.async_receive(asio::buffer(data, size), handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_datagram_socket::async_receive (2 of 2 overloads)]


Start an asynchronous receive on a connected socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_receive(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously receive data from the datagram socket. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[flags][Flags specifying how the receive call is to be made.]]

[[handler][The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes received.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
The async\_receive operation can only be used with a connected socket. Use the async\_receive\_from function to receive data on an unconnected datagram socket. 




[endsect]


[endsect]

[section:async_receive_from basic_datagram_socket::async_receive_from]

[indexterm2 asio.indexterm.basic_datagram_socket.async_receive_from..async_receive_from..basic_datagram_socket] 
Start an asynchronous receive. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_datagram_socket.async_receive_from.overload1 async_receive_from]``(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.async_receive_from.overload1 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_datagram_socket.async_receive_from.overload2 async_receive_from]``(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      socket_base::message_flags flags,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.async_receive_from.overload2 more...]]``


[section:overload1 basic_datagram_socket::async_receive_from (1 of 2 overloads)]


Start an asynchronous receive. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_receive_from(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously receive a datagram. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[sender_endpoint][An endpoint object that receives the endpoint of the remote sender of the datagram. Ownership of the sender\_endpoint object is retained by the caller, which must guarantee that it is valid until the handler is called.]]

[[handler][The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes received.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  
To receive into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.async_receive_from(
       asio::buffer(data, size), sender_endpoint, handler); 


See the [link asio.reference.buffer `buffer`]  documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_datagram_socket::async_receive_from (2 of 2 overloads)]


Start an asynchronous receive. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_receive_from(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      socket_base::message_flags flags,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously receive a datagram. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[sender_endpoint][An endpoint object that receives the endpoint of the remote sender of the datagram. Ownership of the sender\_endpoint object is retained by the caller, which must guarantee that it is valid until the handler is called.]]

[[flags][Flags specifying how the receive call is to be made.]]

[[handler][The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes received.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`]. ]]

]




[endsect]


[endsect]

[section:async_send basic_datagram_socket::async_send]

[indexterm2 asio.indexterm.basic_datagram_socket.async_send..async_send..basic_datagram_socket] 
Start an asynchronous send on a connected socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_datagram_socket.async_send.overload1 async_send]``(
      const ConstBufferSequence & buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.async_send.overload1 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_datagram_socket.async_send.overload2 async_send]``(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.async_send.overload2 more...]]``


[section:overload1 basic_datagram_socket::async_send (1 of 2 overloads)]


Start an asynchronous send on a connected socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_send(
      const ConstBufferSequence & buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously send data on the datagram socket. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent on the socket. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the send operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes sent.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
The async\_send operation can only be used with a connected socket. Use the async\_send\_to function to send data on an unconnected datagram socket.


[heading Example]
  
To send a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.async_send(asio::buffer(data, size), handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_datagram_socket::async_send (2 of 2 overloads)]


Start an asynchronous send on a connected socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_send(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously send data on the datagram socket. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent on the socket. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[flags][Flags specifying how the send call is to be made.]]

[[handler][The handler to be called when the send operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes sent.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
The async\_send operation can only be used with a connected socket. Use the async\_send\_to function to send data on an unconnected datagram socket. 




[endsect]


[endsect]

[section:async_send_to basic_datagram_socket::async_send_to]

[indexterm2 asio.indexterm.basic_datagram_socket.async_send_to..async_send_to..basic_datagram_socket] 
Start an asynchronous send. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_datagram_socket.async_send_to.overload1 async_send_to]``(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.async_send_to.overload1 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_datagram_socket.async_send_to.overload2 async_send_to]``(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      socket_base::message_flags flags,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.async_send_to.overload2 more...]]``


[section:overload1 basic_datagram_socket::async_send_to (1 of 2 overloads)]


Start an asynchronous send. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_send_to(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously send a datagram to the specified remote endpoint. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent to the remote endpoint. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[destination][The remote endpoint to which the data will be sent. Copies will be made of the endpoint as required.]]

[[handler][The handler to be called when the send operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes sent.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  
To send a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::ip::udp::endpoint destination(
       asio::ip::address::from_string("1.2.3.4"), 12345);
   socket.async_send_to(
       asio::buffer(data, size), destination, handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_datagram_socket::async_send_to (2 of 2 overloads)]


Start an asynchronous send. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_send_to(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      socket_base::message_flags flags,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously send a datagram to the specified remote endpoint. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent to the remote endpoint. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[flags][Flags specifying how the send call is to be made.]]

[[destination][The remote endpoint to which the data will be sent. Copies will be made of the endpoint as required.]]

[[handler][The handler to be called when the send operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes sent.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`]. ]]

]




[endsect]


[endsect]


[section:async_wait basic_datagram_socket::async_wait]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_datagram_socket.async_wait..async_wait..basic_datagram_socket] 
Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  template<
      typename ``[link asio.reference.WaitHandler WaitHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_wait(
      wait_type w,
      WaitHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to perform an asynchronous wait for a socket to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired socket state.]]

[[handler][The handler to be called when the wait operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error // Result of operation
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  


   void wait_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Wait succeeded.
     }
   }

   ...

   asio::ip::tcp::socket socket(my_context);
   ...
   socket.async_wait(asio::ip::tcp::socket::wait_read, wait_handler);







[endsect]


[section:at_mark basic_datagram_socket::at_mark]

[indexterm2 asio.indexterm.basic_datagram_socket.at_mark..at_mark..basic_datagram_socket] 
Determine whether the socket is at the out-of-band data mark. 


  bool ``[link asio.reference.basic_datagram_socket.at_mark.overload1 at_mark]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.at_mark.overload1 more...]]``

  bool ``[link asio.reference.basic_datagram_socket.at_mark.overload2 at_mark]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.at_mark.overload2 more...]]``


[section:overload1 basic_datagram_socket::at_mark (1 of 2 overloads)]


['Inherited from basic_socket.]


Determine whether the socket is at the out-of-band data mark. 


  bool at_mark() const;


This function is used to check whether the socket input is currently positioned at the out-of-band data mark.


[heading Return Value]
      
A bool indicating whether the socket is at the out-of-band data mark.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 basic_datagram_socket::at_mark (2 of 2 overloads)]


['Inherited from basic_socket.]


Determine whether the socket is at the out-of-band data mark. 


  bool at_mark(
      asio::error_code & ec) const;


This function is used to check whether the socket input is currently positioned at the out-of-band data mark.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
A bool indicating whether the socket is at the out-of-band data mark. 




[endsect]


[endsect]

[section:available basic_datagram_socket::available]

[indexterm2 asio.indexterm.basic_datagram_socket.available..available..basic_datagram_socket] 
Determine the number of bytes available for reading. 


  std::size_t ``[link asio.reference.basic_datagram_socket.available.overload1 available]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.available.overload1 more...]]``

  std::size_t ``[link asio.reference.basic_datagram_socket.available.overload2 available]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.available.overload2 more...]]``


[section:overload1 basic_datagram_socket::available (1 of 2 overloads)]


['Inherited from basic_socket.]


Determine the number of bytes available for reading. 


  std::size_t available() const;


This function is used to determine the number of bytes that may be read without blocking.


[heading Return Value]
      
The number of bytes that may be read without blocking, or 0 if an error occurs.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 basic_datagram_socket::available (2 of 2 overloads)]


['Inherited from basic_socket.]


Determine the number of bytes available for reading. 


  std::size_t available(
      asio::error_code & ec) const;


This function is used to determine the number of bytes that may be read without blocking.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes that may be read without blocking, or 0 if an error occurs. 




[endsect]


[endsect]

[section:basic_datagram_socket basic_datagram_socket::basic_datagram_socket]

[indexterm2 asio.indexterm.basic_datagram_socket.basic_datagram_socket..basic_datagram_socket..basic_datagram_socket] 
Construct a [link asio.reference.basic_datagram_socket `basic_datagram_socket`] without opening it. 


  explicit ``[link asio.reference.basic_datagram_socket.basic_datagram_socket.overload1 basic_datagram_socket]``(
      const executor_type & ex);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.basic_datagram_socket.overload1 more...]]``

  template<
      typename ExecutionContext>
  explicit ``[link asio.reference.basic_datagram_socket.basic_datagram_socket.overload2 basic_datagram_socket]``(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.basic_datagram_socket.overload2 more...]]``


Construct and open a [link asio.reference.basic_datagram_socket `basic_datagram_socket`]. 


  ``[link asio.reference.basic_datagram_socket.basic_datagram_socket.overload3 basic_datagram_socket]``(
      const executor_type & ex,
      const protocol_type & protocol);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.basic_datagram_socket.overload3 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_datagram_socket.basic_datagram_socket.overload4 basic_datagram_socket]``(
      ExecutionContext & context,
      const protocol_type & protocol,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.basic_datagram_socket.overload4 more...]]``


Construct a [link asio.reference.basic_datagram_socket `basic_datagram_socket`], opening it and binding it to the given local endpoint. 


  ``[link asio.reference.basic_datagram_socket.basic_datagram_socket.overload5 basic_datagram_socket]``(
      const executor_type & ex,
      const endpoint_type & endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.basic_datagram_socket.overload5 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_datagram_socket.basic_datagram_socket.overload6 basic_datagram_socket]``(
      ExecutionContext & context,
      const endpoint_type & endpoint,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.basic_datagram_socket.overload6 more...]]``


Construct a [link asio.reference.basic_datagram_socket `basic_datagram_socket`] on an existing native socket. 


  ``[link asio.reference.basic_datagram_socket.basic_datagram_socket.overload7 basic_datagram_socket]``(
      const executor_type & ex,
      const protocol_type & protocol,
      const native_handle_type & native_socket);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.basic_datagram_socket.overload7 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_datagram_socket.basic_datagram_socket.overload8 basic_datagram_socket]``(
      ExecutionContext & context,
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.basic_datagram_socket.overload8 more...]]``


Move-construct a [link asio.reference.basic_datagram_socket `basic_datagram_socket`] from another. 


  ``[link asio.reference.basic_datagram_socket.basic_datagram_socket.overload9 basic_datagram_socket]``(
      basic_datagram_socket && other);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.basic_datagram_socket.overload9 more...]]``


Move-construct a [link asio.reference.basic_datagram_socket `basic_datagram_socket`] from a socket of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  ``[link asio.reference.basic_datagram_socket.basic_datagram_socket.overload10 basic_datagram_socket]``(
      basic_datagram_socket< Protocol1, Executor1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.basic_datagram_socket.overload10 more...]]``


[section:overload1 basic_datagram_socket::basic_datagram_socket (1 of 10 overloads)]


Construct a [link asio.reference.basic_datagram_socket `basic_datagram_socket`] without opening it. 


  basic_datagram_socket(
      const executor_type & ex);


This constructor creates a datagram socket without opening it. The `open()` function must be called before data can be sent or received on the socket.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket. ]]

]




[endsect]



[section:overload2 basic_datagram_socket::basic_datagram_socket (2 of 10 overloads)]


Construct a [link asio.reference.basic_datagram_socket `basic_datagram_socket`] without opening it. 


  template<
      typename ExecutionContext>
  basic_datagram_socket(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a datagram socket without opening it. The `open()` function must be called before data can be sent or received on the socket.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket. ]]

]




[endsect]



[section:overload3 basic_datagram_socket::basic_datagram_socket (3 of 10 overloads)]


Construct and open a [link asio.reference.basic_datagram_socket `basic_datagram_socket`]. 


  basic_datagram_socket(
      const executor_type & ex,
      const protocol_type & protocol);


This constructor creates and opens a datagram socket.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[protocol][An object specifying protocol parameters to be used.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload4 basic_datagram_socket::basic_datagram_socket (4 of 10 overloads)]


Construct and open a [link asio.reference.basic_datagram_socket `basic_datagram_socket`]. 


  template<
      typename ExecutionContext>
  basic_datagram_socket(
      ExecutionContext & context,
      const protocol_type & protocol,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates and opens a datagram socket.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[protocol][An object specifying protocol parameters to be used.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload5 basic_datagram_socket::basic_datagram_socket (5 of 10 overloads)]


Construct a [link asio.reference.basic_datagram_socket `basic_datagram_socket`], opening it and binding it to the given local endpoint. 


  basic_datagram_socket(
      const executor_type & ex,
      const endpoint_type & endpoint);


This constructor creates a datagram socket and automatically opens it bound to the specified endpoint on the local machine. The protocol used is the protocol associated with the given endpoint.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[endpoint][An endpoint on the local machine to which the datagram socket will be bound.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload6 basic_datagram_socket::basic_datagram_socket (6 of 10 overloads)]


Construct a [link asio.reference.basic_datagram_socket `basic_datagram_socket`], opening it and binding it to the given local endpoint. 


  template<
      typename ExecutionContext>
  basic_datagram_socket(
      ExecutionContext & context,
      const endpoint_type & endpoint,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a datagram socket and automatically opens it bound to the specified endpoint on the local machine. The protocol used is the protocol associated with the given endpoint.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[endpoint][An endpoint on the local machine to which the datagram socket will be bound.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload7 basic_datagram_socket::basic_datagram_socket (7 of 10 overloads)]


Construct a [link asio.reference.basic_datagram_socket `basic_datagram_socket`] on an existing native socket. 


  basic_datagram_socket(
      const executor_type & ex,
      const protocol_type & protocol,
      const native_handle_type & native_socket);


This constructor creates a datagram socket object to hold an existing native socket.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[protocol][An object specifying protocol parameters to be used.]]

[[native_socket][The new underlying socket implementation.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload8 basic_datagram_socket::basic_datagram_socket (8 of 10 overloads)]


Construct a [link asio.reference.basic_datagram_socket `basic_datagram_socket`] on an existing native socket. 


  template<
      typename ExecutionContext>
  basic_datagram_socket(
      ExecutionContext & context,
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a datagram socket object to hold an existing native socket.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[protocol][An object specifying protocol parameters to be used.]]

[[native_socket][The new underlying socket implementation.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload9 basic_datagram_socket::basic_datagram_socket (9 of 10 overloads)]


Move-construct a [link asio.reference.basic_datagram_socket `basic_datagram_socket`] from another. 


  basic_datagram_socket(
      basic_datagram_socket && other);


This constructor moves a datagram socket from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_datagram_socket `basic_datagram_socket`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_datagram_socket(const executor_type&)` constructor. 




[endsect]



[section:overload10 basic_datagram_socket::basic_datagram_socket (10 of 10 overloads)]


Move-construct a [link asio.reference.basic_datagram_socket `basic_datagram_socket`] from a socket of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  basic_datagram_socket(
      basic_datagram_socket< Protocol1, Executor1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value >::type *  = 0);


This constructor moves a datagram socket from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_datagram_socket `basic_datagram_socket`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_datagram_socket(const executor_type&)` constructor. 




[endsect]


[endsect]

[section:bind basic_datagram_socket::bind]

[indexterm2 asio.indexterm.basic_datagram_socket.bind..bind..basic_datagram_socket] 
Bind the socket to the given local endpoint. 


  void ``[link asio.reference.basic_datagram_socket.bind.overload1 bind]``(
      const endpoint_type & endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.bind.overload1 more...]]``

  void ``[link asio.reference.basic_datagram_socket.bind.overload2 bind]``(
      const endpoint_type & endpoint,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.bind.overload2 more...]]``


[section:overload1 basic_datagram_socket::bind (1 of 2 overloads)]


['Inherited from basic_socket.]


Bind the socket to the given local endpoint. 


  void bind(
      const endpoint_type & endpoint);


This function binds the socket to the specified endpoint on the local machine.


[heading Parameters]
    

[variablelist
  
[[endpoint][An endpoint on the local machine to which the socket will be bound.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   socket.open(asio::ip::tcp::v4());
   socket.bind(asio::ip::tcp::endpoint(
         asio::ip::tcp::v4(), 12345));







[endsect]



[section:overload2 basic_datagram_socket::bind (2 of 2 overloads)]


['Inherited from basic_socket.]


Bind the socket to the given local endpoint. 


  void bind(
      const endpoint_type & endpoint,
      asio::error_code & ec);


This function binds the socket to the specified endpoint on the local machine.


[heading Parameters]
    

[variablelist
  
[[endpoint][An endpoint on the local machine to which the socket will be bound.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   socket.open(asio::ip::tcp::v4());
   asio::error_code ec;
   socket.bind(asio::ip::tcp::endpoint(
         asio::ip::tcp::v4(), 12345), ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:broadcast basic_datagram_socket::broadcast]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_datagram_socket.broadcast..broadcast..basic_datagram_socket] 
Socket option to permit sending of broadcast messages. 


  typedef implementation_defined broadcast;



Implements the SOL\_SOCKET/SO\_BROADCAST socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::broadcast option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::broadcast option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_datagram_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:bytes_readable basic_datagram_socket::bytes_readable]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_datagram_socket.bytes_readable..bytes_readable..basic_datagram_socket] 
IO control command to get the amount of data that can be read without blocking. 


  typedef implementation_defined bytes_readable;



Implements the FIONREAD IO control command.


[heading Example]
  


   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();







[heading Requirements]

['Header: ][^asio/basic_datagram_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:cancel basic_datagram_socket::cancel]

[indexterm2 asio.indexterm.basic_datagram_socket.cancel..cancel..basic_datagram_socket] 
Cancel all asynchronous operations associated with the socket. 


  void ``[link asio.reference.basic_datagram_socket.cancel.overload1 cancel]``();
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.cancel.overload1 more...]]``

  void ``[link asio.reference.basic_datagram_socket.cancel.overload2 cancel]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.cancel.overload2 more...]]``


[section:overload1 basic_datagram_socket::cancel (1 of 2 overloads)]


['Inherited from basic_socket.]


Cancel all asynchronous operations associated with the socket. 


  void cancel();


This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls to `cancel()` will always fail with `asio::error::operation_not_supported` when run on Windows XP, Windows Server 2003, and earlier versions of Windows, unless ASIO\_ENABLE\_CANCELIO is defined. However, the CancelIo function has two issues that should be considered before enabling its use:


* It will only cancel asynchronous operations that were initiated in the current thread.


* It can appear to complete without error, but the request to cancel the unfinished operations may be silently ignored by the operating system. Whether it works or not seems to depend on the drivers that are installed.

For portable cancellation, consider using one of the following alternatives:


* Disable asio's I/O completion port backend by defining ASIO\_DISABLE\_IOCP.


* Use the `close()` function to simultaneously cancel the outstanding operations and close the socket.

When running on Windows Vista, Windows Server 2008, and later, the CancelIoEx function is always used. This function does not have the problems described above. 


[endsect]



[section:overload2 basic_datagram_socket::cancel (2 of 2 overloads)]


['Inherited from basic_socket.]


Cancel all asynchronous operations associated with the socket. 


  void cancel(
      asio::error_code & ec);


This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls to `cancel()` will always fail with `asio::error::operation_not_supported` when run on Windows XP, Windows Server 2003, and earlier versions of Windows, unless ASIO\_ENABLE\_CANCELIO is defined. However, the CancelIo function has two issues that should be considered before enabling its use:


* It will only cancel asynchronous operations that were initiated in the current thread.


* It can appear to complete without error, but the request to cancel the unfinished operations may be silently ignored by the operating system. Whether it works or not seems to depend on the drivers that are installed.

For portable cancellation, consider using one of the following alternatives:


* Disable asio's I/O completion port backend by defining ASIO\_DISABLE\_IOCP.


* Use the `close()` function to simultaneously cancel the outstanding operations and close the socket.

When running on Windows Vista, Windows Server 2008, and later, the CancelIoEx function is always used. This function does not have the problems described above. 


[endsect]


[endsect]

[section:close basic_datagram_socket::close]

[indexterm2 asio.indexterm.basic_datagram_socket.close..close..basic_datagram_socket] 
Close the socket. 


  void ``[link asio.reference.basic_datagram_socket.close.overload1 close]``();
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.close.overload1 more...]]``

  void ``[link asio.reference.basic_datagram_socket.close.overload2 close]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.close.overload2 more...]]``


[section:overload1 basic_datagram_socket::close (1 of 2 overloads)]


['Inherited from basic_socket.]


Close the socket. 


  void close();


This function is used to close the socket. Any asynchronous send, receive or connect operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed.]]

]


[heading Remarks]
      
For portable behaviour with respect to graceful closure of a connected socket, call `shutdown()` before closing the socket. 




[endsect]



[section:overload2 basic_datagram_socket::close (2 of 2 overloads)]


['Inherited from basic_socket.]


Close the socket. 


  void close(
      asio::error_code & ec);


This function is used to close the socket. Any asynchronous send, receive or connect operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   socket.close(ec);
   if (ec)
   {
     // An error occurred.
   }





[heading Remarks]
      
For portable behaviour with respect to graceful closure of a connected socket, call `shutdown()` before closing the socket. 




[endsect]


[endsect]

[section:connect basic_datagram_socket::connect]

[indexterm2 asio.indexterm.basic_datagram_socket.connect..connect..basic_datagram_socket] 
Connect the socket to the specified endpoint. 


  void ``[link asio.reference.basic_datagram_socket.connect.overload1 connect]``(
      const endpoint_type & peer_endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.connect.overload1 more...]]``

  void ``[link asio.reference.basic_datagram_socket.connect.overload2 connect]``(
      const endpoint_type & peer_endpoint,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.connect.overload2 more...]]``


[section:overload1 basic_datagram_socket::connect (1 of 2 overloads)]


['Inherited from basic_socket.]


Connect the socket to the specified endpoint. 


  void connect(
      const endpoint_type & peer_endpoint);


This function is used to connect a socket to the specified remote endpoint. The function call will block until the connection is successfully made or an error occurs.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.


[heading Parameters]
    

[variablelist
  
[[peer_endpoint][The remote endpoint to which the socket will be connected.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   asio::ip::tcp::endpoint endpoint(
       asio::ip::address::from_string("1.2.3.4"), 12345);
   socket.connect(endpoint);







[endsect]



[section:overload2 basic_datagram_socket::connect (2 of 2 overloads)]


['Inherited from basic_socket.]


Connect the socket to the specified endpoint. 


  void connect(
      const endpoint_type & peer_endpoint,
      asio::error_code & ec);


This function is used to connect a socket to the specified remote endpoint. The function call will block until the connection is successfully made or an error occurs.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.


[heading Parameters]
    

[variablelist
  
[[peer_endpoint][The remote endpoint to which the socket will be connected.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   asio::ip::tcp::endpoint endpoint(
       asio::ip::address::from_string("1.2.3.4"), 12345);
   asio::error_code ec;
   socket.connect(endpoint, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:debug basic_datagram_socket::debug]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_datagram_socket.debug..debug..basic_datagram_socket] 
Socket option to enable socket-level debugging. 


  typedef implementation_defined debug;



Implements the SOL\_SOCKET/SO\_DEBUG socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::debug option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::debug option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_datagram_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:do_not_route basic_datagram_socket::do_not_route]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_datagram_socket.do_not_route..do_not_route..basic_datagram_socket] 
Socket option to prevent routing, use local interfaces only. 


  typedef implementation_defined do_not_route;



Implements the SOL\_SOCKET/SO\_DONTROUTE socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::do_not_route option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::do_not_route option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_datagram_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:enable_connection_aborted basic_datagram_socket::enable_connection_aborted]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_datagram_socket.enable_connection_aborted..enable_connection_aborted..basic_datagram_socket] 
Socket option to report aborted connections on accept. 


  typedef implementation_defined enable_connection_aborted;



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.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::enable_connection_aborted option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::enable_connection_aborted option;
   acceptor.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_datagram_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:endpoint_type basic_datagram_socket::endpoint_type]

[indexterm2 asio.indexterm.basic_datagram_socket.endpoint_type..endpoint_type..basic_datagram_socket] 
The endpoint type. 


  typedef Protocol::endpoint endpoint_type;



[heading Requirements]

['Header: ][^asio/basic_datagram_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:executor_type basic_datagram_socket::executor_type]

[indexterm2 asio.indexterm.basic_datagram_socket.executor_type..executor_type..basic_datagram_socket] 
The type of the executor associated with the object. 


  typedef Executor executor_type;



[heading Requirements]

['Header: ][^asio/basic_datagram_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:get_executor basic_datagram_socket::get_executor]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_datagram_socket.get_executor..get_executor..basic_datagram_socket] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_option basic_datagram_socket::get_option]

[indexterm2 asio.indexterm.basic_datagram_socket.get_option..get_option..basic_datagram_socket] 
Get an option from the socket. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void ``[link asio.reference.basic_datagram_socket.get_option.overload1 get_option]``(
      GettableSocketOption & option) const;
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.get_option.overload1 more...]]``

  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void ``[link asio.reference.basic_datagram_socket.get_option.overload2 get_option]``(
      GettableSocketOption & option,
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.get_option.overload2 more...]]``


[section:overload1 basic_datagram_socket::get_option (1 of 2 overloads)]


['Inherited from basic_socket.]


Get an option from the socket. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void get_option(
      GettableSocketOption & option) const;


This function is used to get the current value of an option on the socket.


[heading Parameters]
    

[variablelist
  
[[option][The option value to be obtained from the socket.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]



[heading Example]
  
Getting the value of the SOL\_SOCKET/SO\_KEEPALIVE option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::socket::keep_alive option;
   socket.get_option(option);
   bool is_set = option.value();







[endsect]



[section:overload2 basic_datagram_socket::get_option (2 of 2 overloads)]


['Inherited from basic_socket.]


Get an option from the socket. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void get_option(
      GettableSocketOption & option,
      asio::error_code & ec) const;


This function is used to get the current value of an option on the socket.


[heading Parameters]
    

[variablelist
  
[[option][The option value to be obtained from the socket.]]

[[ec][Set to indicate what error occurred, if any.]]

]



[heading Example]
  
Getting the value of the SOL\_SOCKET/SO\_KEEPALIVE option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::socket::keep_alive option;
   asio::error_code ec;
   socket.get_option(option, ec);
   if (ec)
   {
     // An error occurred.
   }
   bool is_set = option.value();







[endsect]


[endsect]

[section:io_control basic_datagram_socket::io_control]

[indexterm2 asio.indexterm.basic_datagram_socket.io_control..io_control..basic_datagram_socket] 
Perform an IO control command on the socket. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void ``[link asio.reference.basic_datagram_socket.io_control.overload1 io_control]``(
      IoControlCommand & command);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.io_control.overload1 more...]]``

  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void ``[link asio.reference.basic_datagram_socket.io_control.overload2 io_control]``(
      IoControlCommand & command,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.io_control.overload2 more...]]``


[section:overload1 basic_datagram_socket::io_control (1 of 2 overloads)]


['Inherited from basic_socket.]


Perform an IO control command on the socket. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void io_control(
      IoControlCommand & command);


This function is used to execute an IO control command on the socket.


[heading Parameters]
    

[variablelist
  
[[command][The IO control command to be performed on the socket.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]



[heading Example]
  
Getting the number of bytes ready to read: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::socket::bytes_readable command;
   socket.io_control(command);
   std::size_t bytes_readable = command.get();







[endsect]



[section:overload2 basic_datagram_socket::io_control (2 of 2 overloads)]


['Inherited from basic_socket.]


Perform an IO control command on the socket. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void io_control(
      IoControlCommand & command,
      asio::error_code & ec);


This function is used to execute an IO control command on the socket.


[heading Parameters]
    

[variablelist
  
[[command][The IO control command to be performed on the socket.]]

[[ec][Set to indicate what error occurred, if any.]]

]



[heading Example]
  
Getting the number of bytes ready to read: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::socket::bytes_readable command;
   asio::error_code ec;
   socket.io_control(command, ec);
   if (ec)
   {
     // An error occurred.
   }
   std::size_t bytes_readable = command.get();







[endsect]


[endsect]


[section:is_open basic_datagram_socket::is_open]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_datagram_socket.is_open..is_open..basic_datagram_socket] 
Determine whether the socket is open. 


  bool is_open() const;



[endsect]



[section:keep_alive basic_datagram_socket::keep_alive]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_datagram_socket.keep_alive..keep_alive..basic_datagram_socket] 
Socket option to send keep-alives. 


  typedef implementation_defined keep_alive;



Implements the SOL\_SOCKET/SO\_KEEPALIVE socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::keep_alive option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::keep_alive option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_datagram_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:linger basic_datagram_socket::linger]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_datagram_socket.linger..linger..basic_datagram_socket] 
Socket option to specify whether the socket lingers on close if unsent data is present. 


  typedef implementation_defined linger;



Implements the SOL\_SOCKET/SO\_LINGER socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::linger option(true, 30);
   socket.set_option(option);





Getting the current option value: 

   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();







[heading Requirements]

['Header: ][^asio/basic_datagram_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:local_endpoint basic_datagram_socket::local_endpoint]

[indexterm2 asio.indexterm.basic_datagram_socket.local_endpoint..local_endpoint..basic_datagram_socket] 
Get the local endpoint of the socket. 


  endpoint_type ``[link asio.reference.basic_datagram_socket.local_endpoint.overload1 local_endpoint]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.local_endpoint.overload1 more...]]``

  endpoint_type ``[link asio.reference.basic_datagram_socket.local_endpoint.overload2 local_endpoint]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.local_endpoint.overload2 more...]]``


[section:overload1 basic_datagram_socket::local_endpoint (1 of 2 overloads)]


['Inherited from basic_socket.]


Get the local endpoint of the socket. 


  endpoint_type local_endpoint() const;


This function is used to obtain the locally bound endpoint of the socket.


[heading Return Value]
      
An object that represents the local endpoint of the socket.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::endpoint endpoint = socket.local_endpoint();







[endsect]



[section:overload2 basic_datagram_socket::local_endpoint (2 of 2 overloads)]


['Inherited from basic_socket.]


Get the local endpoint of the socket. 


  endpoint_type local_endpoint(
      asio::error_code & ec) const;


This function is used to obtain the locally bound endpoint of the socket.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
An object that represents the local endpoint of the socket. Returns a default-constructed endpoint object if an error occurred.


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   asio::ip::tcp::endpoint endpoint = socket.local_endpoint(ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]

[section:lowest_layer basic_datagram_socket::lowest_layer]

[indexterm2 asio.indexterm.basic_datagram_socket.lowest_layer..lowest_layer..basic_datagram_socket] 
Get a reference to the lowest layer. 


  lowest_layer_type & ``[link asio.reference.basic_datagram_socket.lowest_layer.overload1 lowest_layer]``();
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.lowest_layer.overload1 more...]]``


Get a const reference to the lowest layer. 


  const lowest_layer_type & ``[link asio.reference.basic_datagram_socket.lowest_layer.overload2 lowest_layer]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.lowest_layer.overload2 more...]]``


[section:overload1 basic_datagram_socket::lowest_layer (1 of 2 overloads)]


['Inherited from basic_socket.]


Get a reference to the lowest layer. 


  lowest_layer_type & lowest_layer();


This function returns a reference to the lowest layer in a stack of layers. Since a [link asio.reference.basic_socket `basic_socket`] cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]



[section:overload2 basic_datagram_socket::lowest_layer (2 of 2 overloads)]


['Inherited from basic_socket.]


Get a const reference to the lowest layer. 


  const lowest_layer_type & lowest_layer() const;


This function returns a const reference to the lowest layer in a stack of layers. Since a [link asio.reference.basic_socket `basic_socket`] cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]


[endsect]


[section:lowest_layer_type basic_datagram_socket::lowest_layer_type]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_datagram_socket.lowest_layer_type..lowest_layer_type..basic_datagram_socket] 
A [link asio.reference.basic_socket `basic_socket`] is always the lowest layer. 


  typedef basic_socket< Protocol, Executor > lowest_layer_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_socket.basic_socket [*basic_socket]] [constructor]]
    [Construct a basic_socket without opening it. 
     [hr]
     Construct and open a basic_socket. 
     [hr]
     Construct a basic_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_socket on an existing native socket. 
     [hr]
     Move-construct a basic_socket from another. 
     [hr]
     Move-construct a basic_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_socket from another. 
     [hr]
     Move-assign a basic_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket._basic_socket [*~basic_socket]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_socket `basic_socket`] class template provides functionality that is common to both stream-oriented and datagram-oriented sockets.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/basic_datagram_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:max_connections basic_datagram_socket::max_connections]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_datagram_socket.max_connections..max_connections..basic_datagram_socket] 
(Deprecated: Use max\_listen\_connections.) The maximum length of the queue of pending incoming connections. 


  static const int max_connections = implementation_defined;



[endsect]



[section:max_listen_connections basic_datagram_socket::max_listen_connections]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_datagram_socket.max_listen_connections..max_listen_connections..basic_datagram_socket] 
The maximum length of the queue of pending incoming connections. 


  static const int max_listen_connections = implementation_defined;



[endsect]



[section:message_do_not_route basic_datagram_socket::message_do_not_route]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_datagram_socket.message_do_not_route..message_do_not_route..basic_datagram_socket] 
Specify that the data should not be subject to routing. 


  static const int message_do_not_route = implementation_defined;



[endsect]



[section:message_end_of_record basic_datagram_socket::message_end_of_record]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_datagram_socket.message_end_of_record..message_end_of_record..basic_datagram_socket] 
Specifies that the data marks the end of a record. 


  static const int message_end_of_record = implementation_defined;



[endsect]



[section:message_flags basic_datagram_socket::message_flags]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_datagram_socket.message_flags..message_flags..basic_datagram_socket] 
Bitmask type for flags that can be passed to send and receive operations. 


  typedef int message_flags;



[heading Requirements]

['Header: ][^asio/basic_datagram_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:message_out_of_band basic_datagram_socket::message_out_of_band]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_datagram_socket.message_out_of_band..message_out_of_band..basic_datagram_socket] 
Process out-of-band data. 


  static const int message_out_of_band = implementation_defined;



[endsect]



[section:message_peek basic_datagram_socket::message_peek]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_datagram_socket.message_peek..message_peek..basic_datagram_socket] 
Peek at incoming data without removing it from the input queue. 


  static const int message_peek = implementation_defined;



[endsect]



[section:native_handle basic_datagram_socket::native_handle]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_datagram_socket.native_handle..native_handle..basic_datagram_socket] 
Get the native socket representation. 


  native_handle_type native_handle();


This function may be used to obtain the underlying representation of the socket. This is intended to allow access to native socket functionality that is not otherwise provided. 


[endsect]



[section:native_handle_type basic_datagram_socket::native_handle_type]

[indexterm2 asio.indexterm.basic_datagram_socket.native_handle_type..native_handle_type..basic_datagram_socket] 
The native representation of a socket. 


  typedef implementation_defined native_handle_type;



[heading Requirements]

['Header: ][^asio/basic_datagram_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:native_non_blocking basic_datagram_socket::native_non_blocking]

[indexterm2 asio.indexterm.basic_datagram_socket.native_non_blocking..native_non_blocking..basic_datagram_socket] 
Gets the non-blocking mode of the native socket implementation. 


  bool ``[link asio.reference.basic_datagram_socket.native_non_blocking.overload1 native_non_blocking]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.native_non_blocking.overload1 more...]]``


Sets the non-blocking mode of the native socket implementation. 


  void ``[link asio.reference.basic_datagram_socket.native_non_blocking.overload2 native_non_blocking]``(
      bool mode);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.native_non_blocking.overload2 more...]]``

  void ``[link asio.reference.basic_datagram_socket.native_non_blocking.overload3 native_non_blocking]``(
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.native_non_blocking.overload3 more...]]``


[section:overload1 basic_datagram_socket::native_non_blocking (1 of 3 overloads)]


['Inherited from basic_socket.]


Gets the non-blocking mode of the native socket implementation. 


  bool native_non_blocking() const;


This function is used to retrieve the non-blocking mode of the underlying native socket. This mode has no effect on the behaviour of the socket object's synchronous operations.


[heading Return Value]
      
`true` if the underlying socket is in non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).


[heading Remarks]
      
The current non-blocking mode is cached by the socket object. Consequently, the return value may be incorrect if the non-blocking mode was set directly on the native socket.


[heading Example]
  
This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's `sendfile` system call might be encapsulated: 

   template <typename Handler>
   struct sendfile_op
   {
     tcp::socket& sock_;
     int fd_;
     Handler handler_;
     off_t offset_;
     std::size_t total_bytes_transferred_;

     // Function call operator meeting WriteHandler requirements.
     // Used as the handler for the async_write_some operation.
     void operator()(asio::error_code ec, std::size_t)
     {
       // Put the underlying socket into non-blocking mode.
       if (!ec)
         if (!sock_.native_non_blocking())
           sock_.native_non_blocking(true, ec);

       if (!ec)
       {
         for (;;)
         {
           // Try the system call.
           errno = 0;
           int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
           ec = asio::error_code(n < 0 ? errno : 0,
               asio::error::get_system_category());
           total_bytes_transferred_ += ec ? 0 : n;

           // Retry operation immediately if interrupted by signal.
           if (ec == asio::error::interrupted)
             continue;

           // Check if we need to run the operation again.
           if (ec == asio::error::would_block
               || ec == asio::error::try_again)
           {
             // We have to wait for the socket to become ready again.
             sock_.async_wait(tcp::socket::wait_write, *this);
             return;
           }

           if (ec || n == 0)
           {
             // An error occurred, or we have reached the end of the file.
             // Either way we must exit the loop so we can call the handler.
             break;
           }

           // Loop around to try calling sendfile again.
         }
       }

       // Pass result back to user's handler.
       handler_(ec, total_bytes_transferred_);
     }
   };

   template <typename Handler>
   void async_sendfile(tcp::socket& sock, int fd, Handler h)
   {
     sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
     sock.async_wait(tcp::socket::wait_write, op);
   } 







[endsect]



[section:overload2 basic_datagram_socket::native_non_blocking (2 of 3 overloads)]


['Inherited from basic_socket.]


Sets the non-blocking mode of the native socket implementation. 


  void native_non_blocking(
      bool mode);


This function is used to modify the non-blocking mode of the underlying native socket. It has no effect on the behaviour of the socket object's synchronous operations.


[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the underlying socket is put into non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. If the `mode` is `false`, but the current value of `non_blocking()` is `true`, this function fails with `asio::error::invalid_argument`, as the combination does not make sense.]]

]


[heading Example]
  
This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's `sendfile` system call might be encapsulated: 

   template <typename Handler>
   struct sendfile_op
   {
     tcp::socket& sock_;
     int fd_;
     Handler handler_;
     off_t offset_;
     std::size_t total_bytes_transferred_;

     // Function call operator meeting WriteHandler requirements.
     // Used as the handler for the async_write_some operation.
     void operator()(asio::error_code ec, std::size_t)
     {
       // Put the underlying socket into non-blocking mode.
       if (!ec)
         if (!sock_.native_non_blocking())
           sock_.native_non_blocking(true, ec);

       if (!ec)
       {
         for (;;)
         {
           // Try the system call.
           errno = 0;
           int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
           ec = asio::error_code(n < 0 ? errno : 0,
               asio::error::get_system_category());
           total_bytes_transferred_ += ec ? 0 : n;

           // Retry operation immediately if interrupted by signal.
           if (ec == asio::error::interrupted)
             continue;

           // Check if we need to run the operation again.
           if (ec == asio::error::would_block
               || ec == asio::error::try_again)
           {
             // We have to wait for the socket to become ready again.
             sock_.async_wait(tcp::socket::wait_write, *this);
             return;
           }

           if (ec || n == 0)
           {
             // An error occurred, or we have reached the end of the file.
             // Either way we must exit the loop so we can call the handler.
             break;
           }

           // Loop around to try calling sendfile again.
         }
       }

       // Pass result back to user's handler.
       handler_(ec, total_bytes_transferred_);
     }
   };

   template <typename Handler>
   void async_sendfile(tcp::socket& sock, int fd, Handler h)
   {
     sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
     sock.async_wait(tcp::socket::wait_write, op);
   } 







[endsect]



[section:overload3 basic_datagram_socket::native_non_blocking (3 of 3 overloads)]


['Inherited from basic_socket.]


Sets the non-blocking mode of the native socket implementation. 


  void native_non_blocking(
      bool mode,
      asio::error_code & ec);


This function is used to modify the non-blocking mode of the underlying native socket. It has no effect on the behaviour of the socket object's synchronous operations.


[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the underlying socket is put into non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).]]

[[ec][Set to indicate what error occurred, if any. If the `mode` is `false`, but the current value of `non_blocking()` is `true`, this function fails with `asio::error::invalid_argument`, as the combination does not make sense.]]

]


[heading Example]
  
This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's `sendfile` system call might be encapsulated: 

   template <typename Handler>
   struct sendfile_op
   {
     tcp::socket& sock_;
     int fd_;
     Handler handler_;
     off_t offset_;
     std::size_t total_bytes_transferred_;

     // Function call operator meeting WriteHandler requirements.
     // Used as the handler for the async_write_some operation.
     void operator()(asio::error_code ec, std::size_t)
     {
       // Put the underlying socket into non-blocking mode.
       if (!ec)
         if (!sock_.native_non_blocking())
           sock_.native_non_blocking(true, ec);

       if (!ec)
       {
         for (;;)
         {
           // Try the system call.
           errno = 0;
           int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
           ec = asio::error_code(n < 0 ? errno : 0,
               asio::error::get_system_category());
           total_bytes_transferred_ += ec ? 0 : n;

           // Retry operation immediately if interrupted by signal.
           if (ec == asio::error::interrupted)
             continue;

           // Check if we need to run the operation again.
           if (ec == asio::error::would_block
               || ec == asio::error::try_again)
           {
             // We have to wait for the socket to become ready again.
             sock_.async_wait(tcp::socket::wait_write, *this);
             return;
           }

           if (ec || n == 0)
           {
             // An error occurred, or we have reached the end of the file.
             // Either way we must exit the loop so we can call the handler.
             break;
           }

           // Loop around to try calling sendfile again.
         }
       }

       // Pass result back to user's handler.
       handler_(ec, total_bytes_transferred_);
     }
   };

   template <typename Handler>
   void async_sendfile(tcp::socket& sock, int fd, Handler h)
   {
     sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
     sock.async_wait(tcp::socket::wait_write, op);
   } 







[endsect]


[endsect]

[section:non_blocking basic_datagram_socket::non_blocking]

[indexterm2 asio.indexterm.basic_datagram_socket.non_blocking..non_blocking..basic_datagram_socket] 
Gets the non-blocking mode of the socket. 


  bool ``[link asio.reference.basic_datagram_socket.non_blocking.overload1 non_blocking]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.non_blocking.overload1 more...]]``


Sets the non-blocking mode of the socket. 


  void ``[link asio.reference.basic_datagram_socket.non_blocking.overload2 non_blocking]``(
      bool mode);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.non_blocking.overload2 more...]]``

  void ``[link asio.reference.basic_datagram_socket.non_blocking.overload3 non_blocking]``(
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.non_blocking.overload3 more...]]``


[section:overload1 basic_datagram_socket::non_blocking (1 of 3 overloads)]


['Inherited from basic_socket.]


Gets the non-blocking mode of the socket. 


  bool non_blocking() const;



[heading Return Value]
      
`true` if the socket's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]



[section:overload2 basic_datagram_socket::non_blocking (2 of 3 overloads)]


['Inherited from basic_socket.]


Sets the non-blocking mode of the socket. 


  void non_blocking(
      bool mode);



[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the socket's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]



[section:overload3 basic_datagram_socket::non_blocking (3 of 3 overloads)]


['Inherited from basic_socket.]


Sets the non-blocking mode of the socket. 


  void non_blocking(
      bool mode,
      asio::error_code & ec);



[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the socket's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]


[endsect]

[section:open basic_datagram_socket::open]

[indexterm2 asio.indexterm.basic_datagram_socket.open..open..basic_datagram_socket] 
Open the socket using the specified protocol. 


  void ``[link asio.reference.basic_datagram_socket.open.overload1 open]``(
      const protocol_type & protocol = protocol_type());
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.open.overload1 more...]]``

  void ``[link asio.reference.basic_datagram_socket.open.overload2 open]``(
      const protocol_type & protocol,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.open.overload2 more...]]``


[section:overload1 basic_datagram_socket::open (1 of 2 overloads)]


['Inherited from basic_socket.]


Open the socket using the specified protocol. 


  void open(
      const protocol_type & protocol = protocol_type());


This function opens the socket so that it will use the specified protocol.


[heading Parameters]
    

[variablelist
  
[[protocol][An object specifying protocol parameters to be used.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   socket.open(asio::ip::tcp::v4());







[endsect]



[section:overload2 basic_datagram_socket::open (2 of 2 overloads)]


['Inherited from basic_socket.]


Open the socket using the specified protocol. 


  void open(
      const protocol_type & protocol,
      asio::error_code & ec);


This function opens the socket so that it will use the specified protocol.


[heading Parameters]
    

[variablelist
  
[[protocol][An object specifying which protocol is to be used.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   asio::error_code ec;
   socket.open(asio::ip::tcp::v4(), ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]

[section:operator_eq_ basic_datagram_socket::operator=]

[indexterm2 asio.indexterm.basic_datagram_socket.operator_eq_..operator=..basic_datagram_socket] 
Move-assign a [link asio.reference.basic_datagram_socket `basic_datagram_socket`] from another. 


  basic_datagram_socket & ``[link asio.reference.basic_datagram_socket.operator_eq_.overload1 operator=]``(
      basic_datagram_socket && other);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.operator_eq_.overload1 more...]]``


Move-assign a [link asio.reference.basic_datagram_socket `basic_datagram_socket`] from a socket of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value, basic_datagram_socket & >::type ``[link asio.reference.basic_datagram_socket.operator_eq_.overload2 operator=]``(
      basic_datagram_socket< Protocol1, Executor1 > && other);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.operator_eq_.overload2 more...]]``


[section:overload1 basic_datagram_socket::operator= (1 of 2 overloads)]


Move-assign a [link asio.reference.basic_datagram_socket `basic_datagram_socket`] from another. 


  basic_datagram_socket & operator=(
      basic_datagram_socket && other);


This assignment operator moves a datagram socket from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_datagram_socket `basic_datagram_socket`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_datagram_socket(const executor_type&)` constructor. 




[endsect]



[section:overload2 basic_datagram_socket::operator= (2 of 2 overloads)]


Move-assign a [link asio.reference.basic_datagram_socket `basic_datagram_socket`] from a socket of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value, basic_datagram_socket & >::type operator=(
      basic_datagram_socket< Protocol1, Executor1 > && other);


This assignment operator moves a datagram socket from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_datagram_socket `basic_datagram_socket`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_datagram_socket(const executor_type&)` constructor. 




[endsect]


[endsect]


[section:out_of_band_inline basic_datagram_socket::out_of_band_inline]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_datagram_socket.out_of_band_inline..out_of_band_inline..basic_datagram_socket] 
Socket option for putting received out-of-band data inline. 


  typedef implementation_defined out_of_band_inline;



Implements the SOL\_SOCKET/SO\_OOBINLINE socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::out_of_band_inline option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::out_of_band_inline option;
   socket.get_option(option);
   bool value = option.value();







[heading Requirements]

['Header: ][^asio/basic_datagram_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:protocol_type basic_datagram_socket::protocol_type]

[indexterm2 asio.indexterm.basic_datagram_socket.protocol_type..protocol_type..basic_datagram_socket] 
The protocol type. 


  typedef Protocol protocol_type;



[heading Requirements]

['Header: ][^asio/basic_datagram_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:receive basic_datagram_socket::receive]

[indexterm2 asio.indexterm.basic_datagram_socket.receive..receive..basic_datagram_socket] 
Receive some data on a connected socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.basic_datagram_socket.receive.overload1 receive]``(
      const MutableBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.receive.overload1 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.basic_datagram_socket.receive.overload2 receive]``(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.receive.overload2 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.basic_datagram_socket.receive.overload3 receive]``(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.receive.overload3 more...]]``


[section:overload1 basic_datagram_socket::receive (1 of 3 overloads)]


Receive some data on a connected socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive(
      const MutableBufferSequence & buffers);


This function is used to receive data on the datagram socket. The function call will block until data has been received successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received.]]

]


[heading Return Value]
      
The number of bytes received.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
The receive operation can only be used with a connected socket. Use the receive\_from function to receive data on an unconnected datagram socket.


[heading Example]
  
To receive into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.receive(asio::buffer(data, size)); 


See the [link asio.reference.buffer `buffer`]  documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_datagram_socket::receive (2 of 3 overloads)]


Receive some data on a connected socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags);


This function is used to receive data on the datagram socket. The function call will block until data has been received successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received.]]

[[flags][Flags specifying how the receive call is to be made.]]

]


[heading Return Value]
      
The number of bytes received.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
The receive operation can only be used with a connected socket. Use the receive\_from function to receive data on an unconnected datagram socket. 




[endsect]



[section:overload3 basic_datagram_socket::receive (3 of 3 overloads)]


Receive some data on a connected socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      asio::error_code & ec);


This function is used to receive data on the datagram socket. The function call will block until data has been received successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received.]]

[[flags][Flags specifying how the receive call is to be made.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes received.


[heading Remarks]
      
The receive operation can only be used with a connected socket. Use the receive\_from function to receive data on an unconnected datagram socket. 




[endsect]


[endsect]


[section:receive_buffer_size basic_datagram_socket::receive_buffer_size]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_datagram_socket.receive_buffer_size..receive_buffer_size..basic_datagram_socket] 
Socket option for the receive buffer size of a socket. 


  typedef implementation_defined receive_buffer_size;



Implements the SOL\_SOCKET/SO\_RCVBUF socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_buffer_size option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_datagram_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:receive_from basic_datagram_socket::receive_from]

[indexterm2 asio.indexterm.basic_datagram_socket.receive_from..receive_from..basic_datagram_socket] 
Receive a datagram with the endpoint of the sender. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.basic_datagram_socket.receive_from.overload1 receive_from]``(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.receive_from.overload1 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.basic_datagram_socket.receive_from.overload2 receive_from]``(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      socket_base::message_flags flags);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.receive_from.overload2 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.basic_datagram_socket.receive_from.overload3 receive_from]``(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      socket_base::message_flags flags,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.receive_from.overload3 more...]]``


[section:overload1 basic_datagram_socket::receive_from (1 of 3 overloads)]


Receive a datagram with the endpoint of the sender. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive_from(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint);


This function is used to receive a datagram. The function call will block until data has been received successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received.]]

[[sender_endpoint][An endpoint object that receives the endpoint of the remote sender of the datagram.]]

]


[heading Return Value]
      
The number of bytes received.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  
To receive into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::ip::udp::endpoint sender_endpoint;
   socket.receive_from(
       asio::buffer(data, size), sender_endpoint);


See the [link asio.reference.buffer `buffer`]  documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_datagram_socket::receive_from (2 of 3 overloads)]


Receive a datagram with the endpoint of the sender. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive_from(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      socket_base::message_flags flags);


This function is used to receive a datagram. The function call will block until data has been received successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received.]]

[[sender_endpoint][An endpoint object that receives the endpoint of the remote sender of the datagram.]]

[[flags][Flags specifying how the receive call is to be made.]]

]


[heading Return Value]
      
The number of bytes received.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload3 basic_datagram_socket::receive_from (3 of 3 overloads)]


Receive a datagram with the endpoint of the sender. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive_from(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      socket_base::message_flags flags,
      asio::error_code & ec);


This function is used to receive a datagram. The function call will block until data has been received successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received.]]

[[sender_endpoint][An endpoint object that receives the endpoint of the remote sender of the datagram.]]

[[flags][Flags specifying how the receive call is to be made.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes received. 




[endsect]


[endsect]


[section:receive_low_watermark basic_datagram_socket::receive_low_watermark]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_datagram_socket.receive_low_watermark..receive_low_watermark..basic_datagram_socket] 
Socket option for the receive low watermark. 


  typedef implementation_defined receive_low_watermark;



Implements the SOL\_SOCKET/SO\_RCVLOWAT socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_low_watermark option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_datagram_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:release basic_datagram_socket::release]

[indexterm2 asio.indexterm.basic_datagram_socket.release..release..basic_datagram_socket] 
Release ownership of the underlying native socket. 


  native_handle_type ``[link asio.reference.basic_datagram_socket.release.overload1 release]``();
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.release.overload1 more...]]``

  native_handle_type ``[link asio.reference.basic_datagram_socket.release.overload2 release]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.release.overload2 more...]]``


[section:overload1 basic_datagram_socket::release (1 of 2 overloads)]


['Inherited from basic_socket.]


Release ownership of the underlying native socket. 


  native_handle_type release();


This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error. Ownership of the native socket is then transferred to the caller.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
This function is unsupported on Windows versions prior to Windows 8.1, and will fail with `asio::error::operation_not_supported` on these platforms. 




[endsect]



[section:overload2 basic_datagram_socket::release (2 of 2 overloads)]


['Inherited from basic_socket.]


Release ownership of the underlying native socket. 


  native_handle_type release(
      asio::error_code & ec);


This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error. Ownership of the native socket is then transferred to the caller.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
This function is unsupported on Windows versions prior to Windows 8.1, and will fail with `asio::error::operation_not_supported` on these platforms. 




[endsect]


[endsect]

[section:remote_endpoint basic_datagram_socket::remote_endpoint]

[indexterm2 asio.indexterm.basic_datagram_socket.remote_endpoint..remote_endpoint..basic_datagram_socket] 
Get the remote endpoint of the socket. 


  endpoint_type ``[link asio.reference.basic_datagram_socket.remote_endpoint.overload1 remote_endpoint]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.remote_endpoint.overload1 more...]]``

  endpoint_type ``[link asio.reference.basic_datagram_socket.remote_endpoint.overload2 remote_endpoint]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.remote_endpoint.overload2 more...]]``


[section:overload1 basic_datagram_socket::remote_endpoint (1 of 2 overloads)]


['Inherited from basic_socket.]


Get the remote endpoint of the socket. 


  endpoint_type remote_endpoint() const;


This function is used to obtain the remote endpoint of the socket.


[heading Return Value]
      
An object that represents the remote endpoint of the socket.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::endpoint endpoint = socket.remote_endpoint();







[endsect]



[section:overload2 basic_datagram_socket::remote_endpoint (2 of 2 overloads)]


['Inherited from basic_socket.]


Get the remote endpoint of the socket. 


  endpoint_type remote_endpoint(
      asio::error_code & ec) const;


This function is used to obtain the remote endpoint of the socket.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
An object that represents the remote endpoint of the socket. Returns a default-constructed endpoint object if an error occurred.


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   asio::ip::tcp::endpoint endpoint = socket.remote_endpoint(ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:reuse_address basic_datagram_socket::reuse_address]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_datagram_socket.reuse_address..reuse_address..basic_datagram_socket] 
Socket option to allow the socket to be bound to an address that is already in use. 


  typedef implementation_defined reuse_address;



Implements the SOL\_SOCKET/SO\_REUSEADDR socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::reuse_address option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::reuse_address option;
   acceptor.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_datagram_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:send basic_datagram_socket::send]

[indexterm2 asio.indexterm.basic_datagram_socket.send..send..basic_datagram_socket] 
Send some data on a connected socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.basic_datagram_socket.send.overload1 send]``(
      const ConstBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.send.overload1 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.basic_datagram_socket.send.overload2 send]``(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.send.overload2 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.basic_datagram_socket.send.overload3 send]``(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.send.overload3 more...]]``


[section:overload1 basic_datagram_socket::send (1 of 3 overloads)]


Send some data on a connected socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send(
      const ConstBufferSequence & buffers);


This function is used to send data on the datagram socket. The function call will block until the data has been sent successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One ore more data buffers to be sent on the socket.]]

]


[heading Return Value]
      
The number of bytes sent.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
The send operation can only be used with a connected socket. Use the send\_to function to send data on an unconnected datagram socket.


[heading Example]
  
To send a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.send(asio::buffer(data, size)); 


See the [link asio.reference.buffer `buffer`]  documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_datagram_socket::send (2 of 3 overloads)]


Send some data on a connected socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags);


This function is used to send data on the datagram socket. The function call will block until the data has been sent successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One ore more data buffers to be sent on the socket.]]

[[flags][Flags specifying how the send call is to be made.]]

]


[heading Return Value]
      
The number of bytes sent.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
The send operation can only be used with a connected socket. Use the send\_to function to send data on an unconnected datagram socket. 




[endsect]



[section:overload3 basic_datagram_socket::send (3 of 3 overloads)]


Send some data on a connected socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      asio::error_code & ec);


This function is used to send data on the datagram socket. The function call will block until the data has been sent successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent on the socket.]]

[[flags][Flags specifying how the send call is to be made.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes sent.


[heading Remarks]
      
The send operation can only be used with a connected socket. Use the send\_to function to send data on an unconnected datagram socket. 




[endsect]


[endsect]


[section:send_buffer_size basic_datagram_socket::send_buffer_size]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_datagram_socket.send_buffer_size..send_buffer_size..basic_datagram_socket] 
Socket option for the send buffer size of a socket. 


  typedef implementation_defined send_buffer_size;



Implements the SOL\_SOCKET/SO\_SNDBUF socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_buffer_size option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_datagram_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:send_low_watermark basic_datagram_socket::send_low_watermark]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_datagram_socket.send_low_watermark..send_low_watermark..basic_datagram_socket] 
Socket option for the send low watermark. 


  typedef implementation_defined send_low_watermark;



Implements the SOL\_SOCKET/SO\_SNDLOWAT socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_low_watermark option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_datagram_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:send_to basic_datagram_socket::send_to]

[indexterm2 asio.indexterm.basic_datagram_socket.send_to..send_to..basic_datagram_socket] 
Send a datagram to the specified endpoint. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.basic_datagram_socket.send_to.overload1 send_to]``(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.send_to.overload1 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.basic_datagram_socket.send_to.overload2 send_to]``(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      socket_base::message_flags flags);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.send_to.overload2 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.basic_datagram_socket.send_to.overload3 send_to]``(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      socket_base::message_flags flags,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.send_to.overload3 more...]]``


[section:overload1 basic_datagram_socket::send_to (1 of 3 overloads)]


Send a datagram to the specified endpoint. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send_to(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination);


This function is used to send a datagram to the specified remote endpoint. The function call will block until the data has been sent successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent to the remote endpoint.]]

[[destination][The remote endpoint to which the data will be sent.]]

]


[heading Return Value]
      
The number of bytes sent.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  
To send a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::ip::udp::endpoint destination(
       asio::ip::address::from_string("1.2.3.4"), 12345);
   socket.send_to(asio::buffer(data, size), destination);


See the [link asio.reference.buffer `buffer`]  documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_datagram_socket::send_to (2 of 3 overloads)]


Send a datagram to the specified endpoint. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send_to(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      socket_base::message_flags flags);


This function is used to send a datagram to the specified remote endpoint. The function call will block until the data has been sent successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent to the remote endpoint.]]

[[destination][The remote endpoint to which the data will be sent.]]

[[flags][Flags specifying how the send call is to be made.]]

]


[heading Return Value]
      
The number of bytes sent.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload3 basic_datagram_socket::send_to (3 of 3 overloads)]


Send a datagram to the specified endpoint. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send_to(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      socket_base::message_flags flags,
      asio::error_code & ec);


This function is used to send a datagram to the specified remote endpoint. The function call will block until the data has been sent successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent to the remote endpoint.]]

[[destination][The remote endpoint to which the data will be sent.]]

[[flags][Flags specifying how the send call is to be made.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes sent. 




[endsect]


[endsect]

[section:set_option basic_datagram_socket::set_option]

[indexterm2 asio.indexterm.basic_datagram_socket.set_option..set_option..basic_datagram_socket] 
Set an option on the socket. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void ``[link asio.reference.basic_datagram_socket.set_option.overload1 set_option]``(
      const SettableSocketOption & option);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.set_option.overload1 more...]]``

  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void ``[link asio.reference.basic_datagram_socket.set_option.overload2 set_option]``(
      const SettableSocketOption & option,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.set_option.overload2 more...]]``


[section:overload1 basic_datagram_socket::set_option (1 of 2 overloads)]


['Inherited from basic_socket.]


Set an option on the socket. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void set_option(
      const SettableSocketOption & option);


This function is used to set an option on the socket.


[heading Parameters]
    

[variablelist
  
[[option][The new option value to be set on the socket.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]



[heading Example]
  
Setting the IPPROTO\_TCP/TCP\_NODELAY option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::no_delay option(true);
   socket.set_option(option);







[endsect]



[section:overload2 basic_datagram_socket::set_option (2 of 2 overloads)]


['Inherited from basic_socket.]


Set an option on the socket. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void set_option(
      const SettableSocketOption & option,
      asio::error_code & ec);


This function is used to set an option on the socket.


[heading Parameters]
    

[variablelist
  
[[option][The new option value to be set on the socket.]]

[[ec][Set to indicate what error occurred, if any.]]

]



[heading Example]
  
Setting the IPPROTO\_TCP/TCP\_NODELAY option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::no_delay option(true);
   asio::error_code ec;
   socket.set_option(option, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]

[section:shutdown basic_datagram_socket::shutdown]

[indexterm2 asio.indexterm.basic_datagram_socket.shutdown..shutdown..basic_datagram_socket] 
Disable sends or receives on the socket. 


  void ``[link asio.reference.basic_datagram_socket.shutdown.overload1 shutdown]``(
      shutdown_type what);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.shutdown.overload1 more...]]``

  void ``[link asio.reference.basic_datagram_socket.shutdown.overload2 shutdown]``(
      shutdown_type what,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.shutdown.overload2 more...]]``


[section:overload1 basic_datagram_socket::shutdown (1 of 2 overloads)]


['Inherited from basic_socket.]


Disable sends or receives on the socket. 


  void shutdown(
      shutdown_type what);


This function is used to disable send operations, receive operations, or both.


[heading Parameters]
    

[variablelist
  
[[what][Determines what types of operation will no longer be allowed.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  
Shutting down the send side of the socket: 

   asio::ip::tcp::socket socket(my_context);
   ...
   socket.shutdown(asio::ip::tcp::socket::shutdown_send);







[endsect]



[section:overload2 basic_datagram_socket::shutdown (2 of 2 overloads)]


['Inherited from basic_socket.]


Disable sends or receives on the socket. 


  void shutdown(
      shutdown_type what,
      asio::error_code & ec);


This function is used to disable send operations, receive operations, or both.


[heading Parameters]
    

[variablelist
  
[[what][Determines what types of operation will no longer be allowed.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  
Shutting down the send side of the socket: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   socket.shutdown(asio::ip::tcp::socket::shutdown_send, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:shutdown_type basic_datagram_socket::shutdown_type]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_datagram_socket.shutdown_type..shutdown_type..basic_datagram_socket] 
Different ways a socket may be shutdown. 


  enum shutdown_type

[indexterm2 asio.indexterm.basic_datagram_socket.shutdown_type.shutdown_receive..shutdown_receive..basic_datagram_socket]
[indexterm2 asio.indexterm.basic_datagram_socket.shutdown_type.shutdown_send..shutdown_send..basic_datagram_socket]
[indexterm2 asio.indexterm.basic_datagram_socket.shutdown_type.shutdown_both..shutdown_both..basic_datagram_socket]

[heading Values]
[variablelist

  [
    [shutdown_receive]
    [Shutdown the receive side of the socket. ]
  ]

  [
    [shutdown_send]
    [Shutdown the send side of the socket. ]
  ]

  [
    [shutdown_both]
    [Shutdown both send and receive on the socket. ]
  ]

]



[endsect]


[section:wait basic_datagram_socket::wait]

[indexterm2 asio.indexterm.basic_datagram_socket.wait..wait..basic_datagram_socket] 
Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  void ``[link asio.reference.basic_datagram_socket.wait.overload1 wait]``(
      wait_type w);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.wait.overload1 more...]]``

  void ``[link asio.reference.basic_datagram_socket.wait.overload2 wait]``(
      wait_type w,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.wait.overload2 more...]]``


[section:overload1 basic_datagram_socket::wait (1 of 2 overloads)]


['Inherited from basic_socket.]


Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  void wait(
      wait_type w);


This function is used to perform a blocking wait for a socket to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired socket state.]]

]


[heading Example]
  
Waiting for a socket to become readable. 

   asio::ip::tcp::socket socket(my_context);
   ...
   socket.wait(asio::ip::tcp::socket::wait_read);







[endsect]



[section:overload2 basic_datagram_socket::wait (2 of 2 overloads)]


['Inherited from basic_socket.]


Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  void wait(
      wait_type w,
      asio::error_code & ec);


This function is used to perform a blocking wait for a socket to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired socket state.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  
Waiting for a socket to become readable. 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   socket.wait(asio::ip::tcp::socket::wait_read, ec);







[endsect]


[endsect]


[section:wait_type basic_datagram_socket::wait_type]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_datagram_socket.wait_type..wait_type..basic_datagram_socket] 
Wait types. 


  enum wait_type

[indexterm2 asio.indexterm.basic_datagram_socket.wait_type.wait_read..wait_read..basic_datagram_socket]
[indexterm2 asio.indexterm.basic_datagram_socket.wait_type.wait_write..wait_write..basic_datagram_socket]
[indexterm2 asio.indexterm.basic_datagram_socket.wait_type.wait_error..wait_error..basic_datagram_socket]

[heading Values]
[variablelist

  [
    [wait_read]
    [Wait for a socket to become ready to read. ]
  ]

  [
    [wait_write]
    [Wait for a socket to become ready to write. ]
  ]

  [
    [wait_error]
    [Wait for a socket to have error conditions pending. ]
  ]

]


For use with `basic_socket::wait()` and `basic_socket::async_wait()`. 


[endsect]



[section:_basic_datagram_socket basic_datagram_socket::~basic_datagram_socket]

[indexterm2 asio.indexterm.basic_datagram_socket._basic_datagram_socket..~basic_datagram_socket..basic_datagram_socket] 
Destroys the socket. 


  ~basic_datagram_socket();


This function destroys the socket, cancelling any outstanding asynchronous operations associated with the socket as if by calling `cancel`. 


[endsect]



[endsect]

[section:basic_datagram_socket__rebind_executor basic_datagram_socket::rebind_executor]


Rebinds the socket type to another executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  struct rebind_executor


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_datagram_socket__rebind_executor.other [*other]]]
    [The socket type when rebound to the specified executor. ]
  
  ]

]

[heading Requirements]

['Header: ][^asio/basic_datagram_socket.hpp]

['Convenience header: ][^asio.hpp]


[section:other basic_datagram_socket::rebind_executor::other]

[indexterm2 asio.indexterm.basic_datagram_socket__rebind_executor.other..other..basic_datagram_socket::rebind_executor] 
The socket type when rebound to the specified executor. 


  typedef basic_datagram_socket< Protocol, Executor1 > other;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_datagram_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_datagram_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_receive [*async_receive]]]
    [Start an asynchronous receive on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_receive_from [*async_receive_from]]]
    [Start an asynchronous receive. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_send [*async_send]]]
    [Start an asynchronous send on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_send_to [*async_send_to]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.basic_datagram_socket [*basic_datagram_socket]] [constructor]]
    [Construct a basic_datagram_socket without opening it. 
     [hr]
     Construct and open a basic_datagram_socket. 
     [hr]
     Construct a basic_datagram_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_datagram_socket on an existing native socket. 
     [hr]
     Move-construct a basic_datagram_socket from another. 
     [hr]
     Move-construct a basic_datagram_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_datagram_socket from another. 
     [hr]
     Move-assign a basic_datagram_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.receive [*receive]]]
    [Receive some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.receive_from [*receive_from]]]
    [Receive a datagram with the endpoint of the sender. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.send [*send]]]
    [Send some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.send_to [*send_to]]]
    [Send a datagram to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket._basic_datagram_socket [*~basic_datagram_socket]] [destructor]]
    [Destroys the socket. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_datagram_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_datagram_socket `basic_datagram_socket`] class template provides asynchronous and blocking datagram-oriented socket functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/basic_datagram_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:basic_deadline_timer basic_deadline_timer]


Provides waitable timer functionality. 


  template<
      typename Time,
      typename ``[link asio.reference.TimeTraits TimeTraits]`` = asio::time_traits<Time>,
      typename ``[link asio.reference.Executor1 Executor]`` = any_io_executor>
  class basic_deadline_timer


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_deadline_timer__rebind_executor [*rebind_executor]]]
    [Rebinds the timer type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_deadline_timer.duration_type [*duration_type]]]
    [The duration type. ]
  
  ]

  [

    [[link asio.reference.basic_deadline_timer.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_deadline_timer.time_type [*time_type]]]
    [The time type. ]
  
  ]

  [

    [[link asio.reference.basic_deadline_timer.traits_type [*traits_type]]]
    [The time traits type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_deadline_timer.async_wait [*async_wait]]]
    [Start an asynchronous wait on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.basic_deadline_timer [*basic_deadline_timer]] [constructor]]
    [Constructor. 
     [hr]
     Constructor to set a particular expiry time as an absolute time. 
     [hr]
     Constructor to set a particular expiry time relative to now. 
     [hr]
     Move-construct a basic_deadline_timer from another. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.cancel [*cancel]]]
    [Cancel any asynchronous operations that are waiting on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.cancel_one [*cancel_one]]]
    [Cancels one asynchronous operation that is waiting on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.expires_at [*expires_at]]]
    [Get the timer's expiry time as an absolute time. 
     [hr]
     Set the timer's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.expires_from_now [*expires_from_now]]]
    [Get the timer's expiry time relative to now. 
     [hr]
     Set the timer's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.operator_eq_ [*operator=]]]
    [Move-assign a basic_deadline_timer from another. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.wait [*wait]]]
    [Perform a blocking wait on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer._basic_deadline_timer [*~basic_deadline_timer]] [destructor]]
    [Destroys the timer. ]
  ]
  
]

The [link asio.reference.basic_deadline_timer `basic_deadline_timer`] class template provides the ability to perform a blocking or asynchronous wait for a timer to expire.

A deadline timer is always in one of two states: "expired" or "not expired". If the `wait()` or `async_wait()` function is called on an expired timer, the wait operation will complete immediately.

Most applications will use the [link asio.reference.deadline_timer `deadline_timer`] typedef.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.


[heading Examples]
  
Performing a blocking wait: 

   // Construct a timer without setting an expiry time.
   asio::deadline_timer timer(my_context);

   // Set an expiry time relative to now.
   timer.expires_from_now(boost::posix_time::seconds(5));

   // Wait for the timer to expire.
   timer.wait();





Performing an asynchronous wait: 

   void handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Timer expired.
     }
   }

   ...

   // Construct a timer with an absolute expiry time.
   asio::deadline_timer timer(my_context,
       boost::posix_time::time_from_string("2005-12-07 23:59:59.000"));

   // Start an asynchronous wait.
   timer.async_wait(handler);





[heading Changing an active deadline_timer's expiry time]
  


Changing the expiry time of a timer while there are pending asynchronous waits causes those wait operations to be cancelled. To ensure that the action associated with the timer is performed only once, use something like this: used:



   void on_some_event()
   {
     if (my_timer.expires_from_now(seconds(5)) > 0)
     {
       // We managed to cancel the timer. Start new asynchronous wait.
       my_timer.async_wait(on_timeout);
     }
     else
     {
       // Too late, timer has already expired!
     }
   }

   void on_timeout(const asio::error_code& e)
   {
     if (e != asio::error::operation_aborted)
     {
       // Timer was not cancelled, take necessary action.
     }
   }





* The `asio::basic_deadline_timer::expires_from_now()` function cancels any pending asynchronous waits, and returns the number of asynchronous waits that were cancelled. If it returns 0 then you were too late and the wait handler has already been executed, or will soon be executed. If it returns 1 then the wait handler was successfully cancelled.


* If a wait handler is cancelled, the [link asio.reference.error_code `error_code`] passed to it contains the value `asio::error::operation_aborted`. 



[heading Requirements]

['Header: ][^asio/basic_deadline_timer.hpp]

['Convenience header: ][^asio.hpp]


[section:async_wait basic_deadline_timer::async_wait]

[indexterm2 asio.indexterm.basic_deadline_timer.async_wait..async_wait..basic_deadline_timer] 
Start an asynchronous wait on the timer. 


  template<
      typename ``[link asio.reference.WaitHandler WaitHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_wait(
      WaitHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function may be used to initiate an asynchronous wait against the timer. It always returns immediately.

For each call to `async_wait()`, the supplied handler will be called exactly once. The handler will be called when:


* The timer has expired.


* The timer was cancelled, in which case the handler is passed the error code `asio::error::operation_aborted`.


[heading Parameters]
    

[variablelist
  
[[handler][The handler to be called when the timer expires. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error // Result of operation.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`]. ]]

]




[endsect]


[section:basic_deadline_timer basic_deadline_timer::basic_deadline_timer]

[indexterm2 asio.indexterm.basic_deadline_timer.basic_deadline_timer..basic_deadline_timer..basic_deadline_timer] 
Constructor. 


  explicit ``[link asio.reference.basic_deadline_timer.basic_deadline_timer.overload1 basic_deadline_timer]``(
      const executor_type & ex);
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.basic_deadline_timer.overload1 more...]]``

  template<
      typename ExecutionContext>
  explicit ``[link asio.reference.basic_deadline_timer.basic_deadline_timer.overload2 basic_deadline_timer]``(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.basic_deadline_timer.overload2 more...]]``


Constructor to set a particular expiry time as an absolute time. 


  ``[link asio.reference.basic_deadline_timer.basic_deadline_timer.overload3 basic_deadline_timer]``(
      const executor_type & ex,
      const time_type & expiry_time);
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.basic_deadline_timer.overload3 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_deadline_timer.basic_deadline_timer.overload4 basic_deadline_timer]``(
      ExecutionContext & context,
      const time_type & expiry_time,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.basic_deadline_timer.overload4 more...]]``


Constructor to set a particular expiry time relative to now. 


  ``[link asio.reference.basic_deadline_timer.basic_deadline_timer.overload5 basic_deadline_timer]``(
      const executor_type & ex,
      const duration_type & expiry_time);
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.basic_deadline_timer.overload5 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_deadline_timer.basic_deadline_timer.overload6 basic_deadline_timer]``(
      ExecutionContext & context,
      const duration_type & expiry_time,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.basic_deadline_timer.overload6 more...]]``


Move-construct a [link asio.reference.basic_deadline_timer `basic_deadline_timer`] from another. 


  ``[link asio.reference.basic_deadline_timer.basic_deadline_timer.overload7 basic_deadline_timer]``(
      basic_deadline_timer && other);
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.basic_deadline_timer.overload7 more...]]``


[section:overload1 basic_deadline_timer::basic_deadline_timer (1 of 7 overloads)]


Constructor. 


  basic_deadline_timer(
      const executor_type & ex);


This constructor creates a timer without setting an expiry time. The `expires_at()` or `expires_from_now()` functions must be called to set an expiry time before the timer can be waited on.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the timer will use, by default, to dispatch handlers for any asynchronous operations performed on the timer. ]]

]




[endsect]



[section:overload2 basic_deadline_timer::basic_deadline_timer (2 of 7 overloads)]


Constructor. 


  template<
      typename ExecutionContext>
  basic_deadline_timer(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a timer without setting an expiry time. The `expires_at()` or `expires_from_now()` functions must be called to set an expiry time before the timer can be waited on.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the timer will use, by default, to dispatch handlers for any asynchronous operations performed on the timer. ]]

]




[endsect]



[section:overload3 basic_deadline_timer::basic_deadline_timer (3 of 7 overloads)]


Constructor to set a particular expiry time as an absolute time. 


  basic_deadline_timer(
      const executor_type & ex,
      const time_type & expiry_time);


This constructor creates a timer and sets the expiry time.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the timer will use, by default, to dispatch handlers for any asynchronous operations performed on the timer.]]

[[expiry_time][The expiry time to be used for the timer, expressed as an absolute time. ]]

]




[endsect]



[section:overload4 basic_deadline_timer::basic_deadline_timer (4 of 7 overloads)]


Constructor to set a particular expiry time as an absolute time. 


  template<
      typename ExecutionContext>
  basic_deadline_timer(
      ExecutionContext & context,
      const time_type & expiry_time,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a timer and sets the expiry time.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the timer will use, by default, to dispatch handlers for any asynchronous operations performed on the timer.]]

[[expiry_time][The expiry time to be used for the timer, expressed as an absolute time. ]]

]




[endsect]



[section:overload5 basic_deadline_timer::basic_deadline_timer (5 of 7 overloads)]


Constructor to set a particular expiry time relative to now. 


  basic_deadline_timer(
      const executor_type & ex,
      const duration_type & expiry_time);


This constructor creates a timer and sets the expiry time.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the timer will use, by default, to dispatch handlers for any asynchronous operations performed on the timer.]]

[[expiry_time][The expiry time to be used for the timer, relative to now. ]]

]




[endsect]



[section:overload6 basic_deadline_timer::basic_deadline_timer (6 of 7 overloads)]


Constructor to set a particular expiry time relative to now. 


  template<
      typename ExecutionContext>
  basic_deadline_timer(
      ExecutionContext & context,
      const duration_type & expiry_time,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a timer and sets the expiry time.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the timer will use, by default, to dispatch handlers for any asynchronous operations performed on the timer.]]

[[expiry_time][The expiry time to be used for the timer, relative to now. ]]

]




[endsect]



[section:overload7 basic_deadline_timer::basic_deadline_timer (7 of 7 overloads)]


Move-construct a [link asio.reference.basic_deadline_timer `basic_deadline_timer`] from another. 


  basic_deadline_timer(
      basic_deadline_timer && other);


This constructor moves a timer from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_deadline_timer `basic_deadline_timer`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_deadline_timer(const executor_type&)` constructor. 




[endsect]


[endsect]

[section:cancel basic_deadline_timer::cancel]

[indexterm2 asio.indexterm.basic_deadline_timer.cancel..cancel..basic_deadline_timer] 
Cancel any asynchronous operations that are waiting on the timer. 


  std::size_t ``[link asio.reference.basic_deadline_timer.cancel.overload1 cancel]``();
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.cancel.overload1 more...]]``

  std::size_t ``[link asio.reference.basic_deadline_timer.cancel.overload2 cancel]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.cancel.overload2 more...]]``


[section:overload1 basic_deadline_timer::cancel (1 of 2 overloads)]


Cancel any asynchronous operations that are waiting on the timer. 


  std::size_t cancel();


This function forces the completion of any pending asynchronous wait operations against the timer. The handler for each cancelled operation will be invoked with the `asio::error::operation_aborted` error code.

Cancelling the timer does not change the expiry time.


[heading Return Value]
      
The number of asynchronous operations that were cancelled.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
If the timer has already expired when `cancel()` is called, then the handlers for asynchronous wait operations will:


* have already been invoked; or


* have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 


[endsect]



[section:overload2 basic_deadline_timer::cancel (2 of 2 overloads)]


Cancel any asynchronous operations that are waiting on the timer. 


  std::size_t cancel(
      asio::error_code & ec);


This function forces the completion of any pending asynchronous wait operations against the timer. The handler for each cancelled operation will be invoked with the `asio::error::operation_aborted` error code.

Cancelling the timer does not change the expiry time.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of asynchronous operations that were cancelled.


[heading Remarks]
      
If the timer has already expired when `cancel()` is called, then the handlers for asynchronous wait operations will:


* have already been invoked; or


* have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 


[endsect]


[endsect]

[section:cancel_one basic_deadline_timer::cancel_one]

[indexterm2 asio.indexterm.basic_deadline_timer.cancel_one..cancel_one..basic_deadline_timer] 
Cancels one asynchronous operation that is waiting on the timer. 


  std::size_t ``[link asio.reference.basic_deadline_timer.cancel_one.overload1 cancel_one]``();
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.cancel_one.overload1 more...]]``

  std::size_t ``[link asio.reference.basic_deadline_timer.cancel_one.overload2 cancel_one]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.cancel_one.overload2 more...]]``


[section:overload1 basic_deadline_timer::cancel_one (1 of 2 overloads)]


Cancels one asynchronous operation that is waiting on the timer. 


  std::size_t cancel_one();


This function forces the completion of one pending asynchronous wait operation against the timer. Handlers are cancelled in FIFO order. The handler for the cancelled operation will be invoked with the `asio::error::operation_aborted` error code.

Cancelling the timer does not change the expiry time.


[heading Return Value]
      
The number of asynchronous operations that were cancelled. That is, either 0 or 1.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
If the timer has already expired when `cancel_one()` is called, then the handlers for asynchronous wait operations will:


* have already been invoked; or


* have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 


[endsect]



[section:overload2 basic_deadline_timer::cancel_one (2 of 2 overloads)]


Cancels one asynchronous operation that is waiting on the timer. 


  std::size_t cancel_one(
      asio::error_code & ec);


This function forces the completion of one pending asynchronous wait operation against the timer. Handlers are cancelled in FIFO order. The handler for the cancelled operation will be invoked with the `asio::error::operation_aborted` error code.

Cancelling the timer does not change the expiry time.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of asynchronous operations that were cancelled. That is, either 0 or 1.


[heading Remarks]
      
If the timer has already expired when `cancel_one()` is called, then the handlers for asynchronous wait operations will:


* have already been invoked; or


* have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 


[endsect]


[endsect]


[section:duration_type basic_deadline_timer::duration_type]

[indexterm2 asio.indexterm.basic_deadline_timer.duration_type..duration_type..basic_deadline_timer] 
The duration type. 


  typedef traits_type::duration_type duration_type;



[heading Requirements]

['Header: ][^asio/basic_deadline_timer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:executor_type basic_deadline_timer::executor_type]

[indexterm2 asio.indexterm.basic_deadline_timer.executor_type..executor_type..basic_deadline_timer] 
The type of the executor associated with the object. 


  typedef Executor executor_type;



[heading Requirements]

['Header: ][^asio/basic_deadline_timer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:expires_at basic_deadline_timer::expires_at]

[indexterm2 asio.indexterm.basic_deadline_timer.expires_at..expires_at..basic_deadline_timer] 
Get the timer's expiry time as an absolute time. 


  time_type ``[link asio.reference.basic_deadline_timer.expires_at.overload1 expires_at]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.expires_at.overload1 more...]]``


Set the timer's expiry time as an absolute time. 


  std::size_t ``[link asio.reference.basic_deadline_timer.expires_at.overload2 expires_at]``(
      const time_type & expiry_time);
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.expires_at.overload2 more...]]``

  std::size_t ``[link asio.reference.basic_deadline_timer.expires_at.overload3 expires_at]``(
      const time_type & expiry_time,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.expires_at.overload3 more...]]``


[section:overload1 basic_deadline_timer::expires_at (1 of 3 overloads)]


Get the timer's expiry time as an absolute time. 


  time_type expires_at() const;


This function may be used to obtain the timer's current expiry time. Whether the timer has expired or not does not affect this value. 


[endsect]



[section:overload2 basic_deadline_timer::expires_at (2 of 3 overloads)]


Set the timer's expiry time as an absolute time. 


  std::size_t expires_at(
      const time_type & expiry_time);


This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the `asio::error::operation_aborted` error code.


[heading Parameters]
    

[variablelist
  
[[expiry_time][The expiry time to be used for the timer.]]

]


[heading Return Value]
      
The number of asynchronous operations that were cancelled.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
If the timer has already expired when `expires_at()` is called, then the handlers for asynchronous wait operations will:


* have already been invoked; or


* have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 


[endsect]



[section:overload3 basic_deadline_timer::expires_at (3 of 3 overloads)]


Set the timer's expiry time as an absolute time. 


  std::size_t expires_at(
      const time_type & expiry_time,
      asio::error_code & ec);


This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the `asio::error::operation_aborted` error code.


[heading Parameters]
    

[variablelist
  
[[expiry_time][The expiry time to be used for the timer.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of asynchronous operations that were cancelled.


[heading Remarks]
      
If the timer has already expired when `expires_at()` is called, then the handlers for asynchronous wait operations will:


* have already been invoked; or


* have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 


[endsect]


[endsect]

[section:expires_from_now basic_deadline_timer::expires_from_now]

[indexterm2 asio.indexterm.basic_deadline_timer.expires_from_now..expires_from_now..basic_deadline_timer] 
Get the timer's expiry time relative to now. 


  duration_type ``[link asio.reference.basic_deadline_timer.expires_from_now.overload1 expires_from_now]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.expires_from_now.overload1 more...]]``


Set the timer's expiry time relative to now. 


  std::size_t ``[link asio.reference.basic_deadline_timer.expires_from_now.overload2 expires_from_now]``(
      const duration_type & expiry_time);
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.expires_from_now.overload2 more...]]``

  std::size_t ``[link asio.reference.basic_deadline_timer.expires_from_now.overload3 expires_from_now]``(
      const duration_type & expiry_time,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.expires_from_now.overload3 more...]]``


[section:overload1 basic_deadline_timer::expires_from_now (1 of 3 overloads)]


Get the timer's expiry time relative to now. 


  duration_type expires_from_now() const;


This function may be used to obtain the timer's current expiry time. Whether the timer has expired or not does not affect this value. 


[endsect]



[section:overload2 basic_deadline_timer::expires_from_now (2 of 3 overloads)]


Set the timer's expiry time relative to now. 


  std::size_t expires_from_now(
      const duration_type & expiry_time);


This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the `asio::error::operation_aborted` error code.


[heading Parameters]
    

[variablelist
  
[[expiry_time][The expiry time to be used for the timer.]]

]


[heading Return Value]
      
The number of asynchronous operations that were cancelled.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
If the timer has already expired when `expires_from_now()` is called, then the handlers for asynchronous wait operations will:


* have already been invoked; or


* have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 


[endsect]



[section:overload3 basic_deadline_timer::expires_from_now (3 of 3 overloads)]


Set the timer's expiry time relative to now. 


  std::size_t expires_from_now(
      const duration_type & expiry_time,
      asio::error_code & ec);


This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the `asio::error::operation_aborted` error code.


[heading Parameters]
    

[variablelist
  
[[expiry_time][The expiry time to be used for the timer.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of asynchronous operations that were cancelled.


[heading Remarks]
      
If the timer has already expired when `expires_from_now()` is called, then the handlers for asynchronous wait operations will:


* have already been invoked; or


* have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 


[endsect]


[endsect]


[section:get_executor basic_deadline_timer::get_executor]

[indexterm2 asio.indexterm.basic_deadline_timer.get_executor..get_executor..basic_deadline_timer] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]



[section:operator_eq_ basic_deadline_timer::operator=]

[indexterm2 asio.indexterm.basic_deadline_timer.operator_eq_..operator=..basic_deadline_timer] 
Move-assign a [link asio.reference.basic_deadline_timer `basic_deadline_timer`] from another. 


  basic_deadline_timer & operator=(
      basic_deadline_timer && other);


This assignment operator moves a timer from one object to another. Cancels any outstanding asynchronous operations associated with the target object.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_deadline_timer `basic_deadline_timer`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_deadline_timer(const executor_type&)` constructor. 




[endsect]



[section:time_type basic_deadline_timer::time_type]

[indexterm2 asio.indexterm.basic_deadline_timer.time_type..time_type..basic_deadline_timer] 
The time type. 


  typedef traits_type::time_type time_type;



[heading Requirements]

['Header: ][^asio/basic_deadline_timer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:traits_type basic_deadline_timer::traits_type]

[indexterm2 asio.indexterm.basic_deadline_timer.traits_type..traits_type..basic_deadline_timer] 
The time traits type. 


  typedef TimeTraits traits_type;



[heading Requirements]

['Header: ][^asio/basic_deadline_timer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:wait basic_deadline_timer::wait]

[indexterm2 asio.indexterm.basic_deadline_timer.wait..wait..basic_deadline_timer] 
Perform a blocking wait on the timer. 


  void ``[link asio.reference.basic_deadline_timer.wait.overload1 wait]``();
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.wait.overload1 more...]]``

  void ``[link asio.reference.basic_deadline_timer.wait.overload2 wait]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.wait.overload2 more...]]``


[section:overload1 basic_deadline_timer::wait (1 of 2 overloads)]


Perform a blocking wait on the timer. 


  void wait();


This function is used to wait for the timer to expire. This function blocks and does not return until the timer has expired.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 basic_deadline_timer::wait (2 of 2 overloads)]


Perform a blocking wait on the timer. 


  void wait(
      asio::error_code & ec);


This function is used to wait for the timer to expire. This function blocks and does not return until the timer has expired.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. ]]

]




[endsect]


[endsect]


[section:_basic_deadline_timer basic_deadline_timer::~basic_deadline_timer]

[indexterm2 asio.indexterm.basic_deadline_timer._basic_deadline_timer..~basic_deadline_timer..basic_deadline_timer] 
Destroys the timer. 


  ~basic_deadline_timer();


This function destroys the timer, cancelling any outstanding asynchronous wait operations associated with the timer as if by calling `cancel`. 


[endsect]



[endsect]

[section:basic_deadline_timer__rebind_executor basic_deadline_timer::rebind_executor]


Rebinds the timer type to another executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  struct rebind_executor


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_deadline_timer__rebind_executor.other [*other]]]
    [The timer type when rebound to the specified executor. ]
  
  ]

]

[heading Requirements]

['Header: ][^asio/basic_deadline_timer.hpp]

['Convenience header: ][^asio.hpp]


[section:other basic_deadline_timer::rebind_executor::other]

[indexterm2 asio.indexterm.basic_deadline_timer__rebind_executor.other..other..basic_deadline_timer::rebind_executor] 
The timer type when rebound to the specified executor. 


  typedef basic_deadline_timer< Time, TimeTraits, Executor1 > other;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_deadline_timer__rebind_executor [*rebind_executor]]]
    [Rebinds the timer type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_deadline_timer.duration_type [*duration_type]]]
    [The duration type. ]
  
  ]

  [

    [[link asio.reference.basic_deadline_timer.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_deadline_timer.time_type [*time_type]]]
    [The time type. ]
  
  ]

  [

    [[link asio.reference.basic_deadline_timer.traits_type [*traits_type]]]
    [The time traits type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_deadline_timer.async_wait [*async_wait]]]
    [Start an asynchronous wait on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.basic_deadline_timer [*basic_deadline_timer]] [constructor]]
    [Constructor. 
     [hr]
     Constructor to set a particular expiry time as an absolute time. 
     [hr]
     Constructor to set a particular expiry time relative to now. 
     [hr]
     Move-construct a basic_deadline_timer from another. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.cancel [*cancel]]]
    [Cancel any asynchronous operations that are waiting on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.cancel_one [*cancel_one]]]
    [Cancels one asynchronous operation that is waiting on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.expires_at [*expires_at]]]
    [Get the timer's expiry time as an absolute time. 
     [hr]
     Set the timer's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.expires_from_now [*expires_from_now]]]
    [Get the timer's expiry time relative to now. 
     [hr]
     Set the timer's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.operator_eq_ [*operator=]]]
    [Move-assign a basic_deadline_timer from another. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.wait [*wait]]]
    [Perform a blocking wait on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer._basic_deadline_timer [*~basic_deadline_timer]] [destructor]]
    [Destroys the timer. ]
  ]
  
]

The [link asio.reference.basic_deadline_timer `basic_deadline_timer`] class template provides the ability to perform a blocking or asynchronous wait for a timer to expire.

A deadline timer is always in one of two states: "expired" or "not expired". If the `wait()` or `async_wait()` function is called on an expired timer, the wait operation will complete immediately.

Most applications will use the [link asio.reference.deadline_timer `deadline_timer`] typedef.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.


[heading Examples]
  
Performing a blocking wait: 

   // Construct a timer without setting an expiry time.
   asio::deadline_timer timer(my_context);

   // Set an expiry time relative to now.
   timer.expires_from_now(boost::posix_time::seconds(5));

   // Wait for the timer to expire.
   timer.wait();





Performing an asynchronous wait: 

   void handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Timer expired.
     }
   }

   ...

   // Construct a timer with an absolute expiry time.
   asio::deadline_timer timer(my_context,
       boost::posix_time::time_from_string("2005-12-07 23:59:59.000"));

   // Start an asynchronous wait.
   timer.async_wait(handler);





[heading Changing an active deadline_timer's expiry time]
  


Changing the expiry time of a timer while there are pending asynchronous waits causes those wait operations to be cancelled. To ensure that the action associated with the timer is performed only once, use something like this: used:



   void on_some_event()
   {
     if (my_timer.expires_from_now(seconds(5)) > 0)
     {
       // We managed to cancel the timer. Start new asynchronous wait.
       my_timer.async_wait(on_timeout);
     }
     else
     {
       // Too late, timer has already expired!
     }
   }

   void on_timeout(const asio::error_code& e)
   {
     if (e != asio::error::operation_aborted)
     {
       // Timer was not cancelled, take necessary action.
     }
   }





* The `asio::basic_deadline_timer::expires_from_now()` function cancels any pending asynchronous waits, and returns the number of asynchronous waits that were cancelled. If it returns 0 then you were too late and the wait handler has already been executed, or will soon be executed. If it returns 1 then the wait handler was successfully cancelled.


* If a wait handler is cancelled, the [link asio.reference.error_code `error_code`] passed to it contains the value `asio::error::operation_aborted`. 




[heading Requirements]

['Header: ][^asio/basic_deadline_timer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:basic_io_object basic_io_object]


Base class for all I/O objects. 


  template<
      typename ``[link asio.reference.IoObjectService IoObjectService]``>
  class basic_io_object


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_io_object.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_io_object.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.basic_io_object.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_io_object.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_io_object.get_io_context [*get_io_context]]]
    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_io_object.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_io_object.basic_io_object [*basic_io_object]] [constructor]]
    [Construct a basic_io_object. 
     [hr]
     Move-construct a basic_io_object. 
     [hr]
     Perform a converting move-construction of a basic_io_object. ]
  ]
  
  [
    [[link asio.reference.basic_io_object.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_io_object.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_io_object.operator_eq_ [*operator=]]]
    [Move-assign a basic_io_object. ]
  ]
  
  [
    [[link asio.reference.basic_io_object._basic_io_object [*~basic_io_object]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]


[heading Remarks]
      
All I/O objects are non-copyable. However, when using C++0x, certain I/O objects do support move construction and move assignment. 



[heading Requirements]

['Header: ][^asio/basic_io_object.hpp]

['Convenience header: ][^asio.hpp]

[section:basic_io_object basic_io_object::basic_io_object]

[indexterm2 asio.indexterm.basic_io_object.basic_io_object..basic_io_object..basic_io_object] 
Construct a [link asio.reference.basic_io_object `basic_io_object`]. 


  explicit ``[link asio.reference.basic_io_object.basic_io_object.overload1 basic_io_object]``(
      asio::io_context & io_context);
  ``  [''''&raquo;''' [link asio.reference.basic_io_object.basic_io_object.overload1 more...]]``


Move-construct a [link asio.reference.basic_io_object `basic_io_object`]. 


  ``[link asio.reference.basic_io_object.basic_io_object.overload2 basic_io_object]``(
      basic_io_object && other);
  ``  [''''&raquo;''' [link asio.reference.basic_io_object.basic_io_object.overload2 more...]]``


Perform a converting move-construction of a [link asio.reference.basic_io_object `basic_io_object`]. 


  template<
      typename ``[link asio.reference.IoObjectService IoObjectService1]``>
  ``[link asio.reference.basic_io_object.basic_io_object.overload3 basic_io_object]``(
      IoObjectService1 & other_service,
      typename IoObjectService1::implementation_type & other_implementation);
  ``  [''''&raquo;''' [link asio.reference.basic_io_object.basic_io_object.overload3 more...]]``


[section:overload1 basic_io_object::basic_io_object (1 of 3 overloads)]


Construct a [link asio.reference.basic_io_object `basic_io_object`]. 


  basic_io_object(
      asio::io_context & io_context);


Performs: 

   get_service().construct(get_implementation()); 





[endsect]



[section:overload2 basic_io_object::basic_io_object (2 of 3 overloads)]


Move-construct a [link asio.reference.basic_io_object `basic_io_object`]. 


  basic_io_object(
      basic_io_object && other);


Performs: 

   get_service().move_construct(
       get_implementation(), other.get_implementation()); 





[heading Remarks]
      
Available only for services that support movability, 




[endsect]



[section:overload3 basic_io_object::basic_io_object (3 of 3 overloads)]


Perform a converting move-construction of a [link asio.reference.basic_io_object `basic_io_object`]. 


  template<
      typename ``[link asio.reference.IoObjectService IoObjectService1]``>
  basic_io_object(
      IoObjectService1 & other_service,
      typename IoObjectService1::implementation_type & other_implementation);



[endsect]


[endsect]


[section:executor_type basic_io_object::executor_type]

[indexterm2 asio.indexterm.basic_io_object.executor_type..executor_type..basic_io_object] 
The type of the executor associated with the object. 


  typedef asio::io_context::executor_type executor_type;



[heading Requirements]

['Header: ][^asio/basic_io_object.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:get_executor basic_io_object::get_executor]

[indexterm2 asio.indexterm.basic_io_object.get_executor..get_executor..basic_io_object] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_implementation basic_io_object::get_implementation]

[indexterm2 asio.indexterm.basic_io_object.get_implementation..get_implementation..basic_io_object] 
Get the underlying implementation of the I/O object. 


  implementation_type & ``[link asio.reference.basic_io_object.get_implementation.overload1 get_implementation]``();
  ``  [''''&raquo;''' [link asio.reference.basic_io_object.get_implementation.overload1 more...]]``

  const implementation_type & ``[link asio.reference.basic_io_object.get_implementation.overload2 get_implementation]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_io_object.get_implementation.overload2 more...]]``


[section:overload1 basic_io_object::get_implementation (1 of 2 overloads)]


Get the underlying implementation of the I/O object. 


  implementation_type & get_implementation();



[endsect]



[section:overload2 basic_io_object::get_implementation (2 of 2 overloads)]


Get the underlying implementation of the I/O object. 


  const implementation_type & get_implementation() const;



[endsect]


[endsect]


[section:get_io_context basic_io_object::get_io_context]

[indexterm2 asio.indexterm.basic_io_object.get_io_context..get_io_context..basic_io_object] 
(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 


  asio::io_context & get_io_context();


This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the I/O object uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_context `io_context`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 




[endsect]



[section:get_io_service basic_io_object::get_io_service]

[indexterm2 asio.indexterm.basic_io_object.get_io_service..get_io_service..basic_io_object] 
(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 


  asio::io_context & get_io_service();


This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the I/O object uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_context `io_context`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 




[endsect]


[section:get_service basic_io_object::get_service]

[indexterm2 asio.indexterm.basic_io_object.get_service..get_service..basic_io_object] 
Get the service associated with the I/O object. 


  service_type & ``[link asio.reference.basic_io_object.get_service.overload1 get_service]``();
  ``  [''''&raquo;''' [link asio.reference.basic_io_object.get_service.overload1 more...]]``

  const service_type & ``[link asio.reference.basic_io_object.get_service.overload2 get_service]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_io_object.get_service.overload2 more...]]``


[section:overload1 basic_io_object::get_service (1 of 2 overloads)]


Get the service associated with the I/O object. 


  service_type & get_service();



[endsect]



[section:overload2 basic_io_object::get_service (2 of 2 overloads)]


Get the service associated with the I/O object. 


  const service_type & get_service() const;



[endsect]


[endsect]


[section:implementation_type basic_io_object::implementation_type]

[indexterm2 asio.indexterm.basic_io_object.implementation_type..implementation_type..basic_io_object] 
The underlying implementation type of I/O object. 


  typedef service_type::implementation_type implementation_type;



[heading Requirements]

['Header: ][^asio/basic_io_object.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq_ basic_io_object::operator=]

[indexterm2 asio.indexterm.basic_io_object.operator_eq_..operator=..basic_io_object] 
Move-assign a [link asio.reference.basic_io_object `basic_io_object`]. 


  basic_io_object & operator=(
      basic_io_object && other);


Performs: 

   get_service().move_assign(get_implementation(),
       other.get_service(), other.get_implementation()); 





[heading Remarks]
      
Available only for services that support movability, 




[endsect]



[section:service_type basic_io_object::service_type]

[indexterm2 asio.indexterm.basic_io_object.service_type..service_type..basic_io_object] 
The type of the service that will be used to provide I/O operations. 


  typedef IoObjectService service_type;



[heading Requirements]

['Header: ][^asio/basic_io_object.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:_basic_io_object basic_io_object::~basic_io_object]

[indexterm2 asio.indexterm.basic_io_object._basic_io_object..~basic_io_object..basic_io_object] 
Protected destructor to prevent deletion through this type. 


  ~basic_io_object();


Performs: 

   get_service().destroy(get_implementation()); 





[endsect]



[endsect]

[section:basic_raw_socket basic_raw_socket]


Provides raw-oriented socket functionality. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``>
  class basic_raw_socket :
    public basic_socket< Protocol, Executor >


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_raw_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_raw_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_receive [*async_receive]]]
    [Start an asynchronous receive on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_receive_from [*async_receive_from]]]
    [Start an asynchronous receive. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_send [*async_send]]]
    [Start an asynchronous send on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_send_to [*async_send_to]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.basic_raw_socket [*basic_raw_socket]] [constructor]]
    [Construct a basic_raw_socket without opening it. 
     [hr]
     Construct and open a basic_raw_socket. 
     [hr]
     Construct a basic_raw_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_raw_socket on an existing native socket. 
     [hr]
     Move-construct a basic_raw_socket from another. 
     [hr]
     Move-construct a basic_raw_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_raw_socket from another. 
     [hr]
     Move-assign a basic_raw_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.receive [*receive]]]
    [Receive some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.receive_from [*receive_from]]]
    [Receive raw data with the endpoint of the sender. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.send [*send]]]
    [Send some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.send_to [*send_to]]]
    [Send raw data to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket._basic_raw_socket [*~basic_raw_socket]] [destructor]]
    [Destroys the socket. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_raw_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_raw_socket `basic_raw_socket`] class template provides asynchronous and blocking raw-oriented socket functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/basic_raw_socket.hpp]

['Convenience header: ][^asio.hpp]

[section:assign basic_raw_socket::assign]

[indexterm2 asio.indexterm.basic_raw_socket.assign..assign..basic_raw_socket] 
Assign an existing native socket to the socket. 


  void ``[link asio.reference.basic_raw_socket.assign.overload1 assign]``(
      const protocol_type & protocol,
      const native_handle_type & native_socket);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.assign.overload1 more...]]``

  void ``[link asio.reference.basic_raw_socket.assign.overload2 assign]``(
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.assign.overload2 more...]]``


[section:overload1 basic_raw_socket::assign (1 of 2 overloads)]


['Inherited from basic_socket.]


Assign an existing native socket to the socket. 


  void assign(
      const protocol_type & protocol,
      const native_handle_type & native_socket);



[endsect]



[section:overload2 basic_raw_socket::assign (2 of 2 overloads)]


['Inherited from basic_socket.]


Assign an existing native socket to the socket. 


  void assign(
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      asio::error_code & ec);



[endsect]


[endsect]


[section:async_connect basic_raw_socket::async_connect]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_raw_socket.async_connect..async_connect..basic_raw_socket] 
Start an asynchronous connect. 


  template<
      typename ``[link asio.reference.ConnectHandler ConnectHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_connect(
      const endpoint_type & peer_endpoint,
      ConnectHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously connect a socket to the specified remote endpoint. The function call always returns immediately.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.


[heading Parameters]
    

[variablelist
  
[[peer_endpoint][The remote endpoint to which the socket will be connected. Copies will be made of the endpoint object as required.]]

[[handler][The handler to be called when the connection operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error // Result of operation
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  


   void connect_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Connect succeeded.
     }
   }

   ...

   asio::ip::tcp::socket socket(my_context);
   asio::ip::tcp::endpoint endpoint(
       asio::ip::address::from_string("1.2.3.4"), 12345);
   socket.async_connect(endpoint, connect_handler);







[endsect]


[section:async_receive basic_raw_socket::async_receive]

[indexterm2 asio.indexterm.basic_raw_socket.async_receive..async_receive..basic_raw_socket] 
Start an asynchronous receive on a connected socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_raw_socket.async_receive.overload1 async_receive]``(
      const MutableBufferSequence & buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.async_receive.overload1 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_raw_socket.async_receive.overload2 async_receive]``(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.async_receive.overload2 more...]]``


[section:overload1 basic_raw_socket::async_receive (1 of 2 overloads)]


Start an asynchronous receive on a connected socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_receive(
      const MutableBufferSequence & buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously receive data from the raw socket. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes received.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
The async\_receive operation can only be used with a connected socket. Use the async\_receive\_from function to receive data on an unconnected raw socket.


[heading Example]
  
To receive into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.async_receive(asio::buffer(data, size), handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_raw_socket::async_receive (2 of 2 overloads)]


Start an asynchronous receive on a connected socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_receive(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously receive data from the raw socket. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[flags][Flags specifying how the receive call is to be made.]]

[[handler][The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes received.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
The async\_receive operation can only be used with a connected socket. Use the async\_receive\_from function to receive data on an unconnected raw socket. 




[endsect]


[endsect]

[section:async_receive_from basic_raw_socket::async_receive_from]

[indexterm2 asio.indexterm.basic_raw_socket.async_receive_from..async_receive_from..basic_raw_socket] 
Start an asynchronous receive. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_raw_socket.async_receive_from.overload1 async_receive_from]``(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.async_receive_from.overload1 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_raw_socket.async_receive_from.overload2 async_receive_from]``(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      socket_base::message_flags flags,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.async_receive_from.overload2 more...]]``


[section:overload1 basic_raw_socket::async_receive_from (1 of 2 overloads)]


Start an asynchronous receive. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_receive_from(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously receive raw data. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[sender_endpoint][An endpoint object that receives the endpoint of the remote sender of the data. Ownership of the sender\_endpoint object is retained by the caller, which must guarantee that it is valid until the handler is called.]]

[[handler][The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes received.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  
To receive into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.async_receive_from(
       asio::buffer(data, size), 0, sender_endpoint, handler); 


See the [link asio.reference.buffer `buffer`]  documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_raw_socket::async_receive_from (2 of 2 overloads)]


Start an asynchronous receive. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_receive_from(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      socket_base::message_flags flags,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously receive raw data. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[sender_endpoint][An endpoint object that receives the endpoint of the remote sender of the data. Ownership of the sender\_endpoint object is retained by the caller, which must guarantee that it is valid until the handler is called.]]

[[flags][Flags specifying how the receive call is to be made.]]

[[handler][The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes received.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`]. ]]

]




[endsect]


[endsect]

[section:async_send basic_raw_socket::async_send]

[indexterm2 asio.indexterm.basic_raw_socket.async_send..async_send..basic_raw_socket] 
Start an asynchronous send on a connected socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_raw_socket.async_send.overload1 async_send]``(
      const ConstBufferSequence & buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.async_send.overload1 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_raw_socket.async_send.overload2 async_send]``(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.async_send.overload2 more...]]``


[section:overload1 basic_raw_socket::async_send (1 of 2 overloads)]


Start an asynchronous send on a connected socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_send(
      const ConstBufferSequence & buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to send data on the raw socket. The function call will block until the data has been sent successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent on the socket. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the send operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes sent.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
The async\_send operation can only be used with a connected socket. Use the async\_send\_to function to send data on an unconnected raw socket.


[heading Example]
  
To send a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.async_send(asio::buffer(data, size), handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_raw_socket::async_send (2 of 2 overloads)]


Start an asynchronous send on a connected socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_send(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to send data on the raw socket. The function call will block until the data has been sent successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent on the socket. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[flags][Flags specifying how the send call is to be made.]]

[[handler][The handler to be called when the send operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes sent.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
The async\_send operation can only be used with a connected socket. Use the async\_send\_to function to send data on an unconnected raw socket. 




[endsect]


[endsect]

[section:async_send_to basic_raw_socket::async_send_to]

[indexterm2 asio.indexterm.basic_raw_socket.async_send_to..async_send_to..basic_raw_socket] 
Start an asynchronous send. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_raw_socket.async_send_to.overload1 async_send_to]``(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.async_send_to.overload1 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_raw_socket.async_send_to.overload2 async_send_to]``(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      socket_base::message_flags flags,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.async_send_to.overload2 more...]]``


[section:overload1 basic_raw_socket::async_send_to (1 of 2 overloads)]


Start an asynchronous send. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_send_to(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously send raw data to the specified remote endpoint. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent to the remote endpoint. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[destination][The remote endpoint to which the data will be sent. Copies will be made of the endpoint as required.]]

[[handler][The handler to be called when the send operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes sent.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  
To send a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::ip::udp::endpoint destination(
       asio::ip::address::from_string("1.2.3.4"), 12345);
   socket.async_send_to(
       asio::buffer(data, size), destination, handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_raw_socket::async_send_to (2 of 2 overloads)]


Start an asynchronous send. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_send_to(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      socket_base::message_flags flags,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously send raw data to the specified remote endpoint. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent to the remote endpoint. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[flags][Flags specifying how the send call is to be made.]]

[[destination][The remote endpoint to which the data will be sent. Copies will be made of the endpoint as required.]]

[[handler][The handler to be called when the send operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes sent.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`]. ]]

]




[endsect]


[endsect]


[section:async_wait basic_raw_socket::async_wait]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_raw_socket.async_wait..async_wait..basic_raw_socket] 
Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  template<
      typename ``[link asio.reference.WaitHandler WaitHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_wait(
      wait_type w,
      WaitHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to perform an asynchronous wait for a socket to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired socket state.]]

[[handler][The handler to be called when the wait operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error // Result of operation
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  


   void wait_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Wait succeeded.
     }
   }

   ...

   asio::ip::tcp::socket socket(my_context);
   ...
   socket.async_wait(asio::ip::tcp::socket::wait_read, wait_handler);







[endsect]


[section:at_mark basic_raw_socket::at_mark]

[indexterm2 asio.indexterm.basic_raw_socket.at_mark..at_mark..basic_raw_socket] 
Determine whether the socket is at the out-of-band data mark. 


  bool ``[link asio.reference.basic_raw_socket.at_mark.overload1 at_mark]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.at_mark.overload1 more...]]``

  bool ``[link asio.reference.basic_raw_socket.at_mark.overload2 at_mark]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.at_mark.overload2 more...]]``


[section:overload1 basic_raw_socket::at_mark (1 of 2 overloads)]


['Inherited from basic_socket.]


Determine whether the socket is at the out-of-band data mark. 


  bool at_mark() const;


This function is used to check whether the socket input is currently positioned at the out-of-band data mark.


[heading Return Value]
      
A bool indicating whether the socket is at the out-of-band data mark.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 basic_raw_socket::at_mark (2 of 2 overloads)]


['Inherited from basic_socket.]


Determine whether the socket is at the out-of-band data mark. 


  bool at_mark(
      asio::error_code & ec) const;


This function is used to check whether the socket input is currently positioned at the out-of-band data mark.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
A bool indicating whether the socket is at the out-of-band data mark. 




[endsect]


[endsect]

[section:available basic_raw_socket::available]

[indexterm2 asio.indexterm.basic_raw_socket.available..available..basic_raw_socket] 
Determine the number of bytes available for reading. 


  std::size_t ``[link asio.reference.basic_raw_socket.available.overload1 available]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.available.overload1 more...]]``

  std::size_t ``[link asio.reference.basic_raw_socket.available.overload2 available]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.available.overload2 more...]]``


[section:overload1 basic_raw_socket::available (1 of 2 overloads)]


['Inherited from basic_socket.]


Determine the number of bytes available for reading. 


  std::size_t available() const;


This function is used to determine the number of bytes that may be read without blocking.


[heading Return Value]
      
The number of bytes that may be read without blocking, or 0 if an error occurs.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 basic_raw_socket::available (2 of 2 overloads)]


['Inherited from basic_socket.]


Determine the number of bytes available for reading. 


  std::size_t available(
      asio::error_code & ec) const;


This function is used to determine the number of bytes that may be read without blocking.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes that may be read without blocking, or 0 if an error occurs. 




[endsect]


[endsect]

[section:basic_raw_socket basic_raw_socket::basic_raw_socket]

[indexterm2 asio.indexterm.basic_raw_socket.basic_raw_socket..basic_raw_socket..basic_raw_socket] 
Construct a [link asio.reference.basic_raw_socket `basic_raw_socket`] without opening it. 


  explicit ``[link asio.reference.basic_raw_socket.basic_raw_socket.overload1 basic_raw_socket]``(
      const executor_type & ex);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.basic_raw_socket.overload1 more...]]``

  template<
      typename ExecutionContext>
  explicit ``[link asio.reference.basic_raw_socket.basic_raw_socket.overload2 basic_raw_socket]``(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.basic_raw_socket.overload2 more...]]``


Construct and open a [link asio.reference.basic_raw_socket `basic_raw_socket`]. 


  ``[link asio.reference.basic_raw_socket.basic_raw_socket.overload3 basic_raw_socket]``(
      const executor_type & ex,
      const protocol_type & protocol);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.basic_raw_socket.overload3 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_raw_socket.basic_raw_socket.overload4 basic_raw_socket]``(
      ExecutionContext & context,
      const protocol_type & protocol,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.basic_raw_socket.overload4 more...]]``


Construct a [link asio.reference.basic_raw_socket `basic_raw_socket`], opening it and binding it to the given local endpoint. 


  ``[link asio.reference.basic_raw_socket.basic_raw_socket.overload5 basic_raw_socket]``(
      const executor_type & ex,
      const endpoint_type & endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.basic_raw_socket.overload5 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_raw_socket.basic_raw_socket.overload6 basic_raw_socket]``(
      ExecutionContext & context,
      const endpoint_type & endpoint,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.basic_raw_socket.overload6 more...]]``


Construct a [link asio.reference.basic_raw_socket `basic_raw_socket`] on an existing native socket. 


  ``[link asio.reference.basic_raw_socket.basic_raw_socket.overload7 basic_raw_socket]``(
      const executor_type & ex,
      const protocol_type & protocol,
      const native_handle_type & native_socket);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.basic_raw_socket.overload7 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_raw_socket.basic_raw_socket.overload8 basic_raw_socket]``(
      ExecutionContext & context,
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.basic_raw_socket.overload8 more...]]``


Move-construct a [link asio.reference.basic_raw_socket `basic_raw_socket`] from another. 


  ``[link asio.reference.basic_raw_socket.basic_raw_socket.overload9 basic_raw_socket]``(
      basic_raw_socket && other);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.basic_raw_socket.overload9 more...]]``


Move-construct a [link asio.reference.basic_raw_socket `basic_raw_socket`] from a socket of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  ``[link asio.reference.basic_raw_socket.basic_raw_socket.overload10 basic_raw_socket]``(
      basic_raw_socket< Protocol1, Executor1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.basic_raw_socket.overload10 more...]]``


[section:overload1 basic_raw_socket::basic_raw_socket (1 of 10 overloads)]


Construct a [link asio.reference.basic_raw_socket `basic_raw_socket`] without opening it. 


  basic_raw_socket(
      const executor_type & ex);


This constructor creates a raw socket without opening it. The `open()` function must be called before data can be sent or received on the socket.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket. ]]

]




[endsect]



[section:overload2 basic_raw_socket::basic_raw_socket (2 of 10 overloads)]


Construct a [link asio.reference.basic_raw_socket `basic_raw_socket`] without opening it. 


  template<
      typename ExecutionContext>
  basic_raw_socket(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a raw socket without opening it. The `open()` function must be called before data can be sent or received on the socket.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket. ]]

]




[endsect]



[section:overload3 basic_raw_socket::basic_raw_socket (3 of 10 overloads)]


Construct and open a [link asio.reference.basic_raw_socket `basic_raw_socket`]. 


  basic_raw_socket(
      const executor_type & ex,
      const protocol_type & protocol);


This constructor creates and opens a raw socket.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[protocol][An object specifying protocol parameters to be used.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload4 basic_raw_socket::basic_raw_socket (4 of 10 overloads)]


Construct and open a [link asio.reference.basic_raw_socket `basic_raw_socket`]. 


  template<
      typename ExecutionContext>
  basic_raw_socket(
      ExecutionContext & context,
      const protocol_type & protocol,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates and opens a raw socket.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[protocol][An object specifying protocol parameters to be used.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload5 basic_raw_socket::basic_raw_socket (5 of 10 overloads)]


Construct a [link asio.reference.basic_raw_socket `basic_raw_socket`], opening it and binding it to the given local endpoint. 


  basic_raw_socket(
      const executor_type & ex,
      const endpoint_type & endpoint);


This constructor creates a raw socket and automatically opens it bound to the specified endpoint on the local machine. The protocol used is the protocol associated with the given endpoint.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[endpoint][An endpoint on the local machine to which the raw socket will be bound.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload6 basic_raw_socket::basic_raw_socket (6 of 10 overloads)]


Construct a [link asio.reference.basic_raw_socket `basic_raw_socket`], opening it and binding it to the given local endpoint. 


  template<
      typename ExecutionContext>
  basic_raw_socket(
      ExecutionContext & context,
      const endpoint_type & endpoint,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a raw socket and automatically opens it bound to the specified endpoint on the local machine. The protocol used is the protocol associated with the given endpoint.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[endpoint][An endpoint on the local machine to which the raw socket will be bound.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload7 basic_raw_socket::basic_raw_socket (7 of 10 overloads)]


Construct a [link asio.reference.basic_raw_socket `basic_raw_socket`] on an existing native socket. 


  basic_raw_socket(
      const executor_type & ex,
      const protocol_type & protocol,
      const native_handle_type & native_socket);


This constructor creates a raw socket object to hold an existing native socket.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[protocol][An object specifying protocol parameters to be used.]]

[[native_socket][The new underlying socket implementation.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload8 basic_raw_socket::basic_raw_socket (8 of 10 overloads)]


Construct a [link asio.reference.basic_raw_socket `basic_raw_socket`] on an existing native socket. 


  template<
      typename ExecutionContext>
  basic_raw_socket(
      ExecutionContext & context,
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a raw socket object to hold an existing native socket.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[protocol][An object specifying protocol parameters to be used.]]

[[native_socket][The new underlying socket implementation.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload9 basic_raw_socket::basic_raw_socket (9 of 10 overloads)]


Move-construct a [link asio.reference.basic_raw_socket `basic_raw_socket`] from another. 


  basic_raw_socket(
      basic_raw_socket && other);


This constructor moves a raw socket from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_raw_socket `basic_raw_socket`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_raw_socket(const executor_type&)` constructor. 




[endsect]



[section:overload10 basic_raw_socket::basic_raw_socket (10 of 10 overloads)]


Move-construct a [link asio.reference.basic_raw_socket `basic_raw_socket`] from a socket of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  basic_raw_socket(
      basic_raw_socket< Protocol1, Executor1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value >::type *  = 0);


This constructor moves a raw socket from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_raw_socket `basic_raw_socket`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_raw_socket(const executor_type&)` constructor. 




[endsect]


[endsect]

[section:bind basic_raw_socket::bind]

[indexterm2 asio.indexterm.basic_raw_socket.bind..bind..basic_raw_socket] 
Bind the socket to the given local endpoint. 


  void ``[link asio.reference.basic_raw_socket.bind.overload1 bind]``(
      const endpoint_type & endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.bind.overload1 more...]]``

  void ``[link asio.reference.basic_raw_socket.bind.overload2 bind]``(
      const endpoint_type & endpoint,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.bind.overload2 more...]]``


[section:overload1 basic_raw_socket::bind (1 of 2 overloads)]


['Inherited from basic_socket.]


Bind the socket to the given local endpoint. 


  void bind(
      const endpoint_type & endpoint);


This function binds the socket to the specified endpoint on the local machine.


[heading Parameters]
    

[variablelist
  
[[endpoint][An endpoint on the local machine to which the socket will be bound.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   socket.open(asio::ip::tcp::v4());
   socket.bind(asio::ip::tcp::endpoint(
         asio::ip::tcp::v4(), 12345));







[endsect]



[section:overload2 basic_raw_socket::bind (2 of 2 overloads)]


['Inherited from basic_socket.]


Bind the socket to the given local endpoint. 


  void bind(
      const endpoint_type & endpoint,
      asio::error_code & ec);


This function binds the socket to the specified endpoint on the local machine.


[heading Parameters]
    

[variablelist
  
[[endpoint][An endpoint on the local machine to which the socket will be bound.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   socket.open(asio::ip::tcp::v4());
   asio::error_code ec;
   socket.bind(asio::ip::tcp::endpoint(
         asio::ip::tcp::v4(), 12345), ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:broadcast basic_raw_socket::broadcast]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_raw_socket.broadcast..broadcast..basic_raw_socket] 
Socket option to permit sending of broadcast messages. 


  typedef implementation_defined broadcast;



Implements the SOL\_SOCKET/SO\_BROADCAST socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::broadcast option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::broadcast option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_raw_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:bytes_readable basic_raw_socket::bytes_readable]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_raw_socket.bytes_readable..bytes_readable..basic_raw_socket] 
IO control command to get the amount of data that can be read without blocking. 


  typedef implementation_defined bytes_readable;



Implements the FIONREAD IO control command.


[heading Example]
  


   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();







[heading Requirements]

['Header: ][^asio/basic_raw_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:cancel basic_raw_socket::cancel]

[indexterm2 asio.indexterm.basic_raw_socket.cancel..cancel..basic_raw_socket] 
Cancel all asynchronous operations associated with the socket. 


  void ``[link asio.reference.basic_raw_socket.cancel.overload1 cancel]``();
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.cancel.overload1 more...]]``

  void ``[link asio.reference.basic_raw_socket.cancel.overload2 cancel]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.cancel.overload2 more...]]``


[section:overload1 basic_raw_socket::cancel (1 of 2 overloads)]


['Inherited from basic_socket.]


Cancel all asynchronous operations associated with the socket. 


  void cancel();


This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls to `cancel()` will always fail with `asio::error::operation_not_supported` when run on Windows XP, Windows Server 2003, and earlier versions of Windows, unless ASIO\_ENABLE\_CANCELIO is defined. However, the CancelIo function has two issues that should be considered before enabling its use:


* It will only cancel asynchronous operations that were initiated in the current thread.


* It can appear to complete without error, but the request to cancel the unfinished operations may be silently ignored by the operating system. Whether it works or not seems to depend on the drivers that are installed.

For portable cancellation, consider using one of the following alternatives:


* Disable asio's I/O completion port backend by defining ASIO\_DISABLE\_IOCP.


* Use the `close()` function to simultaneously cancel the outstanding operations and close the socket.

When running on Windows Vista, Windows Server 2008, and later, the CancelIoEx function is always used. This function does not have the problems described above. 


[endsect]



[section:overload2 basic_raw_socket::cancel (2 of 2 overloads)]


['Inherited from basic_socket.]


Cancel all asynchronous operations associated with the socket. 


  void cancel(
      asio::error_code & ec);


This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls to `cancel()` will always fail with `asio::error::operation_not_supported` when run on Windows XP, Windows Server 2003, and earlier versions of Windows, unless ASIO\_ENABLE\_CANCELIO is defined. However, the CancelIo function has two issues that should be considered before enabling its use:


* It will only cancel asynchronous operations that were initiated in the current thread.


* It can appear to complete without error, but the request to cancel the unfinished operations may be silently ignored by the operating system. Whether it works or not seems to depend on the drivers that are installed.

For portable cancellation, consider using one of the following alternatives:


* Disable asio's I/O completion port backend by defining ASIO\_DISABLE\_IOCP.


* Use the `close()` function to simultaneously cancel the outstanding operations and close the socket.

When running on Windows Vista, Windows Server 2008, and later, the CancelIoEx function is always used. This function does not have the problems described above. 


[endsect]


[endsect]

[section:close basic_raw_socket::close]

[indexterm2 asio.indexterm.basic_raw_socket.close..close..basic_raw_socket] 
Close the socket. 


  void ``[link asio.reference.basic_raw_socket.close.overload1 close]``();
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.close.overload1 more...]]``

  void ``[link asio.reference.basic_raw_socket.close.overload2 close]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.close.overload2 more...]]``


[section:overload1 basic_raw_socket::close (1 of 2 overloads)]


['Inherited from basic_socket.]


Close the socket. 


  void close();


This function is used to close the socket. Any asynchronous send, receive or connect operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed.]]

]


[heading Remarks]
      
For portable behaviour with respect to graceful closure of a connected socket, call `shutdown()` before closing the socket. 




[endsect]



[section:overload2 basic_raw_socket::close (2 of 2 overloads)]


['Inherited from basic_socket.]


Close the socket. 


  void close(
      asio::error_code & ec);


This function is used to close the socket. Any asynchronous send, receive or connect operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   socket.close(ec);
   if (ec)
   {
     // An error occurred.
   }





[heading Remarks]
      
For portable behaviour with respect to graceful closure of a connected socket, call `shutdown()` before closing the socket. 




[endsect]


[endsect]

[section:connect basic_raw_socket::connect]

[indexterm2 asio.indexterm.basic_raw_socket.connect..connect..basic_raw_socket] 
Connect the socket to the specified endpoint. 


  void ``[link asio.reference.basic_raw_socket.connect.overload1 connect]``(
      const endpoint_type & peer_endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.connect.overload1 more...]]``

  void ``[link asio.reference.basic_raw_socket.connect.overload2 connect]``(
      const endpoint_type & peer_endpoint,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.connect.overload2 more...]]``


[section:overload1 basic_raw_socket::connect (1 of 2 overloads)]


['Inherited from basic_socket.]


Connect the socket to the specified endpoint. 


  void connect(
      const endpoint_type & peer_endpoint);


This function is used to connect a socket to the specified remote endpoint. The function call will block until the connection is successfully made or an error occurs.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.


[heading Parameters]
    

[variablelist
  
[[peer_endpoint][The remote endpoint to which the socket will be connected.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   asio::ip::tcp::endpoint endpoint(
       asio::ip::address::from_string("1.2.3.4"), 12345);
   socket.connect(endpoint);







[endsect]



[section:overload2 basic_raw_socket::connect (2 of 2 overloads)]


['Inherited from basic_socket.]


Connect the socket to the specified endpoint. 


  void connect(
      const endpoint_type & peer_endpoint,
      asio::error_code & ec);


This function is used to connect a socket to the specified remote endpoint. The function call will block until the connection is successfully made or an error occurs.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.


[heading Parameters]
    

[variablelist
  
[[peer_endpoint][The remote endpoint to which the socket will be connected.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   asio::ip::tcp::endpoint endpoint(
       asio::ip::address::from_string("1.2.3.4"), 12345);
   asio::error_code ec;
   socket.connect(endpoint, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:debug basic_raw_socket::debug]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_raw_socket.debug..debug..basic_raw_socket] 
Socket option to enable socket-level debugging. 


  typedef implementation_defined debug;



Implements the SOL\_SOCKET/SO\_DEBUG socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::debug option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::debug option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_raw_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:do_not_route basic_raw_socket::do_not_route]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_raw_socket.do_not_route..do_not_route..basic_raw_socket] 
Socket option to prevent routing, use local interfaces only. 


  typedef implementation_defined do_not_route;



Implements the SOL\_SOCKET/SO\_DONTROUTE socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::do_not_route option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::do_not_route option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_raw_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:enable_connection_aborted basic_raw_socket::enable_connection_aborted]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_raw_socket.enable_connection_aborted..enable_connection_aborted..basic_raw_socket] 
Socket option to report aborted connections on accept. 


  typedef implementation_defined enable_connection_aborted;



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.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::enable_connection_aborted option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::enable_connection_aborted option;
   acceptor.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_raw_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:endpoint_type basic_raw_socket::endpoint_type]

[indexterm2 asio.indexterm.basic_raw_socket.endpoint_type..endpoint_type..basic_raw_socket] 
The endpoint type. 


  typedef Protocol::endpoint endpoint_type;



[heading Requirements]

['Header: ][^asio/basic_raw_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:executor_type basic_raw_socket::executor_type]

[indexterm2 asio.indexterm.basic_raw_socket.executor_type..executor_type..basic_raw_socket] 
The type of the executor associated with the object. 


  typedef Executor executor_type;



[heading Requirements]

['Header: ][^asio/basic_raw_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:get_executor basic_raw_socket::get_executor]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_raw_socket.get_executor..get_executor..basic_raw_socket] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_option basic_raw_socket::get_option]

[indexterm2 asio.indexterm.basic_raw_socket.get_option..get_option..basic_raw_socket] 
Get an option from the socket. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void ``[link asio.reference.basic_raw_socket.get_option.overload1 get_option]``(
      GettableSocketOption & option) const;
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.get_option.overload1 more...]]``

  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void ``[link asio.reference.basic_raw_socket.get_option.overload2 get_option]``(
      GettableSocketOption & option,
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.get_option.overload2 more...]]``


[section:overload1 basic_raw_socket::get_option (1 of 2 overloads)]


['Inherited from basic_socket.]


Get an option from the socket. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void get_option(
      GettableSocketOption & option) const;


This function is used to get the current value of an option on the socket.


[heading Parameters]
    

[variablelist
  
[[option][The option value to be obtained from the socket.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]



[heading Example]
  
Getting the value of the SOL\_SOCKET/SO\_KEEPALIVE option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::socket::keep_alive option;
   socket.get_option(option);
   bool is_set = option.value();







[endsect]



[section:overload2 basic_raw_socket::get_option (2 of 2 overloads)]


['Inherited from basic_socket.]


Get an option from the socket. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void get_option(
      GettableSocketOption & option,
      asio::error_code & ec) const;


This function is used to get the current value of an option on the socket.


[heading Parameters]
    

[variablelist
  
[[option][The option value to be obtained from the socket.]]

[[ec][Set to indicate what error occurred, if any.]]

]



[heading Example]
  
Getting the value of the SOL\_SOCKET/SO\_KEEPALIVE option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::socket::keep_alive option;
   asio::error_code ec;
   socket.get_option(option, ec);
   if (ec)
   {
     // An error occurred.
   }
   bool is_set = option.value();







[endsect]


[endsect]

[section:io_control basic_raw_socket::io_control]

[indexterm2 asio.indexterm.basic_raw_socket.io_control..io_control..basic_raw_socket] 
Perform an IO control command on the socket. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void ``[link asio.reference.basic_raw_socket.io_control.overload1 io_control]``(
      IoControlCommand & command);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.io_control.overload1 more...]]``

  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void ``[link asio.reference.basic_raw_socket.io_control.overload2 io_control]``(
      IoControlCommand & command,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.io_control.overload2 more...]]``


[section:overload1 basic_raw_socket::io_control (1 of 2 overloads)]


['Inherited from basic_socket.]


Perform an IO control command on the socket. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void io_control(
      IoControlCommand & command);


This function is used to execute an IO control command on the socket.


[heading Parameters]
    

[variablelist
  
[[command][The IO control command to be performed on the socket.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]



[heading Example]
  
Getting the number of bytes ready to read: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::socket::bytes_readable command;
   socket.io_control(command);
   std::size_t bytes_readable = command.get();







[endsect]



[section:overload2 basic_raw_socket::io_control (2 of 2 overloads)]


['Inherited from basic_socket.]


Perform an IO control command on the socket. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void io_control(
      IoControlCommand & command,
      asio::error_code & ec);


This function is used to execute an IO control command on the socket.


[heading Parameters]
    

[variablelist
  
[[command][The IO control command to be performed on the socket.]]

[[ec][Set to indicate what error occurred, if any.]]

]



[heading Example]
  
Getting the number of bytes ready to read: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::socket::bytes_readable command;
   asio::error_code ec;
   socket.io_control(command, ec);
   if (ec)
   {
     // An error occurred.
   }
   std::size_t bytes_readable = command.get();







[endsect]


[endsect]


[section:is_open basic_raw_socket::is_open]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_raw_socket.is_open..is_open..basic_raw_socket] 
Determine whether the socket is open. 


  bool is_open() const;



[endsect]



[section:keep_alive basic_raw_socket::keep_alive]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_raw_socket.keep_alive..keep_alive..basic_raw_socket] 
Socket option to send keep-alives. 


  typedef implementation_defined keep_alive;



Implements the SOL\_SOCKET/SO\_KEEPALIVE socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::keep_alive option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::keep_alive option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_raw_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:linger basic_raw_socket::linger]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_raw_socket.linger..linger..basic_raw_socket] 
Socket option to specify whether the socket lingers on close if unsent data is present. 


  typedef implementation_defined linger;



Implements the SOL\_SOCKET/SO\_LINGER socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::linger option(true, 30);
   socket.set_option(option);





Getting the current option value: 

   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();







[heading Requirements]

['Header: ][^asio/basic_raw_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:local_endpoint basic_raw_socket::local_endpoint]

[indexterm2 asio.indexterm.basic_raw_socket.local_endpoint..local_endpoint..basic_raw_socket] 
Get the local endpoint of the socket. 


  endpoint_type ``[link asio.reference.basic_raw_socket.local_endpoint.overload1 local_endpoint]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.local_endpoint.overload1 more...]]``

  endpoint_type ``[link asio.reference.basic_raw_socket.local_endpoint.overload2 local_endpoint]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.local_endpoint.overload2 more...]]``


[section:overload1 basic_raw_socket::local_endpoint (1 of 2 overloads)]


['Inherited from basic_socket.]


Get the local endpoint of the socket. 


  endpoint_type local_endpoint() const;


This function is used to obtain the locally bound endpoint of the socket.


[heading Return Value]
      
An object that represents the local endpoint of the socket.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::endpoint endpoint = socket.local_endpoint();







[endsect]



[section:overload2 basic_raw_socket::local_endpoint (2 of 2 overloads)]


['Inherited from basic_socket.]


Get the local endpoint of the socket. 


  endpoint_type local_endpoint(
      asio::error_code & ec) const;


This function is used to obtain the locally bound endpoint of the socket.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
An object that represents the local endpoint of the socket. Returns a default-constructed endpoint object if an error occurred.


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   asio::ip::tcp::endpoint endpoint = socket.local_endpoint(ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]

[section:lowest_layer basic_raw_socket::lowest_layer]

[indexterm2 asio.indexterm.basic_raw_socket.lowest_layer..lowest_layer..basic_raw_socket] 
Get a reference to the lowest layer. 


  lowest_layer_type & ``[link asio.reference.basic_raw_socket.lowest_layer.overload1 lowest_layer]``();
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.lowest_layer.overload1 more...]]``


Get a const reference to the lowest layer. 


  const lowest_layer_type & ``[link asio.reference.basic_raw_socket.lowest_layer.overload2 lowest_layer]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.lowest_layer.overload2 more...]]``


[section:overload1 basic_raw_socket::lowest_layer (1 of 2 overloads)]


['Inherited from basic_socket.]


Get a reference to the lowest layer. 


  lowest_layer_type & lowest_layer();


This function returns a reference to the lowest layer in a stack of layers. Since a [link asio.reference.basic_socket `basic_socket`] cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]



[section:overload2 basic_raw_socket::lowest_layer (2 of 2 overloads)]


['Inherited from basic_socket.]


Get a const reference to the lowest layer. 


  const lowest_layer_type & lowest_layer() const;


This function returns a const reference to the lowest layer in a stack of layers. Since a [link asio.reference.basic_socket `basic_socket`] cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]


[endsect]


[section:lowest_layer_type basic_raw_socket::lowest_layer_type]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_raw_socket.lowest_layer_type..lowest_layer_type..basic_raw_socket] 
A [link asio.reference.basic_socket `basic_socket`] is always the lowest layer. 


  typedef basic_socket< Protocol, Executor > lowest_layer_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_socket.basic_socket [*basic_socket]] [constructor]]
    [Construct a basic_socket without opening it. 
     [hr]
     Construct and open a basic_socket. 
     [hr]
     Construct a basic_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_socket on an existing native socket. 
     [hr]
     Move-construct a basic_socket from another. 
     [hr]
     Move-construct a basic_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_socket from another. 
     [hr]
     Move-assign a basic_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket._basic_socket [*~basic_socket]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_socket `basic_socket`] class template provides functionality that is common to both stream-oriented and datagram-oriented sockets.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/basic_raw_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:max_connections basic_raw_socket::max_connections]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_raw_socket.max_connections..max_connections..basic_raw_socket] 
(Deprecated: Use max\_listen\_connections.) The maximum length of the queue of pending incoming connections. 


  static const int max_connections = implementation_defined;



[endsect]



[section:max_listen_connections basic_raw_socket::max_listen_connections]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_raw_socket.max_listen_connections..max_listen_connections..basic_raw_socket] 
The maximum length of the queue of pending incoming connections. 


  static const int max_listen_connections = implementation_defined;



[endsect]



[section:message_do_not_route basic_raw_socket::message_do_not_route]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_raw_socket.message_do_not_route..message_do_not_route..basic_raw_socket] 
Specify that the data should not be subject to routing. 


  static const int message_do_not_route = implementation_defined;



[endsect]



[section:message_end_of_record basic_raw_socket::message_end_of_record]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_raw_socket.message_end_of_record..message_end_of_record..basic_raw_socket] 
Specifies that the data marks the end of a record. 


  static const int message_end_of_record = implementation_defined;



[endsect]



[section:message_flags basic_raw_socket::message_flags]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_raw_socket.message_flags..message_flags..basic_raw_socket] 
Bitmask type for flags that can be passed to send and receive operations. 


  typedef int message_flags;



[heading Requirements]

['Header: ][^asio/basic_raw_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:message_out_of_band basic_raw_socket::message_out_of_band]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_raw_socket.message_out_of_band..message_out_of_band..basic_raw_socket] 
Process out-of-band data. 


  static const int message_out_of_band = implementation_defined;



[endsect]



[section:message_peek basic_raw_socket::message_peek]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_raw_socket.message_peek..message_peek..basic_raw_socket] 
Peek at incoming data without removing it from the input queue. 


  static const int message_peek = implementation_defined;



[endsect]



[section:native_handle basic_raw_socket::native_handle]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_raw_socket.native_handle..native_handle..basic_raw_socket] 
Get the native socket representation. 


  native_handle_type native_handle();


This function may be used to obtain the underlying representation of the socket. This is intended to allow access to native socket functionality that is not otherwise provided. 


[endsect]



[section:native_handle_type basic_raw_socket::native_handle_type]

[indexterm2 asio.indexterm.basic_raw_socket.native_handle_type..native_handle_type..basic_raw_socket] 
The native representation of a socket. 


  typedef implementation_defined native_handle_type;



[heading Requirements]

['Header: ][^asio/basic_raw_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:native_non_blocking basic_raw_socket::native_non_blocking]

[indexterm2 asio.indexterm.basic_raw_socket.native_non_blocking..native_non_blocking..basic_raw_socket] 
Gets the non-blocking mode of the native socket implementation. 


  bool ``[link asio.reference.basic_raw_socket.native_non_blocking.overload1 native_non_blocking]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.native_non_blocking.overload1 more...]]``


Sets the non-blocking mode of the native socket implementation. 


  void ``[link asio.reference.basic_raw_socket.native_non_blocking.overload2 native_non_blocking]``(
      bool mode);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.native_non_blocking.overload2 more...]]``

  void ``[link asio.reference.basic_raw_socket.native_non_blocking.overload3 native_non_blocking]``(
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.native_non_blocking.overload3 more...]]``


[section:overload1 basic_raw_socket::native_non_blocking (1 of 3 overloads)]


['Inherited from basic_socket.]


Gets the non-blocking mode of the native socket implementation. 


  bool native_non_blocking() const;


This function is used to retrieve the non-blocking mode of the underlying native socket. This mode has no effect on the behaviour of the socket object's synchronous operations.


[heading Return Value]
      
`true` if the underlying socket is in non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).


[heading Remarks]
      
The current non-blocking mode is cached by the socket object. Consequently, the return value may be incorrect if the non-blocking mode was set directly on the native socket.


[heading Example]
  
This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's `sendfile` system call might be encapsulated: 

   template <typename Handler>
   struct sendfile_op
   {
     tcp::socket& sock_;
     int fd_;
     Handler handler_;
     off_t offset_;
     std::size_t total_bytes_transferred_;

     // Function call operator meeting WriteHandler requirements.
     // Used as the handler for the async_write_some operation.
     void operator()(asio::error_code ec, std::size_t)
     {
       // Put the underlying socket into non-blocking mode.
       if (!ec)
         if (!sock_.native_non_blocking())
           sock_.native_non_blocking(true, ec);

       if (!ec)
       {
         for (;;)
         {
           // Try the system call.
           errno = 0;
           int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
           ec = asio::error_code(n < 0 ? errno : 0,
               asio::error::get_system_category());
           total_bytes_transferred_ += ec ? 0 : n;

           // Retry operation immediately if interrupted by signal.
           if (ec == asio::error::interrupted)
             continue;

           // Check if we need to run the operation again.
           if (ec == asio::error::would_block
               || ec == asio::error::try_again)
           {
             // We have to wait for the socket to become ready again.
             sock_.async_wait(tcp::socket::wait_write, *this);
             return;
           }

           if (ec || n == 0)
           {
             // An error occurred, or we have reached the end of the file.
             // Either way we must exit the loop so we can call the handler.
             break;
           }

           // Loop around to try calling sendfile again.
         }
       }

       // Pass result back to user's handler.
       handler_(ec, total_bytes_transferred_);
     }
   };

   template <typename Handler>
   void async_sendfile(tcp::socket& sock, int fd, Handler h)
   {
     sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
     sock.async_wait(tcp::socket::wait_write, op);
   } 







[endsect]



[section:overload2 basic_raw_socket::native_non_blocking (2 of 3 overloads)]


['Inherited from basic_socket.]


Sets the non-blocking mode of the native socket implementation. 


  void native_non_blocking(
      bool mode);


This function is used to modify the non-blocking mode of the underlying native socket. It has no effect on the behaviour of the socket object's synchronous operations.


[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the underlying socket is put into non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. If the `mode` is `false`, but the current value of `non_blocking()` is `true`, this function fails with `asio::error::invalid_argument`, as the combination does not make sense.]]

]


[heading Example]
  
This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's `sendfile` system call might be encapsulated: 

   template <typename Handler>
   struct sendfile_op
   {
     tcp::socket& sock_;
     int fd_;
     Handler handler_;
     off_t offset_;
     std::size_t total_bytes_transferred_;

     // Function call operator meeting WriteHandler requirements.
     // Used as the handler for the async_write_some operation.
     void operator()(asio::error_code ec, std::size_t)
     {
       // Put the underlying socket into non-blocking mode.
       if (!ec)
         if (!sock_.native_non_blocking())
           sock_.native_non_blocking(true, ec);

       if (!ec)
       {
         for (;;)
         {
           // Try the system call.
           errno = 0;
           int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
           ec = asio::error_code(n < 0 ? errno : 0,
               asio::error::get_system_category());
           total_bytes_transferred_ += ec ? 0 : n;

           // Retry operation immediately if interrupted by signal.
           if (ec == asio::error::interrupted)
             continue;

           // Check if we need to run the operation again.
           if (ec == asio::error::would_block
               || ec == asio::error::try_again)
           {
             // We have to wait for the socket to become ready again.
             sock_.async_wait(tcp::socket::wait_write, *this);
             return;
           }

           if (ec || n == 0)
           {
             // An error occurred, or we have reached the end of the file.
             // Either way we must exit the loop so we can call the handler.
             break;
           }

           // Loop around to try calling sendfile again.
         }
       }

       // Pass result back to user's handler.
       handler_(ec, total_bytes_transferred_);
     }
   };

   template <typename Handler>
   void async_sendfile(tcp::socket& sock, int fd, Handler h)
   {
     sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
     sock.async_wait(tcp::socket::wait_write, op);
   } 







[endsect]



[section:overload3 basic_raw_socket::native_non_blocking (3 of 3 overloads)]


['Inherited from basic_socket.]


Sets the non-blocking mode of the native socket implementation. 


  void native_non_blocking(
      bool mode,
      asio::error_code & ec);


This function is used to modify the non-blocking mode of the underlying native socket. It has no effect on the behaviour of the socket object's synchronous operations.


[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the underlying socket is put into non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).]]

[[ec][Set to indicate what error occurred, if any. If the `mode` is `false`, but the current value of `non_blocking()` is `true`, this function fails with `asio::error::invalid_argument`, as the combination does not make sense.]]

]


[heading Example]
  
This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's `sendfile` system call might be encapsulated: 

   template <typename Handler>
   struct sendfile_op
   {
     tcp::socket& sock_;
     int fd_;
     Handler handler_;
     off_t offset_;
     std::size_t total_bytes_transferred_;

     // Function call operator meeting WriteHandler requirements.
     // Used as the handler for the async_write_some operation.
     void operator()(asio::error_code ec, std::size_t)
     {
       // Put the underlying socket into non-blocking mode.
       if (!ec)
         if (!sock_.native_non_blocking())
           sock_.native_non_blocking(true, ec);

       if (!ec)
       {
         for (;;)
         {
           // Try the system call.
           errno = 0;
           int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
           ec = asio::error_code(n < 0 ? errno : 0,
               asio::error::get_system_category());
           total_bytes_transferred_ += ec ? 0 : n;

           // Retry operation immediately if interrupted by signal.
           if (ec == asio::error::interrupted)
             continue;

           // Check if we need to run the operation again.
           if (ec == asio::error::would_block
               || ec == asio::error::try_again)
           {
             // We have to wait for the socket to become ready again.
             sock_.async_wait(tcp::socket::wait_write, *this);
             return;
           }

           if (ec || n == 0)
           {
             // An error occurred, or we have reached the end of the file.
             // Either way we must exit the loop so we can call the handler.
             break;
           }

           // Loop around to try calling sendfile again.
         }
       }

       // Pass result back to user's handler.
       handler_(ec, total_bytes_transferred_);
     }
   };

   template <typename Handler>
   void async_sendfile(tcp::socket& sock, int fd, Handler h)
   {
     sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
     sock.async_wait(tcp::socket::wait_write, op);
   } 







[endsect]


[endsect]

[section:non_blocking basic_raw_socket::non_blocking]

[indexterm2 asio.indexterm.basic_raw_socket.non_blocking..non_blocking..basic_raw_socket] 
Gets the non-blocking mode of the socket. 


  bool ``[link asio.reference.basic_raw_socket.non_blocking.overload1 non_blocking]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.non_blocking.overload1 more...]]``


Sets the non-blocking mode of the socket. 


  void ``[link asio.reference.basic_raw_socket.non_blocking.overload2 non_blocking]``(
      bool mode);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.non_blocking.overload2 more...]]``

  void ``[link asio.reference.basic_raw_socket.non_blocking.overload3 non_blocking]``(
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.non_blocking.overload3 more...]]``


[section:overload1 basic_raw_socket::non_blocking (1 of 3 overloads)]


['Inherited from basic_socket.]


Gets the non-blocking mode of the socket. 


  bool non_blocking() const;



[heading Return Value]
      
`true` if the socket's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]



[section:overload2 basic_raw_socket::non_blocking (2 of 3 overloads)]


['Inherited from basic_socket.]


Sets the non-blocking mode of the socket. 


  void non_blocking(
      bool mode);



[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the socket's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]



[section:overload3 basic_raw_socket::non_blocking (3 of 3 overloads)]


['Inherited from basic_socket.]


Sets the non-blocking mode of the socket. 


  void non_blocking(
      bool mode,
      asio::error_code & ec);



[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the socket's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]


[endsect]

[section:open basic_raw_socket::open]

[indexterm2 asio.indexterm.basic_raw_socket.open..open..basic_raw_socket] 
Open the socket using the specified protocol. 


  void ``[link asio.reference.basic_raw_socket.open.overload1 open]``(
      const protocol_type & protocol = protocol_type());
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.open.overload1 more...]]``

  void ``[link asio.reference.basic_raw_socket.open.overload2 open]``(
      const protocol_type & protocol,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.open.overload2 more...]]``


[section:overload1 basic_raw_socket::open (1 of 2 overloads)]


['Inherited from basic_socket.]


Open the socket using the specified protocol. 


  void open(
      const protocol_type & protocol = protocol_type());


This function opens the socket so that it will use the specified protocol.


[heading Parameters]
    

[variablelist
  
[[protocol][An object specifying protocol parameters to be used.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   socket.open(asio::ip::tcp::v4());







[endsect]



[section:overload2 basic_raw_socket::open (2 of 2 overloads)]


['Inherited from basic_socket.]


Open the socket using the specified protocol. 


  void open(
      const protocol_type & protocol,
      asio::error_code & ec);


This function opens the socket so that it will use the specified protocol.


[heading Parameters]
    

[variablelist
  
[[protocol][An object specifying which protocol is to be used.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   asio::error_code ec;
   socket.open(asio::ip::tcp::v4(), ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]

[section:operator_eq_ basic_raw_socket::operator=]

[indexterm2 asio.indexterm.basic_raw_socket.operator_eq_..operator=..basic_raw_socket] 
Move-assign a [link asio.reference.basic_raw_socket `basic_raw_socket`] from another. 


  basic_raw_socket & ``[link asio.reference.basic_raw_socket.operator_eq_.overload1 operator=]``(
      basic_raw_socket && other);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.operator_eq_.overload1 more...]]``


Move-assign a [link asio.reference.basic_raw_socket `basic_raw_socket`] from a socket of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value, basic_raw_socket & >::type ``[link asio.reference.basic_raw_socket.operator_eq_.overload2 operator=]``(
      basic_raw_socket< Protocol1, Executor1 > && other);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.operator_eq_.overload2 more...]]``


[section:overload1 basic_raw_socket::operator= (1 of 2 overloads)]


Move-assign a [link asio.reference.basic_raw_socket `basic_raw_socket`] from another. 


  basic_raw_socket & operator=(
      basic_raw_socket && other);


This assignment operator moves a raw socket from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_raw_socket `basic_raw_socket`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_raw_socket(const executor_type&)` constructor. 




[endsect]



[section:overload2 basic_raw_socket::operator= (2 of 2 overloads)]


Move-assign a [link asio.reference.basic_raw_socket `basic_raw_socket`] from a socket of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value, basic_raw_socket & >::type operator=(
      basic_raw_socket< Protocol1, Executor1 > && other);


This assignment operator moves a raw socket from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_raw_socket `basic_raw_socket`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_raw_socket(const executor_type&)` constructor. 




[endsect]


[endsect]


[section:out_of_band_inline basic_raw_socket::out_of_band_inline]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_raw_socket.out_of_band_inline..out_of_band_inline..basic_raw_socket] 
Socket option for putting received out-of-band data inline. 


  typedef implementation_defined out_of_band_inline;



Implements the SOL\_SOCKET/SO\_OOBINLINE socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::out_of_band_inline option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::out_of_band_inline option;
   socket.get_option(option);
   bool value = option.value();







[heading Requirements]

['Header: ][^asio/basic_raw_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:protocol_type basic_raw_socket::protocol_type]

[indexterm2 asio.indexterm.basic_raw_socket.protocol_type..protocol_type..basic_raw_socket] 
The protocol type. 


  typedef Protocol protocol_type;



[heading Requirements]

['Header: ][^asio/basic_raw_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:receive basic_raw_socket::receive]

[indexterm2 asio.indexterm.basic_raw_socket.receive..receive..basic_raw_socket] 
Receive some data on a connected socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.basic_raw_socket.receive.overload1 receive]``(
      const MutableBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.receive.overload1 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.basic_raw_socket.receive.overload2 receive]``(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.receive.overload2 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.basic_raw_socket.receive.overload3 receive]``(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.receive.overload3 more...]]``


[section:overload1 basic_raw_socket::receive (1 of 3 overloads)]


Receive some data on a connected socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive(
      const MutableBufferSequence & buffers);


This function is used to receive data on the raw socket. The function call will block until data has been received successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received.]]

]


[heading Return Value]
      
The number of bytes received.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
The receive operation can only be used with a connected socket. Use the receive\_from function to receive data on an unconnected raw socket.


[heading Example]
  
To receive into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.receive(asio::buffer(data, size)); 


See the [link asio.reference.buffer `buffer`]  documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_raw_socket::receive (2 of 3 overloads)]


Receive some data on a connected socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags);


This function is used to receive data on the raw socket. The function call will block until data has been received successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received.]]

[[flags][Flags specifying how the receive call is to be made.]]

]


[heading Return Value]
      
The number of bytes received.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
The receive operation can only be used with a connected socket. Use the receive\_from function to receive data on an unconnected raw socket. 




[endsect]



[section:overload3 basic_raw_socket::receive (3 of 3 overloads)]


Receive some data on a connected socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      asio::error_code & ec);


This function is used to receive data on the raw socket. The function call will block until data has been received successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received.]]

[[flags][Flags specifying how the receive call is to be made.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes received.


[heading Remarks]
      
The receive operation can only be used with a connected socket. Use the receive\_from function to receive data on an unconnected raw socket. 




[endsect]


[endsect]


[section:receive_buffer_size basic_raw_socket::receive_buffer_size]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_raw_socket.receive_buffer_size..receive_buffer_size..basic_raw_socket] 
Socket option for the receive buffer size of a socket. 


  typedef implementation_defined receive_buffer_size;



Implements the SOL\_SOCKET/SO\_RCVBUF socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_buffer_size option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_raw_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:receive_from basic_raw_socket::receive_from]

[indexterm2 asio.indexterm.basic_raw_socket.receive_from..receive_from..basic_raw_socket] 
Receive raw data with the endpoint of the sender. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.basic_raw_socket.receive_from.overload1 receive_from]``(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.receive_from.overload1 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.basic_raw_socket.receive_from.overload2 receive_from]``(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      socket_base::message_flags flags);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.receive_from.overload2 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.basic_raw_socket.receive_from.overload3 receive_from]``(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      socket_base::message_flags flags,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.receive_from.overload3 more...]]``


[section:overload1 basic_raw_socket::receive_from (1 of 3 overloads)]


Receive raw data with the endpoint of the sender. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive_from(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint);


This function is used to receive raw data. The function call will block until data has been received successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received.]]

[[sender_endpoint][An endpoint object that receives the endpoint of the remote sender of the data.]]

]


[heading Return Value]
      
The number of bytes received.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  
To receive into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::ip::udp::endpoint sender_endpoint;
   socket.receive_from(
       asio::buffer(data, size), sender_endpoint);


See the [link asio.reference.buffer `buffer`]  documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_raw_socket::receive_from (2 of 3 overloads)]


Receive raw data with the endpoint of the sender. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive_from(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      socket_base::message_flags flags);


This function is used to receive raw data. The function call will block until data has been received successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received.]]

[[sender_endpoint][An endpoint object that receives the endpoint of the remote sender of the data.]]

[[flags][Flags specifying how the receive call is to be made.]]

]


[heading Return Value]
      
The number of bytes received.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload3 basic_raw_socket::receive_from (3 of 3 overloads)]


Receive raw data with the endpoint of the sender. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive_from(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      socket_base::message_flags flags,
      asio::error_code & ec);


This function is used to receive raw data. The function call will block until data has been received successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received.]]

[[sender_endpoint][An endpoint object that receives the endpoint of the remote sender of the data.]]

[[flags][Flags specifying how the receive call is to be made.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes received. 




[endsect]


[endsect]


[section:receive_low_watermark basic_raw_socket::receive_low_watermark]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_raw_socket.receive_low_watermark..receive_low_watermark..basic_raw_socket] 
Socket option for the receive low watermark. 


  typedef implementation_defined receive_low_watermark;



Implements the SOL\_SOCKET/SO\_RCVLOWAT socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_low_watermark option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_raw_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:release basic_raw_socket::release]

[indexterm2 asio.indexterm.basic_raw_socket.release..release..basic_raw_socket] 
Release ownership of the underlying native socket. 


  native_handle_type ``[link asio.reference.basic_raw_socket.release.overload1 release]``();
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.release.overload1 more...]]``

  native_handle_type ``[link asio.reference.basic_raw_socket.release.overload2 release]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.release.overload2 more...]]``


[section:overload1 basic_raw_socket::release (1 of 2 overloads)]


['Inherited from basic_socket.]


Release ownership of the underlying native socket. 


  native_handle_type release();


This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error. Ownership of the native socket is then transferred to the caller.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
This function is unsupported on Windows versions prior to Windows 8.1, and will fail with `asio::error::operation_not_supported` on these platforms. 




[endsect]



[section:overload2 basic_raw_socket::release (2 of 2 overloads)]


['Inherited from basic_socket.]


Release ownership of the underlying native socket. 


  native_handle_type release(
      asio::error_code & ec);


This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error. Ownership of the native socket is then transferred to the caller.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
This function is unsupported on Windows versions prior to Windows 8.1, and will fail with `asio::error::operation_not_supported` on these platforms. 




[endsect]


[endsect]

[section:remote_endpoint basic_raw_socket::remote_endpoint]

[indexterm2 asio.indexterm.basic_raw_socket.remote_endpoint..remote_endpoint..basic_raw_socket] 
Get the remote endpoint of the socket. 


  endpoint_type ``[link asio.reference.basic_raw_socket.remote_endpoint.overload1 remote_endpoint]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.remote_endpoint.overload1 more...]]``

  endpoint_type ``[link asio.reference.basic_raw_socket.remote_endpoint.overload2 remote_endpoint]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.remote_endpoint.overload2 more...]]``


[section:overload1 basic_raw_socket::remote_endpoint (1 of 2 overloads)]


['Inherited from basic_socket.]


Get the remote endpoint of the socket. 


  endpoint_type remote_endpoint() const;


This function is used to obtain the remote endpoint of the socket.


[heading Return Value]
      
An object that represents the remote endpoint of the socket.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::endpoint endpoint = socket.remote_endpoint();







[endsect]



[section:overload2 basic_raw_socket::remote_endpoint (2 of 2 overloads)]


['Inherited from basic_socket.]


Get the remote endpoint of the socket. 


  endpoint_type remote_endpoint(
      asio::error_code & ec) const;


This function is used to obtain the remote endpoint of the socket.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
An object that represents the remote endpoint of the socket. Returns a default-constructed endpoint object if an error occurred.


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   asio::ip::tcp::endpoint endpoint = socket.remote_endpoint(ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:reuse_address basic_raw_socket::reuse_address]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_raw_socket.reuse_address..reuse_address..basic_raw_socket] 
Socket option to allow the socket to be bound to an address that is already in use. 


  typedef implementation_defined reuse_address;



Implements the SOL\_SOCKET/SO\_REUSEADDR socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::reuse_address option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::reuse_address option;
   acceptor.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_raw_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:send basic_raw_socket::send]

[indexterm2 asio.indexterm.basic_raw_socket.send..send..basic_raw_socket] 
Send some data on a connected socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.basic_raw_socket.send.overload1 send]``(
      const ConstBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.send.overload1 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.basic_raw_socket.send.overload2 send]``(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.send.overload2 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.basic_raw_socket.send.overload3 send]``(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.send.overload3 more...]]``


[section:overload1 basic_raw_socket::send (1 of 3 overloads)]


Send some data on a connected socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send(
      const ConstBufferSequence & buffers);


This function is used to send data on the raw socket. The function call will block until the data has been sent successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One ore more data buffers to be sent on the socket.]]

]


[heading Return Value]
      
The number of bytes sent.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
The send operation can only be used with a connected socket. Use the send\_to function to send data on an unconnected raw socket.


[heading Example]
  
To send a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.send(asio::buffer(data, size)); 


See the [link asio.reference.buffer `buffer`]  documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_raw_socket::send (2 of 3 overloads)]


Send some data on a connected socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags);


This function is used to send data on the raw socket. The function call will block until the data has been sent successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One ore more data buffers to be sent on the socket.]]

[[flags][Flags specifying how the send call is to be made.]]

]


[heading Return Value]
      
The number of bytes sent.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
The send operation can only be used with a connected socket. Use the send\_to function to send data on an unconnected raw socket. 




[endsect]



[section:overload3 basic_raw_socket::send (3 of 3 overloads)]


Send some data on a connected socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      asio::error_code & ec);


This function is used to send data on the raw socket. The function call will block until the data has been sent successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent on the socket.]]

[[flags][Flags specifying how the send call is to be made.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes sent.


[heading Remarks]
      
The send operation can only be used with a connected socket. Use the send\_to function to send data on an unconnected raw socket. 




[endsect]


[endsect]


[section:send_buffer_size basic_raw_socket::send_buffer_size]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_raw_socket.send_buffer_size..send_buffer_size..basic_raw_socket] 
Socket option for the send buffer size of a socket. 


  typedef implementation_defined send_buffer_size;



Implements the SOL\_SOCKET/SO\_SNDBUF socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_buffer_size option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_raw_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:send_low_watermark basic_raw_socket::send_low_watermark]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_raw_socket.send_low_watermark..send_low_watermark..basic_raw_socket] 
Socket option for the send low watermark. 


  typedef implementation_defined send_low_watermark;



Implements the SOL\_SOCKET/SO\_SNDLOWAT socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_low_watermark option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_raw_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:send_to basic_raw_socket::send_to]

[indexterm2 asio.indexterm.basic_raw_socket.send_to..send_to..basic_raw_socket] 
Send raw data to the specified endpoint. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.basic_raw_socket.send_to.overload1 send_to]``(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.send_to.overload1 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.basic_raw_socket.send_to.overload2 send_to]``(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      socket_base::message_flags flags);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.send_to.overload2 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.basic_raw_socket.send_to.overload3 send_to]``(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      socket_base::message_flags flags,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.send_to.overload3 more...]]``


[section:overload1 basic_raw_socket::send_to (1 of 3 overloads)]


Send raw data to the specified endpoint. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send_to(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination);


This function is used to send raw data to the specified remote endpoint. The function call will block until the data has been sent successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent to the remote endpoint.]]

[[destination][The remote endpoint to which the data will be sent.]]

]


[heading Return Value]
      
The number of bytes sent.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  
To send a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::ip::udp::endpoint destination(
       asio::ip::address::from_string("1.2.3.4"), 12345);
   socket.send_to(asio::buffer(data, size), destination);


See the [link asio.reference.buffer `buffer`]  documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_raw_socket::send_to (2 of 3 overloads)]


Send raw data to the specified endpoint. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send_to(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      socket_base::message_flags flags);


This function is used to send raw data to the specified remote endpoint. The function call will block until the data has been sent successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent to the remote endpoint.]]

[[destination][The remote endpoint to which the data will be sent.]]

[[flags][Flags specifying how the send call is to be made.]]

]


[heading Return Value]
      
The number of bytes sent.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload3 basic_raw_socket::send_to (3 of 3 overloads)]


Send raw data to the specified endpoint. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send_to(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      socket_base::message_flags flags,
      asio::error_code & ec);


This function is used to send raw data to the specified remote endpoint. The function call will block until the data has been sent successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent to the remote endpoint.]]

[[destination][The remote endpoint to which the data will be sent.]]

[[flags][Flags specifying how the send call is to be made.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes sent. 




[endsect]


[endsect]

[section:set_option basic_raw_socket::set_option]

[indexterm2 asio.indexterm.basic_raw_socket.set_option..set_option..basic_raw_socket] 
Set an option on the socket. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void ``[link asio.reference.basic_raw_socket.set_option.overload1 set_option]``(
      const SettableSocketOption & option);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.set_option.overload1 more...]]``

  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void ``[link asio.reference.basic_raw_socket.set_option.overload2 set_option]``(
      const SettableSocketOption & option,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.set_option.overload2 more...]]``


[section:overload1 basic_raw_socket::set_option (1 of 2 overloads)]


['Inherited from basic_socket.]


Set an option on the socket. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void set_option(
      const SettableSocketOption & option);


This function is used to set an option on the socket.


[heading Parameters]
    

[variablelist
  
[[option][The new option value to be set on the socket.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]



[heading Example]
  
Setting the IPPROTO\_TCP/TCP\_NODELAY option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::no_delay option(true);
   socket.set_option(option);







[endsect]



[section:overload2 basic_raw_socket::set_option (2 of 2 overloads)]


['Inherited from basic_socket.]


Set an option on the socket. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void set_option(
      const SettableSocketOption & option,
      asio::error_code & ec);


This function is used to set an option on the socket.


[heading Parameters]
    

[variablelist
  
[[option][The new option value to be set on the socket.]]

[[ec][Set to indicate what error occurred, if any.]]

]



[heading Example]
  
Setting the IPPROTO\_TCP/TCP\_NODELAY option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::no_delay option(true);
   asio::error_code ec;
   socket.set_option(option, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]

[section:shutdown basic_raw_socket::shutdown]

[indexterm2 asio.indexterm.basic_raw_socket.shutdown..shutdown..basic_raw_socket] 
Disable sends or receives on the socket. 


  void ``[link asio.reference.basic_raw_socket.shutdown.overload1 shutdown]``(
      shutdown_type what);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.shutdown.overload1 more...]]``

  void ``[link asio.reference.basic_raw_socket.shutdown.overload2 shutdown]``(
      shutdown_type what,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.shutdown.overload2 more...]]``


[section:overload1 basic_raw_socket::shutdown (1 of 2 overloads)]


['Inherited from basic_socket.]


Disable sends or receives on the socket. 


  void shutdown(
      shutdown_type what);


This function is used to disable send operations, receive operations, or both.


[heading Parameters]
    

[variablelist
  
[[what][Determines what types of operation will no longer be allowed.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  
Shutting down the send side of the socket: 

   asio::ip::tcp::socket socket(my_context);
   ...
   socket.shutdown(asio::ip::tcp::socket::shutdown_send);







[endsect]



[section:overload2 basic_raw_socket::shutdown (2 of 2 overloads)]


['Inherited from basic_socket.]


Disable sends or receives on the socket. 


  void shutdown(
      shutdown_type what,
      asio::error_code & ec);


This function is used to disable send operations, receive operations, or both.


[heading Parameters]
    

[variablelist
  
[[what][Determines what types of operation will no longer be allowed.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  
Shutting down the send side of the socket: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   socket.shutdown(asio::ip::tcp::socket::shutdown_send, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:shutdown_type basic_raw_socket::shutdown_type]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_raw_socket.shutdown_type..shutdown_type..basic_raw_socket] 
Different ways a socket may be shutdown. 


  enum shutdown_type

[indexterm2 asio.indexterm.basic_raw_socket.shutdown_type.shutdown_receive..shutdown_receive..basic_raw_socket]
[indexterm2 asio.indexterm.basic_raw_socket.shutdown_type.shutdown_send..shutdown_send..basic_raw_socket]
[indexterm2 asio.indexterm.basic_raw_socket.shutdown_type.shutdown_both..shutdown_both..basic_raw_socket]

[heading Values]
[variablelist

  [
    [shutdown_receive]
    [Shutdown the receive side of the socket. ]
  ]

  [
    [shutdown_send]
    [Shutdown the send side of the socket. ]
  ]

  [
    [shutdown_both]
    [Shutdown both send and receive on the socket. ]
  ]

]



[endsect]


[section:wait basic_raw_socket::wait]

[indexterm2 asio.indexterm.basic_raw_socket.wait..wait..basic_raw_socket] 
Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  void ``[link asio.reference.basic_raw_socket.wait.overload1 wait]``(
      wait_type w);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.wait.overload1 more...]]``

  void ``[link asio.reference.basic_raw_socket.wait.overload2 wait]``(
      wait_type w,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.wait.overload2 more...]]``


[section:overload1 basic_raw_socket::wait (1 of 2 overloads)]


['Inherited from basic_socket.]


Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  void wait(
      wait_type w);


This function is used to perform a blocking wait for a socket to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired socket state.]]

]


[heading Example]
  
Waiting for a socket to become readable. 

   asio::ip::tcp::socket socket(my_context);
   ...
   socket.wait(asio::ip::tcp::socket::wait_read);







[endsect]



[section:overload2 basic_raw_socket::wait (2 of 2 overloads)]


['Inherited from basic_socket.]


Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  void wait(
      wait_type w,
      asio::error_code & ec);


This function is used to perform a blocking wait for a socket to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired socket state.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  
Waiting for a socket to become readable. 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   socket.wait(asio::ip::tcp::socket::wait_read, ec);







[endsect]


[endsect]


[section:wait_type basic_raw_socket::wait_type]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_raw_socket.wait_type..wait_type..basic_raw_socket] 
Wait types. 


  enum wait_type

[indexterm2 asio.indexterm.basic_raw_socket.wait_type.wait_read..wait_read..basic_raw_socket]
[indexterm2 asio.indexterm.basic_raw_socket.wait_type.wait_write..wait_write..basic_raw_socket]
[indexterm2 asio.indexterm.basic_raw_socket.wait_type.wait_error..wait_error..basic_raw_socket]

[heading Values]
[variablelist

  [
    [wait_read]
    [Wait for a socket to become ready to read. ]
  ]

  [
    [wait_write]
    [Wait for a socket to become ready to write. ]
  ]

  [
    [wait_error]
    [Wait for a socket to have error conditions pending. ]
  ]

]


For use with `basic_socket::wait()` and `basic_socket::async_wait()`. 


[endsect]



[section:_basic_raw_socket basic_raw_socket::~basic_raw_socket]

[indexterm2 asio.indexterm.basic_raw_socket._basic_raw_socket..~basic_raw_socket..basic_raw_socket] 
Destroys the socket. 


  ~basic_raw_socket();


This function destroys the socket, cancelling any outstanding asynchronous operations associated with the socket as if by calling `cancel`. 


[endsect]



[endsect]

[section:basic_raw_socket__rebind_executor basic_raw_socket::rebind_executor]


Rebinds the socket type to another executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  struct rebind_executor


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_raw_socket__rebind_executor.other [*other]]]
    [The socket type when rebound to the specified executor. ]
  
  ]

]

[heading Requirements]

['Header: ][^asio/basic_raw_socket.hpp]

['Convenience header: ][^asio.hpp]


[section:other basic_raw_socket::rebind_executor::other]

[indexterm2 asio.indexterm.basic_raw_socket__rebind_executor.other..other..basic_raw_socket::rebind_executor] 
The socket type when rebound to the specified executor. 


  typedef basic_raw_socket< Protocol, Executor1 > other;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_raw_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_raw_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_receive [*async_receive]]]
    [Start an asynchronous receive on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_receive_from [*async_receive_from]]]
    [Start an asynchronous receive. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_send [*async_send]]]
    [Start an asynchronous send on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_send_to [*async_send_to]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.basic_raw_socket [*basic_raw_socket]] [constructor]]
    [Construct a basic_raw_socket without opening it. 
     [hr]
     Construct and open a basic_raw_socket. 
     [hr]
     Construct a basic_raw_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_raw_socket on an existing native socket. 
     [hr]
     Move-construct a basic_raw_socket from another. 
     [hr]
     Move-construct a basic_raw_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_raw_socket from another. 
     [hr]
     Move-assign a basic_raw_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.receive [*receive]]]
    [Receive some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.receive_from [*receive_from]]]
    [Receive raw data with the endpoint of the sender. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.send [*send]]]
    [Send some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.send_to [*send_to]]]
    [Send raw data to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket._basic_raw_socket [*~basic_raw_socket]] [destructor]]
    [Destroys the socket. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_raw_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_raw_socket `basic_raw_socket`] class template provides asynchronous and blocking raw-oriented socket functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/basic_raw_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:basic_seq_packet_socket basic_seq_packet_socket]


Provides sequenced packet socket functionality. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``>
  class basic_seq_packet_socket :
    public basic_socket< Protocol, Executor >


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_seq_packet_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_seq_packet_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.async_receive [*async_receive]]]
    [Start an asynchronous receive. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.async_send [*async_send]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket [*basic_seq_packet_socket]] [constructor]]
    [Construct a basic_seq_packet_socket without opening it. 
     [hr]
     Construct and open a basic_seq_packet_socket. 
     [hr]
     Construct a basic_seq_packet_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_seq_packet_socket on an existing native socket. 
     [hr]
     Move-construct a basic_seq_packet_socket from another. 
     [hr]
     Move-construct a basic_seq_packet_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_seq_packet_socket from another. 
     [hr]
     Move-assign a basic_seq_packet_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.receive [*receive]]]
    [Receive some data on the socket. 
     [hr]
     Receive some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.send [*send]]]
    [Send some data on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket._basic_seq_packet_socket [*~basic_seq_packet_socket]] [destructor]]
    [Destroys the socket. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_seq_packet_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_seq_packet_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_seq_packet_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_seq_packet_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_seq_packet_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_seq_packet_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] class template provides asynchronous and blocking sequenced packet socket functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/basic_seq_packet_socket.hpp]

['Convenience header: ][^asio.hpp]

[section:assign basic_seq_packet_socket::assign]

[indexterm2 asio.indexterm.basic_seq_packet_socket.assign..assign..basic_seq_packet_socket] 
Assign an existing native socket to the socket. 


  void ``[link asio.reference.basic_seq_packet_socket.assign.overload1 assign]``(
      const protocol_type & protocol,
      const native_handle_type & native_socket);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.assign.overload1 more...]]``

  void ``[link asio.reference.basic_seq_packet_socket.assign.overload2 assign]``(
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.assign.overload2 more...]]``


[section:overload1 basic_seq_packet_socket::assign (1 of 2 overloads)]


['Inherited from basic_socket.]


Assign an existing native socket to the socket. 


  void assign(
      const protocol_type & protocol,
      const native_handle_type & native_socket);



[endsect]



[section:overload2 basic_seq_packet_socket::assign (2 of 2 overloads)]


['Inherited from basic_socket.]


Assign an existing native socket to the socket. 


  void assign(
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      asio::error_code & ec);



[endsect]


[endsect]


[section:async_connect basic_seq_packet_socket::async_connect]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.async_connect..async_connect..basic_seq_packet_socket] 
Start an asynchronous connect. 


  template<
      typename ``[link asio.reference.ConnectHandler ConnectHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_connect(
      const endpoint_type & peer_endpoint,
      ConnectHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously connect a socket to the specified remote endpoint. The function call always returns immediately.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.


[heading Parameters]
    

[variablelist
  
[[peer_endpoint][The remote endpoint to which the socket will be connected. Copies will be made of the endpoint object as required.]]

[[handler][The handler to be called when the connection operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error // Result of operation
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  


   void connect_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Connect succeeded.
     }
   }

   ...

   asio::ip::tcp::socket socket(my_context);
   asio::ip::tcp::endpoint endpoint(
       asio::ip::address::from_string("1.2.3.4"), 12345);
   socket.async_connect(endpoint, connect_handler);







[endsect]


[section:async_receive basic_seq_packet_socket::async_receive]

[indexterm2 asio.indexterm.basic_seq_packet_socket.async_receive..async_receive..basic_seq_packet_socket] 
Start an asynchronous receive. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_seq_packet_socket.async_receive.overload1 async_receive]``(
      const MutableBufferSequence & buffers,
      socket_base::message_flags & out_flags,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.async_receive.overload1 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_seq_packet_socket.async_receive.overload2 async_receive]``(
      const MutableBufferSequence & buffers,
      socket_base::message_flags in_flags,
      socket_base::message_flags & out_flags,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.async_receive.overload2 more...]]``


[section:overload1 basic_seq_packet_socket::async_receive (1 of 2 overloads)]


Start an asynchronous receive. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_receive(
      const MutableBufferSequence & buffers,
      socket_base::message_flags & out_flags,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously receive data from the sequenced packet socket. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[out_flags][Once the asynchronous operation completes, contains flags associated with the received data. For example, if the `socket_base::message_end_of_record` bit is set then the received data marks the end of a record. The caller must guarantee that the referenced variable remains valid until the handler is called.]]

[[handler][The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes received.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  
To receive into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.async_receive(asio::buffer(data, size), out_flags, handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_seq_packet_socket::async_receive (2 of 2 overloads)]


Start an asynchronous receive. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_receive(
      const MutableBufferSequence & buffers,
      socket_base::message_flags in_flags,
      socket_base::message_flags & out_flags,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously receive data from the sequenced data socket. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[in_flags][Flags specifying how the receive call is to be made.]]

[[out_flags][Once the asynchronous operation completes, contains flags associated with the received data. For example, if the `socket_base::message_end_of_record` bit is set then the received data marks the end of a record. The caller must guarantee that the referenced variable remains valid until the handler is called.]]

[[handler][The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes received.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  
To receive into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.async_receive(
       asio::buffer(data, size),
       0, out_flags, handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]


[endsect]


[section:async_send basic_seq_packet_socket::async_send]

[indexterm2 asio.indexterm.basic_seq_packet_socket.async_send..async_send..basic_seq_packet_socket] 
Start an asynchronous send. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_send(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously send data on the sequenced packet socket. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent on the socket. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[flags][Flags specifying how the send call is to be made.]]

[[handler][The handler to be called when the send operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes sent.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  
To send a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.async_send(asio::buffer(data, size), 0, handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:async_wait basic_seq_packet_socket::async_wait]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.async_wait..async_wait..basic_seq_packet_socket] 
Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  template<
      typename ``[link asio.reference.WaitHandler WaitHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_wait(
      wait_type w,
      WaitHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to perform an asynchronous wait for a socket to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired socket state.]]

[[handler][The handler to be called when the wait operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error // Result of operation
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  


   void wait_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Wait succeeded.
     }
   }

   ...

   asio::ip::tcp::socket socket(my_context);
   ...
   socket.async_wait(asio::ip::tcp::socket::wait_read, wait_handler);







[endsect]


[section:at_mark basic_seq_packet_socket::at_mark]

[indexterm2 asio.indexterm.basic_seq_packet_socket.at_mark..at_mark..basic_seq_packet_socket] 
Determine whether the socket is at the out-of-band data mark. 


  bool ``[link asio.reference.basic_seq_packet_socket.at_mark.overload1 at_mark]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.at_mark.overload1 more...]]``

  bool ``[link asio.reference.basic_seq_packet_socket.at_mark.overload2 at_mark]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.at_mark.overload2 more...]]``


[section:overload1 basic_seq_packet_socket::at_mark (1 of 2 overloads)]


['Inherited from basic_socket.]


Determine whether the socket is at the out-of-band data mark. 


  bool at_mark() const;


This function is used to check whether the socket input is currently positioned at the out-of-band data mark.


[heading Return Value]
      
A bool indicating whether the socket is at the out-of-band data mark.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 basic_seq_packet_socket::at_mark (2 of 2 overloads)]


['Inherited from basic_socket.]


Determine whether the socket is at the out-of-band data mark. 


  bool at_mark(
      asio::error_code & ec) const;


This function is used to check whether the socket input is currently positioned at the out-of-band data mark.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
A bool indicating whether the socket is at the out-of-band data mark. 




[endsect]


[endsect]

[section:available basic_seq_packet_socket::available]

[indexterm2 asio.indexterm.basic_seq_packet_socket.available..available..basic_seq_packet_socket] 
Determine the number of bytes available for reading. 


  std::size_t ``[link asio.reference.basic_seq_packet_socket.available.overload1 available]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.available.overload1 more...]]``

  std::size_t ``[link asio.reference.basic_seq_packet_socket.available.overload2 available]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.available.overload2 more...]]``


[section:overload1 basic_seq_packet_socket::available (1 of 2 overloads)]


['Inherited from basic_socket.]


Determine the number of bytes available for reading. 


  std::size_t available() const;


This function is used to determine the number of bytes that may be read without blocking.


[heading Return Value]
      
The number of bytes that may be read without blocking, or 0 if an error occurs.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 basic_seq_packet_socket::available (2 of 2 overloads)]


['Inherited from basic_socket.]


Determine the number of bytes available for reading. 


  std::size_t available(
      asio::error_code & ec) const;


This function is used to determine the number of bytes that may be read without blocking.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes that may be read without blocking, or 0 if an error occurs. 




[endsect]


[endsect]

[section:basic_seq_packet_socket basic_seq_packet_socket::basic_seq_packet_socket]

[indexterm2 asio.indexterm.basic_seq_packet_socket.basic_seq_packet_socket..basic_seq_packet_socket..basic_seq_packet_socket] 
Construct a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] without opening it. 


  explicit ``[link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload1 basic_seq_packet_socket]``(
      const executor_type & ex);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload1 more...]]``

  template<
      typename ExecutionContext>
  explicit ``[link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload2 basic_seq_packet_socket]``(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload2 more...]]``


Construct and open a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`]. 


  ``[link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload3 basic_seq_packet_socket]``(
      const executor_type & ex,
      const protocol_type & protocol);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload3 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload4 basic_seq_packet_socket]``(
      ExecutionContext & context,
      const protocol_type & protocol,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload4 more...]]``


Construct a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`], opening it and binding it to the given local endpoint. 


  ``[link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload5 basic_seq_packet_socket]``(
      const executor_type & ex,
      const endpoint_type & endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload5 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload6 basic_seq_packet_socket]``(
      ExecutionContext & context,
      const endpoint_type & endpoint,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload6 more...]]``


Construct a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] on an existing native socket. 


  ``[link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload7 basic_seq_packet_socket]``(
      const executor_type & ex,
      const protocol_type & protocol,
      const native_handle_type & native_socket);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload7 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload8 basic_seq_packet_socket]``(
      ExecutionContext & context,
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload8 more...]]``


Move-construct a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] from another. 


  ``[link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload9 basic_seq_packet_socket]``(
      basic_seq_packet_socket && other);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload9 more...]]``


Move-construct a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] from a socket of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  ``[link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload10 basic_seq_packet_socket]``(
      basic_seq_packet_socket< Protocol1, Executor1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload10 more...]]``


[section:overload1 basic_seq_packet_socket::basic_seq_packet_socket (1 of 10 overloads)]


Construct a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] without opening it. 


  basic_seq_packet_socket(
      const executor_type & ex);


This constructor creates a sequenced packet socket without opening it. The socket needs to be opened and then connected or accepted before data can be sent or received on it.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket. ]]

]




[endsect]



[section:overload2 basic_seq_packet_socket::basic_seq_packet_socket (2 of 10 overloads)]


Construct a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] without opening it. 


  template<
      typename ExecutionContext>
  basic_seq_packet_socket(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a sequenced packet socket without opening it. The socket needs to be opened and then connected or accepted before data can be sent or received on it.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket. ]]

]




[endsect]



[section:overload3 basic_seq_packet_socket::basic_seq_packet_socket (3 of 10 overloads)]


Construct and open a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`]. 


  basic_seq_packet_socket(
      const executor_type & ex,
      const protocol_type & protocol);


This constructor creates and opens a sequenced\_packet socket. The socket needs to be connected or accepted before data can be sent or received on it.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[protocol][An object specifying protocol parameters to be used.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload4 basic_seq_packet_socket::basic_seq_packet_socket (4 of 10 overloads)]


Construct and open a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`]. 


  template<
      typename ExecutionContext>
  basic_seq_packet_socket(
      ExecutionContext & context,
      const protocol_type & protocol,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates and opens a sequenced\_packet socket. The socket needs to be connected or accepted before data can be sent or received on it.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[protocol][An object specifying protocol parameters to be used.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload5 basic_seq_packet_socket::basic_seq_packet_socket (5 of 10 overloads)]


Construct a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`], opening it and binding it to the given local endpoint. 


  basic_seq_packet_socket(
      const executor_type & ex,
      const endpoint_type & endpoint);


This constructor creates a sequenced packet socket and automatically opens it bound to the specified endpoint on the local machine. The protocol used is the protocol associated with the given endpoint.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[endpoint][An endpoint on the local machine to which the sequenced packet socket will be bound.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload6 basic_seq_packet_socket::basic_seq_packet_socket (6 of 10 overloads)]


Construct a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`], opening it and binding it to the given local endpoint. 


  template<
      typename ExecutionContext>
  basic_seq_packet_socket(
      ExecutionContext & context,
      const endpoint_type & endpoint,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a sequenced packet socket and automatically opens it bound to the specified endpoint on the local machine. The protocol used is the protocol associated with the given endpoint.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[endpoint][An endpoint on the local machine to which the sequenced packet socket will be bound.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload7 basic_seq_packet_socket::basic_seq_packet_socket (7 of 10 overloads)]


Construct a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] on an existing native socket. 


  basic_seq_packet_socket(
      const executor_type & ex,
      const protocol_type & protocol,
      const native_handle_type & native_socket);


This constructor creates a sequenced packet socket object to hold an existing native socket.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[protocol][An object specifying protocol parameters to be used.]]

[[native_socket][The new underlying socket implementation.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload8 basic_seq_packet_socket::basic_seq_packet_socket (8 of 10 overloads)]


Construct a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] on an existing native socket. 


  template<
      typename ExecutionContext>
  basic_seq_packet_socket(
      ExecutionContext & context,
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a sequenced packet socket object to hold an existing native socket.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[protocol][An object specifying protocol parameters to be used.]]

[[native_socket][The new underlying socket implementation.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload9 basic_seq_packet_socket::basic_seq_packet_socket (9 of 10 overloads)]


Move-construct a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] from another. 


  basic_seq_packet_socket(
      basic_seq_packet_socket && other);


This constructor moves a sequenced packet socket from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_seq_packet_socket(const executor_type&)` constructor. 




[endsect]



[section:overload10 basic_seq_packet_socket::basic_seq_packet_socket (10 of 10 overloads)]


Move-construct a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] from a socket of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  basic_seq_packet_socket(
      basic_seq_packet_socket< Protocol1, Executor1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value >::type *  = 0);


This constructor moves a sequenced packet socket from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_seq_packet_socket(const executor_type&)` constructor. 




[endsect]


[endsect]

[section:bind basic_seq_packet_socket::bind]

[indexterm2 asio.indexterm.basic_seq_packet_socket.bind..bind..basic_seq_packet_socket] 
Bind the socket to the given local endpoint. 


  void ``[link asio.reference.basic_seq_packet_socket.bind.overload1 bind]``(
      const endpoint_type & endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.bind.overload1 more...]]``

  void ``[link asio.reference.basic_seq_packet_socket.bind.overload2 bind]``(
      const endpoint_type & endpoint,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.bind.overload2 more...]]``


[section:overload1 basic_seq_packet_socket::bind (1 of 2 overloads)]


['Inherited from basic_socket.]


Bind the socket to the given local endpoint. 


  void bind(
      const endpoint_type & endpoint);


This function binds the socket to the specified endpoint on the local machine.


[heading Parameters]
    

[variablelist
  
[[endpoint][An endpoint on the local machine to which the socket will be bound.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   socket.open(asio::ip::tcp::v4());
   socket.bind(asio::ip::tcp::endpoint(
         asio::ip::tcp::v4(), 12345));







[endsect]



[section:overload2 basic_seq_packet_socket::bind (2 of 2 overloads)]


['Inherited from basic_socket.]


Bind the socket to the given local endpoint. 


  void bind(
      const endpoint_type & endpoint,
      asio::error_code & ec);


This function binds the socket to the specified endpoint on the local machine.


[heading Parameters]
    

[variablelist
  
[[endpoint][An endpoint on the local machine to which the socket will be bound.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   socket.open(asio::ip::tcp::v4());
   asio::error_code ec;
   socket.bind(asio::ip::tcp::endpoint(
         asio::ip::tcp::v4(), 12345), ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:broadcast basic_seq_packet_socket::broadcast]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.broadcast..broadcast..basic_seq_packet_socket] 
Socket option to permit sending of broadcast messages. 


  typedef implementation_defined broadcast;



Implements the SOL\_SOCKET/SO\_BROADCAST socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::broadcast option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::broadcast option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_seq_packet_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:bytes_readable basic_seq_packet_socket::bytes_readable]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.bytes_readable..bytes_readable..basic_seq_packet_socket] 
IO control command to get the amount of data that can be read without blocking. 


  typedef implementation_defined bytes_readable;



Implements the FIONREAD IO control command.


[heading Example]
  


   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();







[heading Requirements]

['Header: ][^asio/basic_seq_packet_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:cancel basic_seq_packet_socket::cancel]

[indexterm2 asio.indexterm.basic_seq_packet_socket.cancel..cancel..basic_seq_packet_socket] 
Cancel all asynchronous operations associated with the socket. 


  void ``[link asio.reference.basic_seq_packet_socket.cancel.overload1 cancel]``();
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.cancel.overload1 more...]]``

  void ``[link asio.reference.basic_seq_packet_socket.cancel.overload2 cancel]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.cancel.overload2 more...]]``


[section:overload1 basic_seq_packet_socket::cancel (1 of 2 overloads)]


['Inherited from basic_socket.]


Cancel all asynchronous operations associated with the socket. 


  void cancel();


This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls to `cancel()` will always fail with `asio::error::operation_not_supported` when run on Windows XP, Windows Server 2003, and earlier versions of Windows, unless ASIO\_ENABLE\_CANCELIO is defined. However, the CancelIo function has two issues that should be considered before enabling its use:


* It will only cancel asynchronous operations that were initiated in the current thread.


* It can appear to complete without error, but the request to cancel the unfinished operations may be silently ignored by the operating system. Whether it works or not seems to depend on the drivers that are installed.

For portable cancellation, consider using one of the following alternatives:


* Disable asio's I/O completion port backend by defining ASIO\_DISABLE\_IOCP.


* Use the `close()` function to simultaneously cancel the outstanding operations and close the socket.

When running on Windows Vista, Windows Server 2008, and later, the CancelIoEx function is always used. This function does not have the problems described above. 


[endsect]



[section:overload2 basic_seq_packet_socket::cancel (2 of 2 overloads)]


['Inherited from basic_socket.]


Cancel all asynchronous operations associated with the socket. 


  void cancel(
      asio::error_code & ec);


This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls to `cancel()` will always fail with `asio::error::operation_not_supported` when run on Windows XP, Windows Server 2003, and earlier versions of Windows, unless ASIO\_ENABLE\_CANCELIO is defined. However, the CancelIo function has two issues that should be considered before enabling its use:


* It will only cancel asynchronous operations that were initiated in the current thread.


* It can appear to complete without error, but the request to cancel the unfinished operations may be silently ignored by the operating system. Whether it works or not seems to depend on the drivers that are installed.

For portable cancellation, consider using one of the following alternatives:


* Disable asio's I/O completion port backend by defining ASIO\_DISABLE\_IOCP.


* Use the `close()` function to simultaneously cancel the outstanding operations and close the socket.

When running on Windows Vista, Windows Server 2008, and later, the CancelIoEx function is always used. This function does not have the problems described above. 


[endsect]


[endsect]

[section:close basic_seq_packet_socket::close]

[indexterm2 asio.indexterm.basic_seq_packet_socket.close..close..basic_seq_packet_socket] 
Close the socket. 


  void ``[link asio.reference.basic_seq_packet_socket.close.overload1 close]``();
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.close.overload1 more...]]``

  void ``[link asio.reference.basic_seq_packet_socket.close.overload2 close]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.close.overload2 more...]]``


[section:overload1 basic_seq_packet_socket::close (1 of 2 overloads)]


['Inherited from basic_socket.]


Close the socket. 


  void close();


This function is used to close the socket. Any asynchronous send, receive or connect operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed.]]

]


[heading Remarks]
      
For portable behaviour with respect to graceful closure of a connected socket, call `shutdown()` before closing the socket. 




[endsect]



[section:overload2 basic_seq_packet_socket::close (2 of 2 overloads)]


['Inherited from basic_socket.]


Close the socket. 


  void close(
      asio::error_code & ec);


This function is used to close the socket. Any asynchronous send, receive or connect operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   socket.close(ec);
   if (ec)
   {
     // An error occurred.
   }





[heading Remarks]
      
For portable behaviour with respect to graceful closure of a connected socket, call `shutdown()` before closing the socket. 




[endsect]


[endsect]

[section:connect basic_seq_packet_socket::connect]

[indexterm2 asio.indexterm.basic_seq_packet_socket.connect..connect..basic_seq_packet_socket] 
Connect the socket to the specified endpoint. 


  void ``[link asio.reference.basic_seq_packet_socket.connect.overload1 connect]``(
      const endpoint_type & peer_endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.connect.overload1 more...]]``

  void ``[link asio.reference.basic_seq_packet_socket.connect.overload2 connect]``(
      const endpoint_type & peer_endpoint,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.connect.overload2 more...]]``


[section:overload1 basic_seq_packet_socket::connect (1 of 2 overloads)]


['Inherited from basic_socket.]


Connect the socket to the specified endpoint. 


  void connect(
      const endpoint_type & peer_endpoint);


This function is used to connect a socket to the specified remote endpoint. The function call will block until the connection is successfully made or an error occurs.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.


[heading Parameters]
    

[variablelist
  
[[peer_endpoint][The remote endpoint to which the socket will be connected.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   asio::ip::tcp::endpoint endpoint(
       asio::ip::address::from_string("1.2.3.4"), 12345);
   socket.connect(endpoint);







[endsect]



[section:overload2 basic_seq_packet_socket::connect (2 of 2 overloads)]


['Inherited from basic_socket.]


Connect the socket to the specified endpoint. 


  void connect(
      const endpoint_type & peer_endpoint,
      asio::error_code & ec);


This function is used to connect a socket to the specified remote endpoint. The function call will block until the connection is successfully made or an error occurs.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.


[heading Parameters]
    

[variablelist
  
[[peer_endpoint][The remote endpoint to which the socket will be connected.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   asio::ip::tcp::endpoint endpoint(
       asio::ip::address::from_string("1.2.3.4"), 12345);
   asio::error_code ec;
   socket.connect(endpoint, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:debug basic_seq_packet_socket::debug]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.debug..debug..basic_seq_packet_socket] 
Socket option to enable socket-level debugging. 


  typedef implementation_defined debug;



Implements the SOL\_SOCKET/SO\_DEBUG socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::debug option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::debug option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_seq_packet_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:do_not_route basic_seq_packet_socket::do_not_route]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.do_not_route..do_not_route..basic_seq_packet_socket] 
Socket option to prevent routing, use local interfaces only. 


  typedef implementation_defined do_not_route;



Implements the SOL\_SOCKET/SO\_DONTROUTE socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::do_not_route option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::do_not_route option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_seq_packet_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:enable_connection_aborted basic_seq_packet_socket::enable_connection_aborted]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.enable_connection_aborted..enable_connection_aborted..basic_seq_packet_socket] 
Socket option to report aborted connections on accept. 


  typedef implementation_defined enable_connection_aborted;



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.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::enable_connection_aborted option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::enable_connection_aborted option;
   acceptor.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_seq_packet_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:endpoint_type basic_seq_packet_socket::endpoint_type]

[indexterm2 asio.indexterm.basic_seq_packet_socket.endpoint_type..endpoint_type..basic_seq_packet_socket] 
The endpoint type. 


  typedef Protocol::endpoint endpoint_type;



[heading Requirements]

['Header: ][^asio/basic_seq_packet_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:executor_type basic_seq_packet_socket::executor_type]

[indexterm2 asio.indexterm.basic_seq_packet_socket.executor_type..executor_type..basic_seq_packet_socket] 
The type of the executor associated with the object. 


  typedef Executor executor_type;



[heading Requirements]

['Header: ][^asio/basic_seq_packet_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:get_executor basic_seq_packet_socket::get_executor]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.get_executor..get_executor..basic_seq_packet_socket] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_option basic_seq_packet_socket::get_option]

[indexterm2 asio.indexterm.basic_seq_packet_socket.get_option..get_option..basic_seq_packet_socket] 
Get an option from the socket. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void ``[link asio.reference.basic_seq_packet_socket.get_option.overload1 get_option]``(
      GettableSocketOption & option) const;
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.get_option.overload1 more...]]``

  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void ``[link asio.reference.basic_seq_packet_socket.get_option.overload2 get_option]``(
      GettableSocketOption & option,
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.get_option.overload2 more...]]``


[section:overload1 basic_seq_packet_socket::get_option (1 of 2 overloads)]


['Inherited from basic_socket.]


Get an option from the socket. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void get_option(
      GettableSocketOption & option) const;


This function is used to get the current value of an option on the socket.


[heading Parameters]
    

[variablelist
  
[[option][The option value to be obtained from the socket.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]



[heading Example]
  
Getting the value of the SOL\_SOCKET/SO\_KEEPALIVE option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::socket::keep_alive option;
   socket.get_option(option);
   bool is_set = option.value();







[endsect]



[section:overload2 basic_seq_packet_socket::get_option (2 of 2 overloads)]


['Inherited from basic_socket.]


Get an option from the socket. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void get_option(
      GettableSocketOption & option,
      asio::error_code & ec) const;


This function is used to get the current value of an option on the socket.


[heading Parameters]
    

[variablelist
  
[[option][The option value to be obtained from the socket.]]

[[ec][Set to indicate what error occurred, if any.]]

]



[heading Example]
  
Getting the value of the SOL\_SOCKET/SO\_KEEPALIVE option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::socket::keep_alive option;
   asio::error_code ec;
   socket.get_option(option, ec);
   if (ec)
   {
     // An error occurred.
   }
   bool is_set = option.value();







[endsect]


[endsect]

[section:io_control basic_seq_packet_socket::io_control]

[indexterm2 asio.indexterm.basic_seq_packet_socket.io_control..io_control..basic_seq_packet_socket] 
Perform an IO control command on the socket. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void ``[link asio.reference.basic_seq_packet_socket.io_control.overload1 io_control]``(
      IoControlCommand & command);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.io_control.overload1 more...]]``

  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void ``[link asio.reference.basic_seq_packet_socket.io_control.overload2 io_control]``(
      IoControlCommand & command,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.io_control.overload2 more...]]``


[section:overload1 basic_seq_packet_socket::io_control (1 of 2 overloads)]


['Inherited from basic_socket.]


Perform an IO control command on the socket. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void io_control(
      IoControlCommand & command);


This function is used to execute an IO control command on the socket.


[heading Parameters]
    

[variablelist
  
[[command][The IO control command to be performed on the socket.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]



[heading Example]
  
Getting the number of bytes ready to read: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::socket::bytes_readable command;
   socket.io_control(command);
   std::size_t bytes_readable = command.get();







[endsect]



[section:overload2 basic_seq_packet_socket::io_control (2 of 2 overloads)]


['Inherited from basic_socket.]


Perform an IO control command on the socket. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void io_control(
      IoControlCommand & command,
      asio::error_code & ec);


This function is used to execute an IO control command on the socket.


[heading Parameters]
    

[variablelist
  
[[command][The IO control command to be performed on the socket.]]

[[ec][Set to indicate what error occurred, if any.]]

]



[heading Example]
  
Getting the number of bytes ready to read: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::socket::bytes_readable command;
   asio::error_code ec;
   socket.io_control(command, ec);
   if (ec)
   {
     // An error occurred.
   }
   std::size_t bytes_readable = command.get();







[endsect]


[endsect]


[section:is_open basic_seq_packet_socket::is_open]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.is_open..is_open..basic_seq_packet_socket] 
Determine whether the socket is open. 


  bool is_open() const;



[endsect]



[section:keep_alive basic_seq_packet_socket::keep_alive]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.keep_alive..keep_alive..basic_seq_packet_socket] 
Socket option to send keep-alives. 


  typedef implementation_defined keep_alive;



Implements the SOL\_SOCKET/SO\_KEEPALIVE socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::keep_alive option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::keep_alive option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_seq_packet_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:linger basic_seq_packet_socket::linger]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.linger..linger..basic_seq_packet_socket] 
Socket option to specify whether the socket lingers on close if unsent data is present. 


  typedef implementation_defined linger;



Implements the SOL\_SOCKET/SO\_LINGER socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::linger option(true, 30);
   socket.set_option(option);





Getting the current option value: 

   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();







[heading Requirements]

['Header: ][^asio/basic_seq_packet_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:local_endpoint basic_seq_packet_socket::local_endpoint]

[indexterm2 asio.indexterm.basic_seq_packet_socket.local_endpoint..local_endpoint..basic_seq_packet_socket] 
Get the local endpoint of the socket. 


  endpoint_type ``[link asio.reference.basic_seq_packet_socket.local_endpoint.overload1 local_endpoint]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.local_endpoint.overload1 more...]]``

  endpoint_type ``[link asio.reference.basic_seq_packet_socket.local_endpoint.overload2 local_endpoint]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.local_endpoint.overload2 more...]]``


[section:overload1 basic_seq_packet_socket::local_endpoint (1 of 2 overloads)]


['Inherited from basic_socket.]


Get the local endpoint of the socket. 


  endpoint_type local_endpoint() const;


This function is used to obtain the locally bound endpoint of the socket.


[heading Return Value]
      
An object that represents the local endpoint of the socket.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::endpoint endpoint = socket.local_endpoint();







[endsect]



[section:overload2 basic_seq_packet_socket::local_endpoint (2 of 2 overloads)]


['Inherited from basic_socket.]


Get the local endpoint of the socket. 


  endpoint_type local_endpoint(
      asio::error_code & ec) const;


This function is used to obtain the locally bound endpoint of the socket.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
An object that represents the local endpoint of the socket. Returns a default-constructed endpoint object if an error occurred.


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   asio::ip::tcp::endpoint endpoint = socket.local_endpoint(ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]

[section:lowest_layer basic_seq_packet_socket::lowest_layer]

[indexterm2 asio.indexterm.basic_seq_packet_socket.lowest_layer..lowest_layer..basic_seq_packet_socket] 
Get a reference to the lowest layer. 


  lowest_layer_type & ``[link asio.reference.basic_seq_packet_socket.lowest_layer.overload1 lowest_layer]``();
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.lowest_layer.overload1 more...]]``


Get a const reference to the lowest layer. 


  const lowest_layer_type & ``[link asio.reference.basic_seq_packet_socket.lowest_layer.overload2 lowest_layer]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.lowest_layer.overload2 more...]]``


[section:overload1 basic_seq_packet_socket::lowest_layer (1 of 2 overloads)]


['Inherited from basic_socket.]


Get a reference to the lowest layer. 


  lowest_layer_type & lowest_layer();


This function returns a reference to the lowest layer in a stack of layers. Since a [link asio.reference.basic_socket `basic_socket`] cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]



[section:overload2 basic_seq_packet_socket::lowest_layer (2 of 2 overloads)]


['Inherited from basic_socket.]


Get a const reference to the lowest layer. 


  const lowest_layer_type & lowest_layer() const;


This function returns a const reference to the lowest layer in a stack of layers. Since a [link asio.reference.basic_socket `basic_socket`] cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]


[endsect]


[section:lowest_layer_type basic_seq_packet_socket::lowest_layer_type]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.lowest_layer_type..lowest_layer_type..basic_seq_packet_socket] 
A [link asio.reference.basic_socket `basic_socket`] is always the lowest layer. 


  typedef basic_socket< Protocol, Executor > lowest_layer_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_socket.basic_socket [*basic_socket]] [constructor]]
    [Construct a basic_socket without opening it. 
     [hr]
     Construct and open a basic_socket. 
     [hr]
     Construct a basic_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_socket on an existing native socket. 
     [hr]
     Move-construct a basic_socket from another. 
     [hr]
     Move-construct a basic_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_socket from another. 
     [hr]
     Move-assign a basic_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket._basic_socket [*~basic_socket]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_socket `basic_socket`] class template provides functionality that is common to both stream-oriented and datagram-oriented sockets.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/basic_seq_packet_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:max_connections basic_seq_packet_socket::max_connections]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.max_connections..max_connections..basic_seq_packet_socket] 
(Deprecated: Use max\_listen\_connections.) The maximum length of the queue of pending incoming connections. 


  static const int max_connections = implementation_defined;



[endsect]



[section:max_listen_connections basic_seq_packet_socket::max_listen_connections]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.max_listen_connections..max_listen_connections..basic_seq_packet_socket] 
The maximum length of the queue of pending incoming connections. 


  static const int max_listen_connections = implementation_defined;



[endsect]



[section:message_do_not_route basic_seq_packet_socket::message_do_not_route]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.message_do_not_route..message_do_not_route..basic_seq_packet_socket] 
Specify that the data should not be subject to routing. 


  static const int message_do_not_route = implementation_defined;



[endsect]



[section:message_end_of_record basic_seq_packet_socket::message_end_of_record]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.message_end_of_record..message_end_of_record..basic_seq_packet_socket] 
Specifies that the data marks the end of a record. 


  static const int message_end_of_record = implementation_defined;



[endsect]



[section:message_flags basic_seq_packet_socket::message_flags]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.message_flags..message_flags..basic_seq_packet_socket] 
Bitmask type for flags that can be passed to send and receive operations. 


  typedef int message_flags;



[heading Requirements]

['Header: ][^asio/basic_seq_packet_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:message_out_of_band basic_seq_packet_socket::message_out_of_band]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.message_out_of_band..message_out_of_band..basic_seq_packet_socket] 
Process out-of-band data. 


  static const int message_out_of_band = implementation_defined;



[endsect]



[section:message_peek basic_seq_packet_socket::message_peek]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.message_peek..message_peek..basic_seq_packet_socket] 
Peek at incoming data without removing it from the input queue. 


  static const int message_peek = implementation_defined;



[endsect]



[section:native_handle basic_seq_packet_socket::native_handle]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.native_handle..native_handle..basic_seq_packet_socket] 
Get the native socket representation. 


  native_handle_type native_handle();


This function may be used to obtain the underlying representation of the socket. This is intended to allow access to native socket functionality that is not otherwise provided. 


[endsect]



[section:native_handle_type basic_seq_packet_socket::native_handle_type]

[indexterm2 asio.indexterm.basic_seq_packet_socket.native_handle_type..native_handle_type..basic_seq_packet_socket] 
The native representation of a socket. 


  typedef implementation_defined native_handle_type;



[heading Requirements]

['Header: ][^asio/basic_seq_packet_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:native_non_blocking basic_seq_packet_socket::native_non_blocking]

[indexterm2 asio.indexterm.basic_seq_packet_socket.native_non_blocking..native_non_blocking..basic_seq_packet_socket] 
Gets the non-blocking mode of the native socket implementation. 


  bool ``[link asio.reference.basic_seq_packet_socket.native_non_blocking.overload1 native_non_blocking]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.native_non_blocking.overload1 more...]]``


Sets the non-blocking mode of the native socket implementation. 


  void ``[link asio.reference.basic_seq_packet_socket.native_non_blocking.overload2 native_non_blocking]``(
      bool mode);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.native_non_blocking.overload2 more...]]``

  void ``[link asio.reference.basic_seq_packet_socket.native_non_blocking.overload3 native_non_blocking]``(
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.native_non_blocking.overload3 more...]]``


[section:overload1 basic_seq_packet_socket::native_non_blocking (1 of 3 overloads)]


['Inherited from basic_socket.]


Gets the non-blocking mode of the native socket implementation. 


  bool native_non_blocking() const;


This function is used to retrieve the non-blocking mode of the underlying native socket. This mode has no effect on the behaviour of the socket object's synchronous operations.


[heading Return Value]
      
`true` if the underlying socket is in non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).


[heading Remarks]
      
The current non-blocking mode is cached by the socket object. Consequently, the return value may be incorrect if the non-blocking mode was set directly on the native socket.


[heading Example]
  
This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's `sendfile` system call might be encapsulated: 

   template <typename Handler>
   struct sendfile_op
   {
     tcp::socket& sock_;
     int fd_;
     Handler handler_;
     off_t offset_;
     std::size_t total_bytes_transferred_;

     // Function call operator meeting WriteHandler requirements.
     // Used as the handler for the async_write_some operation.
     void operator()(asio::error_code ec, std::size_t)
     {
       // Put the underlying socket into non-blocking mode.
       if (!ec)
         if (!sock_.native_non_blocking())
           sock_.native_non_blocking(true, ec);

       if (!ec)
       {
         for (;;)
         {
           // Try the system call.
           errno = 0;
           int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
           ec = asio::error_code(n < 0 ? errno : 0,
               asio::error::get_system_category());
           total_bytes_transferred_ += ec ? 0 : n;

           // Retry operation immediately if interrupted by signal.
           if (ec == asio::error::interrupted)
             continue;

           // Check if we need to run the operation again.
           if (ec == asio::error::would_block
               || ec == asio::error::try_again)
           {
             // We have to wait for the socket to become ready again.
             sock_.async_wait(tcp::socket::wait_write, *this);
             return;
           }

           if (ec || n == 0)
           {
             // An error occurred, or we have reached the end of the file.
             // Either way we must exit the loop so we can call the handler.
             break;
           }

           // Loop around to try calling sendfile again.
         }
       }

       // Pass result back to user's handler.
       handler_(ec, total_bytes_transferred_);
     }
   };

   template <typename Handler>
   void async_sendfile(tcp::socket& sock, int fd, Handler h)
   {
     sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
     sock.async_wait(tcp::socket::wait_write, op);
   } 







[endsect]



[section:overload2 basic_seq_packet_socket::native_non_blocking (2 of 3 overloads)]


['Inherited from basic_socket.]


Sets the non-blocking mode of the native socket implementation. 


  void native_non_blocking(
      bool mode);


This function is used to modify the non-blocking mode of the underlying native socket. It has no effect on the behaviour of the socket object's synchronous operations.


[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the underlying socket is put into non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. If the `mode` is `false`, but the current value of `non_blocking()` is `true`, this function fails with `asio::error::invalid_argument`, as the combination does not make sense.]]

]


[heading Example]
  
This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's `sendfile` system call might be encapsulated: 

   template <typename Handler>
   struct sendfile_op
   {
     tcp::socket& sock_;
     int fd_;
     Handler handler_;
     off_t offset_;
     std::size_t total_bytes_transferred_;

     // Function call operator meeting WriteHandler requirements.
     // Used as the handler for the async_write_some operation.
     void operator()(asio::error_code ec, std::size_t)
     {
       // Put the underlying socket into non-blocking mode.
       if (!ec)
         if (!sock_.native_non_blocking())
           sock_.native_non_blocking(true, ec);

       if (!ec)
       {
         for (;;)
         {
           // Try the system call.
           errno = 0;
           int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
           ec = asio::error_code(n < 0 ? errno : 0,
               asio::error::get_system_category());
           total_bytes_transferred_ += ec ? 0 : n;

           // Retry operation immediately if interrupted by signal.
           if (ec == asio::error::interrupted)
             continue;

           // Check if we need to run the operation again.
           if (ec == asio::error::would_block
               || ec == asio::error::try_again)
           {
             // We have to wait for the socket to become ready again.
             sock_.async_wait(tcp::socket::wait_write, *this);
             return;
           }

           if (ec || n == 0)
           {
             // An error occurred, or we have reached the end of the file.
             // Either way we must exit the loop so we can call the handler.
             break;
           }

           // Loop around to try calling sendfile again.
         }
       }

       // Pass result back to user's handler.
       handler_(ec, total_bytes_transferred_);
     }
   };

   template <typename Handler>
   void async_sendfile(tcp::socket& sock, int fd, Handler h)
   {
     sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
     sock.async_wait(tcp::socket::wait_write, op);
   } 







[endsect]



[section:overload3 basic_seq_packet_socket::native_non_blocking (3 of 3 overloads)]


['Inherited from basic_socket.]


Sets the non-blocking mode of the native socket implementation. 


  void native_non_blocking(
      bool mode,
      asio::error_code & ec);


This function is used to modify the non-blocking mode of the underlying native socket. It has no effect on the behaviour of the socket object's synchronous operations.


[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the underlying socket is put into non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).]]

[[ec][Set to indicate what error occurred, if any. If the `mode` is `false`, but the current value of `non_blocking()` is `true`, this function fails with `asio::error::invalid_argument`, as the combination does not make sense.]]

]


[heading Example]
  
This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's `sendfile` system call might be encapsulated: 

   template <typename Handler>
   struct sendfile_op
   {
     tcp::socket& sock_;
     int fd_;
     Handler handler_;
     off_t offset_;
     std::size_t total_bytes_transferred_;

     // Function call operator meeting WriteHandler requirements.
     // Used as the handler for the async_write_some operation.
     void operator()(asio::error_code ec, std::size_t)
     {
       // Put the underlying socket into non-blocking mode.
       if (!ec)
         if (!sock_.native_non_blocking())
           sock_.native_non_blocking(true, ec);

       if (!ec)
       {
         for (;;)
         {
           // Try the system call.
           errno = 0;
           int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
           ec = asio::error_code(n < 0 ? errno : 0,
               asio::error::get_system_category());
           total_bytes_transferred_ += ec ? 0 : n;

           // Retry operation immediately if interrupted by signal.
           if (ec == asio::error::interrupted)
             continue;

           // Check if we need to run the operation again.
           if (ec == asio::error::would_block
               || ec == asio::error::try_again)
           {
             // We have to wait for the socket to become ready again.
             sock_.async_wait(tcp::socket::wait_write, *this);
             return;
           }

           if (ec || n == 0)
           {
             // An error occurred, or we have reached the end of the file.
             // Either way we must exit the loop so we can call the handler.
             break;
           }

           // Loop around to try calling sendfile again.
         }
       }

       // Pass result back to user's handler.
       handler_(ec, total_bytes_transferred_);
     }
   };

   template <typename Handler>
   void async_sendfile(tcp::socket& sock, int fd, Handler h)
   {
     sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
     sock.async_wait(tcp::socket::wait_write, op);
   } 







[endsect]


[endsect]

[section:non_blocking basic_seq_packet_socket::non_blocking]

[indexterm2 asio.indexterm.basic_seq_packet_socket.non_blocking..non_blocking..basic_seq_packet_socket] 
Gets the non-blocking mode of the socket. 


  bool ``[link asio.reference.basic_seq_packet_socket.non_blocking.overload1 non_blocking]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.non_blocking.overload1 more...]]``


Sets the non-blocking mode of the socket. 


  void ``[link asio.reference.basic_seq_packet_socket.non_blocking.overload2 non_blocking]``(
      bool mode);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.non_blocking.overload2 more...]]``

  void ``[link asio.reference.basic_seq_packet_socket.non_blocking.overload3 non_blocking]``(
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.non_blocking.overload3 more...]]``


[section:overload1 basic_seq_packet_socket::non_blocking (1 of 3 overloads)]


['Inherited from basic_socket.]


Gets the non-blocking mode of the socket. 


  bool non_blocking() const;



[heading Return Value]
      
`true` if the socket's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]



[section:overload2 basic_seq_packet_socket::non_blocking (2 of 3 overloads)]


['Inherited from basic_socket.]


Sets the non-blocking mode of the socket. 


  void non_blocking(
      bool mode);



[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the socket's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]



[section:overload3 basic_seq_packet_socket::non_blocking (3 of 3 overloads)]


['Inherited from basic_socket.]


Sets the non-blocking mode of the socket. 


  void non_blocking(
      bool mode,
      asio::error_code & ec);



[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the socket's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]


[endsect]

[section:open basic_seq_packet_socket::open]

[indexterm2 asio.indexterm.basic_seq_packet_socket.open..open..basic_seq_packet_socket] 
Open the socket using the specified protocol. 


  void ``[link asio.reference.basic_seq_packet_socket.open.overload1 open]``(
      const protocol_type & protocol = protocol_type());
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.open.overload1 more...]]``

  void ``[link asio.reference.basic_seq_packet_socket.open.overload2 open]``(
      const protocol_type & protocol,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.open.overload2 more...]]``


[section:overload1 basic_seq_packet_socket::open (1 of 2 overloads)]


['Inherited from basic_socket.]


Open the socket using the specified protocol. 


  void open(
      const protocol_type & protocol = protocol_type());


This function opens the socket so that it will use the specified protocol.


[heading Parameters]
    

[variablelist
  
[[protocol][An object specifying protocol parameters to be used.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   socket.open(asio::ip::tcp::v4());







[endsect]



[section:overload2 basic_seq_packet_socket::open (2 of 2 overloads)]


['Inherited from basic_socket.]


Open the socket using the specified protocol. 


  void open(
      const protocol_type & protocol,
      asio::error_code & ec);


This function opens the socket so that it will use the specified protocol.


[heading Parameters]
    

[variablelist
  
[[protocol][An object specifying which protocol is to be used.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   asio::error_code ec;
   socket.open(asio::ip::tcp::v4(), ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]

[section:operator_eq_ basic_seq_packet_socket::operator=]

[indexterm2 asio.indexterm.basic_seq_packet_socket.operator_eq_..operator=..basic_seq_packet_socket] 
Move-assign a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] from another. 


  basic_seq_packet_socket & ``[link asio.reference.basic_seq_packet_socket.operator_eq_.overload1 operator=]``(
      basic_seq_packet_socket && other);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.operator_eq_.overload1 more...]]``


Move-assign a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] from a socket of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value, basic_seq_packet_socket & >::type ``[link asio.reference.basic_seq_packet_socket.operator_eq_.overload2 operator=]``(
      basic_seq_packet_socket< Protocol1, Executor1 > && other);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.operator_eq_.overload2 more...]]``


[section:overload1 basic_seq_packet_socket::operator= (1 of 2 overloads)]


Move-assign a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] from another. 


  basic_seq_packet_socket & operator=(
      basic_seq_packet_socket && other);


This assignment operator moves a sequenced packet socket from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_seq_packet_socket(const executor_type&)` constructor. 




[endsect]



[section:overload2 basic_seq_packet_socket::operator= (2 of 2 overloads)]


Move-assign a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] from a socket of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value, basic_seq_packet_socket & >::type operator=(
      basic_seq_packet_socket< Protocol1, Executor1 > && other);


This assignment operator moves a sequenced packet socket from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_seq_packet_socket(const executor_type&)` constructor. 




[endsect]


[endsect]


[section:out_of_band_inline basic_seq_packet_socket::out_of_band_inline]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.out_of_band_inline..out_of_band_inline..basic_seq_packet_socket] 
Socket option for putting received out-of-band data inline. 


  typedef implementation_defined out_of_band_inline;



Implements the SOL\_SOCKET/SO\_OOBINLINE socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::out_of_band_inline option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::out_of_band_inline option;
   socket.get_option(option);
   bool value = option.value();







[heading Requirements]

['Header: ][^asio/basic_seq_packet_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:protocol_type basic_seq_packet_socket::protocol_type]

[indexterm2 asio.indexterm.basic_seq_packet_socket.protocol_type..protocol_type..basic_seq_packet_socket] 
The protocol type. 


  typedef Protocol protocol_type;



[heading Requirements]

['Header: ][^asio/basic_seq_packet_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:receive basic_seq_packet_socket::receive]

[indexterm2 asio.indexterm.basic_seq_packet_socket.receive..receive..basic_seq_packet_socket] 
Receive some data on the socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.basic_seq_packet_socket.receive.overload1 receive]``(
      const MutableBufferSequence & buffers,
      socket_base::message_flags & out_flags);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.receive.overload1 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.basic_seq_packet_socket.receive.overload2 receive]``(
      const MutableBufferSequence & buffers,
      socket_base::message_flags in_flags,
      socket_base::message_flags & out_flags);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.receive.overload2 more...]]``


Receive some data on a connected socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.basic_seq_packet_socket.receive.overload3 receive]``(
      const MutableBufferSequence & buffers,
      socket_base::message_flags in_flags,
      socket_base::message_flags & out_flags,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.receive.overload3 more...]]``


[section:overload1 basic_seq_packet_socket::receive (1 of 3 overloads)]


Receive some data on the socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive(
      const MutableBufferSequence & buffers,
      socket_base::message_flags & out_flags);


This function is used to receive data on the sequenced packet socket. The function call will block until data has been received successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received.]]

[[out_flags][After the receive call completes, contains flags associated with the received data. For example, if the `socket_base::message_end_of_record` bit is set then the received data marks the end of a record.]]

]


[heading Return Value]
      
The number of bytes received.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]

]


[heading Example]
  
To receive into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.receive(asio::buffer(data, size), out_flags);


See the [link asio.reference.buffer `buffer`]  documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_seq_packet_socket::receive (2 of 3 overloads)]


Receive some data on the socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive(
      const MutableBufferSequence & buffers,
      socket_base::message_flags in_flags,
      socket_base::message_flags & out_flags);


This function is used to receive data on the sequenced packet socket. The function call will block until data has been received successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received.]]

[[in_flags][Flags specifying how the receive call is to be made.]]

[[out_flags][After the receive call completes, contains flags associated with the received data. For example, if the `socket_base::message_end_of_record` bit is set then the received data marks the end of a record.]]

]


[heading Return Value]
      
The number of bytes received.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]

]


[heading Remarks]
      
The receive operation may not receive all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes.


[heading Example]
  
To receive into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.receive(asio::buffer(data, size), 0, out_flags);


See the [link asio.reference.buffer `buffer`]  documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload3 basic_seq_packet_socket::receive (3 of 3 overloads)]


Receive some data on a connected socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive(
      const MutableBufferSequence & buffers,
      socket_base::message_flags in_flags,
      socket_base::message_flags & out_flags,
      asio::error_code & ec);


This function is used to receive data on the sequenced packet socket. The function call will block until data has been received successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received.]]

[[in_flags][Flags specifying how the receive call is to be made.]]

[[out_flags][After the receive call completes, contains flags associated with the received data. For example, if the `socket_base::message_end_of_record` bit is set then the received data marks the end of a record.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes received. Returns 0 if an error occurred.


[heading Remarks]
      
The receive operation may not receive all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes. 




[endsect]


[endsect]


[section:receive_buffer_size basic_seq_packet_socket::receive_buffer_size]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.receive_buffer_size..receive_buffer_size..basic_seq_packet_socket] 
Socket option for the receive buffer size of a socket. 


  typedef implementation_defined receive_buffer_size;



Implements the SOL\_SOCKET/SO\_RCVBUF socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_buffer_size option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_seq_packet_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:receive_low_watermark basic_seq_packet_socket::receive_low_watermark]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.receive_low_watermark..receive_low_watermark..basic_seq_packet_socket] 
Socket option for the receive low watermark. 


  typedef implementation_defined receive_low_watermark;



Implements the SOL\_SOCKET/SO\_RCVLOWAT socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_low_watermark option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_seq_packet_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:release basic_seq_packet_socket::release]

[indexterm2 asio.indexterm.basic_seq_packet_socket.release..release..basic_seq_packet_socket] 
Release ownership of the underlying native socket. 


  native_handle_type ``[link asio.reference.basic_seq_packet_socket.release.overload1 release]``();
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.release.overload1 more...]]``

  native_handle_type ``[link asio.reference.basic_seq_packet_socket.release.overload2 release]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.release.overload2 more...]]``


[section:overload1 basic_seq_packet_socket::release (1 of 2 overloads)]


['Inherited from basic_socket.]


Release ownership of the underlying native socket. 


  native_handle_type release();


This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error. Ownership of the native socket is then transferred to the caller.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
This function is unsupported on Windows versions prior to Windows 8.1, and will fail with `asio::error::operation_not_supported` on these platforms. 




[endsect]



[section:overload2 basic_seq_packet_socket::release (2 of 2 overloads)]


['Inherited from basic_socket.]


Release ownership of the underlying native socket. 


  native_handle_type release(
      asio::error_code & ec);


This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error. Ownership of the native socket is then transferred to the caller.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
This function is unsupported on Windows versions prior to Windows 8.1, and will fail with `asio::error::operation_not_supported` on these platforms. 




[endsect]


[endsect]

[section:remote_endpoint basic_seq_packet_socket::remote_endpoint]

[indexterm2 asio.indexterm.basic_seq_packet_socket.remote_endpoint..remote_endpoint..basic_seq_packet_socket] 
Get the remote endpoint of the socket. 


  endpoint_type ``[link asio.reference.basic_seq_packet_socket.remote_endpoint.overload1 remote_endpoint]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.remote_endpoint.overload1 more...]]``

  endpoint_type ``[link asio.reference.basic_seq_packet_socket.remote_endpoint.overload2 remote_endpoint]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.remote_endpoint.overload2 more...]]``


[section:overload1 basic_seq_packet_socket::remote_endpoint (1 of 2 overloads)]


['Inherited from basic_socket.]


Get the remote endpoint of the socket. 


  endpoint_type remote_endpoint() const;


This function is used to obtain the remote endpoint of the socket.


[heading Return Value]
      
An object that represents the remote endpoint of the socket.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::endpoint endpoint = socket.remote_endpoint();







[endsect]



[section:overload2 basic_seq_packet_socket::remote_endpoint (2 of 2 overloads)]


['Inherited from basic_socket.]


Get the remote endpoint of the socket. 


  endpoint_type remote_endpoint(
      asio::error_code & ec) const;


This function is used to obtain the remote endpoint of the socket.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
An object that represents the remote endpoint of the socket. Returns a default-constructed endpoint object if an error occurred.


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   asio::ip::tcp::endpoint endpoint = socket.remote_endpoint(ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:reuse_address basic_seq_packet_socket::reuse_address]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.reuse_address..reuse_address..basic_seq_packet_socket] 
Socket option to allow the socket to be bound to an address that is already in use. 


  typedef implementation_defined reuse_address;



Implements the SOL\_SOCKET/SO\_REUSEADDR socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::reuse_address option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::reuse_address option;
   acceptor.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_seq_packet_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:send basic_seq_packet_socket::send]

[indexterm2 asio.indexterm.basic_seq_packet_socket.send..send..basic_seq_packet_socket] 
Send some data on the socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.basic_seq_packet_socket.send.overload1 send]``(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.send.overload1 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.basic_seq_packet_socket.send.overload2 send]``(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.send.overload2 more...]]``


[section:overload1 basic_seq_packet_socket::send (1 of 2 overloads)]


Send some data on the socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags);


This function is used to send data on the sequenced packet socket. The function call will block until the data has been sent successfully, or an until error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent on the socket.]]

[[flags][Flags specifying how the send call is to be made.]]

]


[heading Return Value]
      
The number of bytes sent.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  
To send a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.send(asio::buffer(data, size), 0);


See the [link asio.reference.buffer `buffer`]  documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_seq_packet_socket::send (2 of 2 overloads)]


Send some data on the socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      asio::error_code & ec);


This function is used to send data on the sequenced packet socket. The function call will block the data has been sent successfully, or an until error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent on the socket.]]

[[flags][Flags specifying how the send call is to be made.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes sent. Returns 0 if an error occurred.


[heading Remarks]
      
The send operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes. 




[endsect]


[endsect]


[section:send_buffer_size basic_seq_packet_socket::send_buffer_size]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.send_buffer_size..send_buffer_size..basic_seq_packet_socket] 
Socket option for the send buffer size of a socket. 


  typedef implementation_defined send_buffer_size;



Implements the SOL\_SOCKET/SO\_SNDBUF socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_buffer_size option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_seq_packet_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:send_low_watermark basic_seq_packet_socket::send_low_watermark]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.send_low_watermark..send_low_watermark..basic_seq_packet_socket] 
Socket option for the send low watermark. 


  typedef implementation_defined send_low_watermark;



Implements the SOL\_SOCKET/SO\_SNDLOWAT socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_low_watermark option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_seq_packet_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:set_option basic_seq_packet_socket::set_option]

[indexterm2 asio.indexterm.basic_seq_packet_socket.set_option..set_option..basic_seq_packet_socket] 
Set an option on the socket. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void ``[link asio.reference.basic_seq_packet_socket.set_option.overload1 set_option]``(
      const SettableSocketOption & option);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.set_option.overload1 more...]]``

  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void ``[link asio.reference.basic_seq_packet_socket.set_option.overload2 set_option]``(
      const SettableSocketOption & option,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.set_option.overload2 more...]]``


[section:overload1 basic_seq_packet_socket::set_option (1 of 2 overloads)]


['Inherited from basic_socket.]


Set an option on the socket. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void set_option(
      const SettableSocketOption & option);


This function is used to set an option on the socket.


[heading Parameters]
    

[variablelist
  
[[option][The new option value to be set on the socket.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]



[heading Example]
  
Setting the IPPROTO\_TCP/TCP\_NODELAY option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::no_delay option(true);
   socket.set_option(option);







[endsect]



[section:overload2 basic_seq_packet_socket::set_option (2 of 2 overloads)]


['Inherited from basic_socket.]


Set an option on the socket. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void set_option(
      const SettableSocketOption & option,
      asio::error_code & ec);


This function is used to set an option on the socket.


[heading Parameters]
    

[variablelist
  
[[option][The new option value to be set on the socket.]]

[[ec][Set to indicate what error occurred, if any.]]

]



[heading Example]
  
Setting the IPPROTO\_TCP/TCP\_NODELAY option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::no_delay option(true);
   asio::error_code ec;
   socket.set_option(option, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]

[section:shutdown basic_seq_packet_socket::shutdown]

[indexterm2 asio.indexterm.basic_seq_packet_socket.shutdown..shutdown..basic_seq_packet_socket] 
Disable sends or receives on the socket. 


  void ``[link asio.reference.basic_seq_packet_socket.shutdown.overload1 shutdown]``(
      shutdown_type what);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.shutdown.overload1 more...]]``

  void ``[link asio.reference.basic_seq_packet_socket.shutdown.overload2 shutdown]``(
      shutdown_type what,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.shutdown.overload2 more...]]``


[section:overload1 basic_seq_packet_socket::shutdown (1 of 2 overloads)]


['Inherited from basic_socket.]


Disable sends or receives on the socket. 


  void shutdown(
      shutdown_type what);


This function is used to disable send operations, receive operations, or both.


[heading Parameters]
    

[variablelist
  
[[what][Determines what types of operation will no longer be allowed.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  
Shutting down the send side of the socket: 

   asio::ip::tcp::socket socket(my_context);
   ...
   socket.shutdown(asio::ip::tcp::socket::shutdown_send);







[endsect]



[section:overload2 basic_seq_packet_socket::shutdown (2 of 2 overloads)]


['Inherited from basic_socket.]


Disable sends or receives on the socket. 


  void shutdown(
      shutdown_type what,
      asio::error_code & ec);


This function is used to disable send operations, receive operations, or both.


[heading Parameters]
    

[variablelist
  
[[what][Determines what types of operation will no longer be allowed.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  
Shutting down the send side of the socket: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   socket.shutdown(asio::ip::tcp::socket::shutdown_send, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:shutdown_type basic_seq_packet_socket::shutdown_type]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.shutdown_type..shutdown_type..basic_seq_packet_socket] 
Different ways a socket may be shutdown. 


  enum shutdown_type

[indexterm2 asio.indexterm.basic_seq_packet_socket.shutdown_type.shutdown_receive..shutdown_receive..basic_seq_packet_socket]
[indexterm2 asio.indexterm.basic_seq_packet_socket.shutdown_type.shutdown_send..shutdown_send..basic_seq_packet_socket]
[indexterm2 asio.indexterm.basic_seq_packet_socket.shutdown_type.shutdown_both..shutdown_both..basic_seq_packet_socket]

[heading Values]
[variablelist

  [
    [shutdown_receive]
    [Shutdown the receive side of the socket. ]
  ]

  [
    [shutdown_send]
    [Shutdown the send side of the socket. ]
  ]

  [
    [shutdown_both]
    [Shutdown both send and receive on the socket. ]
  ]

]



[endsect]


[section:wait basic_seq_packet_socket::wait]

[indexterm2 asio.indexterm.basic_seq_packet_socket.wait..wait..basic_seq_packet_socket] 
Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  void ``[link asio.reference.basic_seq_packet_socket.wait.overload1 wait]``(
      wait_type w);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.wait.overload1 more...]]``

  void ``[link asio.reference.basic_seq_packet_socket.wait.overload2 wait]``(
      wait_type w,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.wait.overload2 more...]]``


[section:overload1 basic_seq_packet_socket::wait (1 of 2 overloads)]


['Inherited from basic_socket.]


Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  void wait(
      wait_type w);


This function is used to perform a blocking wait for a socket to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired socket state.]]

]


[heading Example]
  
Waiting for a socket to become readable. 

   asio::ip::tcp::socket socket(my_context);
   ...
   socket.wait(asio::ip::tcp::socket::wait_read);







[endsect]



[section:overload2 basic_seq_packet_socket::wait (2 of 2 overloads)]


['Inherited from basic_socket.]


Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  void wait(
      wait_type w,
      asio::error_code & ec);


This function is used to perform a blocking wait for a socket to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired socket state.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  
Waiting for a socket to become readable. 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   socket.wait(asio::ip::tcp::socket::wait_read, ec);







[endsect]


[endsect]


[section:wait_type basic_seq_packet_socket::wait_type]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_seq_packet_socket.wait_type..wait_type..basic_seq_packet_socket] 
Wait types. 


  enum wait_type

[indexterm2 asio.indexterm.basic_seq_packet_socket.wait_type.wait_read..wait_read..basic_seq_packet_socket]
[indexterm2 asio.indexterm.basic_seq_packet_socket.wait_type.wait_write..wait_write..basic_seq_packet_socket]
[indexterm2 asio.indexterm.basic_seq_packet_socket.wait_type.wait_error..wait_error..basic_seq_packet_socket]

[heading Values]
[variablelist

  [
    [wait_read]
    [Wait for a socket to become ready to read. ]
  ]

  [
    [wait_write]
    [Wait for a socket to become ready to write. ]
  ]

  [
    [wait_error]
    [Wait for a socket to have error conditions pending. ]
  ]

]


For use with `basic_socket::wait()` and `basic_socket::async_wait()`. 


[endsect]



[section:_basic_seq_packet_socket basic_seq_packet_socket::~basic_seq_packet_socket]

[indexterm2 asio.indexterm.basic_seq_packet_socket._basic_seq_packet_socket..~basic_seq_packet_socket..basic_seq_packet_socket] 
Destroys the socket. 


  ~basic_seq_packet_socket();


This function destroys the socket, cancelling any outstanding asynchronous operations associated with the socket as if by calling `cancel`. 


[endsect]



[endsect]

[section:basic_seq_packet_socket__rebind_executor basic_seq_packet_socket::rebind_executor]


Rebinds the socket type to another executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  struct rebind_executor


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_seq_packet_socket__rebind_executor.other [*other]]]
    [The socket type when rebound to the specified executor. ]
  
  ]

]

[heading Requirements]

['Header: ][^asio/basic_seq_packet_socket.hpp]

['Convenience header: ][^asio.hpp]


[section:other basic_seq_packet_socket::rebind_executor::other]

[indexterm2 asio.indexterm.basic_seq_packet_socket__rebind_executor.other..other..basic_seq_packet_socket::rebind_executor] 
The socket type when rebound to the specified executor. 


  typedef basic_seq_packet_socket< Protocol, Executor1 > other;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_seq_packet_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_seq_packet_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.async_receive [*async_receive]]]
    [Start an asynchronous receive. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.async_send [*async_send]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket [*basic_seq_packet_socket]] [constructor]]
    [Construct a basic_seq_packet_socket without opening it. 
     [hr]
     Construct and open a basic_seq_packet_socket. 
     [hr]
     Construct a basic_seq_packet_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_seq_packet_socket on an existing native socket. 
     [hr]
     Move-construct a basic_seq_packet_socket from another. 
     [hr]
     Move-construct a basic_seq_packet_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_seq_packet_socket from another. 
     [hr]
     Move-assign a basic_seq_packet_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.receive [*receive]]]
    [Receive some data on the socket. 
     [hr]
     Receive some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.send [*send]]]
    [Send some data on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket._basic_seq_packet_socket [*~basic_seq_packet_socket]] [destructor]]
    [Destroys the socket. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_seq_packet_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_seq_packet_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_seq_packet_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_seq_packet_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_seq_packet_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_seq_packet_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] class template provides asynchronous and blocking sequenced packet socket functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/basic_seq_packet_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:basic_serial_port basic_serial_port]


Provides serial port functionality. 


  template<
      typename ``[link asio.reference.Executor1 Executor]`` = any_io_executor>
  class basic_serial_port :
    public serial_port_base


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_serial_port__rebind_executor [*rebind_executor]]]
    [Rebinds the serial port type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_serial_port.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_serial_port.lowest_layer_type [*lowest_layer_type]]]
    [A basic_basic_serial_port is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_serial_port.native_handle_type [*native_handle_type]]]
    [The native representation of a serial port. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_serial_port.assign [*assign]]]
    [Assign an existing native serial port to the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.async_read_some [*async_read_some]]]
    [Start an asynchronous read. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.async_write_some [*async_write_some]]]
    [Start an asynchronous write. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.basic_serial_port [*basic_serial_port]] [constructor]]
    [Construct a basic_serial_port without opening it. 
     [hr]
     Construct and open a basic_serial_port. 
     [hr]
     Construct a basic_serial_port on an existing native serial port. 
     [hr]
     Move-construct a basic_serial_port from another. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.close [*close]]]
    [Close the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.get_option [*get_option]]]
    [Get an option from the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.is_open [*is_open]]]
    [Determine whether the serial port is open. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.native_handle [*native_handle]]]
    [Get the native serial port representation. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.open [*open]]]
    [Open the serial port using the specified device name. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.operator_eq_ [*operator=]]]
    [Move-assign a basic_serial_port from another. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.read_some [*read_some]]]
    [Read some data from the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.send_break [*send_break]]]
    [Send a break sequence to the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.set_option [*set_option]]]
    [Set an option on the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.write_some [*write_some]]]
    [Write some data to the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port._basic_serial_port [*~basic_serial_port]] [destructor]]
    [Destroys the serial port. ]
  ]
  
]

The [link asio.reference.basic_serial_port `basic_serial_port`] class provides a wrapper over serial port functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/basic_serial_port.hpp]

['Convenience header: ][^asio.hpp]

[section:assign basic_serial_port::assign]

[indexterm2 asio.indexterm.basic_serial_port.assign..assign..basic_serial_port] 
Assign an existing native serial port to the serial port. 


  void ``[link asio.reference.basic_serial_port.assign.overload1 assign]``(
      const native_handle_type & native_serial_port);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.assign.overload1 more...]]``

  void ``[link asio.reference.basic_serial_port.assign.overload2 assign]``(
      const native_handle_type & native_serial_port,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.assign.overload2 more...]]``


[section:overload1 basic_serial_port::assign (1 of 2 overloads)]


Assign an existing native serial port to the serial port. 


  void assign(
      const native_handle_type & native_serial_port);



[endsect]



[section:overload2 basic_serial_port::assign (2 of 2 overloads)]


Assign an existing native serial port to the serial port. 


  void assign(
      const native_handle_type & native_serial_port,
      asio::error_code & ec);



[endsect]


[endsect]


[section:async_read_some basic_serial_port::async_read_some]

[indexterm2 asio.indexterm.basic_serial_port.async_read_some..async_read_some..basic_serial_port] 
Start an asynchronous read. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_some(
      const MutableBufferSequence & buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously read data from the serial port. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes read.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
The read operation may not read all of the requested number of bytes. Consider using the [link asio.reference.async_read `async_read`]  function if you need to ensure that the requested amount of data is read before the asynchronous operation completes.


[heading Example]
  
To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   basic_serial_port.async_read_some(
       asio::buffer(data, size), handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:async_write_some basic_serial_port::async_write_some]

[indexterm2 asio.indexterm.basic_serial_port.async_write_some..async_write_some..basic_serial_port] 
Start an asynchronous write. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_write_some(
      const ConstBufferSequence & buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously write data to the serial port. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be written to the serial port. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes written.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
The write operation may not transmit all of the data to the peer. Consider using the [link asio.reference.async_write `async_write`]  function if you need to ensure that all data is written before the asynchronous operation completes.


[heading Example]
  
To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   basic_serial_port.async_write_some(
       asio::buffer(data, size), handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]


[section:basic_serial_port basic_serial_port::basic_serial_port]

[indexterm2 asio.indexterm.basic_serial_port.basic_serial_port..basic_serial_port..basic_serial_port] 
Construct a [link asio.reference.basic_serial_port `basic_serial_port`] without opening it. 


  explicit ``[link asio.reference.basic_serial_port.basic_serial_port.overload1 basic_serial_port]``(
      const executor_type & ex);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.basic_serial_port.overload1 more...]]``

  template<
      typename ExecutionContext>
  explicit ``[link asio.reference.basic_serial_port.basic_serial_port.overload2 basic_serial_port]``(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value, basic_serial_port >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.basic_serial_port.overload2 more...]]``


Construct and open a [link asio.reference.basic_serial_port `basic_serial_port`]. 


  ``[link asio.reference.basic_serial_port.basic_serial_port.overload3 basic_serial_port]``(
      const executor_type & ex,
      const char * device);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.basic_serial_port.overload3 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_serial_port.basic_serial_port.overload4 basic_serial_port]``(
      ExecutionContext & context,
      const char * device,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.basic_serial_port.overload4 more...]]``

  ``[link asio.reference.basic_serial_port.basic_serial_port.overload5 basic_serial_port]``(
      const executor_type & ex,
      const std::string & device);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.basic_serial_port.overload5 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_serial_port.basic_serial_port.overload6 basic_serial_port]``(
      ExecutionContext & context,
      const std::string & device,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.basic_serial_port.overload6 more...]]``


Construct a [link asio.reference.basic_serial_port `basic_serial_port`] on an existing native serial port. 


  ``[link asio.reference.basic_serial_port.basic_serial_port.overload7 basic_serial_port]``(
      const executor_type & ex,
      const native_handle_type & native_serial_port);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.basic_serial_port.overload7 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_serial_port.basic_serial_port.overload8 basic_serial_port]``(
      ExecutionContext & context,
      const native_handle_type & native_serial_port,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.basic_serial_port.overload8 more...]]``


Move-construct a [link asio.reference.basic_serial_port `basic_serial_port`] from another. 


  ``[link asio.reference.basic_serial_port.basic_serial_port.overload9 basic_serial_port]``(
      basic_serial_port && other);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.basic_serial_port.overload9 more...]]``


[section:overload1 basic_serial_port::basic_serial_port (1 of 9 overloads)]


Construct a [link asio.reference.basic_serial_port `basic_serial_port`] without opening it. 


  basic_serial_port(
      const executor_type & ex);


This constructor creates a serial port without opening it.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the serial port will use, by default, to dispatch handlers for any asynchronous operations performed on the serial port. ]]

]




[endsect]



[section:overload2 basic_serial_port::basic_serial_port (2 of 9 overloads)]


Construct a [link asio.reference.basic_serial_port `basic_serial_port`] without opening it. 


  template<
      typename ExecutionContext>
  basic_serial_port(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value, basic_serial_port >::type *  = 0);


This constructor creates a serial port without opening it.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the serial port will use, by default, to dispatch handlers for any asynchronous operations performed on the serial port. ]]

]




[endsect]



[section:overload3 basic_serial_port::basic_serial_port (3 of 9 overloads)]


Construct and open a [link asio.reference.basic_serial_port `basic_serial_port`]. 


  basic_serial_port(
      const executor_type & ex,
      const char * device);


This constructor creates and opens a serial port for the specified device name.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the serial port will use, by default, to dispatch handlers for any asynchronous operations performed on the serial port.]]

[[device][The platform-specific device name for this serial port. ]]

]




[endsect]



[section:overload4 basic_serial_port::basic_serial_port (4 of 9 overloads)]


Construct and open a [link asio.reference.basic_serial_port `basic_serial_port`]. 


  template<
      typename ExecutionContext>
  basic_serial_port(
      ExecutionContext & context,
      const char * device,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates and opens a serial port for the specified device name.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the serial port will use, by default, to dispatch handlers for any asynchronous operations performed on the serial port.]]

[[device][The platform-specific device name for this serial port. ]]

]




[endsect]



[section:overload5 basic_serial_port::basic_serial_port (5 of 9 overloads)]


Construct and open a [link asio.reference.basic_serial_port `basic_serial_port`]. 


  basic_serial_port(
      const executor_type & ex,
      const std::string & device);


This constructor creates and opens a serial port for the specified device name.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the serial port will use, by default, to dispatch handlers for any asynchronous operations performed on the serial port.]]

[[device][The platform-specific device name for this serial port. ]]

]




[endsect]



[section:overload6 basic_serial_port::basic_serial_port (6 of 9 overloads)]


Construct and open a [link asio.reference.basic_serial_port `basic_serial_port`]. 


  template<
      typename ExecutionContext>
  basic_serial_port(
      ExecutionContext & context,
      const std::string & device,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates and opens a serial port for the specified device name.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the serial port will use, by default, to dispatch handlers for any asynchronous operations performed on the serial port.]]

[[device][The platform-specific device name for this serial port. ]]

]




[endsect]



[section:overload7 basic_serial_port::basic_serial_port (7 of 9 overloads)]


Construct a [link asio.reference.basic_serial_port `basic_serial_port`] on an existing native serial port. 


  basic_serial_port(
      const executor_type & ex,
      const native_handle_type & native_serial_port);


This constructor creates a serial port object to hold an existing native serial port.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the serial port will use, by default, to dispatch handlers for any asynchronous operations performed on the serial port.]]

[[native_serial_port][A native serial port.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload8 basic_serial_port::basic_serial_port (8 of 9 overloads)]


Construct a [link asio.reference.basic_serial_port `basic_serial_port`] on an existing native serial port. 


  template<
      typename ExecutionContext>
  basic_serial_port(
      ExecutionContext & context,
      const native_handle_type & native_serial_port,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a serial port object to hold an existing native serial port.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the serial port will use, by default, to dispatch handlers for any asynchronous operations performed on the serial port.]]

[[native_serial_port][A native serial port.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload9 basic_serial_port::basic_serial_port (9 of 9 overloads)]


Move-construct a [link asio.reference.basic_serial_port `basic_serial_port`] from another. 


  basic_serial_port(
      basic_serial_port && other);


This constructor moves a serial port from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_serial_port `basic_serial_port`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_serial_port(const executor_type&)` constructor. 




[endsect]


[endsect]

[section:cancel basic_serial_port::cancel]

[indexterm2 asio.indexterm.basic_serial_port.cancel..cancel..basic_serial_port] 
Cancel all asynchronous operations associated with the serial port. 


  void ``[link asio.reference.basic_serial_port.cancel.overload1 cancel]``();
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.cancel.overload1 more...]]``

  void ``[link asio.reference.basic_serial_port.cancel.overload2 cancel]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.cancel.overload2 more...]]``


[section:overload1 basic_serial_port::cancel (1 of 2 overloads)]


Cancel all asynchronous operations associated with the serial port. 


  void cancel();


This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 basic_serial_port::cancel (2 of 2 overloads)]


Cancel all asynchronous operations associated with the serial port. 


  void cancel(
      asio::error_code & ec);


This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. ]]

]




[endsect]


[endsect]

[section:close basic_serial_port::close]

[indexterm2 asio.indexterm.basic_serial_port.close..close..basic_serial_port] 
Close the serial port. 


  void ``[link asio.reference.basic_serial_port.close.overload1 close]``();
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.close.overload1 more...]]``

  void ``[link asio.reference.basic_serial_port.close.overload2 close]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.close.overload2 more...]]``


[section:overload1 basic_serial_port::close (1 of 2 overloads)]


Close the serial port. 


  void close();


This function is used to close the serial port. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 basic_serial_port::close (2 of 2 overloads)]


Close the serial port. 


  void close(
      asio::error_code & ec);


This function is used to close the serial port. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. ]]

]




[endsect]


[endsect]


[section:executor_type basic_serial_port::executor_type]

[indexterm2 asio.indexterm.basic_serial_port.executor_type..executor_type..basic_serial_port] 
The type of the executor associated with the object. 


  typedef Executor executor_type;



[heading Requirements]

['Header: ][^asio/basic_serial_port.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:get_executor basic_serial_port::get_executor]

[indexterm2 asio.indexterm.basic_serial_port.get_executor..get_executor..basic_serial_port] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_option basic_serial_port::get_option]

[indexterm2 asio.indexterm.basic_serial_port.get_option..get_option..basic_serial_port] 
Get an option from the serial port. 


  template<
      typename ``[link asio.reference.GettableSerialPortOption GettableSerialPortOption]``>
  void ``[link asio.reference.basic_serial_port.get_option.overload1 get_option]``(
      GettableSerialPortOption & option) const;
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.get_option.overload1 more...]]``

  template<
      typename ``[link asio.reference.GettableSerialPortOption GettableSerialPortOption]``>
  void ``[link asio.reference.basic_serial_port.get_option.overload2 get_option]``(
      GettableSerialPortOption & option,
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.get_option.overload2 more...]]``


[section:overload1 basic_serial_port::get_option (1 of 2 overloads)]


Get an option from the serial port. 


  template<
      typename ``[link asio.reference.GettableSerialPortOption GettableSerialPortOption]``>
  void get_option(
      GettableSerialPortOption & option) const;


This function is used to get the current value of an option on the serial port.


[heading Parameters]
    

[variablelist
  
[[option][The option value to be obtained from the serial port.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]





[endsect]



[section:overload2 basic_serial_port::get_option (2 of 2 overloads)]


Get an option from the serial port. 


  template<
      typename ``[link asio.reference.GettableSerialPortOption GettableSerialPortOption]``>
  void get_option(
      GettableSerialPortOption & option,
      asio::error_code & ec) const;


This function is used to get the current value of an option on the serial port.


[heading Parameters]
    

[variablelist
  
[[option][The option value to be obtained from the serial port.]]

[[ec][Set to indicate what error occurred, if any.]]

]





[endsect]


[endsect]


[section:is_open basic_serial_port::is_open]

[indexterm2 asio.indexterm.basic_serial_port.is_open..is_open..basic_serial_port] 
Determine whether the serial port is open. 


  bool is_open() const;



[endsect]


[section:lowest_layer basic_serial_port::lowest_layer]

[indexterm2 asio.indexterm.basic_serial_port.lowest_layer..lowest_layer..basic_serial_port] 
Get a reference to the lowest layer. 


  lowest_layer_type & ``[link asio.reference.basic_serial_port.lowest_layer.overload1 lowest_layer]``();
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.lowest_layer.overload1 more...]]``


Get a const reference to the lowest layer. 


  const lowest_layer_type & ``[link asio.reference.basic_serial_port.lowest_layer.overload2 lowest_layer]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.lowest_layer.overload2 more...]]``


[section:overload1 basic_serial_port::lowest_layer (1 of 2 overloads)]


Get a reference to the lowest layer. 


  lowest_layer_type & lowest_layer();


This function returns a reference to the lowest layer in a stack of layers. Since a [link asio.reference.basic_serial_port `basic_serial_port`] cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]



[section:overload2 basic_serial_port::lowest_layer (2 of 2 overloads)]


Get a const reference to the lowest layer. 


  const lowest_layer_type & lowest_layer() const;


This function returns a const reference to the lowest layer in a stack of layers. Since a [link asio.reference.basic_serial_port `basic_serial_port`] cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]


[endsect]


[section:lowest_layer_type basic_serial_port::lowest_layer_type]

[indexterm2 asio.indexterm.basic_serial_port.lowest_layer_type..lowest_layer_type..basic_serial_port] 
A basic\_basic\_serial\_port is always the lowest layer. 


  typedef basic_serial_port lowest_layer_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_serial_port__rebind_executor [*rebind_executor]]]
    [Rebinds the serial port type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_serial_port.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_serial_port.lowest_layer_type [*lowest_layer_type]]]
    [A basic_basic_serial_port is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_serial_port.native_handle_type [*native_handle_type]]]
    [The native representation of a serial port. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_serial_port.assign [*assign]]]
    [Assign an existing native serial port to the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.async_read_some [*async_read_some]]]
    [Start an asynchronous read. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.async_write_some [*async_write_some]]]
    [Start an asynchronous write. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.basic_serial_port [*basic_serial_port]] [constructor]]
    [Construct a basic_serial_port without opening it. 
     [hr]
     Construct and open a basic_serial_port. 
     [hr]
     Construct a basic_serial_port on an existing native serial port. 
     [hr]
     Move-construct a basic_serial_port from another. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.close [*close]]]
    [Close the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.get_option [*get_option]]]
    [Get an option from the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.is_open [*is_open]]]
    [Determine whether the serial port is open. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.native_handle [*native_handle]]]
    [Get the native serial port representation. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.open [*open]]]
    [Open the serial port using the specified device name. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.operator_eq_ [*operator=]]]
    [Move-assign a basic_serial_port from another. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.read_some [*read_some]]]
    [Read some data from the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.send_break [*send_break]]]
    [Send a break sequence to the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.set_option [*set_option]]]
    [Set an option on the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.write_some [*write_some]]]
    [Write some data to the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port._basic_serial_port [*~basic_serial_port]] [destructor]]
    [Destroys the serial port. ]
  ]
  
]

The [link asio.reference.basic_serial_port `basic_serial_port`] class provides a wrapper over serial port functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/basic_serial_port.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:native_handle basic_serial_port::native_handle]

[indexterm2 asio.indexterm.basic_serial_port.native_handle..native_handle..basic_serial_port] 
Get the native serial port representation. 


  native_handle_type native_handle();


This function may be used to obtain the underlying representation of the serial port. This is intended to allow access to native serial port functionality that is not otherwise provided. 


[endsect]



[section:native_handle_type basic_serial_port::native_handle_type]

[indexterm2 asio.indexterm.basic_serial_port.native_handle_type..native_handle_type..basic_serial_port] 
The native representation of a serial port. 


  typedef implementation_defined native_handle_type;



[heading Requirements]

['Header: ][^asio/basic_serial_port.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:open basic_serial_port::open]

[indexterm2 asio.indexterm.basic_serial_port.open..open..basic_serial_port] 
Open the serial port using the specified device name. 


  void ``[link asio.reference.basic_serial_port.open.overload1 open]``(
      const std::string & device);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.open.overload1 more...]]``

  void ``[link asio.reference.basic_serial_port.open.overload2 open]``(
      const std::string & device,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.open.overload2 more...]]``


[section:overload1 basic_serial_port::open (1 of 2 overloads)]


Open the serial port using the specified device name. 


  void open(
      const std::string & device);


This function opens the serial port for the specified device name.


[heading Parameters]
    

[variablelist
  
[[device][The platform-specific device name.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 basic_serial_port::open (2 of 2 overloads)]


Open the serial port using the specified device name. 


  void open(
      const std::string & device,
      asio::error_code & ec);


This function opens the serial port using the given platform-specific device name.


[heading Parameters]
    

[variablelist
  
[[device][The platform-specific device name.]]

[[ec][Set the indicate what error occurred, if any. ]]

]




[endsect]


[endsect]


[section:operator_eq_ basic_serial_port::operator=]

[indexterm2 asio.indexterm.basic_serial_port.operator_eq_..operator=..basic_serial_port] 
Move-assign a [link asio.reference.basic_serial_port `basic_serial_port`] from another. 


  basic_serial_port & operator=(
      basic_serial_port && other);


This assignment operator moves a serial port from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_serial_port `basic_serial_port`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_serial_port(const executor_type&)` constructor. 




[endsect]


[section:read_some basic_serial_port::read_some]

[indexterm2 asio.indexterm.basic_serial_port.read_some..read_some..basic_serial_port] 
Read some data from the serial port. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.basic_serial_port.read_some.overload1 read_some]``(
      const MutableBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.read_some.overload1 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.basic_serial_port.read_some.overload2 read_some]``(
      const MutableBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.read_some.overload2 more...]]``


[section:overload1 basic_serial_port::read_some (1 of 2 overloads)]


Read some data from the serial port. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_some(
      const MutableBufferSequence & buffers);


This function is used to read data from the serial port. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be read.]]

]


[heading Return Value]
      
The number of bytes read.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]

]


[heading Remarks]
      
The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes.


[heading Example]
  
To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   basic_serial_port.read_some(asio::buffer(data, size));


See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_serial_port::read_some (2 of 2 overloads)]


Read some data from the serial port. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_some(
      const MutableBufferSequence & buffers,
      asio::error_code & ec);


This function is used to read data from the serial port. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be read.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes read. Returns 0 if an error occurred.


[heading Remarks]
      
The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes. 




[endsect]


[endsect]

[section:send_break basic_serial_port::send_break]

[indexterm2 asio.indexterm.basic_serial_port.send_break..send_break..basic_serial_port] 
Send a break sequence to the serial port. 


  void ``[link asio.reference.basic_serial_port.send_break.overload1 send_break]``();
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.send_break.overload1 more...]]``

  void ``[link asio.reference.basic_serial_port.send_break.overload2 send_break]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.send_break.overload2 more...]]``


[section:overload1 basic_serial_port::send_break (1 of 2 overloads)]


Send a break sequence to the serial port. 


  void send_break();


This function causes a break sequence of platform-specific duration to be sent out the serial port.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 basic_serial_port::send_break (2 of 2 overloads)]


Send a break sequence to the serial port. 


  void send_break(
      asio::error_code & ec);


This function causes a break sequence of platform-specific duration to be sent out the serial port.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. ]]

]




[endsect]


[endsect]

[section:set_option basic_serial_port::set_option]

[indexterm2 asio.indexterm.basic_serial_port.set_option..set_option..basic_serial_port] 
Set an option on the serial port. 


  template<
      typename ``[link asio.reference.SettableSerialPortOption SettableSerialPortOption]``>
  void ``[link asio.reference.basic_serial_port.set_option.overload1 set_option]``(
      const SettableSerialPortOption & option);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.set_option.overload1 more...]]``

  template<
      typename ``[link asio.reference.SettableSerialPortOption SettableSerialPortOption]``>
  void ``[link asio.reference.basic_serial_port.set_option.overload2 set_option]``(
      const SettableSerialPortOption & option,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.set_option.overload2 more...]]``


[section:overload1 basic_serial_port::set_option (1 of 2 overloads)]


Set an option on the serial port. 


  template<
      typename ``[link asio.reference.SettableSerialPortOption SettableSerialPortOption]``>
  void set_option(
      const SettableSerialPortOption & option);


This function is used to set an option on the serial port.


[heading Parameters]
    

[variablelist
  
[[option][The option value to be set on the serial port.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]





[endsect]



[section:overload2 basic_serial_port::set_option (2 of 2 overloads)]


Set an option on the serial port. 


  template<
      typename ``[link asio.reference.SettableSerialPortOption SettableSerialPortOption]``>
  void set_option(
      const SettableSerialPortOption & option,
      asio::error_code & ec);


This function is used to set an option on the serial port.


[heading Parameters]
    

[variablelist
  
[[option][The option value to be set on the serial port.]]

[[ec][Set to indicate what error occurred, if any.]]

]





[endsect]


[endsect]

[section:write_some basic_serial_port::write_some]

[indexterm2 asio.indexterm.basic_serial_port.write_some..write_some..basic_serial_port] 
Write some data to the serial port. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.basic_serial_port.write_some.overload1 write_some]``(
      const ConstBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.write_some.overload1 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.basic_serial_port.write_some.overload2 write_some]``(
      const ConstBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.write_some.overload2 more...]]``


[section:overload1 basic_serial_port::write_some (1 of 2 overloads)]


Write some data to the serial port. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_some(
      const ConstBufferSequence & buffers);


This function is used to write data to the serial port. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be written to the serial port.]]

]


[heading Return Value]
      
The number of bytes written.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]

]


[heading Remarks]
      
The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes.


[heading Example]
  
To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   basic_serial_port.write_some(asio::buffer(data, size));


See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_serial_port::write_some (2 of 2 overloads)]


Write some data to the serial port. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_some(
      const ConstBufferSequence & buffers,
      asio::error_code & ec);


This function is used to write data to the serial port. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be written to the serial port.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes written. Returns 0 if an error occurred.


[heading Remarks]
      
The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes. 




[endsect]


[endsect]


[section:_basic_serial_port basic_serial_port::~basic_serial_port]

[indexterm2 asio.indexterm.basic_serial_port._basic_serial_port..~basic_serial_port..basic_serial_port] 
Destroys the serial port. 


  ~basic_serial_port();


This function destroys the serial port, cancelling any outstanding asynchronous wait operations associated with the serial port as if by calling `cancel`. 


[endsect]



[endsect]

[section:basic_serial_port__rebind_executor basic_serial_port::rebind_executor]


Rebinds the serial port type to another executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  struct rebind_executor


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_serial_port__rebind_executor.other [*other]]]
    [The serial port type when rebound to the specified executor. ]
  
  ]

]

[heading Requirements]

['Header: ][^asio/basic_serial_port.hpp]

['Convenience header: ][^asio.hpp]


[section:other basic_serial_port::rebind_executor::other]

[indexterm2 asio.indexterm.basic_serial_port__rebind_executor.other..other..basic_serial_port::rebind_executor] 
The serial port type when rebound to the specified executor. 


  typedef basic_serial_port< Executor1 > other;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_serial_port__rebind_executor [*rebind_executor]]]
    [Rebinds the serial port type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_serial_port.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_serial_port.lowest_layer_type [*lowest_layer_type]]]
    [A basic_basic_serial_port is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_serial_port.native_handle_type [*native_handle_type]]]
    [The native representation of a serial port. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_serial_port.assign [*assign]]]
    [Assign an existing native serial port to the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.async_read_some [*async_read_some]]]
    [Start an asynchronous read. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.async_write_some [*async_write_some]]]
    [Start an asynchronous write. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.basic_serial_port [*basic_serial_port]] [constructor]]
    [Construct a basic_serial_port without opening it. 
     [hr]
     Construct and open a basic_serial_port. 
     [hr]
     Construct a basic_serial_port on an existing native serial port. 
     [hr]
     Move-construct a basic_serial_port from another. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.close [*close]]]
    [Close the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.get_option [*get_option]]]
    [Get an option from the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.is_open [*is_open]]]
    [Determine whether the serial port is open. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.native_handle [*native_handle]]]
    [Get the native serial port representation. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.open [*open]]]
    [Open the serial port using the specified device name. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.operator_eq_ [*operator=]]]
    [Move-assign a basic_serial_port from another. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.read_some [*read_some]]]
    [Read some data from the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.send_break [*send_break]]]
    [Send a break sequence to the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.set_option [*set_option]]]
    [Set an option on the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.write_some [*write_some]]]
    [Write some data to the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port._basic_serial_port [*~basic_serial_port]] [destructor]]
    [Destroys the serial port. ]
  ]
  
]

The [link asio.reference.basic_serial_port `basic_serial_port`] class provides a wrapper over serial port functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/basic_serial_port.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:basic_signal_set basic_signal_set]


Provides signal functionality. 


  template<
      typename ``[link asio.reference.Executor1 Executor]`` = any_io_executor>
  class basic_signal_set


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_signal_set__rebind_executor [*rebind_executor]]]
    [Rebinds the signal set type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_signal_set.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_signal_set.add [*add]]]
    [Add a signal to a signal_set. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set.async_wait [*async_wait]]]
    [Start an asynchronous operation to wait for a signal to be delivered. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set.basic_signal_set [*basic_signal_set]] [constructor]]
    [Construct a signal set without adding any signals. 
     [hr]
     Construct a signal set and add one signal. 
     [hr]
     Construct a signal set and add two signals. 
     [hr]
     Construct a signal set and add three signals. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set.cancel [*cancel]]]
    [Cancel all operations associated with the signal set. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set.clear [*clear]]]
    [Remove all signals from a signal_set. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set.remove [*remove]]]
    [Remove a signal from a signal_set. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set._basic_signal_set [*~basic_signal_set]] [destructor]]
    [Destroys the signal set. ]
  ]
  
]

The [link asio.reference.basic_signal_set `basic_signal_set`] class provides the ability to perform an asynchronous wait for one or more signals to occur.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.


[heading Example]
  
Performing an asynchronous wait: 

   void handler(
       const asio::error_code& error,
       int signal_number)
   {
     if (!error)
     {
       // A signal occurred.
     }
   }

   ...

   // Construct a signal set registered for process termination.
   asio::signal_set signals(my_context, SIGINT, SIGTERM);

   // Start an asynchronous wait for one of the signals to occur.
   signals.async_wait(handler);





[heading Queueing of signal notifications]
  


If a signal is registered with a signal\_set, and the signal occurs when there are no waiting handlers, then the signal notification is queued. The next async\_wait operation on that signal\_set will dequeue the notification. If multiple notifications are queued, subsequent async\_wait operations dequeue them one at a time. Signal notifications are dequeued in order of ascending signal number.

If a signal number is removed from a signal\_set (using the `remove` or `erase` member functions) then any queued notifications for that signal are discarded.


[heading Multiple registration of signals]
  


The same signal number may be registered with different signal\_set objects. When the signal occurs, one handler is called for each signal\_set object.

Note that multiple registration only works for signals that are registered using Asio. The application must not also register a signal handler using functions such as `signal()` or `sigaction()`.


[heading Signal masking on POSIX platforms]
  


POSIX allows signals to be blocked using functions such as `sigprocmask()` and `pthread_sigmask()`. For signals to be delivered, programs must ensure that any signals registered using signal\_set objects are unblocked in at least one thread. 

[heading Requirements]

['Header: ][^asio/basic_signal_set.hpp]

['Convenience header: ][^asio.hpp]

[section:add basic_signal_set::add]

[indexterm2 asio.indexterm.basic_signal_set.add..add..basic_signal_set] 
Add a signal to a signal\_set. 


  void ``[link asio.reference.basic_signal_set.add.overload1 add]``(
      int signal_number);
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.add.overload1 more...]]``

  void ``[link asio.reference.basic_signal_set.add.overload2 add]``(
      int signal_number,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.add.overload2 more...]]``


[section:overload1 basic_signal_set::add (1 of 2 overloads)]


Add a signal to a signal\_set. 


  void add(
      int signal_number);


This function adds the specified signal to the set. It has no effect if the signal is already in the set.


[heading Parameters]
    

[variablelist
  
[[signal_number][The signal to be added to the set.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 basic_signal_set::add (2 of 2 overloads)]


Add a signal to a signal\_set. 


  void add(
      int signal_number,
      asio::error_code & ec);


This function adds the specified signal to the set. It has no effect if the signal is already in the set.


[heading Parameters]
    

[variablelist
  
[[signal_number][The signal to be added to the set.]]

[[ec][Set to indicate what error occurred, if any. ]]

]




[endsect]


[endsect]


[section:async_wait basic_signal_set::async_wait]

[indexterm2 asio.indexterm.basic_signal_set.async_wait..async_wait..basic_signal_set] 
Start an asynchronous operation to wait for a signal to be delivered. 


  template<
      typename ``[link asio.reference.SignalHandler SignalHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_wait(
      SignalHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function may be used to initiate an asynchronous wait against the signal set. It always returns immediately.

For each call to `async_wait()`, the supplied handler will be called exactly once. The handler will be called when:


* One of the registered signals in the signal set occurs; or


* The signal set was cancelled, in which case the handler is passed the error code `asio::error::operation_aborted`.


[heading Parameters]
    

[variablelist
  
[[handler][The handler to be called when the signal occurs. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     int signal_number // Indicates which signal occurred.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`]. ]]

]




[endsect]


[section:basic_signal_set basic_signal_set::basic_signal_set]

[indexterm2 asio.indexterm.basic_signal_set.basic_signal_set..basic_signal_set..basic_signal_set] 
Construct a signal set without adding any signals. 


  explicit ``[link asio.reference.basic_signal_set.basic_signal_set.overload1 basic_signal_set]``(
      const executor_type & ex);
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.basic_signal_set.overload1 more...]]``

  template<
      typename ExecutionContext>
  explicit ``[link asio.reference.basic_signal_set.basic_signal_set.overload2 basic_signal_set]``(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.basic_signal_set.overload2 more...]]``


Construct a signal set and add one signal. 


  ``[link asio.reference.basic_signal_set.basic_signal_set.overload3 basic_signal_set]``(
      const executor_type & ex,
      int signal_number_1);
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.basic_signal_set.overload3 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_signal_set.basic_signal_set.overload4 basic_signal_set]``(
      ExecutionContext & context,
      int signal_number_1,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.basic_signal_set.overload4 more...]]``


Construct a signal set and add two signals. 


  ``[link asio.reference.basic_signal_set.basic_signal_set.overload5 basic_signal_set]``(
      const executor_type & ex,
      int signal_number_1,
      int signal_number_2);
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.basic_signal_set.overload5 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_signal_set.basic_signal_set.overload6 basic_signal_set]``(
      ExecutionContext & context,
      int signal_number_1,
      int signal_number_2,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.basic_signal_set.overload6 more...]]``


Construct a signal set and add three signals. 


  ``[link asio.reference.basic_signal_set.basic_signal_set.overload7 basic_signal_set]``(
      const executor_type & ex,
      int signal_number_1,
      int signal_number_2,
      int signal_number_3);
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.basic_signal_set.overload7 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_signal_set.basic_signal_set.overload8 basic_signal_set]``(
      ExecutionContext & context,
      int signal_number_1,
      int signal_number_2,
      int signal_number_3,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.basic_signal_set.overload8 more...]]``


[section:overload1 basic_signal_set::basic_signal_set (1 of 8 overloads)]


Construct a signal set without adding any signals. 


  basic_signal_set(
      const executor_type & ex);


This constructor creates a signal set without registering for any signals.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the signal set will use, by default, to dispatch handlers for any asynchronous operations performed on the signal set. ]]

]




[endsect]



[section:overload2 basic_signal_set::basic_signal_set (2 of 8 overloads)]


Construct a signal set without adding any signals. 


  template<
      typename ExecutionContext>
  basic_signal_set(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a signal set without registering for any signals.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the signal set will use, by default, to dispatch handlers for any asynchronous operations performed on the signal set. ]]

]




[endsect]



[section:overload3 basic_signal_set::basic_signal_set (3 of 8 overloads)]


Construct a signal set and add one signal. 


  basic_signal_set(
      const executor_type & ex,
      int signal_number_1);


This constructor creates a signal set and registers for one signal.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the signal set will use, by default, to dispatch handlers for any asynchronous operations performed on the signal set.]]

[[signal_number_1][The signal number to be added.]]

]


[heading Remarks]
      
This constructor is equivalent to performing: 

   asio::signal_set signals(ex);
   signals.add(signal_number_1); 







[endsect]



[section:overload4 basic_signal_set::basic_signal_set (4 of 8 overloads)]


Construct a signal set and add one signal. 


  template<
      typename ExecutionContext>
  basic_signal_set(
      ExecutionContext & context,
      int signal_number_1,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a signal set and registers for one signal.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the signal set will use, by default, to dispatch handlers for any asynchronous operations performed on the signal set.]]

[[signal_number_1][The signal number to be added.]]

]


[heading Remarks]
      
This constructor is equivalent to performing: 

   asio::signal_set signals(context);
   signals.add(signal_number_1); 







[endsect]



[section:overload5 basic_signal_set::basic_signal_set (5 of 8 overloads)]


Construct a signal set and add two signals. 


  basic_signal_set(
      const executor_type & ex,
      int signal_number_1,
      int signal_number_2);


This constructor creates a signal set and registers for two signals.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the signal set will use, by default, to dispatch handlers for any asynchronous operations performed on the signal set.]]

[[signal_number_1][The first signal number to be added.]]

[[signal_number_2][The second signal number to be added.]]

]


[heading Remarks]
      
This constructor is equivalent to performing: 

   asio::signal_set signals(ex);
   signals.add(signal_number_1);
   signals.add(signal_number_2); 







[endsect]



[section:overload6 basic_signal_set::basic_signal_set (6 of 8 overloads)]


Construct a signal set and add two signals. 


  template<
      typename ExecutionContext>
  basic_signal_set(
      ExecutionContext & context,
      int signal_number_1,
      int signal_number_2,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a signal set and registers for two signals.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the signal set will use, by default, to dispatch handlers for any asynchronous operations performed on the signal set.]]

[[signal_number_1][The first signal number to be added.]]

[[signal_number_2][The second signal number to be added.]]

]


[heading Remarks]
      
This constructor is equivalent to performing: 

   asio::signal_set signals(context);
   signals.add(signal_number_1);
   signals.add(signal_number_2); 







[endsect]



[section:overload7 basic_signal_set::basic_signal_set (7 of 8 overloads)]


Construct a signal set and add three signals. 


  basic_signal_set(
      const executor_type & ex,
      int signal_number_1,
      int signal_number_2,
      int signal_number_3);


This constructor creates a signal set and registers for three signals.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the signal set will use, by default, to dispatch handlers for any asynchronous operations performed on the signal set.]]

[[signal_number_1][The first signal number to be added.]]

[[signal_number_2][The second signal number to be added.]]

[[signal_number_3][The third signal number to be added.]]

]


[heading Remarks]
      
This constructor is equivalent to performing: 

   asio::signal_set signals(ex);
   signals.add(signal_number_1);
   signals.add(signal_number_2);
   signals.add(signal_number_3); 







[endsect]



[section:overload8 basic_signal_set::basic_signal_set (8 of 8 overloads)]


Construct a signal set and add three signals. 


  template<
      typename ExecutionContext>
  basic_signal_set(
      ExecutionContext & context,
      int signal_number_1,
      int signal_number_2,
      int signal_number_3,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a signal set and registers for three signals.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the signal set will use, by default, to dispatch handlers for any asynchronous operations performed on the signal set.]]

[[signal_number_1][The first signal number to be added.]]

[[signal_number_2][The second signal number to be added.]]

[[signal_number_3][The third signal number to be added.]]

]


[heading Remarks]
      
This constructor is equivalent to performing: 

   asio::signal_set signals(context);
   signals.add(signal_number_1);
   signals.add(signal_number_2);
   signals.add(signal_number_3); 







[endsect]


[endsect]

[section:cancel basic_signal_set::cancel]

[indexterm2 asio.indexterm.basic_signal_set.cancel..cancel..basic_signal_set] 
Cancel all operations associated with the signal set. 


  void ``[link asio.reference.basic_signal_set.cancel.overload1 cancel]``();
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.cancel.overload1 more...]]``

  void ``[link asio.reference.basic_signal_set.cancel.overload2 cancel]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.cancel.overload2 more...]]``


[section:overload1 basic_signal_set::cancel (1 of 2 overloads)]


Cancel all operations associated with the signal set. 


  void cancel();


This function forces the completion of any pending asynchronous wait operations against the signal set. The handler for each cancelled operation will be invoked with the `asio::error::operation_aborted` error code.

Cancellation does not alter the set of registered signals.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
If a registered signal occurred before `cancel()` is called, then the handlers for asynchronous wait operations will:


* have already been invoked; or


* have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 


[endsect]



[section:overload2 basic_signal_set::cancel (2 of 2 overloads)]


Cancel all operations associated with the signal set. 


  void cancel(
      asio::error_code & ec);


This function forces the completion of any pending asynchronous wait operations against the signal set. The handler for each cancelled operation will be invoked with the `asio::error::operation_aborted` error code.

Cancellation does not alter the set of registered signals.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
If a registered signal occurred before `cancel()` is called, then the handlers for asynchronous wait operations will:


* have already been invoked; or


* have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 


[endsect]


[endsect]

[section:clear basic_signal_set::clear]

[indexterm2 asio.indexterm.basic_signal_set.clear..clear..basic_signal_set] 
Remove all signals from a signal\_set. 


  void ``[link asio.reference.basic_signal_set.clear.overload1 clear]``();
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.clear.overload1 more...]]``

  void ``[link asio.reference.basic_signal_set.clear.overload2 clear]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.clear.overload2 more...]]``


[section:overload1 basic_signal_set::clear (1 of 2 overloads)]


Remove all signals from a signal\_set. 


  void clear();


This function removes all signals from the set. It has no effect if the set is already empty.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Removes all queued notifications. 




[endsect]



[section:overload2 basic_signal_set::clear (2 of 2 overloads)]


Remove all signals from a signal\_set. 


  void clear(
      asio::error_code & ec);


This function removes all signals from the set. It has no effect if the set is already empty.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Removes all queued notifications. 




[endsect]


[endsect]


[section:executor_type basic_signal_set::executor_type]

[indexterm2 asio.indexterm.basic_signal_set.executor_type..executor_type..basic_signal_set] 
The type of the executor associated with the object. 


  typedef Executor executor_type;



[heading Requirements]

['Header: ][^asio/basic_signal_set.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:get_executor basic_signal_set::get_executor]

[indexterm2 asio.indexterm.basic_signal_set.get_executor..get_executor..basic_signal_set] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:remove basic_signal_set::remove]

[indexterm2 asio.indexterm.basic_signal_set.remove..remove..basic_signal_set] 
Remove a signal from a signal\_set. 


  void ``[link asio.reference.basic_signal_set.remove.overload1 remove]``(
      int signal_number);
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.remove.overload1 more...]]``

  void ``[link asio.reference.basic_signal_set.remove.overload2 remove]``(
      int signal_number,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.remove.overload2 more...]]``


[section:overload1 basic_signal_set::remove (1 of 2 overloads)]


Remove a signal from a signal\_set. 


  void remove(
      int signal_number);


This function removes the specified signal from the set. It has no effect if the signal is not in the set.


[heading Parameters]
    

[variablelist
  
[[signal_number][The signal to be removed from the set.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Removes any notifications that have been queued for the specified signal number. 




[endsect]



[section:overload2 basic_signal_set::remove (2 of 2 overloads)]


Remove a signal from a signal\_set. 


  void remove(
      int signal_number,
      asio::error_code & ec);


This function removes the specified signal from the set. It has no effect if the signal is not in the set.


[heading Parameters]
    

[variablelist
  
[[signal_number][The signal to be removed from the set.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Removes any notifications that have been queued for the specified signal number. 




[endsect]


[endsect]


[section:_basic_signal_set basic_signal_set::~basic_signal_set]

[indexterm2 asio.indexterm.basic_signal_set._basic_signal_set..~basic_signal_set..basic_signal_set] 
Destroys the signal set. 


  ~basic_signal_set();


This function destroys the signal set, cancelling any outstanding asynchronous wait operations associated with the signal set as if by calling `cancel`. 


[endsect]



[endsect]

[section:basic_signal_set__rebind_executor basic_signal_set::rebind_executor]


Rebinds the signal set type to another executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  struct rebind_executor


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_signal_set__rebind_executor.other [*other]]]
    [The signal set type when rebound to the specified executor. ]
  
  ]

]

[heading Requirements]

['Header: ][^asio/basic_signal_set.hpp]

['Convenience header: ][^asio.hpp]


[section:other basic_signal_set::rebind_executor::other]

[indexterm2 asio.indexterm.basic_signal_set__rebind_executor.other..other..basic_signal_set::rebind_executor] 
The signal set type when rebound to the specified executor. 


  typedef basic_signal_set< Executor1 > other;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_signal_set__rebind_executor [*rebind_executor]]]
    [Rebinds the signal set type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_signal_set.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_signal_set.add [*add]]]
    [Add a signal to a signal_set. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set.async_wait [*async_wait]]]
    [Start an asynchronous operation to wait for a signal to be delivered. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set.basic_signal_set [*basic_signal_set]] [constructor]]
    [Construct a signal set without adding any signals. 
     [hr]
     Construct a signal set and add one signal. 
     [hr]
     Construct a signal set and add two signals. 
     [hr]
     Construct a signal set and add three signals. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set.cancel [*cancel]]]
    [Cancel all operations associated with the signal set. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set.clear [*clear]]]
    [Remove all signals from a signal_set. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set.remove [*remove]]]
    [Remove a signal from a signal_set. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set._basic_signal_set [*~basic_signal_set]] [destructor]]
    [Destroys the signal set. ]
  ]
  
]

The [link asio.reference.basic_signal_set `basic_signal_set`] class provides the ability to perform an asynchronous wait for one or more signals to occur.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.


[heading Example]
  
Performing an asynchronous wait: 

   void handler(
       const asio::error_code& error,
       int signal_number)
   {
     if (!error)
     {
       // A signal occurred.
     }
   }

   ...

   // Construct a signal set registered for process termination.
   asio::signal_set signals(my_context, SIGINT, SIGTERM);

   // Start an asynchronous wait for one of the signals to occur.
   signals.async_wait(handler);





[heading Queueing of signal notifications]
  


If a signal is registered with a signal\_set, and the signal occurs when there are no waiting handlers, then the signal notification is queued. The next async\_wait operation on that signal\_set will dequeue the notification. If multiple notifications are queued, subsequent async\_wait operations dequeue them one at a time. Signal notifications are dequeued in order of ascending signal number.

If a signal number is removed from a signal\_set (using the `remove` or `erase` member functions) then any queued notifications for that signal are discarded.


[heading Multiple registration of signals]
  


The same signal number may be registered with different signal\_set objects. When the signal occurs, one handler is called for each signal\_set object.

Note that multiple registration only works for signals that are registered using Asio. The application must not also register a signal handler using functions such as `signal()` or `sigaction()`.


[heading Signal masking on POSIX platforms]
  


POSIX allows signals to be blocked using functions such as `sigprocmask()` and `pthread_sigmask()`. For signals to be delivered, programs must ensure that any signals registered using signal\_set objects are unblocked in at least one thread. 


[heading Requirements]

['Header: ][^asio/basic_signal_set.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:basic_socket basic_socket]


Provides socket functionality. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``>
  class basic_socket :
    public socket_base


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_socket.basic_socket [*basic_socket]] [constructor]]
    [Construct a basic_socket without opening it. 
     [hr]
     Construct and open a basic_socket. 
     [hr]
     Construct a basic_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_socket on an existing native socket. 
     [hr]
     Move-construct a basic_socket from another. 
     [hr]
     Move-construct a basic_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_socket from another. 
     [hr]
     Move-assign a basic_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket._basic_socket [*~basic_socket]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_socket `basic_socket`] class template provides functionality that is common to both stream-oriented and datagram-oriented sockets.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/basic_socket.hpp]

['Convenience header: ][^asio.hpp]

[section:assign basic_socket::assign]

[indexterm2 asio.indexterm.basic_socket.assign..assign..basic_socket] 
Assign an existing native socket to the socket. 


  void ``[link asio.reference.basic_socket.assign.overload1 assign]``(
      const protocol_type & protocol,
      const native_handle_type & native_socket);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.assign.overload1 more...]]``

  void ``[link asio.reference.basic_socket.assign.overload2 assign]``(
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.assign.overload2 more...]]``


[section:overload1 basic_socket::assign (1 of 2 overloads)]


Assign an existing native socket to the socket. 


  void assign(
      const protocol_type & protocol,
      const native_handle_type & native_socket);



[endsect]



[section:overload2 basic_socket::assign (2 of 2 overloads)]


Assign an existing native socket to the socket. 


  void assign(
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      asio::error_code & ec);



[endsect]


[endsect]


[section:async_connect basic_socket::async_connect]

[indexterm2 asio.indexterm.basic_socket.async_connect..async_connect..basic_socket] 
Start an asynchronous connect. 


  template<
      typename ``[link asio.reference.ConnectHandler ConnectHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_connect(
      const endpoint_type & peer_endpoint,
      ConnectHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously connect a socket to the specified remote endpoint. The function call always returns immediately.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.


[heading Parameters]
    

[variablelist
  
[[peer_endpoint][The remote endpoint to which the socket will be connected. Copies will be made of the endpoint object as required.]]

[[handler][The handler to be called when the connection operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error // Result of operation
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  


   void connect_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Connect succeeded.
     }
   }

   ...

   asio::ip::tcp::socket socket(my_context);
   asio::ip::tcp::endpoint endpoint(
       asio::ip::address::from_string("1.2.3.4"), 12345);
   socket.async_connect(endpoint, connect_handler);







[endsect]



[section:async_wait basic_socket::async_wait]

[indexterm2 asio.indexterm.basic_socket.async_wait..async_wait..basic_socket] 
Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  template<
      typename ``[link asio.reference.WaitHandler WaitHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_wait(
      wait_type w,
      WaitHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to perform an asynchronous wait for a socket to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired socket state.]]

[[handler][The handler to be called when the wait operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error // Result of operation
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  


   void wait_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Wait succeeded.
     }
   }

   ...

   asio::ip::tcp::socket socket(my_context);
   ...
   socket.async_wait(asio::ip::tcp::socket::wait_read, wait_handler);







[endsect]


[section:at_mark basic_socket::at_mark]

[indexterm2 asio.indexterm.basic_socket.at_mark..at_mark..basic_socket] 
Determine whether the socket is at the out-of-band data mark. 


  bool ``[link asio.reference.basic_socket.at_mark.overload1 at_mark]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket.at_mark.overload1 more...]]``

  bool ``[link asio.reference.basic_socket.at_mark.overload2 at_mark]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket.at_mark.overload2 more...]]``


[section:overload1 basic_socket::at_mark (1 of 2 overloads)]


Determine whether the socket is at the out-of-band data mark. 


  bool at_mark() const;


This function is used to check whether the socket input is currently positioned at the out-of-band data mark.


[heading Return Value]
      
A bool indicating whether the socket is at the out-of-band data mark.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 basic_socket::at_mark (2 of 2 overloads)]


Determine whether the socket is at the out-of-band data mark. 


  bool at_mark(
      asio::error_code & ec) const;


This function is used to check whether the socket input is currently positioned at the out-of-band data mark.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
A bool indicating whether the socket is at the out-of-band data mark. 




[endsect]


[endsect]

[section:available basic_socket::available]

[indexterm2 asio.indexterm.basic_socket.available..available..basic_socket] 
Determine the number of bytes available for reading. 


  std::size_t ``[link asio.reference.basic_socket.available.overload1 available]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket.available.overload1 more...]]``

  std::size_t ``[link asio.reference.basic_socket.available.overload2 available]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket.available.overload2 more...]]``


[section:overload1 basic_socket::available (1 of 2 overloads)]


Determine the number of bytes available for reading. 


  std::size_t available() const;


This function is used to determine the number of bytes that may be read without blocking.


[heading Return Value]
      
The number of bytes that may be read without blocking, or 0 if an error occurs.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 basic_socket::available (2 of 2 overloads)]


Determine the number of bytes available for reading. 


  std::size_t available(
      asio::error_code & ec) const;


This function is used to determine the number of bytes that may be read without blocking.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes that may be read without blocking, or 0 if an error occurs. 




[endsect]


[endsect]

[section:basic_socket basic_socket::basic_socket]

[indexterm2 asio.indexterm.basic_socket.basic_socket..basic_socket..basic_socket] 
Construct a [link asio.reference.basic_socket `basic_socket`] without opening it. 


  explicit ``[link asio.reference.basic_socket.basic_socket.overload1 basic_socket]``(
      const executor_type & ex);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.basic_socket.overload1 more...]]``

  template<
      typename ExecutionContext>
  explicit ``[link asio.reference.basic_socket.basic_socket.overload2 basic_socket]``(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.basic_socket.overload2 more...]]``


Construct and open a [link asio.reference.basic_socket `basic_socket`]. 


  ``[link asio.reference.basic_socket.basic_socket.overload3 basic_socket]``(
      const executor_type & ex,
      const protocol_type & protocol);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.basic_socket.overload3 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_socket.basic_socket.overload4 basic_socket]``(
      ExecutionContext & context,
      const protocol_type & protocol,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.basic_socket.overload4 more...]]``


Construct a [link asio.reference.basic_socket `basic_socket`], opening it and binding it to the given local endpoint. 


  ``[link asio.reference.basic_socket.basic_socket.overload5 basic_socket]``(
      const executor_type & ex,
      const endpoint_type & endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.basic_socket.overload5 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_socket.basic_socket.overload6 basic_socket]``(
      ExecutionContext & context,
      const endpoint_type & endpoint,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.basic_socket.overload6 more...]]``


Construct a [link asio.reference.basic_socket `basic_socket`] on an existing native socket. 


  ``[link asio.reference.basic_socket.basic_socket.overload7 basic_socket]``(
      const executor_type & ex,
      const protocol_type & protocol,
      const native_handle_type & native_socket);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.basic_socket.overload7 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_socket.basic_socket.overload8 basic_socket]``(
      ExecutionContext & context,
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.basic_socket.overload8 more...]]``


Move-construct a [link asio.reference.basic_socket `basic_socket`] from another. 


  ``[link asio.reference.basic_socket.basic_socket.overload9 basic_socket]``(
      basic_socket && other);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.basic_socket.overload9 more...]]``


Move-construct a [link asio.reference.basic_socket `basic_socket`] from a socket of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  ``[link asio.reference.basic_socket.basic_socket.overload10 basic_socket]``(
      basic_socket< Protocol1, Executor1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.basic_socket.overload10 more...]]``


[section:overload1 basic_socket::basic_socket (1 of 10 overloads)]


Construct a [link asio.reference.basic_socket `basic_socket`] without opening it. 


  basic_socket(
      const executor_type & ex);


This constructor creates a socket without opening it.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket. ]]

]




[endsect]



[section:overload2 basic_socket::basic_socket (2 of 10 overloads)]


Construct a [link asio.reference.basic_socket `basic_socket`] without opening it. 


  template<
      typename ExecutionContext>
  basic_socket(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a socket without opening it.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket. ]]

]




[endsect]



[section:overload3 basic_socket::basic_socket (3 of 10 overloads)]


Construct and open a [link asio.reference.basic_socket `basic_socket`]. 


  basic_socket(
      const executor_type & ex,
      const protocol_type & protocol);


This constructor creates and opens a socket.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[protocol][An object specifying protocol parameters to be used.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload4 basic_socket::basic_socket (4 of 10 overloads)]


Construct and open a [link asio.reference.basic_socket `basic_socket`]. 


  template<
      typename ExecutionContext>
  basic_socket(
      ExecutionContext & context,
      const protocol_type & protocol,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates and opens a socket.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[protocol][An object specifying protocol parameters to be used.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload5 basic_socket::basic_socket (5 of 10 overloads)]


Construct a [link asio.reference.basic_socket `basic_socket`], opening it and binding it to the given local endpoint. 


  basic_socket(
      const executor_type & ex,
      const endpoint_type & endpoint);


This constructor creates a socket and automatically opens it bound to the specified endpoint on the local machine. The protocol used is the protocol associated with the given endpoint.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[endpoint][An endpoint on the local machine to which the socket will be bound.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload6 basic_socket::basic_socket (6 of 10 overloads)]


Construct a [link asio.reference.basic_socket `basic_socket`], opening it and binding it to the given local endpoint. 


  template<
      typename ExecutionContext>
  basic_socket(
      ExecutionContext & context,
      const endpoint_type & endpoint,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a socket and automatically opens it bound to the specified endpoint on the local machine. The protocol used is the protocol associated with the given endpoint.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[endpoint][An endpoint on the local machine to which the socket will be bound.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload7 basic_socket::basic_socket (7 of 10 overloads)]


Construct a [link asio.reference.basic_socket `basic_socket`] on an existing native socket. 


  basic_socket(
      const executor_type & ex,
      const protocol_type & protocol,
      const native_handle_type & native_socket);


This constructor creates a socket object to hold an existing native socket.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[protocol][An object specifying protocol parameters to be used.]]

[[native_socket][A native socket.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload8 basic_socket::basic_socket (8 of 10 overloads)]


Construct a [link asio.reference.basic_socket `basic_socket`] on an existing native socket. 


  template<
      typename ExecutionContext>
  basic_socket(
      ExecutionContext & context,
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a socket object to hold an existing native socket.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[protocol][An object specifying protocol parameters to be used.]]

[[native_socket][A native socket.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload9 basic_socket::basic_socket (9 of 10 overloads)]


Move-construct a [link asio.reference.basic_socket `basic_socket`] from another. 


  basic_socket(
      basic_socket && other);


This constructor moves a socket from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_socket `basic_socket`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_socket(const executor_type&) constructor`. 




[endsect]



[section:overload10 basic_socket::basic_socket (10 of 10 overloads)]


Move-construct a [link asio.reference.basic_socket `basic_socket`] from a socket of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  basic_socket(
      basic_socket< Protocol1, Executor1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value >::type *  = 0);


This constructor moves a socket from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_socket `basic_socket`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_socket(const executor_type&) constructor`. 




[endsect]


[endsect]

[section:bind basic_socket::bind]

[indexterm2 asio.indexterm.basic_socket.bind..bind..basic_socket] 
Bind the socket to the given local endpoint. 


  void ``[link asio.reference.basic_socket.bind.overload1 bind]``(
      const endpoint_type & endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.bind.overload1 more...]]``

  void ``[link asio.reference.basic_socket.bind.overload2 bind]``(
      const endpoint_type & endpoint,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.bind.overload2 more...]]``


[section:overload1 basic_socket::bind (1 of 2 overloads)]


Bind the socket to the given local endpoint. 


  void bind(
      const endpoint_type & endpoint);


This function binds the socket to the specified endpoint on the local machine.


[heading Parameters]
    

[variablelist
  
[[endpoint][An endpoint on the local machine to which the socket will be bound.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   socket.open(asio::ip::tcp::v4());
   socket.bind(asio::ip::tcp::endpoint(
         asio::ip::tcp::v4(), 12345));







[endsect]



[section:overload2 basic_socket::bind (2 of 2 overloads)]


Bind the socket to the given local endpoint. 


  void bind(
      const endpoint_type & endpoint,
      asio::error_code & ec);


This function binds the socket to the specified endpoint on the local machine.


[heading Parameters]
    

[variablelist
  
[[endpoint][An endpoint on the local machine to which the socket will be bound.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   socket.open(asio::ip::tcp::v4());
   asio::error_code ec;
   socket.bind(asio::ip::tcp::endpoint(
         asio::ip::tcp::v4(), 12345), ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:broadcast basic_socket::broadcast]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket.broadcast..broadcast..basic_socket] 
Socket option to permit sending of broadcast messages. 


  typedef implementation_defined broadcast;



Implements the SOL\_SOCKET/SO\_BROADCAST socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::broadcast option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::broadcast option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:bytes_readable basic_socket::bytes_readable]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket.bytes_readable..bytes_readable..basic_socket] 
IO control command to get the amount of data that can be read without blocking. 


  typedef implementation_defined bytes_readable;



Implements the FIONREAD IO control command.


[heading Example]
  


   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();







[heading Requirements]

['Header: ][^asio/basic_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:cancel basic_socket::cancel]

[indexterm2 asio.indexterm.basic_socket.cancel..cancel..basic_socket] 
Cancel all asynchronous operations associated with the socket. 


  void ``[link asio.reference.basic_socket.cancel.overload1 cancel]``();
  ``  [''''&raquo;''' [link asio.reference.basic_socket.cancel.overload1 more...]]``

  void ``[link asio.reference.basic_socket.cancel.overload2 cancel]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.cancel.overload2 more...]]``


[section:overload1 basic_socket::cancel (1 of 2 overloads)]


Cancel all asynchronous operations associated with the socket. 


  void cancel();


This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls to `cancel()` will always fail with `asio::error::operation_not_supported` when run on Windows XP, Windows Server 2003, and earlier versions of Windows, unless ASIO\_ENABLE\_CANCELIO is defined. However, the CancelIo function has two issues that should be considered before enabling its use:


* It will only cancel asynchronous operations that were initiated in the current thread.


* It can appear to complete without error, but the request to cancel the unfinished operations may be silently ignored by the operating system. Whether it works or not seems to depend on the drivers that are installed.

For portable cancellation, consider using one of the following alternatives:


* Disable asio's I/O completion port backend by defining ASIO\_DISABLE\_IOCP.


* Use the `close()` function to simultaneously cancel the outstanding operations and close the socket.

When running on Windows Vista, Windows Server 2008, and later, the CancelIoEx function is always used. This function does not have the problems described above. 


[endsect]



[section:overload2 basic_socket::cancel (2 of 2 overloads)]


Cancel all asynchronous operations associated with the socket. 


  void cancel(
      asio::error_code & ec);


This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls to `cancel()` will always fail with `asio::error::operation_not_supported` when run on Windows XP, Windows Server 2003, and earlier versions of Windows, unless ASIO\_ENABLE\_CANCELIO is defined. However, the CancelIo function has two issues that should be considered before enabling its use:


* It will only cancel asynchronous operations that were initiated in the current thread.


* It can appear to complete without error, but the request to cancel the unfinished operations may be silently ignored by the operating system. Whether it works or not seems to depend on the drivers that are installed.

For portable cancellation, consider using one of the following alternatives:


* Disable asio's I/O completion port backend by defining ASIO\_DISABLE\_IOCP.


* Use the `close()` function to simultaneously cancel the outstanding operations and close the socket.

When running on Windows Vista, Windows Server 2008, and later, the CancelIoEx function is always used. This function does not have the problems described above. 


[endsect]


[endsect]

[section:close basic_socket::close]

[indexterm2 asio.indexterm.basic_socket.close..close..basic_socket] 
Close the socket. 


  void ``[link asio.reference.basic_socket.close.overload1 close]``();
  ``  [''''&raquo;''' [link asio.reference.basic_socket.close.overload1 more...]]``

  void ``[link asio.reference.basic_socket.close.overload2 close]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.close.overload2 more...]]``


[section:overload1 basic_socket::close (1 of 2 overloads)]


Close the socket. 


  void close();


This function is used to close the socket. Any asynchronous send, receive or connect operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed.]]

]


[heading Remarks]
      
For portable behaviour with respect to graceful closure of a connected socket, call `shutdown()` before closing the socket. 




[endsect]



[section:overload2 basic_socket::close (2 of 2 overloads)]


Close the socket. 


  void close(
      asio::error_code & ec);


This function is used to close the socket. Any asynchronous send, receive or connect operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   socket.close(ec);
   if (ec)
   {
     // An error occurred.
   }





[heading Remarks]
      
For portable behaviour with respect to graceful closure of a connected socket, call `shutdown()` before closing the socket. 




[endsect]


[endsect]

[section:connect basic_socket::connect]

[indexterm2 asio.indexterm.basic_socket.connect..connect..basic_socket] 
Connect the socket to the specified endpoint. 


  void ``[link asio.reference.basic_socket.connect.overload1 connect]``(
      const endpoint_type & peer_endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.connect.overload1 more...]]``

  void ``[link asio.reference.basic_socket.connect.overload2 connect]``(
      const endpoint_type & peer_endpoint,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.connect.overload2 more...]]``


[section:overload1 basic_socket::connect (1 of 2 overloads)]


Connect the socket to the specified endpoint. 


  void connect(
      const endpoint_type & peer_endpoint);


This function is used to connect a socket to the specified remote endpoint. The function call will block until the connection is successfully made or an error occurs.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.


[heading Parameters]
    

[variablelist
  
[[peer_endpoint][The remote endpoint to which the socket will be connected.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   asio::ip::tcp::endpoint endpoint(
       asio::ip::address::from_string("1.2.3.4"), 12345);
   socket.connect(endpoint);







[endsect]



[section:overload2 basic_socket::connect (2 of 2 overloads)]


Connect the socket to the specified endpoint. 


  void connect(
      const endpoint_type & peer_endpoint,
      asio::error_code & ec);


This function is used to connect a socket to the specified remote endpoint. The function call will block until the connection is successfully made or an error occurs.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.


[heading Parameters]
    

[variablelist
  
[[peer_endpoint][The remote endpoint to which the socket will be connected.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   asio::ip::tcp::endpoint endpoint(
       asio::ip::address::from_string("1.2.3.4"), 12345);
   asio::error_code ec;
   socket.connect(endpoint, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:debug basic_socket::debug]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket.debug..debug..basic_socket] 
Socket option to enable socket-level debugging. 


  typedef implementation_defined debug;



Implements the SOL\_SOCKET/SO\_DEBUG socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::debug option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::debug option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:do_not_route basic_socket::do_not_route]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket.do_not_route..do_not_route..basic_socket] 
Socket option to prevent routing, use local interfaces only. 


  typedef implementation_defined do_not_route;



Implements the SOL\_SOCKET/SO\_DONTROUTE socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::do_not_route option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::do_not_route option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:enable_connection_aborted basic_socket::enable_connection_aborted]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket.enable_connection_aborted..enable_connection_aborted..basic_socket] 
Socket option to report aborted connections on accept. 


  typedef implementation_defined enable_connection_aborted;



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.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::enable_connection_aborted option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::enable_connection_aborted option;
   acceptor.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:endpoint_type basic_socket::endpoint_type]

[indexterm2 asio.indexterm.basic_socket.endpoint_type..endpoint_type..basic_socket] 
The endpoint type. 


  typedef Protocol::endpoint endpoint_type;



[heading Requirements]

['Header: ][^asio/basic_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:executor_type basic_socket::executor_type]

[indexterm2 asio.indexterm.basic_socket.executor_type..executor_type..basic_socket] 
The type of the executor associated with the object. 


  typedef Executor executor_type;



[heading Requirements]

['Header: ][^asio/basic_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:get_executor basic_socket::get_executor]

[indexterm2 asio.indexterm.basic_socket.get_executor..get_executor..basic_socket] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_option basic_socket::get_option]

[indexterm2 asio.indexterm.basic_socket.get_option..get_option..basic_socket] 
Get an option from the socket. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void ``[link asio.reference.basic_socket.get_option.overload1 get_option]``(
      GettableSocketOption & option) const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket.get_option.overload1 more...]]``

  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void ``[link asio.reference.basic_socket.get_option.overload2 get_option]``(
      GettableSocketOption & option,
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket.get_option.overload2 more...]]``


[section:overload1 basic_socket::get_option (1 of 2 overloads)]


Get an option from the socket. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void get_option(
      GettableSocketOption & option) const;


This function is used to get the current value of an option on the socket.


[heading Parameters]
    

[variablelist
  
[[option][The option value to be obtained from the socket.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]



[heading Example]
  
Getting the value of the SOL\_SOCKET/SO\_KEEPALIVE option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::socket::keep_alive option;
   socket.get_option(option);
   bool is_set = option.value();







[endsect]



[section:overload2 basic_socket::get_option (2 of 2 overloads)]


Get an option from the socket. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void get_option(
      GettableSocketOption & option,
      asio::error_code & ec) const;


This function is used to get the current value of an option on the socket.


[heading Parameters]
    

[variablelist
  
[[option][The option value to be obtained from the socket.]]

[[ec][Set to indicate what error occurred, if any.]]

]



[heading Example]
  
Getting the value of the SOL\_SOCKET/SO\_KEEPALIVE option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::socket::keep_alive option;
   asio::error_code ec;
   socket.get_option(option, ec);
   if (ec)
   {
     // An error occurred.
   }
   bool is_set = option.value();







[endsect]


[endsect]

[section:io_control basic_socket::io_control]

[indexterm2 asio.indexterm.basic_socket.io_control..io_control..basic_socket] 
Perform an IO control command on the socket. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void ``[link asio.reference.basic_socket.io_control.overload1 io_control]``(
      IoControlCommand & command);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.io_control.overload1 more...]]``

  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void ``[link asio.reference.basic_socket.io_control.overload2 io_control]``(
      IoControlCommand & command,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.io_control.overload2 more...]]``


[section:overload1 basic_socket::io_control (1 of 2 overloads)]


Perform an IO control command on the socket. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void io_control(
      IoControlCommand & command);


This function is used to execute an IO control command on the socket.


[heading Parameters]
    

[variablelist
  
[[command][The IO control command to be performed on the socket.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]



[heading Example]
  
Getting the number of bytes ready to read: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::socket::bytes_readable command;
   socket.io_control(command);
   std::size_t bytes_readable = command.get();







[endsect]



[section:overload2 basic_socket::io_control (2 of 2 overloads)]


Perform an IO control command on the socket. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void io_control(
      IoControlCommand & command,
      asio::error_code & ec);


This function is used to execute an IO control command on the socket.


[heading Parameters]
    

[variablelist
  
[[command][The IO control command to be performed on the socket.]]

[[ec][Set to indicate what error occurred, if any.]]

]



[heading Example]
  
Getting the number of bytes ready to read: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::socket::bytes_readable command;
   asio::error_code ec;
   socket.io_control(command, ec);
   if (ec)
   {
     // An error occurred.
   }
   std::size_t bytes_readable = command.get();







[endsect]


[endsect]


[section:is_open basic_socket::is_open]

[indexterm2 asio.indexterm.basic_socket.is_open..is_open..basic_socket] 
Determine whether the socket is open. 


  bool is_open() const;



[endsect]



[section:keep_alive basic_socket::keep_alive]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket.keep_alive..keep_alive..basic_socket] 
Socket option to send keep-alives. 


  typedef implementation_defined keep_alive;



Implements the SOL\_SOCKET/SO\_KEEPALIVE socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::keep_alive option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::keep_alive option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:linger basic_socket::linger]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket.linger..linger..basic_socket] 
Socket option to specify whether the socket lingers on close if unsent data is present. 


  typedef implementation_defined linger;



Implements the SOL\_SOCKET/SO\_LINGER socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::linger option(true, 30);
   socket.set_option(option);





Getting the current option value: 

   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();







[heading Requirements]

['Header: ][^asio/basic_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:local_endpoint basic_socket::local_endpoint]

[indexterm2 asio.indexterm.basic_socket.local_endpoint..local_endpoint..basic_socket] 
Get the local endpoint of the socket. 


  endpoint_type ``[link asio.reference.basic_socket.local_endpoint.overload1 local_endpoint]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket.local_endpoint.overload1 more...]]``

  endpoint_type ``[link asio.reference.basic_socket.local_endpoint.overload2 local_endpoint]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket.local_endpoint.overload2 more...]]``


[section:overload1 basic_socket::local_endpoint (1 of 2 overloads)]


Get the local endpoint of the socket. 


  endpoint_type local_endpoint() const;


This function is used to obtain the locally bound endpoint of the socket.


[heading Return Value]
      
An object that represents the local endpoint of the socket.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::endpoint endpoint = socket.local_endpoint();







[endsect]



[section:overload2 basic_socket::local_endpoint (2 of 2 overloads)]


Get the local endpoint of the socket. 


  endpoint_type local_endpoint(
      asio::error_code & ec) const;


This function is used to obtain the locally bound endpoint of the socket.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
An object that represents the local endpoint of the socket. Returns a default-constructed endpoint object if an error occurred.


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   asio::ip::tcp::endpoint endpoint = socket.local_endpoint(ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]

[section:lowest_layer basic_socket::lowest_layer]

[indexterm2 asio.indexterm.basic_socket.lowest_layer..lowest_layer..basic_socket] 
Get a reference to the lowest layer. 


  lowest_layer_type & ``[link asio.reference.basic_socket.lowest_layer.overload1 lowest_layer]``();
  ``  [''''&raquo;''' [link asio.reference.basic_socket.lowest_layer.overload1 more...]]``


Get a const reference to the lowest layer. 


  const lowest_layer_type & ``[link asio.reference.basic_socket.lowest_layer.overload2 lowest_layer]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket.lowest_layer.overload2 more...]]``


[section:overload1 basic_socket::lowest_layer (1 of 2 overloads)]


Get a reference to the lowest layer. 


  lowest_layer_type & lowest_layer();


This function returns a reference to the lowest layer in a stack of layers. Since a [link asio.reference.basic_socket `basic_socket`] cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]



[section:overload2 basic_socket::lowest_layer (2 of 2 overloads)]


Get a const reference to the lowest layer. 


  const lowest_layer_type & lowest_layer() const;


This function returns a const reference to the lowest layer in a stack of layers. Since a [link asio.reference.basic_socket `basic_socket`] cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]


[endsect]


[section:lowest_layer_type basic_socket::lowest_layer_type]

[indexterm2 asio.indexterm.basic_socket.lowest_layer_type..lowest_layer_type..basic_socket] 
A [link asio.reference.basic_socket `basic_socket`] is always the lowest layer. 


  typedef basic_socket< Protocol, Executor > lowest_layer_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_socket.basic_socket [*basic_socket]] [constructor]]
    [Construct a basic_socket without opening it. 
     [hr]
     Construct and open a basic_socket. 
     [hr]
     Construct a basic_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_socket on an existing native socket. 
     [hr]
     Move-construct a basic_socket from another. 
     [hr]
     Move-construct a basic_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_socket from another. 
     [hr]
     Move-assign a basic_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket._basic_socket [*~basic_socket]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_socket `basic_socket`] class template provides functionality that is common to both stream-oriented and datagram-oriented sockets.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/basic_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:max_connections basic_socket::max_connections]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket.max_connections..max_connections..basic_socket] 
(Deprecated: Use max\_listen\_connections.) The maximum length of the queue of pending incoming connections. 


  static const int max_connections = implementation_defined;



[endsect]



[section:max_listen_connections basic_socket::max_listen_connections]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket.max_listen_connections..max_listen_connections..basic_socket] 
The maximum length of the queue of pending incoming connections. 


  static const int max_listen_connections = implementation_defined;



[endsect]



[section:message_do_not_route basic_socket::message_do_not_route]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket.message_do_not_route..message_do_not_route..basic_socket] 
Specify that the data should not be subject to routing. 


  static const int message_do_not_route = implementation_defined;



[endsect]



[section:message_end_of_record basic_socket::message_end_of_record]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket.message_end_of_record..message_end_of_record..basic_socket] 
Specifies that the data marks the end of a record. 


  static const int message_end_of_record = implementation_defined;



[endsect]



[section:message_flags basic_socket::message_flags]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket.message_flags..message_flags..basic_socket] 
Bitmask type for flags that can be passed to send and receive operations. 


  typedef int message_flags;



[heading Requirements]

['Header: ][^asio/basic_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:message_out_of_band basic_socket::message_out_of_band]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket.message_out_of_band..message_out_of_band..basic_socket] 
Process out-of-band data. 


  static const int message_out_of_band = implementation_defined;



[endsect]



[section:message_peek basic_socket::message_peek]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket.message_peek..message_peek..basic_socket] 
Peek at incoming data without removing it from the input queue. 


  static const int message_peek = implementation_defined;



[endsect]



[section:native_handle basic_socket::native_handle]

[indexterm2 asio.indexterm.basic_socket.native_handle..native_handle..basic_socket] 
Get the native socket representation. 


  native_handle_type native_handle();


This function may be used to obtain the underlying representation of the socket. This is intended to allow access to native socket functionality that is not otherwise provided. 


[endsect]



[section:native_handle_type basic_socket::native_handle_type]

[indexterm2 asio.indexterm.basic_socket.native_handle_type..native_handle_type..basic_socket] 
The native representation of a socket. 


  typedef implementation_defined native_handle_type;



[heading Requirements]

['Header: ][^asio/basic_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:native_non_blocking basic_socket::native_non_blocking]

[indexterm2 asio.indexterm.basic_socket.native_non_blocking..native_non_blocking..basic_socket] 
Gets the non-blocking mode of the native socket implementation. 


  bool ``[link asio.reference.basic_socket.native_non_blocking.overload1 native_non_blocking]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket.native_non_blocking.overload1 more...]]``


Sets the non-blocking mode of the native socket implementation. 


  void ``[link asio.reference.basic_socket.native_non_blocking.overload2 native_non_blocking]``(
      bool mode);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.native_non_blocking.overload2 more...]]``

  void ``[link asio.reference.basic_socket.native_non_blocking.overload3 native_non_blocking]``(
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.native_non_blocking.overload3 more...]]``


[section:overload1 basic_socket::native_non_blocking (1 of 3 overloads)]


Gets the non-blocking mode of the native socket implementation. 


  bool native_non_blocking() const;


This function is used to retrieve the non-blocking mode of the underlying native socket. This mode has no effect on the behaviour of the socket object's synchronous operations.


[heading Return Value]
      
`true` if the underlying socket is in non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).


[heading Remarks]
      
The current non-blocking mode is cached by the socket object. Consequently, the return value may be incorrect if the non-blocking mode was set directly on the native socket.


[heading Example]
  
This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's `sendfile` system call might be encapsulated: 

   template <typename Handler>
   struct sendfile_op
   {
     tcp::socket& sock_;
     int fd_;
     Handler handler_;
     off_t offset_;
     std::size_t total_bytes_transferred_;

     // Function call operator meeting WriteHandler requirements.
     // Used as the handler for the async_write_some operation.
     void operator()(asio::error_code ec, std::size_t)
     {
       // Put the underlying socket into non-blocking mode.
       if (!ec)
         if (!sock_.native_non_blocking())
           sock_.native_non_blocking(true, ec);

       if (!ec)
       {
         for (;;)
         {
           // Try the system call.
           errno = 0;
           int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
           ec = asio::error_code(n < 0 ? errno : 0,
               asio::error::get_system_category());
           total_bytes_transferred_ += ec ? 0 : n;

           // Retry operation immediately if interrupted by signal.
           if (ec == asio::error::interrupted)
             continue;

           // Check if we need to run the operation again.
           if (ec == asio::error::would_block
               || ec == asio::error::try_again)
           {
             // We have to wait for the socket to become ready again.
             sock_.async_wait(tcp::socket::wait_write, *this);
             return;
           }

           if (ec || n == 0)
           {
             // An error occurred, or we have reached the end of the file.
             // Either way we must exit the loop so we can call the handler.
             break;
           }

           // Loop around to try calling sendfile again.
         }
       }

       // Pass result back to user's handler.
       handler_(ec, total_bytes_transferred_);
     }
   };

   template <typename Handler>
   void async_sendfile(tcp::socket& sock, int fd, Handler h)
   {
     sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
     sock.async_wait(tcp::socket::wait_write, op);
   } 







[endsect]



[section:overload2 basic_socket::native_non_blocking (2 of 3 overloads)]


Sets the non-blocking mode of the native socket implementation. 


  void native_non_blocking(
      bool mode);


This function is used to modify the non-blocking mode of the underlying native socket. It has no effect on the behaviour of the socket object's synchronous operations.


[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the underlying socket is put into non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. If the `mode` is `false`, but the current value of `non_blocking()` is `true`, this function fails with `asio::error::invalid_argument`, as the combination does not make sense.]]

]


[heading Example]
  
This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's `sendfile` system call might be encapsulated: 

   template <typename Handler>
   struct sendfile_op
   {
     tcp::socket& sock_;
     int fd_;
     Handler handler_;
     off_t offset_;
     std::size_t total_bytes_transferred_;

     // Function call operator meeting WriteHandler requirements.
     // Used as the handler for the async_write_some operation.
     void operator()(asio::error_code ec, std::size_t)
     {
       // Put the underlying socket into non-blocking mode.
       if (!ec)
         if (!sock_.native_non_blocking())
           sock_.native_non_blocking(true, ec);

       if (!ec)
       {
         for (;;)
         {
           // Try the system call.
           errno = 0;
           int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
           ec = asio::error_code(n < 0 ? errno : 0,
               asio::error::get_system_category());
           total_bytes_transferred_ += ec ? 0 : n;

           // Retry operation immediately if interrupted by signal.
           if (ec == asio::error::interrupted)
             continue;

           // Check if we need to run the operation again.
           if (ec == asio::error::would_block
               || ec == asio::error::try_again)
           {
             // We have to wait for the socket to become ready again.
             sock_.async_wait(tcp::socket::wait_write, *this);
             return;
           }

           if (ec || n == 0)
           {
             // An error occurred, or we have reached the end of the file.
             // Either way we must exit the loop so we can call the handler.
             break;
           }

           // Loop around to try calling sendfile again.
         }
       }

       // Pass result back to user's handler.
       handler_(ec, total_bytes_transferred_);
     }
   };

   template <typename Handler>
   void async_sendfile(tcp::socket& sock, int fd, Handler h)
   {
     sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
     sock.async_wait(tcp::socket::wait_write, op);
   } 







[endsect]



[section:overload3 basic_socket::native_non_blocking (3 of 3 overloads)]


Sets the non-blocking mode of the native socket implementation. 


  void native_non_blocking(
      bool mode,
      asio::error_code & ec);


This function is used to modify the non-blocking mode of the underlying native socket. It has no effect on the behaviour of the socket object's synchronous operations.


[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the underlying socket is put into non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).]]

[[ec][Set to indicate what error occurred, if any. If the `mode` is `false`, but the current value of `non_blocking()` is `true`, this function fails with `asio::error::invalid_argument`, as the combination does not make sense.]]

]


[heading Example]
  
This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's `sendfile` system call might be encapsulated: 

   template <typename Handler>
   struct sendfile_op
   {
     tcp::socket& sock_;
     int fd_;
     Handler handler_;
     off_t offset_;
     std::size_t total_bytes_transferred_;

     // Function call operator meeting WriteHandler requirements.
     // Used as the handler for the async_write_some operation.
     void operator()(asio::error_code ec, std::size_t)
     {
       // Put the underlying socket into non-blocking mode.
       if (!ec)
         if (!sock_.native_non_blocking())
           sock_.native_non_blocking(true, ec);

       if (!ec)
       {
         for (;;)
         {
           // Try the system call.
           errno = 0;
           int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
           ec = asio::error_code(n < 0 ? errno : 0,
               asio::error::get_system_category());
           total_bytes_transferred_ += ec ? 0 : n;

           // Retry operation immediately if interrupted by signal.
           if (ec == asio::error::interrupted)
             continue;

           // Check if we need to run the operation again.
           if (ec == asio::error::would_block
               || ec == asio::error::try_again)
           {
             // We have to wait for the socket to become ready again.
             sock_.async_wait(tcp::socket::wait_write, *this);
             return;
           }

           if (ec || n == 0)
           {
             // An error occurred, or we have reached the end of the file.
             // Either way we must exit the loop so we can call the handler.
             break;
           }

           // Loop around to try calling sendfile again.
         }
       }

       // Pass result back to user's handler.
       handler_(ec, total_bytes_transferred_);
     }
   };

   template <typename Handler>
   void async_sendfile(tcp::socket& sock, int fd, Handler h)
   {
     sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
     sock.async_wait(tcp::socket::wait_write, op);
   } 







[endsect]


[endsect]

[section:non_blocking basic_socket::non_blocking]

[indexterm2 asio.indexterm.basic_socket.non_blocking..non_blocking..basic_socket] 
Gets the non-blocking mode of the socket. 


  bool ``[link asio.reference.basic_socket.non_blocking.overload1 non_blocking]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket.non_blocking.overload1 more...]]``


Sets the non-blocking mode of the socket. 


  void ``[link asio.reference.basic_socket.non_blocking.overload2 non_blocking]``(
      bool mode);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.non_blocking.overload2 more...]]``

  void ``[link asio.reference.basic_socket.non_blocking.overload3 non_blocking]``(
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.non_blocking.overload3 more...]]``


[section:overload1 basic_socket::non_blocking (1 of 3 overloads)]


Gets the non-blocking mode of the socket. 


  bool non_blocking() const;



[heading Return Value]
      
`true` if the socket's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]



[section:overload2 basic_socket::non_blocking (2 of 3 overloads)]


Sets the non-blocking mode of the socket. 


  void non_blocking(
      bool mode);



[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the socket's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]



[section:overload3 basic_socket::non_blocking (3 of 3 overloads)]


Sets the non-blocking mode of the socket. 


  void non_blocking(
      bool mode,
      asio::error_code & ec);



[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the socket's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]


[endsect]

[section:open basic_socket::open]

[indexterm2 asio.indexterm.basic_socket.open..open..basic_socket] 
Open the socket using the specified protocol. 


  void ``[link asio.reference.basic_socket.open.overload1 open]``(
      const protocol_type & protocol = protocol_type());
  ``  [''''&raquo;''' [link asio.reference.basic_socket.open.overload1 more...]]``

  void ``[link asio.reference.basic_socket.open.overload2 open]``(
      const protocol_type & protocol,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.open.overload2 more...]]``


[section:overload1 basic_socket::open (1 of 2 overloads)]


Open the socket using the specified protocol. 


  void open(
      const protocol_type & protocol = protocol_type());


This function opens the socket so that it will use the specified protocol.


[heading Parameters]
    

[variablelist
  
[[protocol][An object specifying protocol parameters to be used.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   socket.open(asio::ip::tcp::v4());







[endsect]



[section:overload2 basic_socket::open (2 of 2 overloads)]


Open the socket using the specified protocol. 


  void open(
      const protocol_type & protocol,
      asio::error_code & ec);


This function opens the socket so that it will use the specified protocol.


[heading Parameters]
    

[variablelist
  
[[protocol][An object specifying which protocol is to be used.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   asio::error_code ec;
   socket.open(asio::ip::tcp::v4(), ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]

[section:operator_eq_ basic_socket::operator=]

[indexterm2 asio.indexterm.basic_socket.operator_eq_..operator=..basic_socket] 
Move-assign a [link asio.reference.basic_socket `basic_socket`] from another. 


  basic_socket & ``[link asio.reference.basic_socket.operator_eq_.overload1 operator=]``(
      basic_socket && other);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.operator_eq_.overload1 more...]]``


Move-assign a [link asio.reference.basic_socket `basic_socket`] from a socket of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value, basic_socket & >::type ``[link asio.reference.basic_socket.operator_eq_.overload2 operator=]``(
      basic_socket< Protocol1, Executor1 > && other);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.operator_eq_.overload2 more...]]``


[section:overload1 basic_socket::operator= (1 of 2 overloads)]


Move-assign a [link asio.reference.basic_socket `basic_socket`] from another. 


  basic_socket & operator=(
      basic_socket && other);


This assignment operator moves a socket from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_socket `basic_socket`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_socket(const executor_type&) constructor`. 




[endsect]



[section:overload2 basic_socket::operator= (2 of 2 overloads)]


Move-assign a [link asio.reference.basic_socket `basic_socket`] from a socket of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value, basic_socket & >::type operator=(
      basic_socket< Protocol1, Executor1 > && other);


This assignment operator moves a socket from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_socket `basic_socket`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_socket(const executor_type&) constructor`. 




[endsect]


[endsect]


[section:out_of_band_inline basic_socket::out_of_band_inline]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket.out_of_band_inline..out_of_band_inline..basic_socket] 
Socket option for putting received out-of-band data inline. 


  typedef implementation_defined out_of_band_inline;



Implements the SOL\_SOCKET/SO\_OOBINLINE socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::out_of_band_inline option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::out_of_band_inline option;
   socket.get_option(option);
   bool value = option.value();







[heading Requirements]

['Header: ][^asio/basic_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:protocol_type basic_socket::protocol_type]

[indexterm2 asio.indexterm.basic_socket.protocol_type..protocol_type..basic_socket] 
The protocol type. 


  typedef Protocol protocol_type;



[heading Requirements]

['Header: ][^asio/basic_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:receive_buffer_size basic_socket::receive_buffer_size]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket.receive_buffer_size..receive_buffer_size..basic_socket] 
Socket option for the receive buffer size of a socket. 


  typedef implementation_defined receive_buffer_size;



Implements the SOL\_SOCKET/SO\_RCVBUF socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_buffer_size option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:receive_low_watermark basic_socket::receive_low_watermark]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket.receive_low_watermark..receive_low_watermark..basic_socket] 
Socket option for the receive low watermark. 


  typedef implementation_defined receive_low_watermark;



Implements the SOL\_SOCKET/SO\_RCVLOWAT socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_low_watermark option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:release basic_socket::release]

[indexterm2 asio.indexterm.basic_socket.release..release..basic_socket] 
Release ownership of the underlying native socket. 


  native_handle_type ``[link asio.reference.basic_socket.release.overload1 release]``();
  ``  [''''&raquo;''' [link asio.reference.basic_socket.release.overload1 more...]]``

  native_handle_type ``[link asio.reference.basic_socket.release.overload2 release]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.release.overload2 more...]]``


[section:overload1 basic_socket::release (1 of 2 overloads)]


Release ownership of the underlying native socket. 


  native_handle_type release();


This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error. Ownership of the native socket is then transferred to the caller.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
This function is unsupported on Windows versions prior to Windows 8.1, and will fail with `asio::error::operation_not_supported` on these platforms. 




[endsect]



[section:overload2 basic_socket::release (2 of 2 overloads)]


Release ownership of the underlying native socket. 


  native_handle_type release(
      asio::error_code & ec);


This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error. Ownership of the native socket is then transferred to the caller.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
This function is unsupported on Windows versions prior to Windows 8.1, and will fail with `asio::error::operation_not_supported` on these platforms. 




[endsect]


[endsect]

[section:remote_endpoint basic_socket::remote_endpoint]

[indexterm2 asio.indexterm.basic_socket.remote_endpoint..remote_endpoint..basic_socket] 
Get the remote endpoint of the socket. 


  endpoint_type ``[link asio.reference.basic_socket.remote_endpoint.overload1 remote_endpoint]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket.remote_endpoint.overload1 more...]]``

  endpoint_type ``[link asio.reference.basic_socket.remote_endpoint.overload2 remote_endpoint]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket.remote_endpoint.overload2 more...]]``


[section:overload1 basic_socket::remote_endpoint (1 of 2 overloads)]


Get the remote endpoint of the socket. 


  endpoint_type remote_endpoint() const;


This function is used to obtain the remote endpoint of the socket.


[heading Return Value]
      
An object that represents the remote endpoint of the socket.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::endpoint endpoint = socket.remote_endpoint();







[endsect]



[section:overload2 basic_socket::remote_endpoint (2 of 2 overloads)]


Get the remote endpoint of the socket. 


  endpoint_type remote_endpoint(
      asio::error_code & ec) const;


This function is used to obtain the remote endpoint of the socket.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
An object that represents the remote endpoint of the socket. Returns a default-constructed endpoint object if an error occurred.


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   asio::ip::tcp::endpoint endpoint = socket.remote_endpoint(ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:reuse_address basic_socket::reuse_address]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket.reuse_address..reuse_address..basic_socket] 
Socket option to allow the socket to be bound to an address that is already in use. 


  typedef implementation_defined reuse_address;



Implements the SOL\_SOCKET/SO\_REUSEADDR socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::reuse_address option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::reuse_address option;
   acceptor.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:send_buffer_size basic_socket::send_buffer_size]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket.send_buffer_size..send_buffer_size..basic_socket] 
Socket option for the send buffer size of a socket. 


  typedef implementation_defined send_buffer_size;



Implements the SOL\_SOCKET/SO\_SNDBUF socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_buffer_size option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:send_low_watermark basic_socket::send_low_watermark]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket.send_low_watermark..send_low_watermark..basic_socket] 
Socket option for the send low watermark. 


  typedef implementation_defined send_low_watermark;



Implements the SOL\_SOCKET/SO\_SNDLOWAT socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_low_watermark option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:set_option basic_socket::set_option]

[indexterm2 asio.indexterm.basic_socket.set_option..set_option..basic_socket] 
Set an option on the socket. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void ``[link asio.reference.basic_socket.set_option.overload1 set_option]``(
      const SettableSocketOption & option);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.set_option.overload1 more...]]``

  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void ``[link asio.reference.basic_socket.set_option.overload2 set_option]``(
      const SettableSocketOption & option,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.set_option.overload2 more...]]``


[section:overload1 basic_socket::set_option (1 of 2 overloads)]


Set an option on the socket. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void set_option(
      const SettableSocketOption & option);


This function is used to set an option on the socket.


[heading Parameters]
    

[variablelist
  
[[option][The new option value to be set on the socket.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]



[heading Example]
  
Setting the IPPROTO\_TCP/TCP\_NODELAY option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::no_delay option(true);
   socket.set_option(option);







[endsect]



[section:overload2 basic_socket::set_option (2 of 2 overloads)]


Set an option on the socket. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void set_option(
      const SettableSocketOption & option,
      asio::error_code & ec);


This function is used to set an option on the socket.


[heading Parameters]
    

[variablelist
  
[[option][The new option value to be set on the socket.]]

[[ec][Set to indicate what error occurred, if any.]]

]



[heading Example]
  
Setting the IPPROTO\_TCP/TCP\_NODELAY option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::no_delay option(true);
   asio::error_code ec;
   socket.set_option(option, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]

[section:shutdown basic_socket::shutdown]

[indexterm2 asio.indexterm.basic_socket.shutdown..shutdown..basic_socket] 
Disable sends or receives on the socket. 


  void ``[link asio.reference.basic_socket.shutdown.overload1 shutdown]``(
      shutdown_type what);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.shutdown.overload1 more...]]``

  void ``[link asio.reference.basic_socket.shutdown.overload2 shutdown]``(
      shutdown_type what,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.shutdown.overload2 more...]]``


[section:overload1 basic_socket::shutdown (1 of 2 overloads)]


Disable sends or receives on the socket. 


  void shutdown(
      shutdown_type what);


This function is used to disable send operations, receive operations, or both.


[heading Parameters]
    

[variablelist
  
[[what][Determines what types of operation will no longer be allowed.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  
Shutting down the send side of the socket: 

   asio::ip::tcp::socket socket(my_context);
   ...
   socket.shutdown(asio::ip::tcp::socket::shutdown_send);







[endsect]



[section:overload2 basic_socket::shutdown (2 of 2 overloads)]


Disable sends or receives on the socket. 


  void shutdown(
      shutdown_type what,
      asio::error_code & ec);


This function is used to disable send operations, receive operations, or both.


[heading Parameters]
    

[variablelist
  
[[what][Determines what types of operation will no longer be allowed.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  
Shutting down the send side of the socket: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   socket.shutdown(asio::ip::tcp::socket::shutdown_send, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:shutdown_type basic_socket::shutdown_type]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket.shutdown_type..shutdown_type..basic_socket] 
Different ways a socket may be shutdown. 


  enum shutdown_type

[indexterm2 asio.indexterm.basic_socket.shutdown_type.shutdown_receive..shutdown_receive..basic_socket]
[indexterm2 asio.indexterm.basic_socket.shutdown_type.shutdown_send..shutdown_send..basic_socket]
[indexterm2 asio.indexterm.basic_socket.shutdown_type.shutdown_both..shutdown_both..basic_socket]

[heading Values]
[variablelist

  [
    [shutdown_receive]
    [Shutdown the receive side of the socket. ]
  ]

  [
    [shutdown_send]
    [Shutdown the send side of the socket. ]
  ]

  [
    [shutdown_both]
    [Shutdown both send and receive on the socket. ]
  ]

]



[endsect]


[section:wait basic_socket::wait]

[indexterm2 asio.indexterm.basic_socket.wait..wait..basic_socket] 
Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  void ``[link asio.reference.basic_socket.wait.overload1 wait]``(
      wait_type w);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.wait.overload1 more...]]``

  void ``[link asio.reference.basic_socket.wait.overload2 wait]``(
      wait_type w,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.wait.overload2 more...]]``


[section:overload1 basic_socket::wait (1 of 2 overloads)]


Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  void wait(
      wait_type w);


This function is used to perform a blocking wait for a socket to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired socket state.]]

]


[heading Example]
  
Waiting for a socket to become readable. 

   asio::ip::tcp::socket socket(my_context);
   ...
   socket.wait(asio::ip::tcp::socket::wait_read);







[endsect]



[section:overload2 basic_socket::wait (2 of 2 overloads)]


Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  void wait(
      wait_type w,
      asio::error_code & ec);


This function is used to perform a blocking wait for a socket to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired socket state.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  
Waiting for a socket to become readable. 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   socket.wait(asio::ip::tcp::socket::wait_read, ec);







[endsect]


[endsect]


[section:wait_type basic_socket::wait_type]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket.wait_type..wait_type..basic_socket] 
Wait types. 


  enum wait_type

[indexterm2 asio.indexterm.basic_socket.wait_type.wait_read..wait_read..basic_socket]
[indexterm2 asio.indexterm.basic_socket.wait_type.wait_write..wait_write..basic_socket]
[indexterm2 asio.indexterm.basic_socket.wait_type.wait_error..wait_error..basic_socket]

[heading Values]
[variablelist

  [
    [wait_read]
    [Wait for a socket to become ready to read. ]
  ]

  [
    [wait_write]
    [Wait for a socket to become ready to write. ]
  ]

  [
    [wait_error]
    [Wait for a socket to have error conditions pending. ]
  ]

]


For use with `basic_socket::wait()` and `basic_socket::async_wait()`. 


[endsect]



[section:_basic_socket basic_socket::~basic_socket]

[indexterm2 asio.indexterm.basic_socket._basic_socket..~basic_socket..basic_socket] 
Protected destructor to prevent deletion through this type. 


  ~basic_socket();


This function destroys the socket, cancelling any outstanding asynchronous operations associated with the socket as if by calling `cancel`. 


[endsect]



[endsect]

[section:basic_socket__rebind_executor basic_socket::rebind_executor]


Rebinds the socket type to another executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  struct rebind_executor


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_socket__rebind_executor.other [*other]]]
    [The socket type when rebound to the specified executor. ]
  
  ]

]

[heading Requirements]

['Header: ][^asio/basic_socket.hpp]

['Convenience header: ][^asio.hpp]


[section:other basic_socket::rebind_executor::other]

[indexterm2 asio.indexterm.basic_socket__rebind_executor.other..other..basic_socket::rebind_executor] 
The socket type when rebound to the specified executor. 


  typedef basic_socket< Protocol, Executor1 > other;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_socket.basic_socket [*basic_socket]] [constructor]]
    [Construct a basic_socket without opening it. 
     [hr]
     Construct and open a basic_socket. 
     [hr]
     Construct a basic_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_socket on an existing native socket. 
     [hr]
     Move-construct a basic_socket from another. 
     [hr]
     Move-construct a basic_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_socket from another. 
     [hr]
     Move-assign a basic_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket._basic_socket [*~basic_socket]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_socket `basic_socket`] class template provides functionality that is common to both stream-oriented and datagram-oriented sockets.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/basic_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:basic_socket_acceptor basic_socket_acceptor]


Provides the ability to accept new connections. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``>
  class basic_socket_acceptor :
    public socket_base


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_socket_acceptor__rebind_executor [*rebind_executor]]]
    [Rebinds the acceptor type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.native_handle_type [*native_handle_type]]]
    [The native representation of an acceptor. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket_acceptor.accept [*accept]]]
    [Accept a new connection. 
     [hr]
     Accept a new connection and obtain the endpoint of the peer. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.assign [*assign]]]
    [Assigns an existing native acceptor to the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.async_accept [*async_accept]]]
    [Start an asynchronous accept. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.async_wait [*async_wait]]]
    [Asynchronously wait for the acceptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.basic_socket_acceptor [*basic_socket_acceptor]] [constructor]]
    [Construct an acceptor without opening it. 
     [hr]
     Construct an open acceptor. 
     [hr]
     Construct an acceptor opened on the given endpoint. 
     [hr]
     Construct a basic_socket_acceptor on an existing native acceptor. 
     [hr]
     Move-construct a basic_socket_acceptor from another. 
     [hr]
     Move-construct a basic_socket_acceptor from an acceptor of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.bind [*bind]]]
    [Bind the acceptor to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.close [*close]]]
    [Close the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.get_option [*get_option]]]
    [Get an option from the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.io_control [*io_control]]]
    [Perform an IO control command on the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.is_open [*is_open]]]
    [Determine whether the acceptor is open. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.listen [*listen]]]
    [Place the acceptor into the state where it will listen for new connections. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.native_handle [*native_handle]]]
    [Get the native acceptor representation. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native acceptor implementation. 
     [hr]
     Sets the non-blocking mode of the native acceptor implementation. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the acceptor. 
     [hr]
     Sets the non-blocking mode of the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.open [*open]]]
    [Open the acceptor using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.operator_eq_ [*operator=]]]
    [Move-assign a basic_socket_acceptor from another. 
     [hr]
     Move-assign a basic_socket_acceptor from an acceptor of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.release [*release]]]
    [Release ownership of the underlying native acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.set_option [*set_option]]]
    [Set an option on the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.wait [*wait]]]
    [Wait for the acceptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor._basic_socket_acceptor [*~basic_socket_acceptor]] [destructor]]
    [Destroys the acceptor. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket_acceptor.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_socket_acceptor `basic_socket_acceptor`] class template is used for accepting new socket connections.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.


[heading Example]
  
Opening a socket acceptor with the SO\_REUSEADDR option enabled: 

   asio::ip::tcp::acceptor acceptor(my_context);
   asio::ip::tcp::endpoint endpoint(asio::ip::tcp::v4(), port);
   acceptor.open(endpoint.protocol());
   acceptor.set_option(asio::ip::tcp::acceptor::reuse_address(true));
   acceptor.bind(endpoint);
   acceptor.listen();






[heading Requirements]

['Header: ][^asio/basic_socket_acceptor.hpp]

['Convenience header: ][^asio.hpp]

[section:accept basic_socket_acceptor::accept]

[indexterm2 asio.indexterm.basic_socket_acceptor.accept..accept..basic_socket_acceptor] 
Accept a new connection. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  void ``[link asio.reference.basic_socket_acceptor.accept.overload1 accept]``(
      basic_socket< Protocol1, Executor1 > & peer,
      typename enable_if< is_convertible< Protocol, Protocol1 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.accept.overload1 more...]]``

  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  void ``[link asio.reference.basic_socket_acceptor.accept.overload2 accept]``(
      basic_socket< Protocol1, Executor1 > & peer,
      asio::error_code & ec,
      typename enable_if< is_convertible< Protocol, Protocol1 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.accept.overload2 more...]]``


Accept a new connection and obtain the endpoint of the peer. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  void ``[link asio.reference.basic_socket_acceptor.accept.overload3 accept]``(
      basic_socket< protocol_type, Executor1 > & peer,
      endpoint_type & peer_endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.accept.overload3 more...]]``

  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  void ``[link asio.reference.basic_socket_acceptor.accept.overload4 accept]``(
      basic_socket< protocol_type, Executor1 > & peer,
      endpoint_type & peer_endpoint,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.accept.overload4 more...]]``

  Protocol::socket::template rebind_executor< executor_type >::other ``[link asio.reference.basic_socket_acceptor.accept.overload5 accept]``();
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.accept.overload5 more...]]``

  Protocol::socket::template rebind_executor< executor_type >::other ``[link asio.reference.basic_socket_acceptor.accept.overload6 accept]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.accept.overload6 more...]]``

  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  Protocol::socket::template rebind_executor< Executor1 >::other ``[link asio.reference.basic_socket_acceptor.accept.overload7 accept]``(
      const Executor1 & ex,
      typename enable_if< is_executor< Executor1 >::value||execution::is_executor< Executor1 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.accept.overload7 more...]]``

  template<
      typename ExecutionContext>
  Protocol::socket::template rebind_executor< typename ExecutionContext::executor_type >::other ``[link asio.reference.basic_socket_acceptor.accept.overload8 accept]``(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.accept.overload8 more...]]``

  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  Protocol::socket::template rebind_executor< Executor1 >::other ``[link asio.reference.basic_socket_acceptor.accept.overload9 accept]``(
      const Executor1 & ex,
      asio::error_code & ec,
      typename enable_if< is_executor< Executor1 >::value||execution::is_executor< Executor1 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.accept.overload9 more...]]``

  template<
      typename ExecutionContext>
  Protocol::socket::template rebind_executor< typename ExecutionContext::executor_type >::other ``[link asio.reference.basic_socket_acceptor.accept.overload10 accept]``(
      ExecutionContext & context,
      asio::error_code & ec,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.accept.overload10 more...]]``

  Protocol::socket::template rebind_executor< executor_type >::other ``[link asio.reference.basic_socket_acceptor.accept.overload11 accept]``(
      endpoint_type & peer_endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.accept.overload11 more...]]``

  Protocol::socket::template rebind_executor< executor_type >::other ``[link asio.reference.basic_socket_acceptor.accept.overload12 accept]``(
      endpoint_type & peer_endpoint,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.accept.overload12 more...]]``

  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  Protocol::socket::template rebind_executor< Executor1 >::other ``[link asio.reference.basic_socket_acceptor.accept.overload13 accept]``(
      const Executor1 & ex,
      endpoint_type & peer_endpoint,
      typename enable_if< is_executor< Executor1 >::value||execution::is_executor< Executor1 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.accept.overload13 more...]]``

  template<
      typename ExecutionContext>
  Protocol::socket::template rebind_executor< typename ExecutionContext::executor_type >::other ``[link asio.reference.basic_socket_acceptor.accept.overload14 accept]``(
      ExecutionContext & context,
      endpoint_type & peer_endpoint,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.accept.overload14 more...]]``

  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  Protocol::socket::template rebind_executor< Executor1 >::other ``[link asio.reference.basic_socket_acceptor.accept.overload15 accept]``(
      const executor_type & ex,
      endpoint_type & peer_endpoint,
      asio::error_code & ec,
      typename enable_if< is_executor< Executor1 >::value||execution::is_executor< Executor1 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.accept.overload15 more...]]``

  template<
      typename ExecutionContext>
  Protocol::socket::template rebind_executor< typename ExecutionContext::executor_type >::other ``[link asio.reference.basic_socket_acceptor.accept.overload16 accept]``(
      ExecutionContext & context,
      endpoint_type & peer_endpoint,
      asio::error_code & ec,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.accept.overload16 more...]]``


[section:overload1 basic_socket_acceptor::accept (1 of 16 overloads)]


Accept a new connection. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  void accept(
      basic_socket< Protocol1, Executor1 > & peer,
      typename enable_if< is_convertible< Protocol, Protocol1 >::value >::type *  = 0);


This function is used to accept a new connection from a peer into the given socket. The function call will block until a new connection has been accepted successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[peer][The socket into which the new connection will be accepted.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::socket socket(my_context);
   acceptor.accept(socket);







[endsect]



[section:overload2 basic_socket_acceptor::accept (2 of 16 overloads)]


Accept a new connection. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  void accept(
      basic_socket< Protocol1, Executor1 > & peer,
      asio::error_code & ec,
      typename enable_if< is_convertible< Protocol, Protocol1 >::value >::type *  = 0);


This function is used to accept a new connection from a peer into the given socket. The function call will block until a new connection has been accepted successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[peer][The socket into which the new connection will be accepted.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::socket socket(my_context);
   asio::error_code ec;
   acceptor.accept(socket, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]



[section:overload3 basic_socket_acceptor::accept (3 of 16 overloads)]


Accept a new connection and obtain the endpoint of the peer. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  void accept(
      basic_socket< protocol_type, Executor1 > & peer,
      endpoint_type & peer_endpoint);


This function is used to accept a new connection from a peer into the given socket, and additionally provide the endpoint of the remote peer. The function call will block until a new connection has been accepted successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[peer][The socket into which the new connection will be accepted.]]

[[peer_endpoint][An endpoint object which will receive the endpoint of the remote peer.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::socket socket(my_context);
   asio::ip::tcp::endpoint endpoint;
   acceptor.accept(socket, endpoint);







[endsect]



[section:overload4 basic_socket_acceptor::accept (4 of 16 overloads)]


Accept a new connection and obtain the endpoint of the peer. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  void accept(
      basic_socket< protocol_type, Executor1 > & peer,
      endpoint_type & peer_endpoint,
      asio::error_code & ec);


This function is used to accept a new connection from a peer into the given socket, and additionally provide the endpoint of the remote peer. The function call will block until a new connection has been accepted successfully or an error occurs.


[heading Parameters]
    

[variablelist
  
[[peer][The socket into which the new connection will be accepted.]]

[[peer_endpoint][An endpoint object which will receive the endpoint of the remote peer.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::socket socket(my_context);
   asio::ip::tcp::endpoint endpoint;
   asio::error_code ec;
   acceptor.accept(socket, endpoint, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]



[section:overload5 basic_socket_acceptor::accept (5 of 16 overloads)]


Accept a new connection. 


  Protocol::socket::template rebind_executor< executor_type >::other accept();


This function is used to accept a new connection from a peer. The function call will block until a new connection has been accepted successfully or an error occurs.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.


[heading Return Value]
      
A socket object representing the newly accepted connection.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::socket socket(acceptor.accept());







[endsect]



[section:overload6 basic_socket_acceptor::accept (6 of 16 overloads)]


Accept a new connection. 


  Protocol::socket::template rebind_executor< executor_type >::other accept(
      asio::error_code & ec);


This function is used to accept a new connection from a peer. The function call will block until a new connection has been accepted successfully or an error occurs.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
On success, a socket object representing the newly accepted connection. On error, a socket object where `is_open()` is false.


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::socket socket(acceptor.accept(ec));
   if (ec)
   {
     // An error occurred.
   }







[endsect]



[section:overload7 basic_socket_acceptor::accept (7 of 16 overloads)]


Accept a new connection. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  Protocol::socket::template rebind_executor< Executor1 >::other accept(
      const Executor1 & ex,
      typename enable_if< is_executor< Executor1 >::value||execution::is_executor< Executor1 >::value >::type *  = 0);


This function is used to accept a new connection from a peer. The function call will block until a new connection has been accepted successfully or an error occurs.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor object to be used for the newly accepted socket.]]

]


[heading Return Value]
      
A socket object representing the newly accepted connection.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::socket socket(acceptor.accept());







[endsect]



[section:overload8 basic_socket_acceptor::accept (8 of 16 overloads)]


Accept a new connection. 


  template<
      typename ExecutionContext>
  Protocol::socket::template rebind_executor< typename ExecutionContext::executor_type >::other accept(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This function is used to accept a new connection from a peer. The function call will block until a new connection has been accepted successfully or an error occurs.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.


[heading Parameters]
    

[variablelist
  
[[context][The I/O execution context object to be used for the newly accepted socket.]]

]


[heading Return Value]
      
A socket object representing the newly accepted connection.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::socket socket(acceptor.accept());







[endsect]



[section:overload9 basic_socket_acceptor::accept (9 of 16 overloads)]


Accept a new connection. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  Protocol::socket::template rebind_executor< Executor1 >::other accept(
      const Executor1 & ex,
      asio::error_code & ec,
      typename enable_if< is_executor< Executor1 >::value||execution::is_executor< Executor1 >::value >::type *  = 0);


This function is used to accept a new connection from a peer. The function call will block until a new connection has been accepted successfully or an error occurs.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor object to be used for the newly accepted socket.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
On success, a socket object representing the newly accepted connection. On error, a socket object where `is_open()` is false.


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::socket socket(acceptor.accept(my_context2, ec));
   if (ec)
   {
     // An error occurred.
   }







[endsect]



[section:overload10 basic_socket_acceptor::accept (10 of 16 overloads)]


Accept a new connection. 


  template<
      typename ExecutionContext>
  Protocol::socket::template rebind_executor< typename ExecutionContext::executor_type >::other accept(
      ExecutionContext & context,
      asio::error_code & ec,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This function is used to accept a new connection from a peer. The function call will block until a new connection has been accepted successfully or an error occurs.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.


[heading Parameters]
    

[variablelist
  
[[context][The I/O execution context object to be used for the newly accepted socket.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
On success, a socket object representing the newly accepted connection. On error, a socket object where `is_open()` is false.


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::socket socket(acceptor.accept(my_context2, ec));
   if (ec)
   {
     // An error occurred.
   }







[endsect]



[section:overload11 basic_socket_acceptor::accept (11 of 16 overloads)]


Accept a new connection. 


  Protocol::socket::template rebind_executor< executor_type >::other accept(
      endpoint_type & peer_endpoint);


This function is used to accept a new connection from a peer. The function call will block until a new connection has been accepted successfully or an error occurs.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.


[heading Parameters]
    

[variablelist
  
[[peer_endpoint][An endpoint object into which the endpoint of the remote peer will be written.]]

]


[heading Return Value]
      
A socket object representing the newly accepted connection.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::endpoint endpoint;
   asio::ip::tcp::socket socket(acceptor.accept(endpoint));







[endsect]



[section:overload12 basic_socket_acceptor::accept (12 of 16 overloads)]


Accept a new connection. 


  Protocol::socket::template rebind_executor< executor_type >::other accept(
      endpoint_type & peer_endpoint,
      asio::error_code & ec);


This function is used to accept a new connection from a peer. The function call will block until a new connection has been accepted successfully or an error occurs.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.


[heading Parameters]
    

[variablelist
  
[[peer_endpoint][An endpoint object into which the endpoint of the remote peer will be written.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
On success, a socket object representing the newly accepted connection. On error, a socket object where `is_open()` is false.


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::endpoint endpoint;
   asio::ip::tcp::socket socket(acceptor.accept(endpoint, ec));
   if (ec)
   {
     // An error occurred.
   }







[endsect]



[section:overload13 basic_socket_acceptor::accept (13 of 16 overloads)]


Accept a new connection. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  Protocol::socket::template rebind_executor< Executor1 >::other accept(
      const Executor1 & ex,
      endpoint_type & peer_endpoint,
      typename enable_if< is_executor< Executor1 >::value||execution::is_executor< Executor1 >::value >::type *  = 0);


This function is used to accept a new connection from a peer. The function call will block until a new connection has been accepted successfully or an error occurs.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor object to be used for the newly accepted socket.]]

[[peer_endpoint][An endpoint object into which the endpoint of the remote peer will be written.]]

]


[heading Return Value]
      
A socket object representing the newly accepted connection.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::endpoint endpoint;
   asio::ip::tcp::socket socket(
       acceptor.accept(my_context2, endpoint));







[endsect]



[section:overload14 basic_socket_acceptor::accept (14 of 16 overloads)]


Accept a new connection. 


  template<
      typename ExecutionContext>
  Protocol::socket::template rebind_executor< typename ExecutionContext::executor_type >::other accept(
      ExecutionContext & context,
      endpoint_type & peer_endpoint,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This function is used to accept a new connection from a peer. The function call will block until a new connection has been accepted successfully or an error occurs.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.


[heading Parameters]
    

[variablelist
  
[[context][The I/O execution context object to be used for the newly accepted socket.]]

[[peer_endpoint][An endpoint object into which the endpoint of the remote peer will be written.]]

]


[heading Return Value]
      
A socket object representing the newly accepted connection.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::endpoint endpoint;
   asio::ip::tcp::socket socket(
       acceptor.accept(my_context2, endpoint));







[endsect]



[section:overload15 basic_socket_acceptor::accept (15 of 16 overloads)]


Accept a new connection. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  Protocol::socket::template rebind_executor< Executor1 >::other accept(
      const executor_type & ex,
      endpoint_type & peer_endpoint,
      asio::error_code & ec,
      typename enable_if< is_executor< Executor1 >::value||execution::is_executor< Executor1 >::value >::type *  = 0);


This function is used to accept a new connection from a peer. The function call will block until a new connection has been accepted successfully or an error occurs.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor object to be used for the newly accepted socket.]]

[[peer_endpoint][An endpoint object into which the endpoint of the remote peer will be written.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
On success, a socket object representing the newly accepted connection. On error, a socket object where `is_open()` is false.


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::endpoint endpoint;
   asio::ip::tcp::socket socket(
       acceptor.accept(my_context2, endpoint, ec));
   if (ec)
   {
     // An error occurred.
   }







[endsect]



[section:overload16 basic_socket_acceptor::accept (16 of 16 overloads)]


Accept a new connection. 


  template<
      typename ExecutionContext>
  Protocol::socket::template rebind_executor< typename ExecutionContext::executor_type >::other accept(
      ExecutionContext & context,
      endpoint_type & peer_endpoint,
      asio::error_code & ec,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This function is used to accept a new connection from a peer. The function call will block until a new connection has been accepted successfully or an error occurs.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.


[heading Parameters]
    

[variablelist
  
[[context][The I/O execution context object to be used for the newly accepted socket.]]

[[peer_endpoint][An endpoint object into which the endpoint of the remote peer will be written.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
On success, a socket object representing the newly accepted connection. On error, a socket object where `is_open()` is false.


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::endpoint endpoint;
   asio::ip::tcp::socket socket(
       acceptor.accept(my_context2, endpoint, ec));
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]

[section:assign basic_socket_acceptor::assign]

[indexterm2 asio.indexterm.basic_socket_acceptor.assign..assign..basic_socket_acceptor] 
Assigns an existing native acceptor to the acceptor. 


  void ``[link asio.reference.basic_socket_acceptor.assign.overload1 assign]``(
      const protocol_type & protocol,
      const native_handle_type & native_acceptor);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.assign.overload1 more...]]``

  void ``[link asio.reference.basic_socket_acceptor.assign.overload2 assign]``(
      const protocol_type & protocol,
      const native_handle_type & native_acceptor,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.assign.overload2 more...]]``


[section:overload1 basic_socket_acceptor::assign (1 of 2 overloads)]


Assigns an existing native acceptor to the acceptor. 


  void assign(
      const protocol_type & protocol,
      const native_handle_type & native_acceptor);



[endsect]



[section:overload2 basic_socket_acceptor::assign (2 of 2 overloads)]


Assigns an existing native acceptor to the acceptor. 


  void assign(
      const protocol_type & protocol,
      const native_handle_type & native_acceptor,
      asio::error_code & ec);



[endsect]


[endsect]

[section:async_accept basic_socket_acceptor::async_accept]

[indexterm2 asio.indexterm.basic_socket_acceptor.async_accept..async_accept..basic_socket_acceptor] 
Start an asynchronous accept. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``,
      typename ``[link asio.reference.AcceptHandler AcceptHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_socket_acceptor.async_accept.overload1 async_accept]``(
      basic_socket< Protocol1, Executor1 > & peer,
      AcceptHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_convertible< Protocol, Protocol1 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.async_accept.overload1 more...]]``

  template<
      typename ``[link asio.reference.Executor1 Executor1]``,
      typename ``[link asio.reference.AcceptHandler AcceptHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_socket_acceptor.async_accept.overload2 async_accept]``(
      basic_socket< protocol_type, Executor1 > & peer,
      endpoint_type & peer_endpoint,
      AcceptHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.async_accept.overload2 more...]]``

  template<
      typename ``[link asio.reference.MoveAcceptHandler MoveAcceptHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_socket_acceptor.async_accept.overload3 async_accept]``(
      MoveAcceptHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.async_accept.overload3 more...]]``

  template<
      typename ``[link asio.reference.Executor1 Executor1]``,
      typename ``[link asio.reference.MoveAcceptHandler MoveAcceptHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_socket_acceptor.async_accept.overload4 async_accept]``(
      const Executor1 & ex,
      MoveAcceptHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_executor< Executor1 >::value||execution::is_executor< Executor1 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.async_accept.overload4 more...]]``

  template<
      typename ExecutionContext,
      typename ``[link asio.reference.MoveAcceptHandler MoveAcceptHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_socket_acceptor.async_accept.overload5 async_accept]``(
      ExecutionContext & context,
      MoveAcceptHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.async_accept.overload5 more...]]``

  template<
      typename ``[link asio.reference.MoveAcceptHandler MoveAcceptHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_socket_acceptor.async_accept.overload6 async_accept]``(
      endpoint_type & peer_endpoint,
      MoveAcceptHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.async_accept.overload6 more...]]``

  template<
      typename ``[link asio.reference.Executor1 Executor1]``,
      typename ``[link asio.reference.MoveAcceptHandler MoveAcceptHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_socket_acceptor.async_accept.overload7 async_accept]``(
      const Executor1 & ex,
      endpoint_type & peer_endpoint,
      MoveAcceptHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_executor< Executor1 >::value||execution::is_executor< Executor1 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.async_accept.overload7 more...]]``

  template<
      typename ExecutionContext,
      typename ``[link asio.reference.MoveAcceptHandler MoveAcceptHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_socket_acceptor.async_accept.overload8 async_accept]``(
      ExecutionContext & context,
      endpoint_type & peer_endpoint,
      MoveAcceptHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.async_accept.overload8 more...]]``


[section:overload1 basic_socket_acceptor::async_accept (1 of 8 overloads)]


Start an asynchronous accept. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``,
      typename ``[link asio.reference.AcceptHandler AcceptHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_accept(
      basic_socket< Protocol1, Executor1 > & peer,
      AcceptHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_convertible< Protocol, Protocol1 >::value >::type *  = 0);


This function is used to asynchronously accept a new connection into a socket. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[peer][The socket into which the new connection will be accepted. Ownership of the peer object is retained by the caller, which must guarantee that it is valid until the handler is called.]]

[[handler][The handler to be called when the accept operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error // Result of operation.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  


   void accept_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Accept succeeded.
     }
   }

   ...

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::socket socket(my_context);
   acceptor.async_accept(socket, accept_handler);







[endsect]



[section:overload2 basic_socket_acceptor::async_accept (2 of 8 overloads)]


Start an asynchronous accept. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``,
      typename ``[link asio.reference.AcceptHandler AcceptHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_accept(
      basic_socket< protocol_type, Executor1 > & peer,
      endpoint_type & peer_endpoint,
      AcceptHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously accept a new connection into a socket, and additionally obtain the endpoint of the remote peer. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[peer][The socket into which the new connection will be accepted. Ownership of the peer object is retained by the caller, which must guarantee that it is valid until the handler is called.]]

[[peer_endpoint][An endpoint object into which the endpoint of the remote peer will be written. Ownership of the peer\_endpoint object is retained by the caller, which must guarantee that it is valid until the handler is called.]]

[[handler][The handler to be called when the accept operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error // Result of operation.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`]. ]]

]




[endsect]



[section:overload3 basic_socket_acceptor::async_accept (3 of 8 overloads)]


Start an asynchronous accept. 


  template<
      typename ``[link asio.reference.MoveAcceptHandler MoveAcceptHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_accept(
      MoveAcceptHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously accept a new connection. The function call always returns immediately.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.


[heading Parameters]
    

[variablelist
  
[[handler][The handler to be called when the accept operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation.
     const asio::error_code& error,
     // On success, the newly accepted socket.
     typename Protocol::socket::template
       rebind_executor<executor_type>::other peer
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  


   void accept_handler(const asio::error_code& error,
       asio::ip::tcp::socket peer)
   {
     if (!error)
     {
       // Accept succeeded.
     }
   }

   ...

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   acceptor.async_accept(accept_handler);







[endsect]



[section:overload4 basic_socket_acceptor::async_accept (4 of 8 overloads)]


Start an asynchronous accept. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``,
      typename ``[link asio.reference.MoveAcceptHandler MoveAcceptHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_accept(
      const Executor1 & ex,
      MoveAcceptHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_executor< Executor1 >::value||execution::is_executor< Executor1 >::value >::type *  = 0);


This function is used to asynchronously accept a new connection. The function call always returns immediately.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor object to be used for the newly accepted socket.]]

[[handler][The handler to be called when the accept operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     typename Protocol::socket::template rebind_executor<
       Executor1>::other peer // On success, the newly accepted socket.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  


   void accept_handler(const asio::error_code& error,
       asio::ip::tcp::socket peer)
   {
     if (!error)
     {
       // Accept succeeded.
     }
   }

   ...

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   acceptor.async_accept(my_context2, accept_handler);







[endsect]



[section:overload5 basic_socket_acceptor::async_accept (5 of 8 overloads)]


Start an asynchronous accept. 


  template<
      typename ExecutionContext,
      typename ``[link asio.reference.MoveAcceptHandler MoveAcceptHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_accept(
      ExecutionContext & context,
      MoveAcceptHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This function is used to asynchronously accept a new connection. The function call always returns immediately.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.


[heading Parameters]
    

[variablelist
  
[[context][The I/O execution context object to be used for the newly accepted socket.]]

[[handler][The handler to be called when the accept operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     typename Protocol::socket::template rebind_executor<
       typename ExecutionContext::executor_type>::other peer
         // On success, the newly accepted socket.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  


   void accept_handler(const asio::error_code& error,
       asio::ip::tcp::socket peer)
   {
     if (!error)
     {
       // Accept succeeded.
     }
   }

   ...

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   acceptor.async_accept(my_context2, accept_handler);







[endsect]



[section:overload6 basic_socket_acceptor::async_accept (6 of 8 overloads)]


Start an asynchronous accept. 


  template<
      typename ``[link asio.reference.MoveAcceptHandler MoveAcceptHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_accept(
      endpoint_type & peer_endpoint,
      MoveAcceptHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously accept a new connection. The function call always returns immediately.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.


[heading Parameters]
    

[variablelist
  
[[peer_endpoint][An endpoint object into which the endpoint of the remote peer will be written. Ownership of the peer\_endpoint object is retained by the caller, which must guarantee that it is valid until the handler is called.]]

[[handler][The handler to be called when the accept operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     // Result of operation.
     const asio::error_code& error,
     // On success, the newly accepted socket.
     typename Protocol::socket::template
       rebind_executor<executor_type>::other peer
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  


   void accept_handler(const asio::error_code& error,
       asio::ip::tcp::socket peer)
   {
     if (!error)
     {
       // Accept succeeded.
     }
   }

   ...

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::endpoint endpoint;
   acceptor.async_accept(endpoint, accept_handler);







[endsect]



[section:overload7 basic_socket_acceptor::async_accept (7 of 8 overloads)]


Start an asynchronous accept. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``,
      typename ``[link asio.reference.MoveAcceptHandler MoveAcceptHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_accept(
      const Executor1 & ex,
      endpoint_type & peer_endpoint,
      MoveAcceptHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_executor< Executor1 >::value||execution::is_executor< Executor1 >::value >::type *  = 0);


This function is used to asynchronously accept a new connection. The function call always returns immediately.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor object to be used for the newly accepted socket.]]

[[peer_endpoint][An endpoint object into which the endpoint of the remote peer will be written. Ownership of the peer\_endpoint object is retained by the caller, which must guarantee that it is valid until the handler is called.]]

[[handler][The handler to be called when the accept operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     typename Protocol::socket::template rebind_executor<
       Executor1>::other peer // On success, the newly accepted socket.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  


   void accept_handler(const asio::error_code& error,
       asio::ip::tcp::socket peer)
   {
     if (!error)
     {
       // Accept succeeded.
     }
   }

   ...

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::endpoint endpoint;
   acceptor.async_accept(my_context2, endpoint, accept_handler);







[endsect]



[section:overload8 basic_socket_acceptor::async_accept (8 of 8 overloads)]


Start an asynchronous accept. 


  template<
      typename ExecutionContext,
      typename ``[link asio.reference.MoveAcceptHandler MoveAcceptHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_accept(
      ExecutionContext & context,
      endpoint_type & peer_endpoint,
      MoveAcceptHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This function is used to asynchronously accept a new connection. The function call always returns immediately.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.


[heading Parameters]
    

[variablelist
  
[[context][The I/O execution context object to be used for the newly accepted socket.]]

[[peer_endpoint][An endpoint object into which the endpoint of the remote peer will be written. Ownership of the peer\_endpoint object is retained by the caller, which must guarantee that it is valid until the handler is called.]]

[[handler][The handler to be called when the accept operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     typename Protocol::socket::template rebind_executor<
       typename ExecutionContext::executor_type>::other peer
         // On success, the newly accepted socket.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  


   void accept_handler(const asio::error_code& error,
       asio::ip::tcp::socket peer)
   {
     if (!error)
     {
       // Accept succeeded.
     }
   }

   ...

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::endpoint endpoint;
   acceptor.async_accept(my_context2, endpoint, accept_handler);







[endsect]


[endsect]


[section:async_wait basic_socket_acceptor::async_wait]

[indexterm2 asio.indexterm.basic_socket_acceptor.async_wait..async_wait..basic_socket_acceptor] 
Asynchronously wait for the acceptor to become ready to read, ready to write, or to have pending error conditions. 


  template<
      typename ``[link asio.reference.WaitHandler WaitHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_wait(
      wait_type w,
      WaitHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to perform an asynchronous wait for an acceptor to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired acceptor state.]]

[[handler][The handler to be called when the wait operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error // Result of operation
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  


   void wait_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Wait succeeded.
     }
   }

   ...

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   acceptor.async_wait(
       asio::ip::tcp::acceptor::wait_read,
       wait_handler);







[endsect]


[section:basic_socket_acceptor basic_socket_acceptor::basic_socket_acceptor]

[indexterm2 asio.indexterm.basic_socket_acceptor.basic_socket_acceptor..basic_socket_acceptor..basic_socket_acceptor] 
Construct an acceptor without opening it. 


  explicit ``[link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload1 basic_socket_acceptor]``(
      const executor_type & ex);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload1 more...]]``

  template<
      typename ExecutionContext>
  explicit ``[link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload2 basic_socket_acceptor]``(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload2 more...]]``


Construct an open acceptor. 


  ``[link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload3 basic_socket_acceptor]``(
      const executor_type & ex,
      const protocol_type & protocol);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload3 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload4 basic_socket_acceptor]``(
      ExecutionContext & context,
      const protocol_type & protocol,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload4 more...]]``


Construct an acceptor opened on the given endpoint. 


  ``[link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload5 basic_socket_acceptor]``(
      const executor_type & ex,
      const endpoint_type & endpoint,
      bool reuse_addr = true);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload5 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload6 basic_socket_acceptor]``(
      ExecutionContext & context,
      const endpoint_type & endpoint,
      bool reuse_addr = true,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload6 more...]]``


Construct a [link asio.reference.basic_socket_acceptor `basic_socket_acceptor`] on an existing native acceptor. 


  ``[link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload7 basic_socket_acceptor]``(
      const executor_type & ex,
      const protocol_type & protocol,
      const native_handle_type & native_acceptor);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload7 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload8 basic_socket_acceptor]``(
      ExecutionContext & context,
      const protocol_type & protocol,
      const native_handle_type & native_acceptor,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload8 more...]]``


Move-construct a [link asio.reference.basic_socket_acceptor `basic_socket_acceptor`] from another. 


  ``[link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload9 basic_socket_acceptor]``(
      basic_socket_acceptor && other);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload9 more...]]``


Move-construct a [link asio.reference.basic_socket_acceptor `basic_socket_acceptor`] from an acceptor of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  ``[link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload10 basic_socket_acceptor]``(
      basic_socket_acceptor< Protocol1, Executor1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload10 more...]]``


[section:overload1 basic_socket_acceptor::basic_socket_acceptor (1 of 10 overloads)]


Construct an acceptor without opening it. 


  basic_socket_acceptor(
      const executor_type & ex);


This constructor creates an acceptor without opening it to listen for new connections. The `open()` function must be called before the acceptor can accept new socket connections.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the acceptor will use, by default, to dispatch handlers for any asynchronous operations performed on the acceptor. ]]

]




[endsect]



[section:overload2 basic_socket_acceptor::basic_socket_acceptor (2 of 10 overloads)]


Construct an acceptor without opening it. 


  template<
      typename ExecutionContext>
  basic_socket_acceptor(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates an acceptor without opening it to listen for new connections. The `open()` function must be called before the acceptor can accept new socket connections.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the acceptor will use, by default, to dispatch handlers for any asynchronous operations performed on the acceptor. ]]

]




[endsect]



[section:overload3 basic_socket_acceptor::basic_socket_acceptor (3 of 10 overloads)]


Construct an open acceptor. 


  basic_socket_acceptor(
      const executor_type & ex,
      const protocol_type & protocol);


This constructor creates an acceptor and automatically opens it.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the acceptor will use, by default, to dispatch handlers for any asynchronous operations performed on the acceptor.]]

[[protocol][An object specifying protocol parameters to be used.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload4 basic_socket_acceptor::basic_socket_acceptor (4 of 10 overloads)]


Construct an open acceptor. 


  template<
      typename ExecutionContext>
  basic_socket_acceptor(
      ExecutionContext & context,
      const protocol_type & protocol,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates an acceptor and automatically opens it.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the acceptor will use, by default, to dispatch handlers for any asynchronous operations performed on the acceptor.]]

[[protocol][An object specifying protocol parameters to be used.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload5 basic_socket_acceptor::basic_socket_acceptor (5 of 10 overloads)]


Construct an acceptor opened on the given endpoint. 


  basic_socket_acceptor(
      const executor_type & ex,
      const endpoint_type & endpoint,
      bool reuse_addr = true);


This constructor creates an acceptor and automatically opens it to listen for new connections on the specified endpoint.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the acceptor will use, by default, to dispatch handlers for any asynchronous operations performed on the acceptor.]]

[[endpoint][An endpoint on the local machine on which the acceptor will listen for new connections.]]

[[reuse_addr][Whether the constructor should set the socket option `socket_base::reuse_address`.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
This constructor is equivalent to the following code: 

   basic_socket_acceptor<Protocol> acceptor(my_context);
   acceptor.open(endpoint.protocol());
   if (reuse_addr)
     acceptor.set_option(socket_base::reuse_address(true));
   acceptor.bind(endpoint);
   acceptor.listen();







[endsect]



[section:overload6 basic_socket_acceptor::basic_socket_acceptor (6 of 10 overloads)]


Construct an acceptor opened on the given endpoint. 


  template<
      typename ExecutionContext>
  basic_socket_acceptor(
      ExecutionContext & context,
      const endpoint_type & endpoint,
      bool reuse_addr = true,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates an acceptor and automatically opens it to listen for new connections on the specified endpoint.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the acceptor will use, by default, to dispatch handlers for any asynchronous operations performed on the acceptor.]]

[[endpoint][An endpoint on the local machine on which the acceptor will listen for new connections.]]

[[reuse_addr][Whether the constructor should set the socket option `socket_base::reuse_address`.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
This constructor is equivalent to the following code: 

   basic_socket_acceptor<Protocol> acceptor(my_context);
   acceptor.open(endpoint.protocol());
   if (reuse_addr)
     acceptor.set_option(socket_base::reuse_address(true));
   acceptor.bind(endpoint);
   acceptor.listen();







[endsect]



[section:overload7 basic_socket_acceptor::basic_socket_acceptor (7 of 10 overloads)]


Construct a [link asio.reference.basic_socket_acceptor `basic_socket_acceptor`] on an existing native acceptor. 


  basic_socket_acceptor(
      const executor_type & ex,
      const protocol_type & protocol,
      const native_handle_type & native_acceptor);


This constructor creates an acceptor object to hold an existing native acceptor.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the acceptor will use, by default, to dispatch handlers for any asynchronous operations performed on the acceptor.]]

[[protocol][An object specifying protocol parameters to be used.]]

[[native_acceptor][A native acceptor.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload8 basic_socket_acceptor::basic_socket_acceptor (8 of 10 overloads)]


Construct a [link asio.reference.basic_socket_acceptor `basic_socket_acceptor`] on an existing native acceptor. 


  template<
      typename ExecutionContext>
  basic_socket_acceptor(
      ExecutionContext & context,
      const protocol_type & protocol,
      const native_handle_type & native_acceptor,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates an acceptor object to hold an existing native acceptor.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the acceptor will use, by default, to dispatch handlers for any asynchronous operations performed on the acceptor.]]

[[protocol][An object specifying protocol parameters to be used.]]

[[native_acceptor][A native acceptor.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload9 basic_socket_acceptor::basic_socket_acceptor (9 of 10 overloads)]


Move-construct a [link asio.reference.basic_socket_acceptor `basic_socket_acceptor`] from another. 


  basic_socket_acceptor(
      basic_socket_acceptor && other);


This constructor moves an acceptor from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_socket_acceptor `basic_socket_acceptor`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_socket_acceptor(const executor_type&)` constructor. 




[endsect]



[section:overload10 basic_socket_acceptor::basic_socket_acceptor (10 of 10 overloads)]


Move-construct a [link asio.reference.basic_socket_acceptor `basic_socket_acceptor`] from an acceptor of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  basic_socket_acceptor(
      basic_socket_acceptor< Protocol1, Executor1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value >::type *  = 0);


This constructor moves an acceptor from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_socket_acceptor `basic_socket_acceptor`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_socket_acceptor(const executor_type&)` constructor. 




[endsect]


[endsect]

[section:bind basic_socket_acceptor::bind]

[indexterm2 asio.indexterm.basic_socket_acceptor.bind..bind..basic_socket_acceptor] 
Bind the acceptor to the given local endpoint. 


  void ``[link asio.reference.basic_socket_acceptor.bind.overload1 bind]``(
      const endpoint_type & endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.bind.overload1 more...]]``

  void ``[link asio.reference.basic_socket_acceptor.bind.overload2 bind]``(
      const endpoint_type & endpoint,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.bind.overload2 more...]]``


[section:overload1 basic_socket_acceptor::bind (1 of 2 overloads)]


Bind the acceptor to the given local endpoint. 


  void bind(
      const endpoint_type & endpoint);


This function binds the socket acceptor to the specified endpoint on the local machine.


[heading Parameters]
    

[variablelist
  
[[endpoint][An endpoint on the local machine to which the socket acceptor will be bound.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   asio::ip::tcp::endpoint endpoint(asio::ip::tcp::v4(), 12345);
   acceptor.open(endpoint.protocol());
   acceptor.bind(endpoint);







[endsect]



[section:overload2 basic_socket_acceptor::bind (2 of 2 overloads)]


Bind the acceptor to the given local endpoint. 


  void bind(
      const endpoint_type & endpoint,
      asio::error_code & ec);


This function binds the socket acceptor to the specified endpoint on the local machine.


[heading Parameters]
    

[variablelist
  
[[endpoint][An endpoint on the local machine to which the socket acceptor will be bound.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   asio::ip::tcp::endpoint endpoint(asio::ip::tcp::v4(), 12345);
   acceptor.open(endpoint.protocol());
   asio::error_code ec;
   acceptor.bind(endpoint, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:broadcast basic_socket_acceptor::broadcast]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket_acceptor.broadcast..broadcast..basic_socket_acceptor] 
Socket option to permit sending of broadcast messages. 


  typedef implementation_defined broadcast;



Implements the SOL\_SOCKET/SO\_BROADCAST socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::broadcast option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::broadcast option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_socket_acceptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:bytes_readable basic_socket_acceptor::bytes_readable]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket_acceptor.bytes_readable..bytes_readable..basic_socket_acceptor] 
IO control command to get the amount of data that can be read without blocking. 


  typedef implementation_defined bytes_readable;



Implements the FIONREAD IO control command.


[heading Example]
  


   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();







[heading Requirements]

['Header: ][^asio/basic_socket_acceptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:cancel basic_socket_acceptor::cancel]

[indexterm2 asio.indexterm.basic_socket_acceptor.cancel..cancel..basic_socket_acceptor] 
Cancel all asynchronous operations associated with the acceptor. 


  void ``[link asio.reference.basic_socket_acceptor.cancel.overload1 cancel]``();
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.cancel.overload1 more...]]``

  void ``[link asio.reference.basic_socket_acceptor.cancel.overload2 cancel]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.cancel.overload2 more...]]``


[section:overload1 basic_socket_acceptor::cancel (1 of 2 overloads)]


Cancel all asynchronous operations associated with the acceptor. 


  void cancel();


This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 basic_socket_acceptor::cancel (2 of 2 overloads)]


Cancel all asynchronous operations associated with the acceptor. 


  void cancel(
      asio::error_code & ec);


This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. ]]

]




[endsect]


[endsect]

[section:close basic_socket_acceptor::close]

[indexterm2 asio.indexterm.basic_socket_acceptor.close..close..basic_socket_acceptor] 
Close the acceptor. 


  void ``[link asio.reference.basic_socket_acceptor.close.overload1 close]``();
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.close.overload1 more...]]``

  void ``[link asio.reference.basic_socket_acceptor.close.overload2 close]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.close.overload2 more...]]``


[section:overload1 basic_socket_acceptor::close (1 of 2 overloads)]


Close the acceptor. 


  void close();


This function is used to close the acceptor. Any asynchronous accept operations will be cancelled immediately.

A subsequent call to `open()` is required before the acceptor can again be used to again perform socket accept operations.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 basic_socket_acceptor::close (2 of 2 overloads)]


Close the acceptor. 


  void close(
      asio::error_code & ec);


This function is used to close the acceptor. Any asynchronous accept operations will be cancelled immediately.

A subsequent call to `open()` is required before the acceptor can again be used to again perform socket accept operations.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::error_code ec;
   acceptor.close(ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:debug basic_socket_acceptor::debug]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket_acceptor.debug..debug..basic_socket_acceptor] 
Socket option to enable socket-level debugging. 


  typedef implementation_defined debug;



Implements the SOL\_SOCKET/SO\_DEBUG socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::debug option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::debug option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_socket_acceptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:do_not_route basic_socket_acceptor::do_not_route]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket_acceptor.do_not_route..do_not_route..basic_socket_acceptor] 
Socket option to prevent routing, use local interfaces only. 


  typedef implementation_defined do_not_route;



Implements the SOL\_SOCKET/SO\_DONTROUTE socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::do_not_route option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::do_not_route option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_socket_acceptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:enable_connection_aborted basic_socket_acceptor::enable_connection_aborted]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket_acceptor.enable_connection_aborted..enable_connection_aborted..basic_socket_acceptor] 
Socket option to report aborted connections on accept. 


  typedef implementation_defined enable_connection_aborted;



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.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::enable_connection_aborted option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::enable_connection_aborted option;
   acceptor.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_socket_acceptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:endpoint_type basic_socket_acceptor::endpoint_type]

[indexterm2 asio.indexterm.basic_socket_acceptor.endpoint_type..endpoint_type..basic_socket_acceptor] 
The endpoint type. 


  typedef Protocol::endpoint endpoint_type;



[heading Requirements]

['Header: ][^asio/basic_socket_acceptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:executor_type basic_socket_acceptor::executor_type]

[indexterm2 asio.indexterm.basic_socket_acceptor.executor_type..executor_type..basic_socket_acceptor] 
The type of the executor associated with the object. 


  typedef Executor executor_type;



[heading Requirements]

['Header: ][^asio/basic_socket_acceptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:get_executor basic_socket_acceptor::get_executor]

[indexterm2 asio.indexterm.basic_socket_acceptor.get_executor..get_executor..basic_socket_acceptor] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_option basic_socket_acceptor::get_option]

[indexterm2 asio.indexterm.basic_socket_acceptor.get_option..get_option..basic_socket_acceptor] 
Get an option from the acceptor. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void ``[link asio.reference.basic_socket_acceptor.get_option.overload1 get_option]``(
      GettableSocketOption & option) const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.get_option.overload1 more...]]``

  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void ``[link asio.reference.basic_socket_acceptor.get_option.overload2 get_option]``(
      GettableSocketOption & option,
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.get_option.overload2 more...]]``


[section:overload1 basic_socket_acceptor::get_option (1 of 2 overloads)]


Get an option from the acceptor. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void get_option(
      GettableSocketOption & option) const;


This function is used to get the current value of an option on the acceptor.


[heading Parameters]
    

[variablelist
  
[[option][The option value to be obtained from the acceptor.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]



[heading Example]
  
Getting the value of the SOL\_SOCKET/SO\_REUSEADDR option: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::acceptor::reuse_address option;
   acceptor.get_option(option);
   bool is_set = option.get();







[endsect]



[section:overload2 basic_socket_acceptor::get_option (2 of 2 overloads)]


Get an option from the acceptor. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void get_option(
      GettableSocketOption & option,
      asio::error_code & ec) const;


This function is used to get the current value of an option on the acceptor.


[heading Parameters]
    

[variablelist
  
[[option][The option value to be obtained from the acceptor.]]

[[ec][Set to indicate what error occurred, if any.]]

]



[heading Example]
  
Getting the value of the SOL\_SOCKET/SO\_REUSEADDR option: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::acceptor::reuse_address option;
   asio::error_code ec;
   acceptor.get_option(option, ec);
   if (ec)
   {
     // An error occurred.
   }
   bool is_set = option.get();







[endsect]


[endsect]

[section:io_control basic_socket_acceptor::io_control]

[indexterm2 asio.indexterm.basic_socket_acceptor.io_control..io_control..basic_socket_acceptor] 
Perform an IO control command on the acceptor. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void ``[link asio.reference.basic_socket_acceptor.io_control.overload1 io_control]``(
      IoControlCommand & command);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.io_control.overload1 more...]]``

  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void ``[link asio.reference.basic_socket_acceptor.io_control.overload2 io_control]``(
      IoControlCommand & command,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.io_control.overload2 more...]]``


[section:overload1 basic_socket_acceptor::io_control (1 of 2 overloads)]


Perform an IO control command on the acceptor. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void io_control(
      IoControlCommand & command);


This function is used to execute an IO control command on the acceptor.


[heading Parameters]
    

[variablelist
  
[[command][The IO control command to be performed on the acceptor.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]



[heading Example]
  
Getting the number of bytes ready to read: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::acceptor::non_blocking_io command(true);
   socket.io_control(command);







[endsect]



[section:overload2 basic_socket_acceptor::io_control (2 of 2 overloads)]


Perform an IO control command on the acceptor. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void io_control(
      IoControlCommand & command,
      asio::error_code & ec);


This function is used to execute an IO control command on the acceptor.


[heading Parameters]
    

[variablelist
  
[[command][The IO control command to be performed on the acceptor.]]

[[ec][Set to indicate what error occurred, if any.]]

]



[heading Example]
  
Getting the number of bytes ready to read: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::acceptor::non_blocking_io command(true);
   asio::error_code ec;
   socket.io_control(command, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:is_open basic_socket_acceptor::is_open]

[indexterm2 asio.indexterm.basic_socket_acceptor.is_open..is_open..basic_socket_acceptor] 
Determine whether the acceptor is open. 


  bool is_open() const;



[endsect]



[section:keep_alive basic_socket_acceptor::keep_alive]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket_acceptor.keep_alive..keep_alive..basic_socket_acceptor] 
Socket option to send keep-alives. 


  typedef implementation_defined keep_alive;



Implements the SOL\_SOCKET/SO\_KEEPALIVE socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::keep_alive option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::keep_alive option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_socket_acceptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:linger basic_socket_acceptor::linger]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket_acceptor.linger..linger..basic_socket_acceptor] 
Socket option to specify whether the socket lingers on close if unsent data is present. 


  typedef implementation_defined linger;



Implements the SOL\_SOCKET/SO\_LINGER socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::linger option(true, 30);
   socket.set_option(option);





Getting the current option value: 

   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();







[heading Requirements]

['Header: ][^asio/basic_socket_acceptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:listen basic_socket_acceptor::listen]

[indexterm2 asio.indexterm.basic_socket_acceptor.listen..listen..basic_socket_acceptor] 
Place the acceptor into the state where it will listen for new connections. 


  void ``[link asio.reference.basic_socket_acceptor.listen.overload1 listen]``(
      int backlog = socket_base::max_listen_connections);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.listen.overload1 more...]]``

  void ``[link asio.reference.basic_socket_acceptor.listen.overload2 listen]``(
      int backlog,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.listen.overload2 more...]]``


[section:overload1 basic_socket_acceptor::listen (1 of 2 overloads)]


Place the acceptor into the state where it will listen for new connections. 


  void listen(
      int backlog = socket_base::max_listen_connections);


This function puts the socket acceptor into the state where it may accept new connections.


[heading Parameters]
    

[variablelist
  
[[backlog][The maximum length of the queue of pending connections.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 basic_socket_acceptor::listen (2 of 2 overloads)]


Place the acceptor into the state where it will listen for new connections. 


  void listen(
      int backlog,
      asio::error_code & ec);


This function puts the socket acceptor into the state where it may accept new connections.


[heading Parameters]
    

[variablelist
  
[[backlog][The maximum length of the queue of pending connections.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::error_code ec;
   acceptor.listen(asio::socket_base::max_listen_connections, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]

[section:local_endpoint basic_socket_acceptor::local_endpoint]

[indexterm2 asio.indexterm.basic_socket_acceptor.local_endpoint..local_endpoint..basic_socket_acceptor] 
Get the local endpoint of the acceptor. 


  endpoint_type ``[link asio.reference.basic_socket_acceptor.local_endpoint.overload1 local_endpoint]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.local_endpoint.overload1 more...]]``

  endpoint_type ``[link asio.reference.basic_socket_acceptor.local_endpoint.overload2 local_endpoint]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.local_endpoint.overload2 more...]]``


[section:overload1 basic_socket_acceptor::local_endpoint (1 of 2 overloads)]


Get the local endpoint of the acceptor. 


  endpoint_type local_endpoint() const;


This function is used to obtain the locally bound endpoint of the acceptor.


[heading Return Value]
      
An object that represents the local endpoint of the acceptor.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::endpoint endpoint = acceptor.local_endpoint();







[endsect]



[section:overload2 basic_socket_acceptor::local_endpoint (2 of 2 overloads)]


Get the local endpoint of the acceptor. 


  endpoint_type local_endpoint(
      asio::error_code & ec) const;


This function is used to obtain the locally bound endpoint of the acceptor.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
An object that represents the local endpoint of the acceptor. Returns a default-constructed endpoint object if an error occurred and the error handler did not throw an exception.


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::error_code ec;
   asio::ip::tcp::endpoint endpoint = acceptor.local_endpoint(ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:max_connections basic_socket_acceptor::max_connections]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket_acceptor.max_connections..max_connections..basic_socket_acceptor] 
(Deprecated: Use max\_listen\_connections.) The maximum length of the queue of pending incoming connections. 


  static const int max_connections = implementation_defined;



[endsect]



[section:max_listen_connections basic_socket_acceptor::max_listen_connections]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket_acceptor.max_listen_connections..max_listen_connections..basic_socket_acceptor] 
The maximum length of the queue of pending incoming connections. 


  static const int max_listen_connections = implementation_defined;



[endsect]



[section:message_do_not_route basic_socket_acceptor::message_do_not_route]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket_acceptor.message_do_not_route..message_do_not_route..basic_socket_acceptor] 
Specify that the data should not be subject to routing. 


  static const int message_do_not_route = implementation_defined;



[endsect]



[section:message_end_of_record basic_socket_acceptor::message_end_of_record]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket_acceptor.message_end_of_record..message_end_of_record..basic_socket_acceptor] 
Specifies that the data marks the end of a record. 


  static const int message_end_of_record = implementation_defined;



[endsect]



[section:message_flags basic_socket_acceptor::message_flags]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket_acceptor.message_flags..message_flags..basic_socket_acceptor] 
Bitmask type for flags that can be passed to send and receive operations. 


  typedef int message_flags;



[heading Requirements]

['Header: ][^asio/basic_socket_acceptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:message_out_of_band basic_socket_acceptor::message_out_of_band]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket_acceptor.message_out_of_band..message_out_of_band..basic_socket_acceptor] 
Process out-of-band data. 


  static const int message_out_of_band = implementation_defined;



[endsect]



[section:message_peek basic_socket_acceptor::message_peek]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket_acceptor.message_peek..message_peek..basic_socket_acceptor] 
Peek at incoming data without removing it from the input queue. 


  static const int message_peek = implementation_defined;



[endsect]



[section:native_handle basic_socket_acceptor::native_handle]

[indexterm2 asio.indexterm.basic_socket_acceptor.native_handle..native_handle..basic_socket_acceptor] 
Get the native acceptor representation. 


  native_handle_type native_handle();


This function may be used to obtain the underlying representation of the acceptor. This is intended to allow access to native acceptor functionality that is not otherwise provided. 


[endsect]



[section:native_handle_type basic_socket_acceptor::native_handle_type]

[indexterm2 asio.indexterm.basic_socket_acceptor.native_handle_type..native_handle_type..basic_socket_acceptor] 
The native representation of an acceptor. 


  typedef implementation_defined native_handle_type;



[heading Requirements]

['Header: ][^asio/basic_socket_acceptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:native_non_blocking basic_socket_acceptor::native_non_blocking]

[indexterm2 asio.indexterm.basic_socket_acceptor.native_non_blocking..native_non_blocking..basic_socket_acceptor] 
Gets the non-blocking mode of the native acceptor implementation. 


  bool ``[link asio.reference.basic_socket_acceptor.native_non_blocking.overload1 native_non_blocking]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.native_non_blocking.overload1 more...]]``


Sets the non-blocking mode of the native acceptor implementation. 


  void ``[link asio.reference.basic_socket_acceptor.native_non_blocking.overload2 native_non_blocking]``(
      bool mode);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.native_non_blocking.overload2 more...]]``

  void ``[link asio.reference.basic_socket_acceptor.native_non_blocking.overload3 native_non_blocking]``(
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.native_non_blocking.overload3 more...]]``


[section:overload1 basic_socket_acceptor::native_non_blocking (1 of 3 overloads)]


Gets the non-blocking mode of the native acceptor implementation. 


  bool native_non_blocking() const;


This function is used to retrieve the non-blocking mode of the underlying native acceptor. This mode has no effect on the behaviour of the acceptor object's synchronous operations.


[heading Return Value]
      
`true` if the underlying acceptor is in non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).


[heading Remarks]
      
The current non-blocking mode is cached by the acceptor object. Consequently, the return value may be incorrect if the non-blocking mode was set directly on the native acceptor. 




[endsect]



[section:overload2 basic_socket_acceptor::native_non_blocking (2 of 3 overloads)]


Sets the non-blocking mode of the native acceptor implementation. 


  void native_non_blocking(
      bool mode);


This function is used to modify the non-blocking mode of the underlying native acceptor. It has no effect on the behaviour of the acceptor object's synchronous operations.


[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the underlying acceptor is put into non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. If the `mode` is `false`, but the current value of `non_blocking()` is `true`, this function fails with `asio::error::invalid_argument`, as the combination does not make sense. ]]

]




[endsect]



[section:overload3 basic_socket_acceptor::native_non_blocking (3 of 3 overloads)]


Sets the non-blocking mode of the native acceptor implementation. 


  void native_non_blocking(
      bool mode,
      asio::error_code & ec);


This function is used to modify the non-blocking mode of the underlying native acceptor. It has no effect on the behaviour of the acceptor object's synchronous operations.


[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the underlying acceptor is put into non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).]]

[[ec][Set to indicate what error occurred, if any. If the `mode` is `false`, but the current value of `non_blocking()` is `true`, this function fails with `asio::error::invalid_argument`, as the combination does not make sense. ]]

]




[endsect]


[endsect]

[section:non_blocking basic_socket_acceptor::non_blocking]

[indexterm2 asio.indexterm.basic_socket_acceptor.non_blocking..non_blocking..basic_socket_acceptor] 
Gets the non-blocking mode of the acceptor. 


  bool ``[link asio.reference.basic_socket_acceptor.non_blocking.overload1 non_blocking]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.non_blocking.overload1 more...]]``


Sets the non-blocking mode of the acceptor. 


  void ``[link asio.reference.basic_socket_acceptor.non_blocking.overload2 non_blocking]``(
      bool mode);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.non_blocking.overload2 more...]]``

  void ``[link asio.reference.basic_socket_acceptor.non_blocking.overload3 non_blocking]``(
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.non_blocking.overload3 more...]]``


[section:overload1 basic_socket_acceptor::non_blocking (1 of 3 overloads)]


Gets the non-blocking mode of the acceptor. 


  bool non_blocking() const;



[heading Return Value]
      
`true` if the acceptor's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]



[section:overload2 basic_socket_acceptor::non_blocking (2 of 3 overloads)]


Sets the non-blocking mode of the acceptor. 


  void non_blocking(
      bool mode);



[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the acceptor's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]



[section:overload3 basic_socket_acceptor::non_blocking (3 of 3 overloads)]


Sets the non-blocking mode of the acceptor. 


  void non_blocking(
      bool mode,
      asio::error_code & ec);



[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the acceptor's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]


[endsect]

[section:open basic_socket_acceptor::open]

[indexterm2 asio.indexterm.basic_socket_acceptor.open..open..basic_socket_acceptor] 
Open the acceptor using the specified protocol. 


  void ``[link asio.reference.basic_socket_acceptor.open.overload1 open]``(
      const protocol_type & protocol = protocol_type());
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.open.overload1 more...]]``

  void ``[link asio.reference.basic_socket_acceptor.open.overload2 open]``(
      const protocol_type & protocol,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.open.overload2 more...]]``


[section:overload1 basic_socket_acceptor::open (1 of 2 overloads)]


Open the acceptor using the specified protocol. 


  void open(
      const protocol_type & protocol = protocol_type());


This function opens the socket acceptor so that it will use the specified protocol.


[heading Parameters]
    

[variablelist
  
[[protocol][An object specifying which protocol is to be used.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   acceptor.open(asio::ip::tcp::v4());







[endsect]



[section:overload2 basic_socket_acceptor::open (2 of 2 overloads)]


Open the acceptor using the specified protocol. 


  void open(
      const protocol_type & protocol,
      asio::error_code & ec);


This function opens the socket acceptor so that it will use the specified protocol.


[heading Parameters]
    

[variablelist
  
[[protocol][An object specifying which protocol is to be used.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  


   asio::ip::tcp::acceptor acceptor(my_context);
   asio::error_code ec;
   acceptor.open(asio::ip::tcp::v4(), ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]

[section:operator_eq_ basic_socket_acceptor::operator=]

[indexterm2 asio.indexterm.basic_socket_acceptor.operator_eq_..operator=..basic_socket_acceptor] 
Move-assign a [link asio.reference.basic_socket_acceptor `basic_socket_acceptor`] from another. 


  basic_socket_acceptor & ``[link asio.reference.basic_socket_acceptor.operator_eq_.overload1 operator=]``(
      basic_socket_acceptor && other);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.operator_eq_.overload1 more...]]``


Move-assign a [link asio.reference.basic_socket_acceptor `basic_socket_acceptor`] from an acceptor of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value, basic_socket_acceptor & >::type ``[link asio.reference.basic_socket_acceptor.operator_eq_.overload2 operator=]``(
      basic_socket_acceptor< Protocol1, Executor1 > && other);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.operator_eq_.overload2 more...]]``


[section:overload1 basic_socket_acceptor::operator= (1 of 2 overloads)]


Move-assign a [link asio.reference.basic_socket_acceptor `basic_socket_acceptor`] from another. 


  basic_socket_acceptor & operator=(
      basic_socket_acceptor && other);


This assignment operator moves an acceptor from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_socket_acceptor `basic_socket_acceptor`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_socket_acceptor(const executor_type&)` constructor. 




[endsect]



[section:overload2 basic_socket_acceptor::operator= (2 of 2 overloads)]


Move-assign a [link asio.reference.basic_socket_acceptor `basic_socket_acceptor`] from an acceptor of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value, basic_socket_acceptor & >::type operator=(
      basic_socket_acceptor< Protocol1, Executor1 > && other);


This assignment operator moves an acceptor from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_socket_acceptor `basic_socket_acceptor`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_socket_acceptor(const executor_type&)` constructor. 




[endsect]


[endsect]


[section:out_of_band_inline basic_socket_acceptor::out_of_band_inline]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket_acceptor.out_of_band_inline..out_of_band_inline..basic_socket_acceptor] 
Socket option for putting received out-of-band data inline. 


  typedef implementation_defined out_of_band_inline;



Implements the SOL\_SOCKET/SO\_OOBINLINE socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::out_of_band_inline option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::out_of_band_inline option;
   socket.get_option(option);
   bool value = option.value();







[heading Requirements]

['Header: ][^asio/basic_socket_acceptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:protocol_type basic_socket_acceptor::protocol_type]

[indexterm2 asio.indexterm.basic_socket_acceptor.protocol_type..protocol_type..basic_socket_acceptor] 
The protocol type. 


  typedef Protocol protocol_type;



[heading Requirements]

['Header: ][^asio/basic_socket_acceptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:receive_buffer_size basic_socket_acceptor::receive_buffer_size]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket_acceptor.receive_buffer_size..receive_buffer_size..basic_socket_acceptor] 
Socket option for the receive buffer size of a socket. 


  typedef implementation_defined receive_buffer_size;



Implements the SOL\_SOCKET/SO\_RCVBUF socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_buffer_size option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_socket_acceptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:receive_low_watermark basic_socket_acceptor::receive_low_watermark]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket_acceptor.receive_low_watermark..receive_low_watermark..basic_socket_acceptor] 
Socket option for the receive low watermark. 


  typedef implementation_defined receive_low_watermark;



Implements the SOL\_SOCKET/SO\_RCVLOWAT socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_low_watermark option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_socket_acceptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:release basic_socket_acceptor::release]

[indexterm2 asio.indexterm.basic_socket_acceptor.release..release..basic_socket_acceptor] 
Release ownership of the underlying native acceptor. 


  native_handle_type ``[link asio.reference.basic_socket_acceptor.release.overload1 release]``();
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.release.overload1 more...]]``

  native_handle_type ``[link asio.reference.basic_socket_acceptor.release.overload2 release]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.release.overload2 more...]]``


[section:overload1 basic_socket_acceptor::release (1 of 2 overloads)]


Release ownership of the underlying native acceptor. 


  native_handle_type release();


This function causes all outstanding asynchronous accept operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error. Ownership of the native acceptor is then transferred to the caller.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
This function is unsupported on Windows versions prior to Windows 8.1, and will fail with `asio::error::operation_not_supported` on these platforms. 




[endsect]



[section:overload2 basic_socket_acceptor::release (2 of 2 overloads)]


Release ownership of the underlying native acceptor. 


  native_handle_type release(
      asio::error_code & ec);


This function causes all outstanding asynchronous accept operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error. Ownership of the native acceptor is then transferred to the caller.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
This function is unsupported on Windows versions prior to Windows 8.1, and will fail with `asio::error::operation_not_supported` on these platforms. 




[endsect]


[endsect]


[section:reuse_address basic_socket_acceptor::reuse_address]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket_acceptor.reuse_address..reuse_address..basic_socket_acceptor] 
Socket option to allow the socket to be bound to an address that is already in use. 


  typedef implementation_defined reuse_address;



Implements the SOL\_SOCKET/SO\_REUSEADDR socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::reuse_address option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::reuse_address option;
   acceptor.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_socket_acceptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:send_buffer_size basic_socket_acceptor::send_buffer_size]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket_acceptor.send_buffer_size..send_buffer_size..basic_socket_acceptor] 
Socket option for the send buffer size of a socket. 


  typedef implementation_defined send_buffer_size;



Implements the SOL\_SOCKET/SO\_SNDBUF socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_buffer_size option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_socket_acceptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:send_low_watermark basic_socket_acceptor::send_low_watermark]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket_acceptor.send_low_watermark..send_low_watermark..basic_socket_acceptor] 
Socket option for the send low watermark. 


  typedef implementation_defined send_low_watermark;



Implements the SOL\_SOCKET/SO\_SNDLOWAT socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_low_watermark option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_socket_acceptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:set_option basic_socket_acceptor::set_option]

[indexterm2 asio.indexterm.basic_socket_acceptor.set_option..set_option..basic_socket_acceptor] 
Set an option on the acceptor. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void ``[link asio.reference.basic_socket_acceptor.set_option.overload1 set_option]``(
      const SettableSocketOption & option);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.set_option.overload1 more...]]``

  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void ``[link asio.reference.basic_socket_acceptor.set_option.overload2 set_option]``(
      const SettableSocketOption & option,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.set_option.overload2 more...]]``


[section:overload1 basic_socket_acceptor::set_option (1 of 2 overloads)]


Set an option on the acceptor. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void set_option(
      const SettableSocketOption & option);


This function is used to set an option on the acceptor.


[heading Parameters]
    

[variablelist
  
[[option][The new option value to be set on the acceptor.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]



[heading Example]
  
Setting the SOL\_SOCKET/SO\_REUSEADDR option: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::acceptor::reuse_address option(true);
   acceptor.set_option(option);







[endsect]



[section:overload2 basic_socket_acceptor::set_option (2 of 2 overloads)]


Set an option on the acceptor. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void set_option(
      const SettableSocketOption & option,
      asio::error_code & ec);


This function is used to set an option on the acceptor.


[heading Parameters]
    

[variablelist
  
[[option][The new option value to be set on the acceptor.]]

[[ec][Set to indicate what error occurred, if any.]]

]



[heading Example]
  
Setting the SOL\_SOCKET/SO\_REUSEADDR option: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::ip::tcp::acceptor::reuse_address option(true);
   asio::error_code ec;
   acceptor.set_option(option, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:shutdown_type basic_socket_acceptor::shutdown_type]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket_acceptor.shutdown_type..shutdown_type..basic_socket_acceptor] 
Different ways a socket may be shutdown. 


  enum shutdown_type

[indexterm2 asio.indexterm.basic_socket_acceptor.shutdown_type.shutdown_receive..shutdown_receive..basic_socket_acceptor]
[indexterm2 asio.indexterm.basic_socket_acceptor.shutdown_type.shutdown_send..shutdown_send..basic_socket_acceptor]
[indexterm2 asio.indexterm.basic_socket_acceptor.shutdown_type.shutdown_both..shutdown_both..basic_socket_acceptor]

[heading Values]
[variablelist

  [
    [shutdown_receive]
    [Shutdown the receive side of the socket. ]
  ]

  [
    [shutdown_send]
    [Shutdown the send side of the socket. ]
  ]

  [
    [shutdown_both]
    [Shutdown both send and receive on the socket. ]
  ]

]



[endsect]


[section:wait basic_socket_acceptor::wait]

[indexterm2 asio.indexterm.basic_socket_acceptor.wait..wait..basic_socket_acceptor] 
Wait for the acceptor to become ready to read, ready to write, or to have pending error conditions. 


  void ``[link asio.reference.basic_socket_acceptor.wait.overload1 wait]``(
      wait_type w);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.wait.overload1 more...]]``

  void ``[link asio.reference.basic_socket_acceptor.wait.overload2 wait]``(
      wait_type w,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.wait.overload2 more...]]``


[section:overload1 basic_socket_acceptor::wait (1 of 2 overloads)]


Wait for the acceptor to become ready to read, ready to write, or to have pending error conditions. 


  void wait(
      wait_type w);


This function is used to perform a blocking wait for an acceptor to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired acceptor state.]]

]


[heading Example]
  
Waiting for an acceptor to become readable. 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   acceptor.wait(asio::ip::tcp::acceptor::wait_read);







[endsect]



[section:overload2 basic_socket_acceptor::wait (2 of 2 overloads)]


Wait for the acceptor to become ready to read, ready to write, or to have pending error conditions. 


  void wait(
      wait_type w,
      asio::error_code & ec);


This function is used to perform a blocking wait for an acceptor to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired acceptor state.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  
Waiting for an acceptor to become readable. 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::error_code ec;
   acceptor.wait(asio::ip::tcp::acceptor::wait_read, ec);







[endsect]


[endsect]


[section:wait_type basic_socket_acceptor::wait_type]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_socket_acceptor.wait_type..wait_type..basic_socket_acceptor] 
Wait types. 


  enum wait_type

[indexterm2 asio.indexterm.basic_socket_acceptor.wait_type.wait_read..wait_read..basic_socket_acceptor]
[indexterm2 asio.indexterm.basic_socket_acceptor.wait_type.wait_write..wait_write..basic_socket_acceptor]
[indexterm2 asio.indexterm.basic_socket_acceptor.wait_type.wait_error..wait_error..basic_socket_acceptor]

[heading Values]
[variablelist

  [
    [wait_read]
    [Wait for a socket to become ready to read. ]
  ]

  [
    [wait_write]
    [Wait for a socket to become ready to write. ]
  ]

  [
    [wait_error]
    [Wait for a socket to have error conditions pending. ]
  ]

]


For use with `basic_socket::wait()` and `basic_socket::async_wait()`. 


[endsect]



[section:_basic_socket_acceptor basic_socket_acceptor::~basic_socket_acceptor]

[indexterm2 asio.indexterm.basic_socket_acceptor._basic_socket_acceptor..~basic_socket_acceptor..basic_socket_acceptor] 
Destroys the acceptor. 


  ~basic_socket_acceptor();


This function destroys the acceptor, cancelling any outstanding asynchronous operations associated with the acceptor as if by calling `cancel`. 


[endsect]



[endsect]

[section:basic_socket_acceptor__rebind_executor basic_socket_acceptor::rebind_executor]


Rebinds the acceptor type to another executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  struct rebind_executor


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_socket_acceptor__rebind_executor.other [*other]]]
    [The socket type when rebound to the specified executor. ]
  
  ]

]

[heading Requirements]

['Header: ][^asio/basic_socket_acceptor.hpp]

['Convenience header: ][^asio.hpp]


[section:other basic_socket_acceptor::rebind_executor::other]

[indexterm2 asio.indexterm.basic_socket_acceptor__rebind_executor.other..other..basic_socket_acceptor::rebind_executor] 
The socket type when rebound to the specified executor. 


  typedef basic_socket_acceptor< Protocol, Executor1 > other;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_socket_acceptor__rebind_executor [*rebind_executor]]]
    [Rebinds the acceptor type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.native_handle_type [*native_handle_type]]]
    [The native representation of an acceptor. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket_acceptor.accept [*accept]]]
    [Accept a new connection. 
     [hr]
     Accept a new connection and obtain the endpoint of the peer. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.assign [*assign]]]
    [Assigns an existing native acceptor to the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.async_accept [*async_accept]]]
    [Start an asynchronous accept. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.async_wait [*async_wait]]]
    [Asynchronously wait for the acceptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.basic_socket_acceptor [*basic_socket_acceptor]] [constructor]]
    [Construct an acceptor without opening it. 
     [hr]
     Construct an open acceptor. 
     [hr]
     Construct an acceptor opened on the given endpoint. 
     [hr]
     Construct a basic_socket_acceptor on an existing native acceptor. 
     [hr]
     Move-construct a basic_socket_acceptor from another. 
     [hr]
     Move-construct a basic_socket_acceptor from an acceptor of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.bind [*bind]]]
    [Bind the acceptor to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.close [*close]]]
    [Close the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.get_option [*get_option]]]
    [Get an option from the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.io_control [*io_control]]]
    [Perform an IO control command on the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.is_open [*is_open]]]
    [Determine whether the acceptor is open. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.listen [*listen]]]
    [Place the acceptor into the state where it will listen for new connections. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.native_handle [*native_handle]]]
    [Get the native acceptor representation. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native acceptor implementation. 
     [hr]
     Sets the non-blocking mode of the native acceptor implementation. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the acceptor. 
     [hr]
     Sets the non-blocking mode of the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.open [*open]]]
    [Open the acceptor using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.operator_eq_ [*operator=]]]
    [Move-assign a basic_socket_acceptor from another. 
     [hr]
     Move-assign a basic_socket_acceptor from an acceptor of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.release [*release]]]
    [Release ownership of the underlying native acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.set_option [*set_option]]]
    [Set an option on the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.wait [*wait]]]
    [Wait for the acceptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor._basic_socket_acceptor [*~basic_socket_acceptor]] [destructor]]
    [Destroys the acceptor. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket_acceptor.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_socket_acceptor `basic_socket_acceptor`] class template is used for accepting new socket connections.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.


[heading Example]
  
Opening a socket acceptor with the SO\_REUSEADDR option enabled: 

   asio::ip::tcp::acceptor acceptor(my_context);
   asio::ip::tcp::endpoint endpoint(asio::ip::tcp::v4(), port);
   acceptor.open(endpoint.protocol());
   acceptor.set_option(asio::ip::tcp::acceptor::reuse_address(true));
   acceptor.bind(endpoint);
   acceptor.listen();







[heading Requirements]

['Header: ][^asio/basic_socket_acceptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:basic_socket_iostream basic_socket_iostream]


Iostream interface for a socket. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename Clock = chrono::steady_clock,
      typename ``[link asio.reference.WaitTraits WaitTraits]`` = wait_traits<Clock>>
  class basic_socket_iostream


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_socket_iostream.clock_type [*clock_type]]]
    [The clock type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.duration [*duration]]]
    [The duration type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.duration_type [*duration_type]]]
    [(Deprecated: Use duration.) The duration type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.time_point [*time_point]]]
    [The time type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.time_type [*time_type]]]
    [(Deprecated: Use time_point.) The time type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket_iostream.basic_socket_iostream [*basic_socket_iostream]] [constructor]]
    [Construct a basic_socket_iostream without establishing a connection. 
     [hr]
     Construct a basic_socket_iostream from the supplied socket. 
     [hr]
     Move-construct a basic_socket_iostream from another. 
     [hr]
     Establish a connection to an endpoint corresponding to a resolver query. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.close [*close]]]
    [Close the connection. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.connect [*connect]]]
    [Establish a connection to an endpoint corresponding to a resolver query. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.error [*error]]]
    [Get the last error associated with the stream. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.expires_after [*expires_after]]]
    [Set the stream's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.expires_at [*expires_at]]]
    [(Deprecated: Use expiry().) Get the stream's expiry time as an absolute time. 
     [hr]
     Set the stream's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.expires_from_now [*expires_from_now]]]
    [(Deprecated: Use expiry().) Get the stream's expiry time relative to now. 
     [hr]
     (Deprecated: Use expires_after().) Set the stream's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.expiry [*expiry]]]
    [Get the stream's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.operator_eq_ [*operator=]]]
    [Move-assign a basic_socket_iostream from another. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.rdbuf [*rdbuf]]]
    [Return a pointer to the underlying streambuf. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.socket [*socket]]]
    [Get a reference to the underlying socket. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/basic_socket_iostream.hpp]

['Convenience header: ][^asio.hpp]

[section:basic_socket_iostream basic_socket_iostream::basic_socket_iostream]

[indexterm2 asio.indexterm.basic_socket_iostream.basic_socket_iostream..basic_socket_iostream..basic_socket_iostream] 
Construct a [link asio.reference.basic_socket_iostream `basic_socket_iostream`] without establishing a connection. 


  ``[link asio.reference.basic_socket_iostream.basic_socket_iostream.overload1 basic_socket_iostream]``();
  ``  [''''&raquo;''' [link asio.reference.basic_socket_iostream.basic_socket_iostream.overload1 more...]]``


Construct a [link asio.reference.basic_socket_iostream `basic_socket_iostream`] from the supplied socket. 


  explicit ``[link asio.reference.basic_socket_iostream.basic_socket_iostream.overload2 basic_socket_iostream]``(
      basic_stream_socket< protocol_type > s);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_iostream.basic_socket_iostream.overload2 more...]]``


Move-construct a [link asio.reference.basic_socket_iostream `basic_socket_iostream`] from another. 


  ``[link asio.reference.basic_socket_iostream.basic_socket_iostream.overload3 basic_socket_iostream]``(
      basic_socket_iostream && other);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_iostream.basic_socket_iostream.overload3 more...]]``


Establish a connection to an endpoint corresponding to a resolver query. 


  template<
      typename T1,
      ... ,
      typename TN>
  explicit ``[link asio.reference.basic_socket_iostream.basic_socket_iostream.overload4 basic_socket_iostream]``(
      T1 t1,
      ... ,
      TN tn);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_iostream.basic_socket_iostream.overload4 more...]]``


[section:overload1 basic_socket_iostream::basic_socket_iostream (1 of 4 overloads)]


Construct a [link asio.reference.basic_socket_iostream `basic_socket_iostream`] without establishing a connection. 


  basic_socket_iostream();



[endsect]



[section:overload2 basic_socket_iostream::basic_socket_iostream (2 of 4 overloads)]


Construct a [link asio.reference.basic_socket_iostream `basic_socket_iostream`] from the supplied socket. 


  basic_socket_iostream(
      basic_stream_socket< protocol_type > s);



[endsect]



[section:overload3 basic_socket_iostream::basic_socket_iostream (3 of 4 overloads)]


Move-construct a [link asio.reference.basic_socket_iostream `basic_socket_iostream`] from another. 


  basic_socket_iostream(
      basic_socket_iostream && other);



[endsect]



[section:overload4 basic_socket_iostream::basic_socket_iostream (4 of 4 overloads)]


Establish a connection to an endpoint corresponding to a resolver query. 


  template<
      typename T1,
      ... ,
      typename TN>
  basic_socket_iostream(
      T1 t1,
      ... ,
      TN tn);


This constructor automatically establishes a connection based on the supplied resolver query parameters. The arguments are used to construct a resolver query object. 


[endsect]


[endsect]


[section:clock_type basic_socket_iostream::clock_type]

[indexterm2 asio.indexterm.basic_socket_iostream.clock_type..clock_type..basic_socket_iostream] 
The clock type. 


  typedef Clock clock_type;



[heading Requirements]

['Header: ][^asio/basic_socket_iostream.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:close basic_socket_iostream::close]

[indexterm2 asio.indexterm.basic_socket_iostream.close..close..basic_socket_iostream] 
Close the connection. 


  void close();



[endsect]



[section:connect basic_socket_iostream::connect]

[indexterm2 asio.indexterm.basic_socket_iostream.connect..connect..basic_socket_iostream] 
Establish a connection to an endpoint corresponding to a resolver query. 


  template<
      typename T1,
      ... ,
      typename TN>
  void connect(
      T1 t1,
      ... ,
      TN tn);


This function automatically establishes a connection based on the supplied resolver query parameters. The arguments are used to construct a resolver query object. 


[endsect]



[section:duration basic_socket_iostream::duration]

[indexterm2 asio.indexterm.basic_socket_iostream.duration..duration..basic_socket_iostream] 
The duration type. 


  typedef WaitTraits::duration duration;



[heading Requirements]

['Header: ][^asio/basic_socket_iostream.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:duration_type basic_socket_iostream::duration_type]

[indexterm2 asio.indexterm.basic_socket_iostream.duration_type..duration_type..basic_socket_iostream] 
(Deprecated: Use duration.) The duration type. 


  typedef WaitTraits::duration_type duration_type;



[heading Requirements]

['Header: ][^asio/basic_socket_iostream.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:endpoint_type basic_socket_iostream::endpoint_type]

[indexterm2 asio.indexterm.basic_socket_iostream.endpoint_type..endpoint_type..basic_socket_iostream] 
The endpoint type. 


  typedef Protocol::endpoint endpoint_type;



[heading Requirements]

['Header: ][^asio/basic_socket_iostream.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:error basic_socket_iostream::error]

[indexterm2 asio.indexterm.basic_socket_iostream.error..error..basic_socket_iostream] 
Get the last error associated with the stream. 


  const asio::error_code & error() const;



[heading Return Value]
      
An `error_code` corresponding to the last error from the stream.


[heading Example]
  
To print the error associated with a failure to establish a connection: 

   tcp::iostream s("www.boost.org", "http");
   if (!s)
   {
     std::cout << "Error: " << s.error().message() << std::endl;
   } 







[endsect]



[section:expires_after basic_socket_iostream::expires_after]

[indexterm2 asio.indexterm.basic_socket_iostream.expires_after..expires_after..basic_socket_iostream] 
Set the stream's expiry time relative to now. 


  void expires_after(
      const duration & expiry_time);


This function sets the expiry time associated with the stream. Stream operations performed after this time (where the operations cannot be completed using the internal buffers) will fail with the error `asio::error::operation_aborted`.


[heading Parameters]
    

[variablelist
  
[[expiry_time][The expiry time to be used for the timer. ]]

]




[endsect]


[section:expires_at basic_socket_iostream::expires_at]

[indexterm2 asio.indexterm.basic_socket_iostream.expires_at..expires_at..basic_socket_iostream] 
(Deprecated: Use `expiry()`.) Get the stream's expiry time as an absolute time. 


  time_point ``[link asio.reference.basic_socket_iostream.expires_at.overload1 expires_at]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_iostream.expires_at.overload1 more...]]``


Set the stream's expiry time as an absolute time. 


  void ``[link asio.reference.basic_socket_iostream.expires_at.overload2 expires_at]``(
      const time_point & expiry_time);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_iostream.expires_at.overload2 more...]]``


[section:overload1 basic_socket_iostream::expires_at (1 of 2 overloads)]


(Deprecated: Use `expiry()`.) Get the stream's expiry time as an absolute time. 


  time_point expires_at() const;



[heading Return Value]
      
An absolute time value representing the stream's expiry time. 




[endsect]



[section:overload2 basic_socket_iostream::expires_at (2 of 2 overloads)]


Set the stream's expiry time as an absolute time. 


  void expires_at(
      const time_point & expiry_time);


This function sets the expiry time associated with the stream. Stream operations performed after this time (where the operations cannot be completed using the internal buffers) will fail with the error `asio::error::operation_aborted`.


[heading Parameters]
    

[variablelist
  
[[expiry_time][The expiry time to be used for the stream. ]]

]




[endsect]


[endsect]

[section:expires_from_now basic_socket_iostream::expires_from_now]

[indexterm2 asio.indexterm.basic_socket_iostream.expires_from_now..expires_from_now..basic_socket_iostream] 
(Deprecated: Use `expiry()`.) Get the stream's expiry time relative to now. 


  duration ``[link asio.reference.basic_socket_iostream.expires_from_now.overload1 expires_from_now]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_iostream.expires_from_now.overload1 more...]]``


(Deprecated: Use `expires_after()`.) Set the stream's expiry time relative to now. 


  void ``[link asio.reference.basic_socket_iostream.expires_from_now.overload2 expires_from_now]``(
      const duration & expiry_time);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_iostream.expires_from_now.overload2 more...]]``


[section:overload1 basic_socket_iostream::expires_from_now (1 of 2 overloads)]


(Deprecated: Use `expiry()`.) Get the stream's expiry time relative to now. 


  duration expires_from_now() const;



[heading Return Value]
      
A relative time value representing the stream's expiry time. 




[endsect]



[section:overload2 basic_socket_iostream::expires_from_now (2 of 2 overloads)]


(Deprecated: Use `expires_after()`.) Set the stream's expiry time relative to now. 


  void expires_from_now(
      const duration & expiry_time);


This function sets the expiry time associated with the stream. Stream operations performed after this time (where the operations cannot be completed using the internal buffers) will fail with the error `asio::error::operation_aborted`.


[heading Parameters]
    

[variablelist
  
[[expiry_time][The expiry time to be used for the timer. ]]

]




[endsect]


[endsect]


[section:expiry basic_socket_iostream::expiry]

[indexterm2 asio.indexterm.basic_socket_iostream.expiry..expiry..basic_socket_iostream] 
Get the stream's expiry time as an absolute time. 


  time_point expiry() const;



[heading Return Value]
      
An absolute time value representing the stream's expiry time. 




[endsect]



[section:operator_eq_ basic_socket_iostream::operator=]

[indexterm2 asio.indexterm.basic_socket_iostream.operator_eq_..operator=..basic_socket_iostream] 
Move-assign a [link asio.reference.basic_socket_iostream `basic_socket_iostream`] from another. 


  basic_socket_iostream & operator=(
      basic_socket_iostream && other);



[endsect]



[section:protocol_type basic_socket_iostream::protocol_type]

[indexterm2 asio.indexterm.basic_socket_iostream.protocol_type..protocol_type..basic_socket_iostream] 
The protocol type. 


  typedef Protocol protocol_type;



[heading Requirements]

['Header: ][^asio/basic_socket_iostream.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:rdbuf basic_socket_iostream::rdbuf]

[indexterm2 asio.indexterm.basic_socket_iostream.rdbuf..rdbuf..basic_socket_iostream] 
Return a pointer to the underlying streambuf. 


  basic_socket_streambuf< Protocol, Clock, WaitTraits > * rdbuf() const;



[endsect]



[section:socket basic_socket_iostream::socket]

[indexterm2 asio.indexterm.basic_socket_iostream.socket..socket..basic_socket_iostream] 
Get a reference to the underlying socket. 


  basic_socket< Protocol > & socket();



[endsect]



[section:time_point basic_socket_iostream::time_point]

[indexterm2 asio.indexterm.basic_socket_iostream.time_point..time_point..basic_socket_iostream] 
The time type. 


  typedef WaitTraits::time_point time_point;



[heading Requirements]

['Header: ][^asio/basic_socket_iostream.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:time_type basic_socket_iostream::time_type]

[indexterm2 asio.indexterm.basic_socket_iostream.time_type..time_type..basic_socket_iostream] 
(Deprecated: Use time\_point.) The time type. 


  typedef WaitTraits::time_type time_type;



[heading Requirements]

['Header: ][^asio/basic_socket_iostream.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:basic_socket_streambuf basic_socket_streambuf]


Iostream streambuf for a socket. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename Clock = chrono::steady_clock,
      typename ``[link asio.reference.WaitTraits WaitTraits]`` = wait_traits<Clock>>
  class basic_socket_streambuf :
    basic_socket< Protocol >


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_socket_streambuf.clock_type [*clock_type]]]
    [The clock type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.duration [*duration]]]
    [The duration type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.duration_type [*duration_type]]]
    [(Deprecated: Use duration.) The duration type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.time_point [*time_point]]]
    [The time type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.time_type [*time_type]]]
    [(Deprecated: Use time_point.) The time type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket_streambuf.basic_socket_streambuf [*basic_socket_streambuf]] [constructor]]
    [Construct a basic_socket_streambuf without establishing a connection. 
     [hr]
     Construct a basic_socket_streambuf from the supplied socket. 
     [hr]
     Move-construct a basic_socket_streambuf from another. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.close [*close]]]
    [Close the connection. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.connect [*connect]]]
    [Establish a connection. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.error [*error]]]
    [Get the last error associated with the stream buffer. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.expires_after [*expires_after]]]
    [Set the stream buffer's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.expires_at [*expires_at]]]
    [(Deprecated: Use expiry().) Get the stream buffer's expiry time as an absolute time. 
     [hr]
     Set the stream buffer's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.expires_from_now [*expires_from_now]]]
    [(Deprecated: Use expiry().) Get the stream buffer's expiry time relative to now. 
     [hr]
     (Deprecated: Use expires_after().) Set the stream buffer's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.expiry [*expiry]]]
    [Get the stream buffer's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.operator_eq_ [*operator=]]]
    [Move-assign a basic_socket_streambuf from another. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.puberror [*puberror]]]
    [(Deprecated: Use error().) Get the last error associated with the stream buffer. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.socket [*socket]]]
    [Get a reference to the underlying socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf._basic_socket_streambuf [*~basic_socket_streambuf]] [destructor]]
    [Destructor flushes buffered data. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket_streambuf.overflow [*overflow]]]
    []
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.setbuf [*setbuf]]]
    []
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.sync [*sync]]]
    []
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.underflow [*underflow]]]
    []
  ]
  
]

[heading Requirements]

['Header: ][^asio/basic_socket_streambuf.hpp]

['Convenience header: ][^asio.hpp]

[section:basic_socket_streambuf basic_socket_streambuf::basic_socket_streambuf]

[indexterm2 asio.indexterm.basic_socket_streambuf.basic_socket_streambuf..basic_socket_streambuf..basic_socket_streambuf] 
Construct a [link asio.reference.basic_socket_streambuf `basic_socket_streambuf`] without establishing a connection. 


  ``[link asio.reference.basic_socket_streambuf.basic_socket_streambuf.overload1 basic_socket_streambuf]``();
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.basic_socket_streambuf.overload1 more...]]``


Construct a [link asio.reference.basic_socket_streambuf `basic_socket_streambuf`] from the supplied socket. 


  explicit ``[link asio.reference.basic_socket_streambuf.basic_socket_streambuf.overload2 basic_socket_streambuf]``(
      basic_stream_socket< protocol_type > s);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.basic_socket_streambuf.overload2 more...]]``


Move-construct a [link asio.reference.basic_socket_streambuf `basic_socket_streambuf`] from another. 


  ``[link asio.reference.basic_socket_streambuf.basic_socket_streambuf.overload3 basic_socket_streambuf]``(
      basic_socket_streambuf && other);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.basic_socket_streambuf.overload3 more...]]``


[section:overload1 basic_socket_streambuf::basic_socket_streambuf (1 of 3 overloads)]


Construct a [link asio.reference.basic_socket_streambuf `basic_socket_streambuf`] without establishing a connection. 


  basic_socket_streambuf();



[endsect]



[section:overload2 basic_socket_streambuf::basic_socket_streambuf (2 of 3 overloads)]


Construct a [link asio.reference.basic_socket_streambuf `basic_socket_streambuf`] from the supplied socket. 


  basic_socket_streambuf(
      basic_stream_socket< protocol_type > s);



[endsect]



[section:overload3 basic_socket_streambuf::basic_socket_streambuf (3 of 3 overloads)]


Move-construct a [link asio.reference.basic_socket_streambuf `basic_socket_streambuf`] from another. 


  basic_socket_streambuf(
      basic_socket_streambuf && other);



[endsect]


[endsect]


[section:clock_type basic_socket_streambuf::clock_type]

[indexterm2 asio.indexterm.basic_socket_streambuf.clock_type..clock_type..basic_socket_streambuf] 
The clock type. 


  typedef Clock clock_type;



[heading Requirements]

['Header: ][^asio/basic_socket_streambuf.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:close basic_socket_streambuf::close]

[indexterm2 asio.indexterm.basic_socket_streambuf.close..close..basic_socket_streambuf] 
Close the connection. 


  basic_socket_streambuf * close();



[heading Return Value]
      
`this` if a connection was successfully established, a null pointer otherwise. 




[endsect]


[section:connect basic_socket_streambuf::connect]

[indexterm2 asio.indexterm.basic_socket_streambuf.connect..connect..basic_socket_streambuf] 
Establish a connection. 


  basic_socket_streambuf * ``[link asio.reference.basic_socket_streambuf.connect.overload1 connect]``(
      const endpoint_type & endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.connect.overload1 more...]]``

  template<
      typename T1,
      ... ,
      typename TN>
  basic_socket_streambuf * ``[link asio.reference.basic_socket_streambuf.connect.overload2 connect]``(
      T1 t1,
      ... ,
      TN tn);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.connect.overload2 more...]]``


[section:overload1 basic_socket_streambuf::connect (1 of 2 overloads)]


Establish a connection. 


  basic_socket_streambuf * connect(
      const endpoint_type & endpoint);


This function establishes a connection to the specified endpoint.


[heading Return Value]
      
`this` if a connection was successfully established, a null pointer otherwise. 




[endsect]



[section:overload2 basic_socket_streambuf::connect (2 of 2 overloads)]


Establish a connection. 


  template<
      typename T1,
      ... ,
      typename TN>
  basic_socket_streambuf * connect(
      T1 t1,
      ... ,
      TN tn);


This function automatically establishes a connection based on the supplied resolver query parameters. The arguments are used to construct a resolver query object.


[heading Return Value]
      
`this` if a connection was successfully established, a null pointer otherwise. 




[endsect]


[endsect]


[section:duration basic_socket_streambuf::duration]

[indexterm2 asio.indexterm.basic_socket_streambuf.duration..duration..basic_socket_streambuf] 
The duration type. 


  typedef WaitTraits::duration duration;



[heading Requirements]

['Header: ][^asio/basic_socket_streambuf.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:duration_type basic_socket_streambuf::duration_type]

[indexterm2 asio.indexterm.basic_socket_streambuf.duration_type..duration_type..basic_socket_streambuf] 
(Deprecated: Use duration.) The duration type. 


  typedef WaitTraits::duration_type duration_type;



[heading Requirements]

['Header: ][^asio/basic_socket_streambuf.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:endpoint_type basic_socket_streambuf::endpoint_type]

[indexterm2 asio.indexterm.basic_socket_streambuf.endpoint_type..endpoint_type..basic_socket_streambuf] 
The endpoint type. 


  typedef Protocol::endpoint endpoint_type;



[heading Requirements]

['Header: ][^asio/basic_socket_streambuf.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:error basic_socket_streambuf::error]

[indexterm2 asio.indexterm.basic_socket_streambuf.error..error..basic_socket_streambuf] 
Get the last error associated with the stream buffer. 


  const asio::error_code & error() const;



[heading Return Value]
      
An `error_code` corresponding to the last error from the stream buffer. 




[endsect]



[section:expires_after basic_socket_streambuf::expires_after]

[indexterm2 asio.indexterm.basic_socket_streambuf.expires_after..expires_after..basic_socket_streambuf] 
Set the stream buffer's expiry time relative to now. 


  void expires_after(
      const duration & expiry_time);


This function sets the expiry time associated with the stream. Stream operations performed after this time (where the operations cannot be completed using the internal buffers) will fail with the error `asio::error::operation_aborted`.


[heading Parameters]
    

[variablelist
  
[[expiry_time][The expiry time to be used for the timer. ]]

]




[endsect]


[section:expires_at basic_socket_streambuf::expires_at]

[indexterm2 asio.indexterm.basic_socket_streambuf.expires_at..expires_at..basic_socket_streambuf] 
(Deprecated: Use `expiry()`.) Get the stream buffer's expiry time as an absolute time. 


  time_point ``[link asio.reference.basic_socket_streambuf.expires_at.overload1 expires_at]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.expires_at.overload1 more...]]``


Set the stream buffer's expiry time as an absolute time. 


  void ``[link asio.reference.basic_socket_streambuf.expires_at.overload2 expires_at]``(
      const time_point & expiry_time);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.expires_at.overload2 more...]]``


[section:overload1 basic_socket_streambuf::expires_at (1 of 2 overloads)]


(Deprecated: Use `expiry()`.) Get the stream buffer's expiry time as an absolute time. 


  time_point expires_at() const;



[heading Return Value]
      
An absolute time value representing the stream buffer's expiry time. 




[endsect]



[section:overload2 basic_socket_streambuf::expires_at (2 of 2 overloads)]


Set the stream buffer's expiry time as an absolute time. 


  void expires_at(
      const time_point & expiry_time);


This function sets the expiry time associated with the stream. Stream operations performed after this time (where the operations cannot be completed using the internal buffers) will fail with the error `asio::error::operation_aborted`.


[heading Parameters]
    

[variablelist
  
[[expiry_time][The expiry time to be used for the stream. ]]

]




[endsect]


[endsect]

[section:expires_from_now basic_socket_streambuf::expires_from_now]

[indexterm2 asio.indexterm.basic_socket_streambuf.expires_from_now..expires_from_now..basic_socket_streambuf] 
(Deprecated: Use `expiry()`.) Get the stream buffer's expiry time relative to now. 


  duration ``[link asio.reference.basic_socket_streambuf.expires_from_now.overload1 expires_from_now]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.expires_from_now.overload1 more...]]``


(Deprecated: Use `expires_after()`.) Set the stream buffer's expiry time relative to now. 


  void ``[link asio.reference.basic_socket_streambuf.expires_from_now.overload2 expires_from_now]``(
      const duration & expiry_time);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.expires_from_now.overload2 more...]]``


[section:overload1 basic_socket_streambuf::expires_from_now (1 of 2 overloads)]


(Deprecated: Use `expiry()`.) Get the stream buffer's expiry time relative to now. 


  duration expires_from_now() const;



[heading Return Value]
      
A relative time value representing the stream buffer's expiry time. 




[endsect]



[section:overload2 basic_socket_streambuf::expires_from_now (2 of 2 overloads)]


(Deprecated: Use `expires_after()`.) Set the stream buffer's expiry time relative to now. 


  void expires_from_now(
      const duration & expiry_time);


This function sets the expiry time associated with the stream. Stream operations performed after this time (where the operations cannot be completed using the internal buffers) will fail with the error `asio::error::operation_aborted`.


[heading Parameters]
    

[variablelist
  
[[expiry_time][The expiry time to be used for the timer. ]]

]




[endsect]


[endsect]


[section:expiry basic_socket_streambuf::expiry]

[indexterm2 asio.indexterm.basic_socket_streambuf.expiry..expiry..basic_socket_streambuf] 
Get the stream buffer's expiry time as an absolute time. 


  time_point expiry() const;



[heading Return Value]
      
An absolute time value representing the stream buffer's expiry time. 




[endsect]



[section:operator_eq_ basic_socket_streambuf::operator=]

[indexterm2 asio.indexterm.basic_socket_streambuf.operator_eq_..operator=..basic_socket_streambuf] 
Move-assign a [link asio.reference.basic_socket_streambuf `basic_socket_streambuf`] from another. 


  basic_socket_streambuf & operator=(
      basic_socket_streambuf && other);



[endsect]



[section:overflow basic_socket_streambuf::overflow]

[indexterm2 asio.indexterm.basic_socket_streambuf.overflow..overflow..basic_socket_streambuf] 

  int_type overflow(
      int_type c);



[endsect]



[section:protocol_type basic_socket_streambuf::protocol_type]

[indexterm2 asio.indexterm.basic_socket_streambuf.protocol_type..protocol_type..basic_socket_streambuf] 
The protocol type. 


  typedef Protocol protocol_type;



[heading Requirements]

['Header: ][^asio/basic_socket_streambuf.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:puberror basic_socket_streambuf::puberror]

[indexterm2 asio.indexterm.basic_socket_streambuf.puberror..puberror..basic_socket_streambuf] 
(Deprecated: Use `error()`.) Get the last error associated with the stream buffer. 


  const asio::error_code & puberror() const;



[heading Return Value]
      
An `error_code` corresponding to the last error from the stream buffer. 




[endsect]



[section:setbuf basic_socket_streambuf::setbuf]

[indexterm2 asio.indexterm.basic_socket_streambuf.setbuf..setbuf..basic_socket_streambuf] 

  std::streambuf * setbuf(
      char_type * s,
      std::streamsize n);



[endsect]



[section:socket basic_socket_streambuf::socket]

[indexterm2 asio.indexterm.basic_socket_streambuf.socket..socket..basic_socket_streambuf] 
Get a reference to the underlying socket. 


  basic_socket< Protocol > & socket();



[endsect]



[section:sync basic_socket_streambuf::sync]

[indexterm2 asio.indexterm.basic_socket_streambuf.sync..sync..basic_socket_streambuf] 

  int sync();



[endsect]



[section:time_point basic_socket_streambuf::time_point]

[indexterm2 asio.indexterm.basic_socket_streambuf.time_point..time_point..basic_socket_streambuf] 
The time type. 


  typedef WaitTraits::time_point time_point;



[heading Requirements]

['Header: ][^asio/basic_socket_streambuf.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:time_type basic_socket_streambuf::time_type]

[indexterm2 asio.indexterm.basic_socket_streambuf.time_type..time_type..basic_socket_streambuf] 
(Deprecated: Use time\_point.) The time type. 


  typedef WaitTraits::time_type time_type;



[heading Requirements]

['Header: ][^asio/basic_socket_streambuf.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:underflow basic_socket_streambuf::underflow]

[indexterm2 asio.indexterm.basic_socket_streambuf.underflow..underflow..basic_socket_streambuf] 

  int_type underflow();



[endsect]



[section:_basic_socket_streambuf basic_socket_streambuf::~basic_socket_streambuf]

[indexterm2 asio.indexterm.basic_socket_streambuf._basic_socket_streambuf..~basic_socket_streambuf..basic_socket_streambuf] 
Destructor flushes buffered data. 


  virtual ~basic_socket_streambuf();



[endsect]



[endsect]

[section:basic_stream_socket basic_stream_socket]


Provides stream-oriented socket functionality. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``>
  class basic_stream_socket :
    public basic_socket< Protocol, Executor >


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_stream_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_stream_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_read_some [*async_read_some]]]
    [Start an asynchronous read. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_receive [*async_receive]]]
    [Start an asynchronous receive. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_send [*async_send]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_write_some [*async_write_some]]]
    [Start an asynchronous write. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.basic_stream_socket [*basic_stream_socket]] [constructor]]
    [Construct a basic_stream_socket without opening it. 
     [hr]
     Construct and open a basic_stream_socket. 
     [hr]
     Construct a basic_stream_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_stream_socket on an existing native socket. 
     [hr]
     Move-construct a basic_stream_socket from another. 
     [hr]
     Move-construct a basic_stream_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_stream_socket from another. 
     [hr]
     Move-assign a basic_stream_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.read_some [*read_some]]]
    [Read some data from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.receive [*receive]]]
    [Receive some data on the socket. 
     [hr]
     Receive some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.send [*send]]]
    [Send some data on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.write_some [*write_some]]]
    [Write some data to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket._basic_stream_socket [*~basic_stream_socket]] [destructor]]
    [Destroys the socket. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_stream_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_stream_socket `basic_stream_socket`] class template provides asynchronous and blocking stream-oriented socket functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.




[heading Requirements]

['Header: ][^asio/basic_stream_socket.hpp]

['Convenience header: ][^asio.hpp]

[section:assign basic_stream_socket::assign]

[indexterm2 asio.indexterm.basic_stream_socket.assign..assign..basic_stream_socket] 
Assign an existing native socket to the socket. 


  void ``[link asio.reference.basic_stream_socket.assign.overload1 assign]``(
      const protocol_type & protocol,
      const native_handle_type & native_socket);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.assign.overload1 more...]]``

  void ``[link asio.reference.basic_stream_socket.assign.overload2 assign]``(
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.assign.overload2 more...]]``


[section:overload1 basic_stream_socket::assign (1 of 2 overloads)]


['Inherited from basic_socket.]


Assign an existing native socket to the socket. 


  void assign(
      const protocol_type & protocol,
      const native_handle_type & native_socket);



[endsect]



[section:overload2 basic_stream_socket::assign (2 of 2 overloads)]


['Inherited from basic_socket.]


Assign an existing native socket to the socket. 


  void assign(
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      asio::error_code & ec);



[endsect]


[endsect]


[section:async_connect basic_stream_socket::async_connect]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_stream_socket.async_connect..async_connect..basic_stream_socket] 
Start an asynchronous connect. 


  template<
      typename ``[link asio.reference.ConnectHandler ConnectHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_connect(
      const endpoint_type & peer_endpoint,
      ConnectHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously connect a socket to the specified remote endpoint. The function call always returns immediately.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.


[heading Parameters]
    

[variablelist
  
[[peer_endpoint][The remote endpoint to which the socket will be connected. Copies will be made of the endpoint object as required.]]

[[handler][The handler to be called when the connection operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error // Result of operation
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  


   void connect_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Connect succeeded.
     }
   }

   ...

   asio::ip::tcp::socket socket(my_context);
   asio::ip::tcp::endpoint endpoint(
       asio::ip::address::from_string("1.2.3.4"), 12345);
   socket.async_connect(endpoint, connect_handler);







[endsect]



[section:async_read_some basic_stream_socket::async_read_some]

[indexterm2 asio.indexterm.basic_stream_socket.async_read_some..async_read_some..basic_stream_socket] 
Start an asynchronous read. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_some(
      const MutableBufferSequence & buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously read data from the stream socket. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes read.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
The read operation may not read all of the requested number of bytes. Consider using the [link asio.reference.async_read `async_read`]  function if you need to ensure that the requested amount of data is read before the asynchronous operation completes.


[heading Example]
  
To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.async_read_some(asio::buffer(data, size), handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]


[section:async_receive basic_stream_socket::async_receive]

[indexterm2 asio.indexterm.basic_stream_socket.async_receive..async_receive..basic_stream_socket] 
Start an asynchronous receive. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_stream_socket.async_receive.overload1 async_receive]``(
      const MutableBufferSequence & buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.async_receive.overload1 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_stream_socket.async_receive.overload2 async_receive]``(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.async_receive.overload2 more...]]``


[section:overload1 basic_stream_socket::async_receive (1 of 2 overloads)]


Start an asynchronous receive. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_receive(
      const MutableBufferSequence & buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously receive data from the stream socket. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes received.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
The receive operation may not receive all of the requested number of bytes. Consider using the [link asio.reference.async_read `async_read`]  function if you need to ensure that the requested amount of data is received before the asynchronous operation completes.


[heading Example]
  
To receive into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.async_receive(asio::buffer(data, size), handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_stream_socket::async_receive (2 of 2 overloads)]


Start an asynchronous receive. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_receive(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously receive data from the stream socket. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[flags][Flags specifying how the receive call is to be made.]]

[[handler][The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes received.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
The receive operation may not receive all of the requested number of bytes. Consider using the [link asio.reference.async_read `async_read`]  function if you need to ensure that the requested amount of data is received before the asynchronous operation completes.


[heading Example]
  
To receive into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.async_receive(asio::buffer(data, size), 0, handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]


[endsect]

[section:async_send basic_stream_socket::async_send]

[indexterm2 asio.indexterm.basic_stream_socket.async_send..async_send..basic_stream_socket] 
Start an asynchronous send. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_stream_socket.async_send.overload1 async_send]``(
      const ConstBufferSequence & buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.async_send.overload1 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.basic_stream_socket.async_send.overload2 async_send]``(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.async_send.overload2 more...]]``


[section:overload1 basic_stream_socket::async_send (1 of 2 overloads)]


Start an asynchronous send. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_send(
      const ConstBufferSequence & buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously send data on the stream socket. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent on the socket. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the send operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes sent.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
The send operation may not transmit all of the data to the peer. Consider using the [link asio.reference.async_write `async_write`]  function if you need to ensure that all data is written before the asynchronous operation completes.


[heading Example]
  
To send a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.async_send(asio::buffer(data, size), handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_stream_socket::async_send (2 of 2 overloads)]


Start an asynchronous send. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_send(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously send data on the stream socket. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent on the socket. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[flags][Flags specifying how the send call is to be made.]]

[[handler][The handler to be called when the send operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes sent.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
The send operation may not transmit all of the data to the peer. Consider using the [link asio.reference.async_write `async_write`]  function if you need to ensure that all data is written before the asynchronous operation completes.


[heading Example]
  
To send a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.async_send(asio::buffer(data, size), 0, handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]


[endsect]


[section:async_wait basic_stream_socket::async_wait]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_stream_socket.async_wait..async_wait..basic_stream_socket] 
Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  template<
      typename ``[link asio.reference.WaitHandler WaitHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_wait(
      wait_type w,
      WaitHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to perform an asynchronous wait for a socket to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired socket state.]]

[[handler][The handler to be called when the wait operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error // Result of operation
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  


   void wait_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Wait succeeded.
     }
   }

   ...

   asio::ip::tcp::socket socket(my_context);
   ...
   socket.async_wait(asio::ip::tcp::socket::wait_read, wait_handler);







[endsect]



[section:async_write_some basic_stream_socket::async_write_some]

[indexterm2 asio.indexterm.basic_stream_socket.async_write_some..async_write_some..basic_stream_socket] 
Start an asynchronous write. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_write_some(
      const ConstBufferSequence & buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously write data to the stream socket. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be written to the socket. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes written.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
The write operation may not transmit all of the data to the peer. Consider using the [link asio.reference.async_write `async_write`]  function if you need to ensure that all data is written before the asynchronous operation completes.


[heading Example]
  
To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.async_write_some(asio::buffer(data, size), handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]


[section:at_mark basic_stream_socket::at_mark]

[indexterm2 asio.indexterm.basic_stream_socket.at_mark..at_mark..basic_stream_socket] 
Determine whether the socket is at the out-of-band data mark. 


  bool ``[link asio.reference.basic_stream_socket.at_mark.overload1 at_mark]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.at_mark.overload1 more...]]``

  bool ``[link asio.reference.basic_stream_socket.at_mark.overload2 at_mark]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.at_mark.overload2 more...]]``


[section:overload1 basic_stream_socket::at_mark (1 of 2 overloads)]


['Inherited from basic_socket.]


Determine whether the socket is at the out-of-band data mark. 


  bool at_mark() const;


This function is used to check whether the socket input is currently positioned at the out-of-band data mark.


[heading Return Value]
      
A bool indicating whether the socket is at the out-of-band data mark.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 basic_stream_socket::at_mark (2 of 2 overloads)]


['Inherited from basic_socket.]


Determine whether the socket is at the out-of-band data mark. 


  bool at_mark(
      asio::error_code & ec) const;


This function is used to check whether the socket input is currently positioned at the out-of-band data mark.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
A bool indicating whether the socket is at the out-of-band data mark. 




[endsect]


[endsect]

[section:available basic_stream_socket::available]

[indexterm2 asio.indexterm.basic_stream_socket.available..available..basic_stream_socket] 
Determine the number of bytes available for reading. 


  std::size_t ``[link asio.reference.basic_stream_socket.available.overload1 available]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.available.overload1 more...]]``

  std::size_t ``[link asio.reference.basic_stream_socket.available.overload2 available]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.available.overload2 more...]]``


[section:overload1 basic_stream_socket::available (1 of 2 overloads)]


['Inherited from basic_socket.]


Determine the number of bytes available for reading. 


  std::size_t available() const;


This function is used to determine the number of bytes that may be read without blocking.


[heading Return Value]
      
The number of bytes that may be read without blocking, or 0 if an error occurs.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 basic_stream_socket::available (2 of 2 overloads)]


['Inherited from basic_socket.]


Determine the number of bytes available for reading. 


  std::size_t available(
      asio::error_code & ec) const;


This function is used to determine the number of bytes that may be read without blocking.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes that may be read without blocking, or 0 if an error occurs. 




[endsect]


[endsect]

[section:basic_stream_socket basic_stream_socket::basic_stream_socket]

[indexterm2 asio.indexterm.basic_stream_socket.basic_stream_socket..basic_stream_socket..basic_stream_socket] 
Construct a [link asio.reference.basic_stream_socket `basic_stream_socket`] without opening it. 


  explicit ``[link asio.reference.basic_stream_socket.basic_stream_socket.overload1 basic_stream_socket]``(
      const executor_type & ex);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.basic_stream_socket.overload1 more...]]``

  template<
      typename ExecutionContext>
  explicit ``[link asio.reference.basic_stream_socket.basic_stream_socket.overload2 basic_stream_socket]``(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.basic_stream_socket.overload2 more...]]``


Construct and open a [link asio.reference.basic_stream_socket `basic_stream_socket`]. 


  ``[link asio.reference.basic_stream_socket.basic_stream_socket.overload3 basic_stream_socket]``(
      const executor_type & ex,
      const protocol_type & protocol);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.basic_stream_socket.overload3 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_stream_socket.basic_stream_socket.overload4 basic_stream_socket]``(
      ExecutionContext & context,
      const protocol_type & protocol,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.basic_stream_socket.overload4 more...]]``


Construct a [link asio.reference.basic_stream_socket `basic_stream_socket`], opening it and binding it to the given local endpoint. 


  ``[link asio.reference.basic_stream_socket.basic_stream_socket.overload5 basic_stream_socket]``(
      const executor_type & ex,
      const endpoint_type & endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.basic_stream_socket.overload5 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_stream_socket.basic_stream_socket.overload6 basic_stream_socket]``(
      ExecutionContext & context,
      const endpoint_type & endpoint,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.basic_stream_socket.overload6 more...]]``


Construct a [link asio.reference.basic_stream_socket `basic_stream_socket`] on an existing native socket. 


  ``[link asio.reference.basic_stream_socket.basic_stream_socket.overload7 basic_stream_socket]``(
      const executor_type & ex,
      const protocol_type & protocol,
      const native_handle_type & native_socket);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.basic_stream_socket.overload7 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.basic_stream_socket.basic_stream_socket.overload8 basic_stream_socket]``(
      ExecutionContext & context,
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.basic_stream_socket.overload8 more...]]``


Move-construct a [link asio.reference.basic_stream_socket `basic_stream_socket`] from another. 


  ``[link asio.reference.basic_stream_socket.basic_stream_socket.overload9 basic_stream_socket]``(
      basic_stream_socket && other);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.basic_stream_socket.overload9 more...]]``


Move-construct a [link asio.reference.basic_stream_socket `basic_stream_socket`] from a socket of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  ``[link asio.reference.basic_stream_socket.basic_stream_socket.overload10 basic_stream_socket]``(
      basic_stream_socket< Protocol1, Executor1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.basic_stream_socket.overload10 more...]]``


[section:overload1 basic_stream_socket::basic_stream_socket (1 of 10 overloads)]


Construct a [link asio.reference.basic_stream_socket `basic_stream_socket`] without opening it. 


  basic_stream_socket(
      const executor_type & ex);


This constructor creates a stream socket without opening it. The socket needs to be opened and then connected or accepted before data can be sent or received on it.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket. ]]

]




[endsect]



[section:overload2 basic_stream_socket::basic_stream_socket (2 of 10 overloads)]


Construct a [link asio.reference.basic_stream_socket `basic_stream_socket`] without opening it. 


  template<
      typename ExecutionContext>
  basic_stream_socket(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a stream socket without opening it. The socket needs to be opened and then connected or accepted before data can be sent or received on it.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket. ]]

]




[endsect]



[section:overload3 basic_stream_socket::basic_stream_socket (3 of 10 overloads)]


Construct and open a [link asio.reference.basic_stream_socket `basic_stream_socket`]. 


  basic_stream_socket(
      const executor_type & ex,
      const protocol_type & protocol);


This constructor creates and opens a stream socket. The socket needs to be connected or accepted before data can be sent or received on it.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[protocol][An object specifying protocol parameters to be used.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload4 basic_stream_socket::basic_stream_socket (4 of 10 overloads)]


Construct and open a [link asio.reference.basic_stream_socket `basic_stream_socket`]. 


  template<
      typename ExecutionContext>
  basic_stream_socket(
      ExecutionContext & context,
      const protocol_type & protocol,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates and opens a stream socket. The socket needs to be connected or accepted before data can be sent or received on it.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[protocol][An object specifying protocol parameters to be used.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload5 basic_stream_socket::basic_stream_socket (5 of 10 overloads)]


Construct a [link asio.reference.basic_stream_socket `basic_stream_socket`], opening it and binding it to the given local endpoint. 


  basic_stream_socket(
      const executor_type & ex,
      const endpoint_type & endpoint);


This constructor creates a stream socket and automatically opens it bound to the specified endpoint on the local machine. The protocol used is the protocol associated with the given endpoint.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[endpoint][An endpoint on the local machine to which the stream socket will be bound.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload6 basic_stream_socket::basic_stream_socket (6 of 10 overloads)]


Construct a [link asio.reference.basic_stream_socket `basic_stream_socket`], opening it and binding it to the given local endpoint. 


  template<
      typename ExecutionContext>
  basic_stream_socket(
      ExecutionContext & context,
      const endpoint_type & endpoint,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a stream socket and automatically opens it bound to the specified endpoint on the local machine. The protocol used is the protocol associated with the given endpoint.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[endpoint][An endpoint on the local machine to which the stream socket will be bound.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload7 basic_stream_socket::basic_stream_socket (7 of 10 overloads)]


Construct a [link asio.reference.basic_stream_socket `basic_stream_socket`] on an existing native socket. 


  basic_stream_socket(
      const executor_type & ex,
      const protocol_type & protocol,
      const native_handle_type & native_socket);


This constructor creates a stream socket object to hold an existing native socket.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[protocol][An object specifying protocol parameters to be used.]]

[[native_socket][The new underlying socket implementation.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload8 basic_stream_socket::basic_stream_socket (8 of 10 overloads)]


Construct a [link asio.reference.basic_stream_socket `basic_stream_socket`] on an existing native socket. 


  template<
      typename ExecutionContext>
  basic_stream_socket(
      ExecutionContext & context,
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a stream socket object to hold an existing native socket.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the socket will use, by default, to dispatch handlers for any asynchronous operations performed on the socket.]]

[[protocol][An object specifying protocol parameters to be used.]]

[[native_socket][The new underlying socket implementation.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload9 basic_stream_socket::basic_stream_socket (9 of 10 overloads)]


Move-construct a [link asio.reference.basic_stream_socket `basic_stream_socket`] from another. 


  basic_stream_socket(
      basic_stream_socket && other);


This constructor moves a stream socket from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_stream_socket `basic_stream_socket`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_stream_socket(const executor_type&)` constructor. 




[endsect]



[section:overload10 basic_stream_socket::basic_stream_socket (10 of 10 overloads)]


Move-construct a [link asio.reference.basic_stream_socket `basic_stream_socket`] from a socket of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  basic_stream_socket(
      basic_stream_socket< Protocol1, Executor1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value >::type *  = 0);


This constructor moves a stream socket from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_stream_socket `basic_stream_socket`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_stream_socket(const executor_type&)` constructor. 




[endsect]


[endsect]

[section:bind basic_stream_socket::bind]

[indexterm2 asio.indexterm.basic_stream_socket.bind..bind..basic_stream_socket] 
Bind the socket to the given local endpoint. 


  void ``[link asio.reference.basic_stream_socket.bind.overload1 bind]``(
      const endpoint_type & endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.bind.overload1 more...]]``

  void ``[link asio.reference.basic_stream_socket.bind.overload2 bind]``(
      const endpoint_type & endpoint,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.bind.overload2 more...]]``


[section:overload1 basic_stream_socket::bind (1 of 2 overloads)]


['Inherited from basic_socket.]


Bind the socket to the given local endpoint. 


  void bind(
      const endpoint_type & endpoint);


This function binds the socket to the specified endpoint on the local machine.


[heading Parameters]
    

[variablelist
  
[[endpoint][An endpoint on the local machine to which the socket will be bound.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   socket.open(asio::ip::tcp::v4());
   socket.bind(asio::ip::tcp::endpoint(
         asio::ip::tcp::v4(), 12345));







[endsect]



[section:overload2 basic_stream_socket::bind (2 of 2 overloads)]


['Inherited from basic_socket.]


Bind the socket to the given local endpoint. 


  void bind(
      const endpoint_type & endpoint,
      asio::error_code & ec);


This function binds the socket to the specified endpoint on the local machine.


[heading Parameters]
    

[variablelist
  
[[endpoint][An endpoint on the local machine to which the socket will be bound.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   socket.open(asio::ip::tcp::v4());
   asio::error_code ec;
   socket.bind(asio::ip::tcp::endpoint(
         asio::ip::tcp::v4(), 12345), ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:broadcast basic_stream_socket::broadcast]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_stream_socket.broadcast..broadcast..basic_stream_socket] 
Socket option to permit sending of broadcast messages. 


  typedef implementation_defined broadcast;



Implements the SOL\_SOCKET/SO\_BROADCAST socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::broadcast option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::broadcast option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_stream_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:bytes_readable basic_stream_socket::bytes_readable]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_stream_socket.bytes_readable..bytes_readable..basic_stream_socket] 
IO control command to get the amount of data that can be read without blocking. 


  typedef implementation_defined bytes_readable;



Implements the FIONREAD IO control command.


[heading Example]
  


   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();







[heading Requirements]

['Header: ][^asio/basic_stream_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:cancel basic_stream_socket::cancel]

[indexterm2 asio.indexterm.basic_stream_socket.cancel..cancel..basic_stream_socket] 
Cancel all asynchronous operations associated with the socket. 


  void ``[link asio.reference.basic_stream_socket.cancel.overload1 cancel]``();
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.cancel.overload1 more...]]``

  void ``[link asio.reference.basic_stream_socket.cancel.overload2 cancel]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.cancel.overload2 more...]]``


[section:overload1 basic_stream_socket::cancel (1 of 2 overloads)]


['Inherited from basic_socket.]


Cancel all asynchronous operations associated with the socket. 


  void cancel();


This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls to `cancel()` will always fail with `asio::error::operation_not_supported` when run on Windows XP, Windows Server 2003, and earlier versions of Windows, unless ASIO\_ENABLE\_CANCELIO is defined. However, the CancelIo function has two issues that should be considered before enabling its use:


* It will only cancel asynchronous operations that were initiated in the current thread.


* It can appear to complete without error, but the request to cancel the unfinished operations may be silently ignored by the operating system. Whether it works or not seems to depend on the drivers that are installed.

For portable cancellation, consider using one of the following alternatives:


* Disable asio's I/O completion port backend by defining ASIO\_DISABLE\_IOCP.


* Use the `close()` function to simultaneously cancel the outstanding operations and close the socket.

When running on Windows Vista, Windows Server 2008, and later, the CancelIoEx function is always used. This function does not have the problems described above. 


[endsect]



[section:overload2 basic_stream_socket::cancel (2 of 2 overloads)]


['Inherited from basic_socket.]


Cancel all asynchronous operations associated with the socket. 


  void cancel(
      asio::error_code & ec);


This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls to `cancel()` will always fail with `asio::error::operation_not_supported` when run on Windows XP, Windows Server 2003, and earlier versions of Windows, unless ASIO\_ENABLE\_CANCELIO is defined. However, the CancelIo function has two issues that should be considered before enabling its use:


* It will only cancel asynchronous operations that were initiated in the current thread.


* It can appear to complete without error, but the request to cancel the unfinished operations may be silently ignored by the operating system. Whether it works or not seems to depend on the drivers that are installed.

For portable cancellation, consider using one of the following alternatives:


* Disable asio's I/O completion port backend by defining ASIO\_DISABLE\_IOCP.


* Use the `close()` function to simultaneously cancel the outstanding operations and close the socket.

When running on Windows Vista, Windows Server 2008, and later, the CancelIoEx function is always used. This function does not have the problems described above. 


[endsect]


[endsect]

[section:close basic_stream_socket::close]

[indexterm2 asio.indexterm.basic_stream_socket.close..close..basic_stream_socket] 
Close the socket. 


  void ``[link asio.reference.basic_stream_socket.close.overload1 close]``();
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.close.overload1 more...]]``

  void ``[link asio.reference.basic_stream_socket.close.overload2 close]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.close.overload2 more...]]``


[section:overload1 basic_stream_socket::close (1 of 2 overloads)]


['Inherited from basic_socket.]


Close the socket. 


  void close();


This function is used to close the socket. Any asynchronous send, receive or connect operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed.]]

]


[heading Remarks]
      
For portable behaviour with respect to graceful closure of a connected socket, call `shutdown()` before closing the socket. 




[endsect]



[section:overload2 basic_stream_socket::close (2 of 2 overloads)]


['Inherited from basic_socket.]


Close the socket. 


  void close(
      asio::error_code & ec);


This function is used to close the socket. Any asynchronous send, receive or connect operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   socket.close(ec);
   if (ec)
   {
     // An error occurred.
   }





[heading Remarks]
      
For portable behaviour with respect to graceful closure of a connected socket, call `shutdown()` before closing the socket. 




[endsect]


[endsect]

[section:connect basic_stream_socket::connect]

[indexterm2 asio.indexterm.basic_stream_socket.connect..connect..basic_stream_socket] 
Connect the socket to the specified endpoint. 


  void ``[link asio.reference.basic_stream_socket.connect.overload1 connect]``(
      const endpoint_type & peer_endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.connect.overload1 more...]]``

  void ``[link asio.reference.basic_stream_socket.connect.overload2 connect]``(
      const endpoint_type & peer_endpoint,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.connect.overload2 more...]]``


[section:overload1 basic_stream_socket::connect (1 of 2 overloads)]


['Inherited from basic_socket.]


Connect the socket to the specified endpoint. 


  void connect(
      const endpoint_type & peer_endpoint);


This function is used to connect a socket to the specified remote endpoint. The function call will block until the connection is successfully made or an error occurs.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.


[heading Parameters]
    

[variablelist
  
[[peer_endpoint][The remote endpoint to which the socket will be connected.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   asio::ip::tcp::endpoint endpoint(
       asio::ip::address::from_string("1.2.3.4"), 12345);
   socket.connect(endpoint);







[endsect]



[section:overload2 basic_stream_socket::connect (2 of 2 overloads)]


['Inherited from basic_socket.]


Connect the socket to the specified endpoint. 


  void connect(
      const endpoint_type & peer_endpoint,
      asio::error_code & ec);


This function is used to connect a socket to the specified remote endpoint. The function call will block until the connection is successfully made or an error occurs.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.


[heading Parameters]
    

[variablelist
  
[[peer_endpoint][The remote endpoint to which the socket will be connected.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   asio::ip::tcp::endpoint endpoint(
       asio::ip::address::from_string("1.2.3.4"), 12345);
   asio::error_code ec;
   socket.connect(endpoint, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:debug basic_stream_socket::debug]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_stream_socket.debug..debug..basic_stream_socket] 
Socket option to enable socket-level debugging. 


  typedef implementation_defined debug;



Implements the SOL\_SOCKET/SO\_DEBUG socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::debug option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::debug option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_stream_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:do_not_route basic_stream_socket::do_not_route]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_stream_socket.do_not_route..do_not_route..basic_stream_socket] 
Socket option to prevent routing, use local interfaces only. 


  typedef implementation_defined do_not_route;



Implements the SOL\_SOCKET/SO\_DONTROUTE socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::do_not_route option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::do_not_route option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_stream_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:enable_connection_aborted basic_stream_socket::enable_connection_aborted]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_stream_socket.enable_connection_aborted..enable_connection_aborted..basic_stream_socket] 
Socket option to report aborted connections on accept. 


  typedef implementation_defined enable_connection_aborted;



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.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::enable_connection_aborted option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::enable_connection_aborted option;
   acceptor.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_stream_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:endpoint_type basic_stream_socket::endpoint_type]

[indexterm2 asio.indexterm.basic_stream_socket.endpoint_type..endpoint_type..basic_stream_socket] 
The endpoint type. 


  typedef Protocol::endpoint endpoint_type;



[heading Requirements]

['Header: ][^asio/basic_stream_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:executor_type basic_stream_socket::executor_type]

[indexterm2 asio.indexterm.basic_stream_socket.executor_type..executor_type..basic_stream_socket] 
The type of the executor associated with the object. 


  typedef Executor executor_type;



[heading Requirements]

['Header: ][^asio/basic_stream_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:get_executor basic_stream_socket::get_executor]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_stream_socket.get_executor..get_executor..basic_stream_socket] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_option basic_stream_socket::get_option]

[indexterm2 asio.indexterm.basic_stream_socket.get_option..get_option..basic_stream_socket] 
Get an option from the socket. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void ``[link asio.reference.basic_stream_socket.get_option.overload1 get_option]``(
      GettableSocketOption & option) const;
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.get_option.overload1 more...]]``

  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void ``[link asio.reference.basic_stream_socket.get_option.overload2 get_option]``(
      GettableSocketOption & option,
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.get_option.overload2 more...]]``


[section:overload1 basic_stream_socket::get_option (1 of 2 overloads)]


['Inherited from basic_socket.]


Get an option from the socket. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void get_option(
      GettableSocketOption & option) const;


This function is used to get the current value of an option on the socket.


[heading Parameters]
    

[variablelist
  
[[option][The option value to be obtained from the socket.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]



[heading Example]
  
Getting the value of the SOL\_SOCKET/SO\_KEEPALIVE option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::socket::keep_alive option;
   socket.get_option(option);
   bool is_set = option.value();







[endsect]



[section:overload2 basic_stream_socket::get_option (2 of 2 overloads)]


['Inherited from basic_socket.]


Get an option from the socket. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  void get_option(
      GettableSocketOption & option,
      asio::error_code & ec) const;


This function is used to get the current value of an option on the socket.


[heading Parameters]
    

[variablelist
  
[[option][The option value to be obtained from the socket.]]

[[ec][Set to indicate what error occurred, if any.]]

]



[heading Example]
  
Getting the value of the SOL\_SOCKET/SO\_KEEPALIVE option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::socket::keep_alive option;
   asio::error_code ec;
   socket.get_option(option, ec);
   if (ec)
   {
     // An error occurred.
   }
   bool is_set = option.value();







[endsect]


[endsect]

[section:io_control basic_stream_socket::io_control]

[indexterm2 asio.indexterm.basic_stream_socket.io_control..io_control..basic_stream_socket] 
Perform an IO control command on the socket. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void ``[link asio.reference.basic_stream_socket.io_control.overload1 io_control]``(
      IoControlCommand & command);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.io_control.overload1 more...]]``

  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void ``[link asio.reference.basic_stream_socket.io_control.overload2 io_control]``(
      IoControlCommand & command,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.io_control.overload2 more...]]``


[section:overload1 basic_stream_socket::io_control (1 of 2 overloads)]


['Inherited from basic_socket.]


Perform an IO control command on the socket. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void io_control(
      IoControlCommand & command);


This function is used to execute an IO control command on the socket.


[heading Parameters]
    

[variablelist
  
[[command][The IO control command to be performed on the socket.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]



[heading Example]
  
Getting the number of bytes ready to read: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::socket::bytes_readable command;
   socket.io_control(command);
   std::size_t bytes_readable = command.get();







[endsect]



[section:overload2 basic_stream_socket::io_control (2 of 2 overloads)]


['Inherited from basic_socket.]


Perform an IO control command on the socket. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void io_control(
      IoControlCommand & command,
      asio::error_code & ec);


This function is used to execute an IO control command on the socket.


[heading Parameters]
    

[variablelist
  
[[command][The IO control command to be performed on the socket.]]

[[ec][Set to indicate what error occurred, if any.]]

]



[heading Example]
  
Getting the number of bytes ready to read: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::socket::bytes_readable command;
   asio::error_code ec;
   socket.io_control(command, ec);
   if (ec)
   {
     // An error occurred.
   }
   std::size_t bytes_readable = command.get();







[endsect]


[endsect]


[section:is_open basic_stream_socket::is_open]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_stream_socket.is_open..is_open..basic_stream_socket] 
Determine whether the socket is open. 


  bool is_open() const;



[endsect]



[section:keep_alive basic_stream_socket::keep_alive]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_stream_socket.keep_alive..keep_alive..basic_stream_socket] 
Socket option to send keep-alives. 


  typedef implementation_defined keep_alive;



Implements the SOL\_SOCKET/SO\_KEEPALIVE socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::keep_alive option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::keep_alive option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_stream_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:linger basic_stream_socket::linger]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_stream_socket.linger..linger..basic_stream_socket] 
Socket option to specify whether the socket lingers on close if unsent data is present. 


  typedef implementation_defined linger;



Implements the SOL\_SOCKET/SO\_LINGER socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::linger option(true, 30);
   socket.set_option(option);





Getting the current option value: 

   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();







[heading Requirements]

['Header: ][^asio/basic_stream_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:local_endpoint basic_stream_socket::local_endpoint]

[indexterm2 asio.indexterm.basic_stream_socket.local_endpoint..local_endpoint..basic_stream_socket] 
Get the local endpoint of the socket. 


  endpoint_type ``[link asio.reference.basic_stream_socket.local_endpoint.overload1 local_endpoint]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.local_endpoint.overload1 more...]]``

  endpoint_type ``[link asio.reference.basic_stream_socket.local_endpoint.overload2 local_endpoint]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.local_endpoint.overload2 more...]]``


[section:overload1 basic_stream_socket::local_endpoint (1 of 2 overloads)]


['Inherited from basic_socket.]


Get the local endpoint of the socket. 


  endpoint_type local_endpoint() const;


This function is used to obtain the locally bound endpoint of the socket.


[heading Return Value]
      
An object that represents the local endpoint of the socket.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::endpoint endpoint = socket.local_endpoint();







[endsect]



[section:overload2 basic_stream_socket::local_endpoint (2 of 2 overloads)]


['Inherited from basic_socket.]


Get the local endpoint of the socket. 


  endpoint_type local_endpoint(
      asio::error_code & ec) const;


This function is used to obtain the locally bound endpoint of the socket.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
An object that represents the local endpoint of the socket. Returns a default-constructed endpoint object if an error occurred.


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   asio::ip::tcp::endpoint endpoint = socket.local_endpoint(ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]

[section:lowest_layer basic_stream_socket::lowest_layer]

[indexterm2 asio.indexterm.basic_stream_socket.lowest_layer..lowest_layer..basic_stream_socket] 
Get a reference to the lowest layer. 


  lowest_layer_type & ``[link asio.reference.basic_stream_socket.lowest_layer.overload1 lowest_layer]``();
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.lowest_layer.overload1 more...]]``


Get a const reference to the lowest layer. 


  const lowest_layer_type & ``[link asio.reference.basic_stream_socket.lowest_layer.overload2 lowest_layer]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.lowest_layer.overload2 more...]]``


[section:overload1 basic_stream_socket::lowest_layer (1 of 2 overloads)]


['Inherited from basic_socket.]


Get a reference to the lowest layer. 


  lowest_layer_type & lowest_layer();


This function returns a reference to the lowest layer in a stack of layers. Since a [link asio.reference.basic_socket `basic_socket`] cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]



[section:overload2 basic_stream_socket::lowest_layer (2 of 2 overloads)]


['Inherited from basic_socket.]


Get a const reference to the lowest layer. 


  const lowest_layer_type & lowest_layer() const;


This function returns a const reference to the lowest layer in a stack of layers. Since a [link asio.reference.basic_socket `basic_socket`] cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]


[endsect]


[section:lowest_layer_type basic_stream_socket::lowest_layer_type]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_stream_socket.lowest_layer_type..lowest_layer_type..basic_stream_socket] 
A [link asio.reference.basic_socket `basic_socket`] is always the lowest layer. 


  typedef basic_socket< Protocol, Executor > lowest_layer_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_socket.basic_socket [*basic_socket]] [constructor]]
    [Construct a basic_socket without opening it. 
     [hr]
     Construct and open a basic_socket. 
     [hr]
     Construct a basic_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_socket on an existing native socket. 
     [hr]
     Move-construct a basic_socket from another. 
     [hr]
     Move-construct a basic_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_socket from another. 
     [hr]
     Move-assign a basic_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket._basic_socket [*~basic_socket]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_socket `basic_socket`] class template provides functionality that is common to both stream-oriented and datagram-oriented sockets.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/basic_stream_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:max_connections basic_stream_socket::max_connections]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_stream_socket.max_connections..max_connections..basic_stream_socket] 
(Deprecated: Use max\_listen\_connections.) The maximum length of the queue of pending incoming connections. 


  static const int max_connections = implementation_defined;



[endsect]



[section:max_listen_connections basic_stream_socket::max_listen_connections]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_stream_socket.max_listen_connections..max_listen_connections..basic_stream_socket] 
The maximum length of the queue of pending incoming connections. 


  static const int max_listen_connections = implementation_defined;



[endsect]



[section:message_do_not_route basic_stream_socket::message_do_not_route]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_stream_socket.message_do_not_route..message_do_not_route..basic_stream_socket] 
Specify that the data should not be subject to routing. 


  static const int message_do_not_route = implementation_defined;



[endsect]



[section:message_end_of_record basic_stream_socket::message_end_of_record]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_stream_socket.message_end_of_record..message_end_of_record..basic_stream_socket] 
Specifies that the data marks the end of a record. 


  static const int message_end_of_record = implementation_defined;



[endsect]



[section:message_flags basic_stream_socket::message_flags]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_stream_socket.message_flags..message_flags..basic_stream_socket] 
Bitmask type for flags that can be passed to send and receive operations. 


  typedef int message_flags;



[heading Requirements]

['Header: ][^asio/basic_stream_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:message_out_of_band basic_stream_socket::message_out_of_band]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_stream_socket.message_out_of_band..message_out_of_band..basic_stream_socket] 
Process out-of-band data. 


  static const int message_out_of_band = implementation_defined;



[endsect]



[section:message_peek basic_stream_socket::message_peek]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_stream_socket.message_peek..message_peek..basic_stream_socket] 
Peek at incoming data without removing it from the input queue. 


  static const int message_peek = implementation_defined;



[endsect]



[section:native_handle basic_stream_socket::native_handle]


['Inherited from basic_socket.]

[indexterm2 asio.indexterm.basic_stream_socket.native_handle..native_handle..basic_stream_socket] 
Get the native socket representation. 


  native_handle_type native_handle();


This function may be used to obtain the underlying representation of the socket. This is intended to allow access to native socket functionality that is not otherwise provided. 


[endsect]



[section:native_handle_type basic_stream_socket::native_handle_type]

[indexterm2 asio.indexterm.basic_stream_socket.native_handle_type..native_handle_type..basic_stream_socket] 
The native representation of a socket. 


  typedef implementation_defined native_handle_type;



[heading Requirements]

['Header: ][^asio/basic_stream_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:native_non_blocking basic_stream_socket::native_non_blocking]

[indexterm2 asio.indexterm.basic_stream_socket.native_non_blocking..native_non_blocking..basic_stream_socket] 
Gets the non-blocking mode of the native socket implementation. 


  bool ``[link asio.reference.basic_stream_socket.native_non_blocking.overload1 native_non_blocking]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.native_non_blocking.overload1 more...]]``


Sets the non-blocking mode of the native socket implementation. 


  void ``[link asio.reference.basic_stream_socket.native_non_blocking.overload2 native_non_blocking]``(
      bool mode);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.native_non_blocking.overload2 more...]]``

  void ``[link asio.reference.basic_stream_socket.native_non_blocking.overload3 native_non_blocking]``(
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.native_non_blocking.overload3 more...]]``


[section:overload1 basic_stream_socket::native_non_blocking (1 of 3 overloads)]


['Inherited from basic_socket.]


Gets the non-blocking mode of the native socket implementation. 


  bool native_non_blocking() const;


This function is used to retrieve the non-blocking mode of the underlying native socket. This mode has no effect on the behaviour of the socket object's synchronous operations.


[heading Return Value]
      
`true` if the underlying socket is in non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).


[heading Remarks]
      
The current non-blocking mode is cached by the socket object. Consequently, the return value may be incorrect if the non-blocking mode was set directly on the native socket.


[heading Example]
  
This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's `sendfile` system call might be encapsulated: 

   template <typename Handler>
   struct sendfile_op
   {
     tcp::socket& sock_;
     int fd_;
     Handler handler_;
     off_t offset_;
     std::size_t total_bytes_transferred_;

     // Function call operator meeting WriteHandler requirements.
     // Used as the handler for the async_write_some operation.
     void operator()(asio::error_code ec, std::size_t)
     {
       // Put the underlying socket into non-blocking mode.
       if (!ec)
         if (!sock_.native_non_blocking())
           sock_.native_non_blocking(true, ec);

       if (!ec)
       {
         for (;;)
         {
           // Try the system call.
           errno = 0;
           int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
           ec = asio::error_code(n < 0 ? errno : 0,
               asio::error::get_system_category());
           total_bytes_transferred_ += ec ? 0 : n;

           // Retry operation immediately if interrupted by signal.
           if (ec == asio::error::interrupted)
             continue;

           // Check if we need to run the operation again.
           if (ec == asio::error::would_block
               || ec == asio::error::try_again)
           {
             // We have to wait for the socket to become ready again.
             sock_.async_wait(tcp::socket::wait_write, *this);
             return;
           }

           if (ec || n == 0)
           {
             // An error occurred, or we have reached the end of the file.
             // Either way we must exit the loop so we can call the handler.
             break;
           }

           // Loop around to try calling sendfile again.
         }
       }

       // Pass result back to user's handler.
       handler_(ec, total_bytes_transferred_);
     }
   };

   template <typename Handler>
   void async_sendfile(tcp::socket& sock, int fd, Handler h)
   {
     sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
     sock.async_wait(tcp::socket::wait_write, op);
   } 







[endsect]



[section:overload2 basic_stream_socket::native_non_blocking (2 of 3 overloads)]


['Inherited from basic_socket.]


Sets the non-blocking mode of the native socket implementation. 


  void native_non_blocking(
      bool mode);


This function is used to modify the non-blocking mode of the underlying native socket. It has no effect on the behaviour of the socket object's synchronous operations.


[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the underlying socket is put into non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. If the `mode` is `false`, but the current value of `non_blocking()` is `true`, this function fails with `asio::error::invalid_argument`, as the combination does not make sense.]]

]


[heading Example]
  
This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's `sendfile` system call might be encapsulated: 

   template <typename Handler>
   struct sendfile_op
   {
     tcp::socket& sock_;
     int fd_;
     Handler handler_;
     off_t offset_;
     std::size_t total_bytes_transferred_;

     // Function call operator meeting WriteHandler requirements.
     // Used as the handler for the async_write_some operation.
     void operator()(asio::error_code ec, std::size_t)
     {
       // Put the underlying socket into non-blocking mode.
       if (!ec)
         if (!sock_.native_non_blocking())
           sock_.native_non_blocking(true, ec);

       if (!ec)
       {
         for (;;)
         {
           // Try the system call.
           errno = 0;
           int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
           ec = asio::error_code(n < 0 ? errno : 0,
               asio::error::get_system_category());
           total_bytes_transferred_ += ec ? 0 : n;

           // Retry operation immediately if interrupted by signal.
           if (ec == asio::error::interrupted)
             continue;

           // Check if we need to run the operation again.
           if (ec == asio::error::would_block
               || ec == asio::error::try_again)
           {
             // We have to wait for the socket to become ready again.
             sock_.async_wait(tcp::socket::wait_write, *this);
             return;
           }

           if (ec || n == 0)
           {
             // An error occurred, or we have reached the end of the file.
             // Either way we must exit the loop so we can call the handler.
             break;
           }

           // Loop around to try calling sendfile again.
         }
       }

       // Pass result back to user's handler.
       handler_(ec, total_bytes_transferred_);
     }
   };

   template <typename Handler>
   void async_sendfile(tcp::socket& sock, int fd, Handler h)
   {
     sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
     sock.async_wait(tcp::socket::wait_write, op);
   } 







[endsect]



[section:overload3 basic_stream_socket::native_non_blocking (3 of 3 overloads)]


['Inherited from basic_socket.]


Sets the non-blocking mode of the native socket implementation. 


  void native_non_blocking(
      bool mode,
      asio::error_code & ec);


This function is used to modify the non-blocking mode of the underlying native socket. It has no effect on the behaviour of the socket object's synchronous operations.


[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the underlying socket is put into non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).]]

[[ec][Set to indicate what error occurred, if any. If the `mode` is `false`, but the current value of `non_blocking()` is `true`, this function fails with `asio::error::invalid_argument`, as the combination does not make sense.]]

]


[heading Example]
  
This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's `sendfile` system call might be encapsulated: 

   template <typename Handler>
   struct sendfile_op
   {
     tcp::socket& sock_;
     int fd_;
     Handler handler_;
     off_t offset_;
     std::size_t total_bytes_transferred_;

     // Function call operator meeting WriteHandler requirements.
     // Used as the handler for the async_write_some operation.
     void operator()(asio::error_code ec, std::size_t)
     {
       // Put the underlying socket into non-blocking mode.
       if (!ec)
         if (!sock_.native_non_blocking())
           sock_.native_non_blocking(true, ec);

       if (!ec)
       {
         for (;;)
         {
           // Try the system call.
           errno = 0;
           int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
           ec = asio::error_code(n < 0 ? errno : 0,
               asio::error::get_system_category());
           total_bytes_transferred_ += ec ? 0 : n;

           // Retry operation immediately if interrupted by signal.
           if (ec == asio::error::interrupted)
             continue;

           // Check if we need to run the operation again.
           if (ec == asio::error::would_block
               || ec == asio::error::try_again)
           {
             // We have to wait for the socket to become ready again.
             sock_.async_wait(tcp::socket::wait_write, *this);
             return;
           }

           if (ec || n == 0)
           {
             // An error occurred, or we have reached the end of the file.
             // Either way we must exit the loop so we can call the handler.
             break;
           }

           // Loop around to try calling sendfile again.
         }
       }

       // Pass result back to user's handler.
       handler_(ec, total_bytes_transferred_);
     }
   };

   template <typename Handler>
   void async_sendfile(tcp::socket& sock, int fd, Handler h)
   {
     sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
     sock.async_wait(tcp::socket::wait_write, op);
   } 







[endsect]


[endsect]

[section:non_blocking basic_stream_socket::non_blocking]

[indexterm2 asio.indexterm.basic_stream_socket.non_blocking..non_blocking..basic_stream_socket] 
Gets the non-blocking mode of the socket. 


  bool ``[link asio.reference.basic_stream_socket.non_blocking.overload1 non_blocking]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.non_blocking.overload1 more...]]``


Sets the non-blocking mode of the socket. 


  void ``[link asio.reference.basic_stream_socket.non_blocking.overload2 non_blocking]``(
      bool mode);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.non_blocking.overload2 more...]]``

  void ``[link asio.reference.basic_stream_socket.non_blocking.overload3 non_blocking]``(
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.non_blocking.overload3 more...]]``


[section:overload1 basic_stream_socket::non_blocking (1 of 3 overloads)]


['Inherited from basic_socket.]


Gets the non-blocking mode of the socket. 


  bool non_blocking() const;



[heading Return Value]
      
`true` if the socket's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]



[section:overload2 basic_stream_socket::non_blocking (2 of 3 overloads)]


['Inherited from basic_socket.]


Sets the non-blocking mode of the socket. 


  void non_blocking(
      bool mode);



[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the socket's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]



[section:overload3 basic_stream_socket::non_blocking (3 of 3 overloads)]


['Inherited from basic_socket.]


Sets the non-blocking mode of the socket. 


  void non_blocking(
      bool mode,
      asio::error_code & ec);



[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the socket's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]


[endsect]

[section:open basic_stream_socket::open]

[indexterm2 asio.indexterm.basic_stream_socket.open..open..basic_stream_socket] 
Open the socket using the specified protocol. 


  void ``[link asio.reference.basic_stream_socket.open.overload1 open]``(
      const protocol_type & protocol = protocol_type());
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.open.overload1 more...]]``

  void ``[link asio.reference.basic_stream_socket.open.overload2 open]``(
      const protocol_type & protocol,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.open.overload2 more...]]``


[section:overload1 basic_stream_socket::open (1 of 2 overloads)]


['Inherited from basic_socket.]


Open the socket using the specified protocol. 


  void open(
      const protocol_type & protocol = protocol_type());


This function opens the socket so that it will use the specified protocol.


[heading Parameters]
    

[variablelist
  
[[protocol][An object specifying protocol parameters to be used.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   socket.open(asio::ip::tcp::v4());







[endsect]



[section:overload2 basic_stream_socket::open (2 of 2 overloads)]


['Inherited from basic_socket.]


Open the socket using the specified protocol. 


  void open(
      const protocol_type & protocol,
      asio::error_code & ec);


This function opens the socket so that it will use the specified protocol.


[heading Parameters]
    

[variablelist
  
[[protocol][An object specifying which protocol is to be used.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   asio::error_code ec;
   socket.open(asio::ip::tcp::v4(), ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]

[section:operator_eq_ basic_stream_socket::operator=]

[indexterm2 asio.indexterm.basic_stream_socket.operator_eq_..operator=..basic_stream_socket] 
Move-assign a [link asio.reference.basic_stream_socket `basic_stream_socket`] from another. 


  basic_stream_socket & ``[link asio.reference.basic_stream_socket.operator_eq_.overload1 operator=]``(
      basic_stream_socket && other);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.operator_eq_.overload1 more...]]``


Move-assign a [link asio.reference.basic_stream_socket `basic_stream_socket`] from a socket of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value, basic_stream_socket & >::type ``[link asio.reference.basic_stream_socket.operator_eq_.overload2 operator=]``(
      basic_stream_socket< Protocol1, Executor1 > && other);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.operator_eq_.overload2 more...]]``


[section:overload1 basic_stream_socket::operator= (1 of 2 overloads)]


Move-assign a [link asio.reference.basic_stream_socket `basic_stream_socket`] from another. 


  basic_stream_socket & operator=(
      basic_stream_socket && other);


This assignment operator moves a stream socket from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_stream_socket `basic_stream_socket`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_stream_socket(const executor_type&)` constructor. 




[endsect]



[section:overload2 basic_stream_socket::operator= (2 of 2 overloads)]


Move-assign a [link asio.reference.basic_stream_socket `basic_stream_socket`] from a socket of another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.Executor1 Executor1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value &&is_convertible< Executor1, Executor >::value, basic_stream_socket & >::type operator=(
      basic_stream_socket< Protocol1, Executor1 > && other);


This assignment operator moves a stream socket from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_stream_socket `basic_stream_socket`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_stream_socket(const executor_type&)` constructor. 




[endsect]


[endsect]


[section:out_of_band_inline basic_stream_socket::out_of_band_inline]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_stream_socket.out_of_band_inline..out_of_band_inline..basic_stream_socket] 
Socket option for putting received out-of-band data inline. 


  typedef implementation_defined out_of_band_inline;



Implements the SOL\_SOCKET/SO\_OOBINLINE socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::out_of_band_inline option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::out_of_band_inline option;
   socket.get_option(option);
   bool value = option.value();







[heading Requirements]

['Header: ][^asio/basic_stream_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:protocol_type basic_stream_socket::protocol_type]

[indexterm2 asio.indexterm.basic_stream_socket.protocol_type..protocol_type..basic_stream_socket] 
The protocol type. 


  typedef Protocol protocol_type;



[heading Requirements]

['Header: ][^asio/basic_stream_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:read_some basic_stream_socket::read_some]

[indexterm2 asio.indexterm.basic_stream_socket.read_some..read_some..basic_stream_socket] 
Read some data from the socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.basic_stream_socket.read_some.overload1 read_some]``(
      const MutableBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.read_some.overload1 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.basic_stream_socket.read_some.overload2 read_some]``(
      const MutableBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.read_some.overload2 more...]]``


[section:overload1 basic_stream_socket::read_some (1 of 2 overloads)]


Read some data from the socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_some(
      const MutableBufferSequence & buffers);


This function is used to read data from the stream socket. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be read.]]

]


[heading Return Value]
      
The number of bytes read.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]

]


[heading Remarks]
      
The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes.


[heading Example]
  
To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.read_some(asio::buffer(data, size));


See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_stream_socket::read_some (2 of 2 overloads)]


Read some data from the socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_some(
      const MutableBufferSequence & buffers,
      asio::error_code & ec);


This function is used to read data from the stream socket. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be read.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes read. Returns 0 if an error occurred.


[heading Remarks]
      
The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes. 




[endsect]


[endsect]

[section:receive basic_stream_socket::receive]

[indexterm2 asio.indexterm.basic_stream_socket.receive..receive..basic_stream_socket] 
Receive some data on the socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.basic_stream_socket.receive.overload1 receive]``(
      const MutableBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.receive.overload1 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.basic_stream_socket.receive.overload2 receive]``(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.receive.overload2 more...]]``


Receive some data on a connected socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.basic_stream_socket.receive.overload3 receive]``(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.receive.overload3 more...]]``


[section:overload1 basic_stream_socket::receive (1 of 3 overloads)]


Receive some data on the socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive(
      const MutableBufferSequence & buffers);


This function is used to receive data on the stream socket. The function call will block until one or more bytes of data has been received successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received.]]

]


[heading Return Value]
      
The number of bytes received.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]

]


[heading Remarks]
      
The receive operation may not receive all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes.


[heading Example]
  
To receive into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.receive(asio::buffer(data, size));


See the [link asio.reference.buffer `buffer`]  documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_stream_socket::receive (2 of 3 overloads)]


Receive some data on the socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags);


This function is used to receive data on the stream socket. The function call will block until one or more bytes of data has been received successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received.]]

[[flags][Flags specifying how the receive call is to be made.]]

]


[heading Return Value]
      
The number of bytes received.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]

]


[heading Remarks]
      
The receive operation may not receive all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes.


[heading Example]
  
To receive into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.receive(asio::buffer(data, size), 0);


See the [link asio.reference.buffer `buffer`]  documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload3 basic_stream_socket::receive (3 of 3 overloads)]


Receive some data on a connected socket. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      asio::error_code & ec);


This function is used to receive data on the stream socket. The function call will block until one or more bytes of data has been received successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be received.]]

[[flags][Flags specifying how the receive call is to be made.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes received. Returns 0 if an error occurred.


[heading Remarks]
      
The receive operation may not receive all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes. 




[endsect]


[endsect]


[section:receive_buffer_size basic_stream_socket::receive_buffer_size]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_stream_socket.receive_buffer_size..receive_buffer_size..basic_stream_socket] 
Socket option for the receive buffer size of a socket. 


  typedef implementation_defined receive_buffer_size;



Implements the SOL\_SOCKET/SO\_RCVBUF socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_buffer_size option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_stream_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:receive_low_watermark basic_stream_socket::receive_low_watermark]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_stream_socket.receive_low_watermark..receive_low_watermark..basic_stream_socket] 
Socket option for the receive low watermark. 


  typedef implementation_defined receive_low_watermark;



Implements the SOL\_SOCKET/SO\_RCVLOWAT socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_low_watermark option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_stream_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:release basic_stream_socket::release]

[indexterm2 asio.indexterm.basic_stream_socket.release..release..basic_stream_socket] 
Release ownership of the underlying native socket. 


  native_handle_type ``[link asio.reference.basic_stream_socket.release.overload1 release]``();
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.release.overload1 more...]]``

  native_handle_type ``[link asio.reference.basic_stream_socket.release.overload2 release]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.release.overload2 more...]]``


[section:overload1 basic_stream_socket::release (1 of 2 overloads)]


['Inherited from basic_socket.]


Release ownership of the underlying native socket. 


  native_handle_type release();


This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error. Ownership of the native socket is then transferred to the caller.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
This function is unsupported on Windows versions prior to Windows 8.1, and will fail with `asio::error::operation_not_supported` on these platforms. 




[endsect]



[section:overload2 basic_stream_socket::release (2 of 2 overloads)]


['Inherited from basic_socket.]


Release ownership of the underlying native socket. 


  native_handle_type release(
      asio::error_code & ec);


This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error. Ownership of the native socket is then transferred to the caller.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
This function is unsupported on Windows versions prior to Windows 8.1, and will fail with `asio::error::operation_not_supported` on these platforms. 




[endsect]


[endsect]

[section:remote_endpoint basic_stream_socket::remote_endpoint]

[indexterm2 asio.indexterm.basic_stream_socket.remote_endpoint..remote_endpoint..basic_stream_socket] 
Get the remote endpoint of the socket. 


  endpoint_type ``[link asio.reference.basic_stream_socket.remote_endpoint.overload1 remote_endpoint]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.remote_endpoint.overload1 more...]]``

  endpoint_type ``[link asio.reference.basic_stream_socket.remote_endpoint.overload2 remote_endpoint]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.remote_endpoint.overload2 more...]]``


[section:overload1 basic_stream_socket::remote_endpoint (1 of 2 overloads)]


['Inherited from basic_socket.]


Get the remote endpoint of the socket. 


  endpoint_type remote_endpoint() const;


This function is used to obtain the remote endpoint of the socket.


[heading Return Value]
      
An object that represents the remote endpoint of the socket.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::endpoint endpoint = socket.remote_endpoint();







[endsect]



[section:overload2 basic_stream_socket::remote_endpoint (2 of 2 overloads)]


['Inherited from basic_socket.]


Get the remote endpoint of the socket. 


  endpoint_type remote_endpoint(
      asio::error_code & ec) const;


This function is used to obtain the remote endpoint of the socket.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
An object that represents the remote endpoint of the socket. Returns a default-constructed endpoint object if an error occurred.


[heading Example]
  


   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   asio::ip::tcp::endpoint endpoint = socket.remote_endpoint(ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:reuse_address basic_stream_socket::reuse_address]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_stream_socket.reuse_address..reuse_address..basic_stream_socket] 
Socket option to allow the socket to be bound to an address that is already in use. 


  typedef implementation_defined reuse_address;



Implements the SOL\_SOCKET/SO\_REUSEADDR socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::reuse_address option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::reuse_address option;
   acceptor.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/basic_stream_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:send basic_stream_socket::send]

[indexterm2 asio.indexterm.basic_stream_socket.send..send..basic_stream_socket] 
Send some data on the socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.basic_stream_socket.send.overload1 send]``(
      const ConstBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.send.overload1 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.basic_stream_socket.send.overload2 send]``(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.send.overload2 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.basic_stream_socket.send.overload3 send]``(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.send.overload3 more...]]``


[section:overload1 basic_stream_socket::send (1 of 3 overloads)]


Send some data on the socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send(
      const ConstBufferSequence & buffers);


This function is used to send data on the stream socket. The function call will block until one or more bytes of the data has been sent successfully, or an until error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent on the socket.]]

]


[heading Return Value]
      
The number of bytes sent.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
The send operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes.


[heading Example]
  
To send a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.send(asio::buffer(data, size));


See the [link asio.reference.buffer `buffer`]  documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_stream_socket::send (2 of 3 overloads)]


Send some data on the socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags);


This function is used to send data on the stream socket. The function call will block until one or more bytes of the data has been sent successfully, or an until error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent on the socket.]]

[[flags][Flags specifying how the send call is to be made.]]

]


[heading Return Value]
      
The number of bytes sent.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
The send operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes.


[heading Example]
  
To send a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.send(asio::buffer(data, size), 0);


See the [link asio.reference.buffer `buffer`]  documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload3 basic_stream_socket::send (3 of 3 overloads)]


Send some data on the socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      asio::error_code & ec);


This function is used to send data on the stream socket. The function call will block until one or more bytes of the data has been sent successfully, or an until error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be sent on the socket.]]

[[flags][Flags specifying how the send call is to be made.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes sent. Returns 0 if an error occurred.


[heading Remarks]
      
The send operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes. 




[endsect]


[endsect]


[section:send_buffer_size basic_stream_socket::send_buffer_size]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_stream_socket.send_buffer_size..send_buffer_size..basic_stream_socket] 
Socket option for the send buffer size of a socket. 


  typedef implementation_defined send_buffer_size;



Implements the SOL\_SOCKET/SO\_SNDBUF socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_buffer_size option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_stream_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:send_low_watermark basic_stream_socket::send_low_watermark]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_stream_socket.send_low_watermark..send_low_watermark..basic_stream_socket] 
Socket option for the send low watermark. 


  typedef implementation_defined send_low_watermark;



Implements the SOL\_SOCKET/SO\_SNDLOWAT socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_low_watermark option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/basic_stream_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:set_option basic_stream_socket::set_option]

[indexterm2 asio.indexterm.basic_stream_socket.set_option..set_option..basic_stream_socket] 
Set an option on the socket. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void ``[link asio.reference.basic_stream_socket.set_option.overload1 set_option]``(
      const SettableSocketOption & option);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.set_option.overload1 more...]]``

  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void ``[link asio.reference.basic_stream_socket.set_option.overload2 set_option]``(
      const SettableSocketOption & option,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.set_option.overload2 more...]]``


[section:overload1 basic_stream_socket::set_option (1 of 2 overloads)]


['Inherited from basic_socket.]


Set an option on the socket. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void set_option(
      const SettableSocketOption & option);


This function is used to set an option on the socket.


[heading Parameters]
    

[variablelist
  
[[option][The new option value to be set on the socket.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]



[heading Example]
  
Setting the IPPROTO\_TCP/TCP\_NODELAY option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::no_delay option(true);
   socket.set_option(option);







[endsect]



[section:overload2 basic_stream_socket::set_option (2 of 2 overloads)]


['Inherited from basic_socket.]


Set an option on the socket. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  void set_option(
      const SettableSocketOption & option,
      asio::error_code & ec);


This function is used to set an option on the socket.


[heading Parameters]
    

[variablelist
  
[[option][The new option value to be set on the socket.]]

[[ec][Set to indicate what error occurred, if any.]]

]



[heading Example]
  
Setting the IPPROTO\_TCP/TCP\_NODELAY option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::no_delay option(true);
   asio::error_code ec;
   socket.set_option(option, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]

[section:shutdown basic_stream_socket::shutdown]

[indexterm2 asio.indexterm.basic_stream_socket.shutdown..shutdown..basic_stream_socket] 
Disable sends or receives on the socket. 


  void ``[link asio.reference.basic_stream_socket.shutdown.overload1 shutdown]``(
      shutdown_type what);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.shutdown.overload1 more...]]``

  void ``[link asio.reference.basic_stream_socket.shutdown.overload2 shutdown]``(
      shutdown_type what,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.shutdown.overload2 more...]]``


[section:overload1 basic_stream_socket::shutdown (1 of 2 overloads)]


['Inherited from basic_socket.]


Disable sends or receives on the socket. 


  void shutdown(
      shutdown_type what);


This function is used to disable send operations, receive operations, or both.


[heading Parameters]
    

[variablelist
  
[[what][Determines what types of operation will no longer be allowed.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  
Shutting down the send side of the socket: 

   asio::ip::tcp::socket socket(my_context);
   ...
   socket.shutdown(asio::ip::tcp::socket::shutdown_send);







[endsect]



[section:overload2 basic_stream_socket::shutdown (2 of 2 overloads)]


['Inherited from basic_socket.]


Disable sends or receives on the socket. 


  void shutdown(
      shutdown_type what,
      asio::error_code & ec);


This function is used to disable send operations, receive operations, or both.


[heading Parameters]
    

[variablelist
  
[[what][Determines what types of operation will no longer be allowed.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  
Shutting down the send side of the socket: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   socket.shutdown(asio::ip::tcp::socket::shutdown_send, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:shutdown_type basic_stream_socket::shutdown_type]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_stream_socket.shutdown_type..shutdown_type..basic_stream_socket] 
Different ways a socket may be shutdown. 


  enum shutdown_type

[indexterm2 asio.indexterm.basic_stream_socket.shutdown_type.shutdown_receive..shutdown_receive..basic_stream_socket]
[indexterm2 asio.indexterm.basic_stream_socket.shutdown_type.shutdown_send..shutdown_send..basic_stream_socket]
[indexterm2 asio.indexterm.basic_stream_socket.shutdown_type.shutdown_both..shutdown_both..basic_stream_socket]

[heading Values]
[variablelist

  [
    [shutdown_receive]
    [Shutdown the receive side of the socket. ]
  ]

  [
    [shutdown_send]
    [Shutdown the send side of the socket. ]
  ]

  [
    [shutdown_both]
    [Shutdown both send and receive on the socket. ]
  ]

]



[endsect]


[section:wait basic_stream_socket::wait]

[indexterm2 asio.indexterm.basic_stream_socket.wait..wait..basic_stream_socket] 
Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  void ``[link asio.reference.basic_stream_socket.wait.overload1 wait]``(
      wait_type w);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.wait.overload1 more...]]``

  void ``[link asio.reference.basic_stream_socket.wait.overload2 wait]``(
      wait_type w,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.wait.overload2 more...]]``


[section:overload1 basic_stream_socket::wait (1 of 2 overloads)]


['Inherited from basic_socket.]


Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  void wait(
      wait_type w);


This function is used to perform a blocking wait for a socket to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired socket state.]]

]


[heading Example]
  
Waiting for a socket to become readable. 

   asio::ip::tcp::socket socket(my_context);
   ...
   socket.wait(asio::ip::tcp::socket::wait_read);







[endsect]



[section:overload2 basic_stream_socket::wait (2 of 2 overloads)]


['Inherited from basic_socket.]


Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  void wait(
      wait_type w,
      asio::error_code & ec);


This function is used to perform a blocking wait for a socket to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired socket state.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  
Waiting for a socket to become readable. 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::error_code ec;
   socket.wait(asio::ip::tcp::socket::wait_read, ec);







[endsect]


[endsect]


[section:wait_type basic_stream_socket::wait_type]


['Inherited from socket_base.]

[indexterm2 asio.indexterm.basic_stream_socket.wait_type..wait_type..basic_stream_socket] 
Wait types. 


  enum wait_type

[indexterm2 asio.indexterm.basic_stream_socket.wait_type.wait_read..wait_read..basic_stream_socket]
[indexterm2 asio.indexterm.basic_stream_socket.wait_type.wait_write..wait_write..basic_stream_socket]
[indexterm2 asio.indexterm.basic_stream_socket.wait_type.wait_error..wait_error..basic_stream_socket]

[heading Values]
[variablelist

  [
    [wait_read]
    [Wait for a socket to become ready to read. ]
  ]

  [
    [wait_write]
    [Wait for a socket to become ready to write. ]
  ]

  [
    [wait_error]
    [Wait for a socket to have error conditions pending. ]
  ]

]


For use with `basic_socket::wait()` and `basic_socket::async_wait()`. 


[endsect]


[section:write_some basic_stream_socket::write_some]

[indexterm2 asio.indexterm.basic_stream_socket.write_some..write_some..basic_stream_socket] 
Write some data to the socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.basic_stream_socket.write_some.overload1 write_some]``(
      const ConstBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.write_some.overload1 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.basic_stream_socket.write_some.overload2 write_some]``(
      const ConstBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.write_some.overload2 more...]]``


[section:overload1 basic_stream_socket::write_some (1 of 2 overloads)]


Write some data to the socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_some(
      const ConstBufferSequence & buffers);


This function is used to write data to the stream socket. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be written to the socket.]]

]


[heading Return Value]
      
The number of bytes written.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]

]


[heading Remarks]
      
The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes.


[heading Example]
  
To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   socket.write_some(asio::buffer(data, size));


See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 basic_stream_socket::write_some (2 of 2 overloads)]


Write some data to the socket. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_some(
      const ConstBufferSequence & buffers,
      asio::error_code & ec);


This function is used to write data to the stream socket. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be written to the socket.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes written. Returns 0 if an error occurred.


[heading Remarks]
      
The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes. 




[endsect]


[endsect]


[section:_basic_stream_socket basic_stream_socket::~basic_stream_socket]

[indexterm2 asio.indexterm.basic_stream_socket._basic_stream_socket..~basic_stream_socket..basic_stream_socket] 
Destroys the socket. 


  ~basic_stream_socket();


This function destroys the socket, cancelling any outstanding asynchronous operations associated with the socket as if by calling `cancel`. 


[endsect]



[endsect]

[section:basic_stream_socket__rebind_executor basic_stream_socket::rebind_executor]


Rebinds the socket type to another executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  struct rebind_executor


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_stream_socket__rebind_executor.other [*other]]]
    [The socket type when rebound to the specified executor. ]
  
  ]

]

[heading Requirements]

['Header: ][^asio/basic_stream_socket.hpp]

['Convenience header: ][^asio.hpp]


[section:other basic_stream_socket::rebind_executor::other]

[indexterm2 asio.indexterm.basic_stream_socket__rebind_executor.other..other..basic_stream_socket::rebind_executor] 
The socket type when rebound to the specified executor. 


  typedef basic_stream_socket< Protocol, Executor1 > other;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_stream_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_stream_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_read_some [*async_read_some]]]
    [Start an asynchronous read. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_receive [*async_receive]]]
    [Start an asynchronous receive. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_send [*async_send]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_write_some [*async_write_some]]]
    [Start an asynchronous write. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.basic_stream_socket [*basic_stream_socket]] [constructor]]
    [Construct a basic_stream_socket without opening it. 
     [hr]
     Construct and open a basic_stream_socket. 
     [hr]
     Construct a basic_stream_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_stream_socket on an existing native socket. 
     [hr]
     Move-construct a basic_stream_socket from another. 
     [hr]
     Move-construct a basic_stream_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_stream_socket from another. 
     [hr]
     Move-assign a basic_stream_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.read_some [*read_some]]]
    [Read some data from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.receive [*receive]]]
    [Receive some data on the socket. 
     [hr]
     Receive some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.send [*send]]]
    [Send some data on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.write_some [*write_some]]]
    [Write some data to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket._basic_stream_socket [*~basic_stream_socket]] [destructor]]
    [Destroys the socket. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_stream_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_stream_socket `basic_stream_socket`] class template provides asynchronous and blocking stream-oriented socket functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.





[heading Requirements]

['Header: ][^asio/basic_stream_socket.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:basic_streambuf basic_streambuf]


Automatically resizable buffer class based on std::streambuf. 


  template<
      typename Allocator = std::allocator<char>>
  class basic_streambuf :
    noncopyable


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_streambuf.const_buffers_type [*const_buffers_type]]]
    [The type used to represent the input sequence as a list of buffers. ]
  
  ]

  [

    [[link asio.reference.basic_streambuf.mutable_buffers_type [*mutable_buffers_type]]]
    [The type used to represent the output sequence as a list of buffers. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_streambuf.basic_streambuf [*basic_streambuf]] [constructor]]
    [Construct a basic_streambuf object. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.capacity [*capacity]]]
    [Get the current capacity of the basic_streambuf. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.commit [*commit]]]
    [Move characters from the output sequence to the input sequence. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.consume [*consume]]]
    [Remove characters from the input sequence. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.data [*data]]]
    [Get a list of buffers that represents the input sequence. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.max_size [*max_size]]]
    [Get the maximum size of the basic_streambuf. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.prepare [*prepare]]]
    [Get a list of buffers that represents the output sequence, with the given size. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.size [*size]]]
    [Get the size of the input sequence. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_streambuf.overflow [*overflow]]]
    [Override std::streambuf behaviour. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.reserve [*reserve]]]
    []
  ]
  
  [
    [[link asio.reference.basic_streambuf.underflow [*underflow]]]
    [Override std::streambuf behaviour. ]
  ]
  
]

The `basic_streambuf` class is derived from `std::streambuf` to associate the streambuf's input and output sequences with one or more character arrays. These character arrays are internal to the `basic_streambuf` object, but direct access to the array elements is provided to permit them to be used efficiently with I/O operations. Characters written to the output sequence of a `basic_streambuf` object are appended to the input sequence of the same object.

The `basic_streambuf` class's public interface is intended to permit the following implementation strategies:


* A single contiguous character array, which is reallocated as necessary to accommodate changes in the size of the character sequence. This is the implementation approach currently used in Asio.


* A sequence of one or more character arrays, where each array is of the same size. Additional character array objects are appended to the sequence to accommodate changes in the size of the character sequence.


* A sequence of one or more character arrays of varying sizes. Additional character array objects are appended to the sequence to accommodate changes in the size of the character sequence.

The constructor for [link asio.reference.basic_streambuf `basic_streambuf`] accepts a `size_t` argument specifying the maximum of the sum of the sizes of the input sequence and output sequence. During the lifetime of the `basic_streambuf` object, the following invariant holds: 

   size() <= max_size()


Any member function that would, if successful, cause the invariant to be violated shall throw an exception of class `std::length_error`.

The constructor for `basic_streambuf` takes an Allocator argument. A copy of this argument is used for any memory allocation performed, by the constructor and by all member functions, during the lifetime of each `basic_streambuf` object.


[heading Examples]
  
Writing directly from an streambuf to a socket: 

   asio::streambuf b;
   std::ostream os(&b);
   os << "Hello, World!\n";

   // try sending some data in input sequence
   size_t n = sock.send(b.data());

   b.consume(n); // sent data is removed from input sequence




Reading from a socket directly into a streambuf: 

   asio::streambuf b;

   // reserve 512 bytes in output sequence
   asio::streambuf::mutable_buffers_type bufs = b.prepare(512);

   size_t n = sock.receive(bufs);

   // received data is "committed" from output sequence to input sequence
   b.commit(n);

   std::istream is(&b);
   std::string s;
   is >> s;




[heading Requirements]

['Header: ][^asio/basic_streambuf.hpp]

['Convenience header: ][^asio.hpp]


[section:basic_streambuf basic_streambuf::basic_streambuf]

[indexterm2 asio.indexterm.basic_streambuf.basic_streambuf..basic_streambuf..basic_streambuf] 
Construct a [link asio.reference.basic_streambuf `basic_streambuf`] object. 


  basic_streambuf(
      std::size_t maximum_size = (std::numeric_limits< std::size_t >::max)(),
      const Allocator & allocator = Allocator());


Constructs a streambuf with the specified maximum size. The initial size of the streambuf's input sequence is 0. 


[endsect]



[section:capacity basic_streambuf::capacity]

[indexterm2 asio.indexterm.basic_streambuf.capacity..capacity..basic_streambuf] 
Get the current capacity of the [link asio.reference.basic_streambuf `basic_streambuf`]. 


  std::size_t capacity() const;



[heading Return Value]
      
The current total capacity of the streambuf, i.e. for both the input sequence and output sequence. 




[endsect]



[section:commit basic_streambuf::commit]

[indexterm2 asio.indexterm.basic_streambuf.commit..commit..basic_streambuf] 
Move characters from the output sequence to the input sequence. 


  void commit(
      std::size_t n);


Appends `n` characters from the start of the output sequence to the input sequence. The beginning of the output sequence is advanced by `n` characters.

Requires a preceding call `prepare(x)` where `x >= n`, and no intervening operations that modify the input or output sequence.


[heading Remarks]
      
If `n` is greater than the size of the output sequence, the entire output sequence is moved to the input sequence and no error is issued. 




[endsect]



[section:const_buffers_type basic_streambuf::const_buffers_type]

[indexterm2 asio.indexterm.basic_streambuf.const_buffers_type..const_buffers_type..basic_streambuf] 
The type used to represent the input sequence as a list of buffers. 


  typedef implementation_defined const_buffers_type;



[heading Requirements]

['Header: ][^asio/basic_streambuf.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:consume basic_streambuf::consume]

[indexterm2 asio.indexterm.basic_streambuf.consume..consume..basic_streambuf] 
Remove characters from the input sequence. 


  void consume(
      std::size_t n);


Removes `n` characters from the beginning of the input sequence.


[heading Remarks]
      
If `n` is greater than the size of the input sequence, the entire input sequence is consumed and no error is issued. 




[endsect]



[section:data basic_streambuf::data]

[indexterm2 asio.indexterm.basic_streambuf.data..data..basic_streambuf] 
Get a list of buffers that represents the input sequence. 


  const_buffers_type data() const;



[heading Return Value]
      
An object of type `const_buffers_type` that satisfies ConstBufferSequence requirements, representing all character arrays in the input sequence.


[heading Remarks]
      
The returned object is invalidated by any `basic_streambuf` member function that modifies the input sequence or output sequence. 




[endsect]



[section:max_size basic_streambuf::max_size]

[indexterm2 asio.indexterm.basic_streambuf.max_size..max_size..basic_streambuf] 
Get the maximum size of the [link asio.reference.basic_streambuf `basic_streambuf`]. 


  std::size_t max_size() const;



[heading Return Value]
      
The allowed maximum of the sum of the sizes of the input sequence and output sequence. 




[endsect]



[section:mutable_buffers_type basic_streambuf::mutable_buffers_type]

[indexterm2 asio.indexterm.basic_streambuf.mutable_buffers_type..mutable_buffers_type..basic_streambuf] 
The type used to represent the output sequence as a list of buffers. 


  typedef implementation_defined mutable_buffers_type;



[heading Requirements]

['Header: ][^asio/basic_streambuf.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:overflow basic_streambuf::overflow]

[indexterm2 asio.indexterm.basic_streambuf.overflow..overflow..basic_streambuf] 
Override std::streambuf behaviour. 


  int_type overflow(
      int_type c);


Behaves according to the specification of `std::streambuf::overflow()`, with the specialisation that `std::length_error` is thrown if appending the character to the input sequence would require the condition `size() > max_size()` to be true. 


[endsect]



[section:prepare basic_streambuf::prepare]

[indexterm2 asio.indexterm.basic_streambuf.prepare..prepare..basic_streambuf] 
Get a list of buffers that represents the output sequence, with the given size. 


  mutable_buffers_type prepare(
      std::size_t n);


Ensures that the output sequence can accommodate `n` characters, reallocating character array objects as necessary.


[heading Return Value]
      
An object of type `mutable_buffers_type` that satisfies MutableBufferSequence requirements, representing character array objects at the start of the output sequence such that the sum of the buffer sizes is `n`.


[heading Exceptions]
    

[variablelist
  
[[std::length_error][If `size() + n > max_size()`.]]

]


[heading Remarks]
      
The returned object is invalidated by any `basic_streambuf` member function that modifies the input sequence or output sequence. 




[endsect]



[section:reserve basic_streambuf::reserve]

[indexterm2 asio.indexterm.basic_streambuf.reserve..reserve..basic_streambuf] 

  void reserve(
      std::size_t n);



[endsect]



[section:size basic_streambuf::size]

[indexterm2 asio.indexterm.basic_streambuf.size..size..basic_streambuf] 
Get the size of the input sequence. 


  std::size_t size() const;



[heading Return Value]
      
The size of the input sequence. The value is equal to that calculated for `s` in the following code: 

   size_t s = 0;
   const_buffers_type bufs = data();
   const_buffers_type::const_iterator i = bufs.begin();
   while (i != bufs.end())
   {
     const_buffer buf(*i++);
     s += buf.size();
   }







[endsect]



[section:underflow basic_streambuf::underflow]

[indexterm2 asio.indexterm.basic_streambuf.underflow..underflow..basic_streambuf] 
Override std::streambuf behaviour. 


  int_type underflow();


Behaves according to the specification of `std::streambuf::underflow()`. 


[endsect]



[endsect]

[section:basic_streambuf_ref basic_streambuf_ref]


Adapts [link asio.reference.basic_streambuf `basic_streambuf`] to the dynamic buffer sequence type requirements. 


  template<
      typename Allocator = std::allocator<char>>
  class basic_streambuf_ref


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_streambuf_ref.const_buffers_type [*const_buffers_type]]]
    [The type used to represent the input sequence as a list of buffers. ]
  
  ]

  [

    [[link asio.reference.basic_streambuf_ref.mutable_buffers_type [*mutable_buffers_type]]]
    [The type used to represent the output sequence as a list of buffers. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_streambuf_ref.basic_streambuf_ref [*basic_streambuf_ref]] [constructor]]
    [Construct a basic_streambuf_ref for the given basic_streambuf object. 
     [hr]
     Copy construct a basic_streambuf_ref. 
     [hr]
     Move construct a basic_streambuf_ref. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf_ref.capacity [*capacity]]]
    [Get the current capacity of the dynamic buffer. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf_ref.commit [*commit]]]
    [Move bytes from the output sequence to the input sequence. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf_ref.consume [*consume]]]
    [Remove characters from the input sequence. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf_ref.data [*data]]]
    [Get a list of buffers that represents the input sequence. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf_ref.max_size [*max_size]]]
    [Get the maximum size of the dynamic buffer. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf_ref.prepare [*prepare]]]
    [Get a list of buffers that represents the output sequence, with the given size. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf_ref.size [*size]]]
    [Get the size of the input sequence. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/basic_streambuf.hpp]

['Convenience header: ][^asio.hpp]

[section:basic_streambuf_ref basic_streambuf_ref::basic_streambuf_ref]

[indexterm2 asio.indexterm.basic_streambuf_ref.basic_streambuf_ref..basic_streambuf_ref..basic_streambuf_ref] 
Construct a [link asio.reference.basic_streambuf_ref `basic_streambuf_ref`] for the given [link asio.reference.basic_streambuf `basic_streambuf`] object. 


  explicit ``[link asio.reference.basic_streambuf_ref.basic_streambuf_ref.overload1 basic_streambuf_ref]``(
      basic_streambuf< Allocator > & sb);
  ``  [''''&raquo;''' [link asio.reference.basic_streambuf_ref.basic_streambuf_ref.overload1 more...]]``


Copy construct a [link asio.reference.basic_streambuf_ref `basic_streambuf_ref`]. 


  ``[link asio.reference.basic_streambuf_ref.basic_streambuf_ref.overload2 basic_streambuf_ref]``(
      const basic_streambuf_ref & other);
  ``  [''''&raquo;''' [link asio.reference.basic_streambuf_ref.basic_streambuf_ref.overload2 more...]]``


Move construct a [link asio.reference.basic_streambuf_ref `basic_streambuf_ref`]. 


  ``[link asio.reference.basic_streambuf_ref.basic_streambuf_ref.overload3 basic_streambuf_ref]``(
      basic_streambuf_ref && other);
  ``  [''''&raquo;''' [link asio.reference.basic_streambuf_ref.basic_streambuf_ref.overload3 more...]]``


[section:overload1 basic_streambuf_ref::basic_streambuf_ref (1 of 3 overloads)]


Construct a [link asio.reference.basic_streambuf_ref `basic_streambuf_ref`] for the given [link asio.reference.basic_streambuf `basic_streambuf`] object. 


  basic_streambuf_ref(
      basic_streambuf< Allocator > & sb);



[endsect]



[section:overload2 basic_streambuf_ref::basic_streambuf_ref (2 of 3 overloads)]


Copy construct a [link asio.reference.basic_streambuf_ref `basic_streambuf_ref`]. 


  basic_streambuf_ref(
      const basic_streambuf_ref & other);



[endsect]



[section:overload3 basic_streambuf_ref::basic_streambuf_ref (3 of 3 overloads)]


Move construct a [link asio.reference.basic_streambuf_ref `basic_streambuf_ref`]. 


  basic_streambuf_ref(
      basic_streambuf_ref && other);



[endsect]


[endsect]


[section:capacity basic_streambuf_ref::capacity]

[indexterm2 asio.indexterm.basic_streambuf_ref.capacity..capacity..basic_streambuf_ref] 
Get the current capacity of the dynamic buffer. 


  std::size_t capacity() const;



[endsect]



[section:commit basic_streambuf_ref::commit]

[indexterm2 asio.indexterm.basic_streambuf_ref.commit..commit..basic_streambuf_ref] 
Move bytes from the output sequence to the input sequence. 


  void commit(
      std::size_t n);



[endsect]



[section:const_buffers_type basic_streambuf_ref::const_buffers_type]

[indexterm2 asio.indexterm.basic_streambuf_ref.const_buffers_type..const_buffers_type..basic_streambuf_ref] 
The type used to represent the input sequence as a list of buffers. 


  typedef basic_streambuf< Allocator >::const_buffers_type const_buffers_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_streambuf.const_buffers_type [*const_buffers_type]]]
    [The type used to represent the input sequence as a list of buffers. ]
  
  ]

  [

    [[link asio.reference.basic_streambuf.mutable_buffers_type [*mutable_buffers_type]]]
    [The type used to represent the output sequence as a list of buffers. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_streambuf.basic_streambuf [*basic_streambuf]] [constructor]]
    [Construct a basic_streambuf object. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.capacity [*capacity]]]
    [Get the current capacity of the basic_streambuf. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.commit [*commit]]]
    [Move characters from the output sequence to the input sequence. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.consume [*consume]]]
    [Remove characters from the input sequence. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.data [*data]]]
    [Get a list of buffers that represents the input sequence. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.max_size [*max_size]]]
    [Get the maximum size of the basic_streambuf. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.prepare [*prepare]]]
    [Get a list of buffers that represents the output sequence, with the given size. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.size [*size]]]
    [Get the size of the input sequence. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_streambuf.overflow [*overflow]]]
    [Override std::streambuf behaviour. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.reserve [*reserve]]]
    []
  ]
  
  [
    [[link asio.reference.basic_streambuf.underflow [*underflow]]]
    [Override std::streambuf behaviour. ]
  ]
  
]

The `basic_streambuf` class is derived from `std::streambuf` to associate the streambuf's input and output sequences with one or more character arrays. These character arrays are internal to the `basic_streambuf` object, but direct access to the array elements is provided to permit them to be used efficiently with I/O operations. Characters written to the output sequence of a `basic_streambuf` object are appended to the input sequence of the same object.

The `basic_streambuf` class's public interface is intended to permit the following implementation strategies:


* A single contiguous character array, which is reallocated as necessary to accommodate changes in the size of the character sequence. This is the implementation approach currently used in Asio.


* A sequence of one or more character arrays, where each array is of the same size. Additional character array objects are appended to the sequence to accommodate changes in the size of the character sequence.


* A sequence of one or more character arrays of varying sizes. Additional character array objects are appended to the sequence to accommodate changes in the size of the character sequence.

The constructor for [link asio.reference.basic_streambuf `basic_streambuf`] accepts a `size_t` argument specifying the maximum of the sum of the sizes of the input sequence and output sequence. During the lifetime of the `basic_streambuf` object, the following invariant holds: 

   size() <= max_size()


Any member function that would, if successful, cause the invariant to be violated shall throw an exception of class `std::length_error`.

The constructor for `basic_streambuf` takes an Allocator argument. A copy of this argument is used for any memory allocation performed, by the constructor and by all member functions, during the lifetime of each `basic_streambuf` object.


[heading Examples]
  
Writing directly from an streambuf to a socket: 

   asio::streambuf b;
   std::ostream os(&b);
   os << "Hello, World!\n";

   // try sending some data in input sequence
   size_t n = sock.send(b.data());

   b.consume(n); // sent data is removed from input sequence




Reading from a socket directly into a streambuf: 

   asio::streambuf b;

   // reserve 512 bytes in output sequence
   asio::streambuf::mutable_buffers_type bufs = b.prepare(512);

   size_t n = sock.receive(bufs);

   // received data is "committed" from output sequence to input sequence
   b.commit(n);

   std::istream is(&b);
   std::string s;
   is >> s;





[heading Requirements]

['Header: ][^asio/basic_streambuf.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:consume basic_streambuf_ref::consume]

[indexterm2 asio.indexterm.basic_streambuf_ref.consume..consume..basic_streambuf_ref] 
Remove characters from the input sequence. 


  void consume(
      std::size_t n);



[endsect]



[section:data basic_streambuf_ref::data]

[indexterm2 asio.indexterm.basic_streambuf_ref.data..data..basic_streambuf_ref] 
Get a list of buffers that represents the input sequence. 


  const_buffers_type data() const;



[endsect]



[section:max_size basic_streambuf_ref::max_size]

[indexterm2 asio.indexterm.basic_streambuf_ref.max_size..max_size..basic_streambuf_ref] 
Get the maximum size of the dynamic buffer. 


  std::size_t max_size() const;



[endsect]



[section:mutable_buffers_type basic_streambuf_ref::mutable_buffers_type]

[indexterm2 asio.indexterm.basic_streambuf_ref.mutable_buffers_type..mutable_buffers_type..basic_streambuf_ref] 
The type used to represent the output sequence as a list of buffers. 


  typedef basic_streambuf< Allocator >::mutable_buffers_type mutable_buffers_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_streambuf.const_buffers_type [*const_buffers_type]]]
    [The type used to represent the input sequence as a list of buffers. ]
  
  ]

  [

    [[link asio.reference.basic_streambuf.mutable_buffers_type [*mutable_buffers_type]]]
    [The type used to represent the output sequence as a list of buffers. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_streambuf.basic_streambuf [*basic_streambuf]] [constructor]]
    [Construct a basic_streambuf object. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.capacity [*capacity]]]
    [Get the current capacity of the basic_streambuf. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.commit [*commit]]]
    [Move characters from the output sequence to the input sequence. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.consume [*consume]]]
    [Remove characters from the input sequence. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.data [*data]]]
    [Get a list of buffers that represents the input sequence. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.max_size [*max_size]]]
    [Get the maximum size of the basic_streambuf. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.prepare [*prepare]]]
    [Get a list of buffers that represents the output sequence, with the given size. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.size [*size]]]
    [Get the size of the input sequence. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_streambuf.overflow [*overflow]]]
    [Override std::streambuf behaviour. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.reserve [*reserve]]]
    []
  ]
  
  [
    [[link asio.reference.basic_streambuf.underflow [*underflow]]]
    [Override std::streambuf behaviour. ]
  ]
  
]

The `basic_streambuf` class is derived from `std::streambuf` to associate the streambuf's input and output sequences with one or more character arrays. These character arrays are internal to the `basic_streambuf` object, but direct access to the array elements is provided to permit them to be used efficiently with I/O operations. Characters written to the output sequence of a `basic_streambuf` object are appended to the input sequence of the same object.

The `basic_streambuf` class's public interface is intended to permit the following implementation strategies:


* A single contiguous character array, which is reallocated as necessary to accommodate changes in the size of the character sequence. This is the implementation approach currently used in Asio.


* A sequence of one or more character arrays, where each array is of the same size. Additional character array objects are appended to the sequence to accommodate changes in the size of the character sequence.


* A sequence of one or more character arrays of varying sizes. Additional character array objects are appended to the sequence to accommodate changes in the size of the character sequence.

The constructor for [link asio.reference.basic_streambuf `basic_streambuf`] accepts a `size_t` argument specifying the maximum of the sum of the sizes of the input sequence and output sequence. During the lifetime of the `basic_streambuf` object, the following invariant holds: 

   size() <= max_size()


Any member function that would, if successful, cause the invariant to be violated shall throw an exception of class `std::length_error`.

The constructor for `basic_streambuf` takes an Allocator argument. A copy of this argument is used for any memory allocation performed, by the constructor and by all member functions, during the lifetime of each `basic_streambuf` object.


[heading Examples]
  
Writing directly from an streambuf to a socket: 

   asio::streambuf b;
   std::ostream os(&b);
   os << "Hello, World!\n";

   // try sending some data in input sequence
   size_t n = sock.send(b.data());

   b.consume(n); // sent data is removed from input sequence




Reading from a socket directly into a streambuf: 

   asio::streambuf b;

   // reserve 512 bytes in output sequence
   asio::streambuf::mutable_buffers_type bufs = b.prepare(512);

   size_t n = sock.receive(bufs);

   // received data is "committed" from output sequence to input sequence
   b.commit(n);

   std::istream is(&b);
   std::string s;
   is >> s;





[heading Requirements]

['Header: ][^asio/basic_streambuf.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:prepare basic_streambuf_ref::prepare]

[indexterm2 asio.indexterm.basic_streambuf_ref.prepare..prepare..basic_streambuf_ref] 
Get a list of buffers that represents the output sequence, with the given size. 


  mutable_buffers_type prepare(
      std::size_t n);



[endsect]



[section:size basic_streambuf_ref::size]

[indexterm2 asio.indexterm.basic_streambuf_ref.size..size..basic_streambuf_ref] 
Get the size of the input sequence. 


  std::size_t size() const;



[endsect]



[endsect]

[section:basic_system_executor basic_system_executor]


An executor that uses arbitrary threads. 


  template<
      typename Blocking,
      typename Relationship,
      typename Allocator>
  class basic_system_executor


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_system_executor.basic_system_executor [*basic_system_executor]] [constructor]]
    [Default constructor. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.defer [*defer]]]
    [Request the system executor to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.dispatch [*dispatch]]]
    [Request the system executor to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.execute [*execute]]]
    [Execution function. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.on_work_finished [*on_work_finished]]]
    [Inform the executor that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.on_work_started [*on_work_started]]]
    [Inform the executor that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.post [*post]]]
    [Request the system executor to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.query [*query]]]
    [Query the current value of the allocator property. 
     [hr]
     Query the occupancy (recommended number of work items) for the system context. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.query__static [*query]] [static]]
    [Query the current value of the mapping property. 
     [hr]
     Query the current value of the context property. 
     [hr]
     Query the current value of the blocking property. 
     [hr]
     Query the current value of the relationship property. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.require [*require]]]
    [Obtain an executor with the blocking.possibly property. 
     [hr]
     Obtain an executor with the blocking.always property. 
     [hr]
     Obtain an executor with the blocking.never property. 
     [hr]
     Obtain an executor with the relationship.continuation property. 
     [hr]
     Obtain an executor with the relationship.fork property. 
     [hr]
     Obtain an executor with the specified allocator property. 
     [hr]
     Obtain an executor with the default allocator property. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_system_executor.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]

The system executor represents an execution context where functions are permitted to run on arbitrary threads. When the blocking.never property is established, the system executor will schedule the function to run on an unspecified system thread pool. When either blocking.possibly or blocking.always is established, the executor invokes the function immediately. 

[heading Requirements]

['Header: ][^asio/system_executor.hpp]

['Convenience header: ][^asio.hpp]


[section:basic_system_executor basic_system_executor::basic_system_executor]

[indexterm2 asio.indexterm.basic_system_executor.basic_system_executor..basic_system_executor..basic_system_executor] 
Default constructor. 


  basic_system_executor();



[endsect]



[section:context basic_system_executor::context]

[indexterm2 asio.indexterm.basic_system_executor.context..context..basic_system_executor] 
Obtain the underlying execution context. 


  system_context & context() const;



[endsect]



[section:defer basic_system_executor::defer]

[indexterm2 asio.indexterm.basic_system_executor.defer..defer..basic_system_executor] 
Request the system executor to invoke the given function object. 


  template<
      typename Function,
      typename OtherAllocator>
  void defer(
      Function && f,
      const OtherAllocator & a) const;


This function is used to ask the executor to execute the given function object. The function object will never be executed inside this function. Instead, it will be scheduled to run on an unspecified system thread pool.


[heading Parameters]
    

[variablelist
  
[[f][The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:
``
   void function(); 
``
]]

[[a][An allocator that may be used by the executor to allocate the internal storage needed for function invocation. ]]

]




[endsect]



[section:dispatch basic_system_executor::dispatch]

[indexterm2 asio.indexterm.basic_system_executor.dispatch..dispatch..basic_system_executor] 
Request the system executor to invoke the given function object. 


  template<
      typename Function,
      typename OtherAllocator>
  void dispatch(
      Function && f,
      const OtherAllocator & a) const;


This function is used to ask the executor to execute the given function object. The function object will always be executed inside this function.


[heading Parameters]
    

[variablelist
  
[[f][The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:
``
   void function(); 
``
]]

[[a][An allocator that may be used by the executor to allocate the internal storage needed for function invocation. ]]

]




[endsect]



[section:execute basic_system_executor::execute]

[indexterm2 asio.indexterm.basic_system_executor.execute..execute..basic_system_executor] 
Execution function. 


  template<
      typename Function>
  void execute(
      Function && f) const;


Do not call this function directly. It is intended for use with the [link asio.reference.execution__execute `execution::execute`] customisation point.

For example: 

   asio::system_executor ex;
   execution::execute(ex, my_function_object); 





[endsect]



[section:on_work_finished basic_system_executor::on_work_finished]

[indexterm2 asio.indexterm.basic_system_executor.on_work_finished..on_work_finished..basic_system_executor] 
Inform the executor that some work is no longer outstanding. 


  void on_work_finished() const;


For the system executor, this is a no-op. 


[endsect]



[section:on_work_started basic_system_executor::on_work_started]

[indexterm2 asio.indexterm.basic_system_executor.on_work_started..on_work_started..basic_system_executor] 
Inform the executor that it has some outstanding work to do. 


  void on_work_started() const;


For the system executor, this is a no-op. 


[endsect]



[section:operator_not__eq_ basic_system_executor::operator!=]

[indexterm2 asio.indexterm.basic_system_executor.operator_not__eq_..operator!=..basic_system_executor] 
Compare two executors for inequality. 


  friend bool operator!=(
      const basic_system_executor & ,
      const basic_system_executor & );


Two executors are equal if they refer to the same underlying [link asio.reference.io_context `io_context`]. 

[heading Requirements]

['Header: ][^asio/system_executor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq__eq_ basic_system_executor::operator==]

[indexterm2 asio.indexterm.basic_system_executor.operator_eq__eq_..operator==..basic_system_executor] 
Compare two executors for equality. 


  friend bool operator==(
      const basic_system_executor & ,
      const basic_system_executor & );


Two executors are equal if they refer to the same underlying [link asio.reference.io_context `io_context`]. 

[heading Requirements]

['Header: ][^asio/system_executor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:post basic_system_executor::post]

[indexterm2 asio.indexterm.basic_system_executor.post..post..basic_system_executor] 
Request the system executor to invoke the given function object. 


  template<
      typename Function,
      typename OtherAllocator>
  void post(
      Function && f,
      const OtherAllocator & a) const;


This function is used to ask the executor to execute the given function object. The function object will never be executed inside this function. Instead, it will be scheduled to run on an unspecified system thread pool.


[heading Parameters]
    

[variablelist
  
[[f][The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:
``
   void function(); 
``
]]

[[a][An allocator that may be used by the executor to allocate the internal storage needed for function invocation. ]]

]




[endsect]


[section:query basic_system_executor::query]

[indexterm2 asio.indexterm.basic_system_executor.query..query..basic_system_executor] 
Query the current value of the `allocator` property. 


  template<
      typename OtherAllocator>
  constexpr Allocator ``[link asio.reference.basic_system_executor.query.overload1 query]``(
      execution::allocator_t< OtherAllocator > ) const;
  ``  [''''&raquo;''' [link asio.reference.basic_system_executor.query.overload1 more...]]``

  constexpr Allocator ``[link asio.reference.basic_system_executor.query.overload2 query]``(
      execution::allocator_t< void > ) const;
  ``  [''''&raquo;''' [link asio.reference.basic_system_executor.query.overload2 more...]]``


Query the occupancy (recommended number of work items) for the system context. 


  std::size_t ``[link asio.reference.basic_system_executor.query.overload3 query]``(
      execution::occupancy_t ) const;
  ``  [''''&raquo;''' [link asio.reference.basic_system_executor.query.overload3 more...]]``


[section:overload1 basic_system_executor::query (1 of 3 overloads)]


Query the current value of the `allocator` property. 


  template<
      typename OtherAllocator>
  constexpr Allocator query(
      execution::allocator_t< OtherAllocator > ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   asio::system_executor ex;
   auto alloc = asio::query(ex,
       asio::execution::allocator); 





[endsect]



[section:overload2 basic_system_executor::query (2 of 3 overloads)]


Query the current value of the `allocator` property. 


  constexpr Allocator query(
      execution::allocator_t< void > ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   asio::system_executor ex;
   auto alloc = asio::query(ex,
       asio::execution::allocator); 





[endsect]



[section:overload3 basic_system_executor::query (3 of 3 overloads)]


Query the occupancy (recommended number of work items) for the system context. 


  std::size_t query(
      execution::occupancy_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   asio::system_executor ex;
   std::size_t occupancy = asio::query(
       ex, asio::execution::occupancy); 





[endsect]


[endsect]

[section:query__static basic_system_executor::query]

[indexterm2 asio.indexterm.basic_system_executor.query__static..query..basic_system_executor] 
Query the current value of the `mapping` property. 


  static constexpr execution::mapping_t ``[link asio.reference.basic_system_executor.query__static.overload1 query]``(
      execution::mapping_t );
  ``  [''''&raquo;''' [link asio.reference.basic_system_executor.query__static.overload1 more...]]``


Query the current value of the `context` property. 


  static system_context & ``[link asio.reference.basic_system_executor.query__static.overload2 query]``(
      execution::context_t );
  ``  [''''&raquo;''' [link asio.reference.basic_system_executor.query__static.overload2 more...]]``


Query the current value of the `blocking` property. 


  static constexpr execution::blocking_t ``[link asio.reference.basic_system_executor.query__static.overload3 query]``(
      execution::blocking_t );
  ``  [''''&raquo;''' [link asio.reference.basic_system_executor.query__static.overload3 more...]]``


Query the current value of the `relationship` property. 


  static constexpr execution::relationship_t ``[link asio.reference.basic_system_executor.query__static.overload4 query]``(
      execution::relationship_t );
  ``  [''''&raquo;''' [link asio.reference.basic_system_executor.query__static.overload4 more...]]``


[section:overload1 basic_system_executor::query (1 of 4 overloads)]


Query the current value of the `mapping` property. 


  static constexpr execution::mapping_t query(
      execution::mapping_t );


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   asio::system_executor ex;
   if (asio::query(ex, asio::execution::mapping)
         == asio::execution::mapping.thread)
     ... 





[endsect]



[section:overload2 basic_system_executor::query (2 of 4 overloads)]


Query the current value of the `context` property. 


  static system_context & query(
      execution::context_t );


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   asio::system_executor ex;
   asio::system_context& pool = asio::query(
       ex, asio::execution::context); 





[endsect]



[section:overload3 basic_system_executor::query (3 of 4 overloads)]


Query the current value of the `blocking` property. 


  static constexpr execution::blocking_t query(
      execution::blocking_t );


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   asio::system_executor ex;
   if (asio::query(ex, asio::execution::blocking)
         == asio::execution::blocking.always)
     ... 





[endsect]



[section:overload4 basic_system_executor::query (4 of 4 overloads)]


Query the current value of the `relationship` property. 


  static constexpr execution::relationship_t query(
      execution::relationship_t );


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   asio::system_executor ex;
   if (asio::query(ex, asio::execution::relationship)
         == asio::execution::relationship.continuation)
     ... 





[endsect]


[endsect]

[section:require basic_system_executor::require]

[indexterm2 asio.indexterm.basic_system_executor.require..require..basic_system_executor] 
Obtain an executor with the `blocking.possibly` property. 


  basic_system_executor< execution::blocking_t::possibly_t, Relationship, Allocator > ``[link asio.reference.basic_system_executor.require.overload1 require]``(
      execution::blocking_t::possibly_t ) const;
  ``  [''''&raquo;''' [link asio.reference.basic_system_executor.require.overload1 more...]]``


Obtain an executor with the `blocking.always` property. 


  basic_system_executor< execution::blocking_t::always_t, Relationship, Allocator > ``[link asio.reference.basic_system_executor.require.overload2 require]``(
      execution::blocking_t::always_t ) const;
  ``  [''''&raquo;''' [link asio.reference.basic_system_executor.require.overload2 more...]]``


Obtain an executor with the `blocking.never` property. 


  basic_system_executor< execution::blocking_t::never_t, Relationship, Allocator > ``[link asio.reference.basic_system_executor.require.overload3 require]``(
      execution::blocking_t::never_t ) const;
  ``  [''''&raquo;''' [link asio.reference.basic_system_executor.require.overload3 more...]]``


Obtain an executor with the `relationship.continuation` property. 


  basic_system_executor< Blocking, execution::relationship_t::continuation_t, Allocator > ``[link asio.reference.basic_system_executor.require.overload4 require]``(
      execution::relationship_t::continuation_t ) const;
  ``  [''''&raquo;''' [link asio.reference.basic_system_executor.require.overload4 more...]]``


Obtain an executor with the `relationship.fork` property. 


  basic_system_executor< Blocking, execution::relationship_t::fork_t, Allocator > ``[link asio.reference.basic_system_executor.require.overload5 require]``(
      execution::relationship_t::fork_t ) const;
  ``  [''''&raquo;''' [link asio.reference.basic_system_executor.require.overload5 more...]]``


Obtain an executor with the specified `allocator` property. 


  template<
      typename OtherAllocator>
  basic_system_executor< Blocking, Relationship, OtherAllocator > ``[link asio.reference.basic_system_executor.require.overload6 require]``(
      execution::allocator_t< OtherAllocator > a) const;
  ``  [''''&raquo;''' [link asio.reference.basic_system_executor.require.overload6 more...]]``


Obtain an executor with the default `allocator` property. 


  basic_system_executor< Blocking, Relationship, std::allocator< void > > ``[link asio.reference.basic_system_executor.require.overload7 require]``(
      execution::allocator_t< void > ) const;
  ``  [''''&raquo;''' [link asio.reference.basic_system_executor.require.overload7 more...]]``


[section:overload1 basic_system_executor::require (1 of 7 overloads)]


Obtain an executor with the `blocking.possibly` property. 


  basic_system_executor< execution::blocking_t::possibly_t, Relationship, Allocator > require(
      execution::blocking_t::possibly_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   asio::system_executor ex1;
   auto ex2 = asio::require(ex1,
       asio::execution::blocking.possibly); 





[endsect]



[section:overload2 basic_system_executor::require (2 of 7 overloads)]


Obtain an executor with the `blocking.always` property. 


  basic_system_executor< execution::blocking_t::always_t, Relationship, Allocator > require(
      execution::blocking_t::always_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   asio::system_executor ex1;
   auto ex2 = asio::require(ex1,
       asio::execution::blocking.always); 





[endsect]



[section:overload3 basic_system_executor::require (3 of 7 overloads)]


Obtain an executor with the `blocking.never` property. 


  basic_system_executor< execution::blocking_t::never_t, Relationship, Allocator > require(
      execution::blocking_t::never_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   asio::system_executor ex1;
   auto ex2 = asio::require(ex1,
       asio::execution::blocking.never); 





[endsect]



[section:overload4 basic_system_executor::require (4 of 7 overloads)]


Obtain an executor with the `relationship.continuation` property. 


  basic_system_executor< Blocking, execution::relationship_t::continuation_t, Allocator > require(
      execution::relationship_t::continuation_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   asio::system_executor ex1;
   auto ex2 = asio::require(ex1,
       asio::execution::relationship.continuation); 





[endsect]



[section:overload5 basic_system_executor::require (5 of 7 overloads)]


Obtain an executor with the `relationship.fork` property. 


  basic_system_executor< Blocking, execution::relationship_t::fork_t, Allocator > require(
      execution::relationship_t::fork_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   asio::system_executor ex1;
   auto ex2 = asio::require(ex1,
       asio::execution::relationship.fork); 





[endsect]



[section:overload6 basic_system_executor::require (6 of 7 overloads)]


Obtain an executor with the specified `allocator` property. 


  template<
      typename OtherAllocator>
  basic_system_executor< Blocking, Relationship, OtherAllocator > require(
      execution::allocator_t< OtherAllocator > a) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   asio::system_executor ex1;
   auto ex2 = asio::require(ex1,
       asio::execution::allocator(my_allocator)); 





[endsect]



[section:overload7 basic_system_executor::require (7 of 7 overloads)]


Obtain an executor with the default `allocator` property. 


  basic_system_executor< Blocking, Relationship, std::allocator< void > > require(
      execution::allocator_t< void > ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   asio::system_executor ex1;
   auto ex2 = asio::require(ex1,
       asio::execution::allocator); 





[endsect]


[endsect]


[endsect]

[section:basic_waitable_timer basic_waitable_timer]


Provides waitable timer functionality. 


  template<
      typename Clock,
      typename ``[link asio.reference.WaitTraits WaitTraits]``,
      typename ``[link asio.reference.Executor1 Executor]``>
  class basic_waitable_timer


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_waitable_timer__rebind_executor [*rebind_executor]]]
    [Rebinds the timer type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.clock_type [*clock_type]]]
    [The clock type. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.duration [*duration]]]
    [The duration type of the clock. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.time_point [*time_point]]]
    [The time point type of the clock. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.traits_type [*traits_type]]]
    [The wait traits type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_waitable_timer.async_wait [*async_wait]]]
    [Start an asynchronous wait on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.basic_waitable_timer [*basic_waitable_timer]] [constructor]]
    [Constructor. 
     [hr]
     Constructor to set a particular expiry time as an absolute time. 
     [hr]
     Constructor to set a particular expiry time relative to now. 
     [hr]
     Move-construct a basic_waitable_timer from another. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.cancel [*cancel]]]
    [Cancel any asynchronous operations that are waiting on the timer. 
     [hr]
     (Deprecated: Use non-error_code overload.) Cancel any asynchronous operations that are waiting on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.cancel_one [*cancel_one]]]
    [Cancels one asynchronous operation that is waiting on the timer. 
     [hr]
     (Deprecated: Use non-error_code overload.) Cancels one asynchronous operation that is waiting on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.expires_after [*expires_after]]]
    [Set the timer's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.expires_at [*expires_at]]]
    [(Deprecated: Use expiry().) Get the timer's expiry time as an absolute time. 
     [hr]
     Set the timer's expiry time as an absolute time. 
     [hr]
     (Deprecated: Use non-error_code overload.) Set the timer's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.expires_from_now [*expires_from_now]]]
    [(Deprecated: Use expiry().) Get the timer's expiry time relative to now. 
     [hr]
     (Deprecated: Use expires_after().) Set the timer's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.expiry [*expiry]]]
    [Get the timer's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.operator_eq_ [*operator=]]]
    [Move-assign a basic_waitable_timer from another. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.wait [*wait]]]
    [Perform a blocking wait on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer._basic_waitable_timer [*~basic_waitable_timer]] [destructor]]
    [Destroys the timer. ]
  ]
  
]

The [link asio.reference.basic_waitable_timer `basic_waitable_timer`] class template provides the ability to perform a blocking or asynchronous wait for a timer to expire.

A waitable timer is always in one of two states: "expired" or "not expired". If the `wait()` or `async_wait()` function is called on an expired timer, the wait operation will complete immediately.

Most applications will use one of the [link asio.reference.steady_timer `steady_timer`], [link asio.reference.system_timer `system_timer`] or [link asio.reference.high_resolution_timer `high_resolution_timer`] typedefs.


[heading Remarks]
      
This waitable timer functionality is for use with the C++11 standard library's `<chrono>` facility, or with the Boost.Chrono library.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.


[heading Examples]
  
Performing a blocking wait (C++11): 

   // Construct a timer without setting an expiry time.
   asio::steady_timer timer(my_context);

   // Set an expiry time relative to now.
   timer.expires_after(std::chrono::seconds(5));

   // Wait for the timer to expire.
   timer.wait();





Performing an asynchronous wait (C++11): 

   void handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Timer expired.
     }
   }

   ...

   // Construct a timer with an absolute expiry time.
   asio::steady_timer timer(my_context,
       std::chrono::steady_clock::now() + std::chrono::seconds(60));

   // Start an asynchronous wait.
   timer.async_wait(handler);





[heading Changing an active waitable timer's expiry time]
  


Changing the expiry time of a timer while there are pending asynchronous waits causes those wait operations to be cancelled. To ensure that the action associated with the timer is performed only once, use something like this: used:



   void on_some_event()
   {
     if (my_timer.expires_after(seconds(5)) > 0)
     {
       // We managed to cancel the timer. Start new asynchronous wait.
       my_timer.async_wait(on_timeout);
     }
     else
     {
       // Too late, timer has already expired!
     }
   }

   void on_timeout(const asio::error_code& e)
   {
     if (e != asio::error::operation_aborted)
     {
       // Timer was not cancelled, take necessary action.
     }
   }





* The `asio::basic_waitable_timer::expires_after()` function cancels any pending asynchronous waits, and returns the number of asynchronous waits that were cancelled. If it returns 0 then you were too late and the wait handler has already been executed, or will soon be executed. If it returns 1 then the wait handler was successfully cancelled.


* If a wait handler is cancelled, the [link asio.reference.error_code `error_code`] passed to it contains the value `asio::error::operation_aborted`. 



[heading Requirements]

['Header: ][^asio/basic_waitable_timer.hpp]

['Convenience header: ][^asio.hpp]


[section:async_wait basic_waitable_timer::async_wait]

[indexterm2 asio.indexterm.basic_waitable_timer.async_wait..async_wait..basic_waitable_timer] 
Start an asynchronous wait on the timer. 


  template<
      typename ``[link asio.reference.WaitHandler WaitHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_wait(
      WaitHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function may be used to initiate an asynchronous wait against the timer. It always returns immediately.

For each call to `async_wait()`, the supplied handler will be called exactly once. The handler will be called when:


* The timer has expired.


* The timer was cancelled, in which case the handler is passed the error code `asio::error::operation_aborted`.


[heading Parameters]
    

[variablelist
  
[[handler][The handler to be called when the timer expires. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error // Result of operation.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`]. ]]

]




[endsect]


[section:basic_waitable_timer basic_waitable_timer::basic_waitable_timer]

[indexterm2 asio.indexterm.basic_waitable_timer.basic_waitable_timer..basic_waitable_timer..basic_waitable_timer] 
Constructor. 


  explicit ``[link asio.reference.basic_waitable_timer.basic_waitable_timer.overload1 basic_waitable_timer]``(
      const executor_type & ex);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.basic_waitable_timer.overload1 more...]]``

  template<
      typename ExecutionContext>
  explicit ``[link asio.reference.basic_waitable_timer.basic_waitable_timer.overload2 basic_waitable_timer]``(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.basic_waitable_timer.overload2 more...]]``


Constructor to set a particular expiry time as an absolute time. 


  ``[link asio.reference.basic_waitable_timer.basic_waitable_timer.overload3 basic_waitable_timer]``(
      const executor_type & ex,
      const time_point & expiry_time);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.basic_waitable_timer.overload3 more...]]``

  template<
      typename ExecutionContext>
  explicit ``[link asio.reference.basic_waitable_timer.basic_waitable_timer.overload4 basic_waitable_timer]``(
      ExecutionContext & context,
      const time_point & expiry_time,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.basic_waitable_timer.overload4 more...]]``


Constructor to set a particular expiry time relative to now. 


  ``[link asio.reference.basic_waitable_timer.basic_waitable_timer.overload5 basic_waitable_timer]``(
      const executor_type & ex,
      const duration & expiry_time);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.basic_waitable_timer.overload5 more...]]``

  template<
      typename ExecutionContext>
  explicit ``[link asio.reference.basic_waitable_timer.basic_waitable_timer.overload6 basic_waitable_timer]``(
      ExecutionContext & context,
      const duration & expiry_time,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.basic_waitable_timer.overload6 more...]]``


Move-construct a [link asio.reference.basic_waitable_timer `basic_waitable_timer`] from another. 


  ``[link asio.reference.basic_waitable_timer.basic_waitable_timer.overload7 basic_waitable_timer]``(
      basic_waitable_timer && other);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.basic_waitable_timer.overload7 more...]]``

  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  ``[link asio.reference.basic_waitable_timer.basic_waitable_timer.overload8 basic_waitable_timer]``(
      basic_waitable_timer< Clock, WaitTraits, Executor1 > && other,
      typename enable_if< is_convertible< Executor1, Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.basic_waitable_timer.overload8 more...]]``


[section:overload1 basic_waitable_timer::basic_waitable_timer (1 of 8 overloads)]


Constructor. 


  basic_waitable_timer(
      const executor_type & ex);


This constructor creates a timer without setting an expiry time. The `expires_at()` or `expires_after()` functions must be called to set an expiry time before the timer can be waited on.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the timer will use, by default, to dispatch handlers for any asynchronous operations performed on the timer. ]]

]




[endsect]



[section:overload2 basic_waitable_timer::basic_waitable_timer (2 of 8 overloads)]


Constructor. 


  template<
      typename ExecutionContext>
  basic_waitable_timer(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a timer without setting an expiry time. The `expires_at()` or `expires_after()` functions must be called to set an expiry time before the timer can be waited on.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the timer will use, by default, to dispatch handlers for any asynchronous operations performed on the timer. ]]

]




[endsect]



[section:overload3 basic_waitable_timer::basic_waitable_timer (3 of 8 overloads)]


Constructor to set a particular expiry time as an absolute time. 


  basic_waitable_timer(
      const executor_type & ex,
      const time_point & expiry_time);


This constructor creates a timer and sets the expiry time.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor object that the timer will use, by default, to dispatch handlers for any asynchronous operations performed on the timer.]]

[[expiry_time][The expiry time to be used for the timer, expressed as an absolute time. ]]

]




[endsect]



[section:overload4 basic_waitable_timer::basic_waitable_timer (4 of 8 overloads)]


Constructor to set a particular expiry time as an absolute time. 


  template<
      typename ExecutionContext>
  basic_waitable_timer(
      ExecutionContext & context,
      const time_point & expiry_time,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a timer and sets the expiry time.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the timer will use, by default, to dispatch handlers for any asynchronous operations performed on the timer.]]

[[expiry_time][The expiry time to be used for the timer, expressed as an absolute time. ]]

]




[endsect]



[section:overload5 basic_waitable_timer::basic_waitable_timer (5 of 8 overloads)]


Constructor to set a particular expiry time relative to now. 


  basic_waitable_timer(
      const executor_type & ex,
      const duration & expiry_time);


This constructor creates a timer and sets the expiry time.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the timer will use, by default, to dispatch handlers for any asynchronous operations performed on the timer.]]

[[expiry_time][The expiry time to be used for the timer, relative to now. ]]

]




[endsect]



[section:overload6 basic_waitable_timer::basic_waitable_timer (6 of 8 overloads)]


Constructor to set a particular expiry time relative to now. 


  template<
      typename ExecutionContext>
  basic_waitable_timer(
      ExecutionContext & context,
      const duration & expiry_time,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a timer and sets the expiry time.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the timer will use, by default, to dispatch handlers for any asynchronous operations performed on the timer.]]

[[expiry_time][The expiry time to be used for the timer, relative to now. ]]

]




[endsect]



[section:overload7 basic_waitable_timer::basic_waitable_timer (7 of 8 overloads)]


Move-construct a [link asio.reference.basic_waitable_timer `basic_waitable_timer`] from another. 


  basic_waitable_timer(
      basic_waitable_timer && other);


This constructor moves a timer from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_waitable_timer `basic_waitable_timer`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_waitable_timer(const executor_type&)` constructor. 




[endsect]



[section:overload8 basic_waitable_timer::basic_waitable_timer (8 of 8 overloads)]


Move-construct a [link asio.reference.basic_waitable_timer `basic_waitable_timer`] from another. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  basic_waitable_timer(
      basic_waitable_timer< Clock, WaitTraits, Executor1 > && other,
      typename enable_if< is_convertible< Executor1, Executor >::value >::type *  = 0);


This constructor moves a timer from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_waitable_timer `basic_waitable_timer`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_waitable_timer(const executor_type&)` constructor. 




[endsect]


[endsect]

[section:cancel basic_waitable_timer::cancel]

[indexterm2 asio.indexterm.basic_waitable_timer.cancel..cancel..basic_waitable_timer] 
Cancel any asynchronous operations that are waiting on the timer. 


  std::size_t ``[link asio.reference.basic_waitable_timer.cancel.overload1 cancel]``();
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.cancel.overload1 more...]]``


(Deprecated: Use non-error\_code overload.) Cancel any asynchronous operations that are waiting on the timer. 


  std::size_t ``[link asio.reference.basic_waitable_timer.cancel.overload2 cancel]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.cancel.overload2 more...]]``


[section:overload1 basic_waitable_timer::cancel (1 of 2 overloads)]


Cancel any asynchronous operations that are waiting on the timer. 


  std::size_t cancel();


This function forces the completion of any pending asynchronous wait operations against the timer. The handler for each cancelled operation will be invoked with the `asio::error::operation_aborted` error code.

Cancelling the timer does not change the expiry time.


[heading Return Value]
      
The number of asynchronous operations that were cancelled.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
If the timer has already expired when `cancel()` is called, then the handlers for asynchronous wait operations will:


* have already been invoked; or


* have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 


[endsect]



[section:overload2 basic_waitable_timer::cancel (2 of 2 overloads)]


(Deprecated: Use non-error\_code overload.) Cancel any asynchronous operations that are waiting on the timer. 


  std::size_t cancel(
      asio::error_code & ec);


This function forces the completion of any pending asynchronous wait operations against the timer. The handler for each cancelled operation will be invoked with the `asio::error::operation_aborted` error code.

Cancelling the timer does not change the expiry time.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of asynchronous operations that were cancelled.


[heading Remarks]
      
If the timer has already expired when `cancel()` is called, then the handlers for asynchronous wait operations will:


* have already been invoked; or


* have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 


[endsect]


[endsect]

[section:cancel_one basic_waitable_timer::cancel_one]

[indexterm2 asio.indexterm.basic_waitable_timer.cancel_one..cancel_one..basic_waitable_timer] 
Cancels one asynchronous operation that is waiting on the timer. 


  std::size_t ``[link asio.reference.basic_waitable_timer.cancel_one.overload1 cancel_one]``();
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.cancel_one.overload1 more...]]``


(Deprecated: Use non-error\_code overload.) Cancels one asynchronous operation that is waiting on the timer. 


  std::size_t ``[link asio.reference.basic_waitable_timer.cancel_one.overload2 cancel_one]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.cancel_one.overload2 more...]]``


[section:overload1 basic_waitable_timer::cancel_one (1 of 2 overloads)]


Cancels one asynchronous operation that is waiting on the timer. 


  std::size_t cancel_one();


This function forces the completion of one pending asynchronous wait operation against the timer. Handlers are cancelled in FIFO order. The handler for the cancelled operation will be invoked with the `asio::error::operation_aborted` error code.

Cancelling the timer does not change the expiry time.


[heading Return Value]
      
The number of asynchronous operations that were cancelled. That is, either 0 or 1.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
If the timer has already expired when `cancel_one()` is called, then the handlers for asynchronous wait operations will:


* have already been invoked; or


* have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 


[endsect]



[section:overload2 basic_waitable_timer::cancel_one (2 of 2 overloads)]


(Deprecated: Use non-error\_code overload.) Cancels one asynchronous operation that is waiting on the timer. 


  std::size_t cancel_one(
      asio::error_code & ec);


This function forces the completion of one pending asynchronous wait operation against the timer. Handlers are cancelled in FIFO order. The handler for the cancelled operation will be invoked with the `asio::error::operation_aborted` error code.

Cancelling the timer does not change the expiry time.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of asynchronous operations that were cancelled. That is, either 0 or 1.


[heading Remarks]
      
If the timer has already expired when `cancel_one()` is called, then the handlers for asynchronous wait operations will:


* have already been invoked; or


* have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 


[endsect]


[endsect]


[section:clock_type basic_waitable_timer::clock_type]

[indexterm2 asio.indexterm.basic_waitable_timer.clock_type..clock_type..basic_waitable_timer] 
The clock type. 


  typedef Clock clock_type;



[heading Requirements]

['Header: ][^asio/basic_waitable_timer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:duration basic_waitable_timer::duration]

[indexterm2 asio.indexterm.basic_waitable_timer.duration..duration..basic_waitable_timer] 
The duration type of the clock. 


  typedef clock_type::duration duration;



[heading Requirements]

['Header: ][^asio/basic_waitable_timer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:executor_type basic_waitable_timer::executor_type]

[indexterm2 asio.indexterm.basic_waitable_timer.executor_type..executor_type..basic_waitable_timer] 
The type of the executor associated with the object. 


  typedef Executor executor_type;



[heading Requirements]

['Header: ][^asio/basic_waitable_timer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:expires_after basic_waitable_timer::expires_after]

[indexterm2 asio.indexterm.basic_waitable_timer.expires_after..expires_after..basic_waitable_timer] 
Set the timer's expiry time relative to now. 


  std::size_t expires_after(
      const duration & expiry_time);


This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the `asio::error::operation_aborted` error code.


[heading Parameters]
    

[variablelist
  
[[expiry_time][The expiry time to be used for the timer.]]

]


[heading Return Value]
      
The number of asynchronous operations that were cancelled.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
If the timer has already expired when `expires_after()` is called, then the handlers for asynchronous wait operations will:


* have already been invoked; or


* have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 


[endsect]


[section:expires_at basic_waitable_timer::expires_at]

[indexterm2 asio.indexterm.basic_waitable_timer.expires_at..expires_at..basic_waitable_timer] 
(Deprecated: Use `expiry()`.) Get the timer's expiry time as an absolute time. 


  time_point ``[link asio.reference.basic_waitable_timer.expires_at.overload1 expires_at]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.expires_at.overload1 more...]]``


Set the timer's expiry time as an absolute time. 


  std::size_t ``[link asio.reference.basic_waitable_timer.expires_at.overload2 expires_at]``(
      const time_point & expiry_time);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.expires_at.overload2 more...]]``


(Deprecated: Use non-error\_code overload.) Set the timer's expiry time as an absolute time. 


  std::size_t ``[link asio.reference.basic_waitable_timer.expires_at.overload3 expires_at]``(
      const time_point & expiry_time,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.expires_at.overload3 more...]]``


[section:overload1 basic_waitable_timer::expires_at (1 of 3 overloads)]


(Deprecated: Use `expiry()`.) Get the timer's expiry time as an absolute time. 


  time_point expires_at() const;


This function may be used to obtain the timer's current expiry time. Whether the timer has expired or not does not affect this value. 


[endsect]



[section:overload2 basic_waitable_timer::expires_at (2 of 3 overloads)]


Set the timer's expiry time as an absolute time. 


  std::size_t expires_at(
      const time_point & expiry_time);


This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the `asio::error::operation_aborted` error code.


[heading Parameters]
    

[variablelist
  
[[expiry_time][The expiry time to be used for the timer.]]

]


[heading Return Value]
      
The number of asynchronous operations that were cancelled.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
If the timer has already expired when `expires_at()` is called, then the handlers for asynchronous wait operations will:


* have already been invoked; or


* have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 


[endsect]



[section:overload3 basic_waitable_timer::expires_at (3 of 3 overloads)]


(Deprecated: Use non-error\_code overload.) Set the timer's expiry time as an absolute time. 


  std::size_t expires_at(
      const time_point & expiry_time,
      asio::error_code & ec);


This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the `asio::error::operation_aborted` error code.


[heading Parameters]
    

[variablelist
  
[[expiry_time][The expiry time to be used for the timer.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of asynchronous operations that were cancelled.


[heading Remarks]
      
If the timer has already expired when `expires_at()` is called, then the handlers for asynchronous wait operations will:


* have already been invoked; or


* have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 


[endsect]


[endsect]

[section:expires_from_now basic_waitable_timer::expires_from_now]

[indexterm2 asio.indexterm.basic_waitable_timer.expires_from_now..expires_from_now..basic_waitable_timer] 
(Deprecated: Use `expiry()`.) Get the timer's expiry time relative to now. 


  duration ``[link asio.reference.basic_waitable_timer.expires_from_now.overload1 expires_from_now]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.expires_from_now.overload1 more...]]``


(Deprecated: Use `expires_after()`.) Set the timer's expiry time relative to now. 


  std::size_t ``[link asio.reference.basic_waitable_timer.expires_from_now.overload2 expires_from_now]``(
      const duration & expiry_time);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.expires_from_now.overload2 more...]]``

  std::size_t ``[link asio.reference.basic_waitable_timer.expires_from_now.overload3 expires_from_now]``(
      const duration & expiry_time,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.expires_from_now.overload3 more...]]``


[section:overload1 basic_waitable_timer::expires_from_now (1 of 3 overloads)]


(Deprecated: Use `expiry()`.) Get the timer's expiry time relative to now. 


  duration expires_from_now() const;


This function may be used to obtain the timer's current expiry time. Whether the timer has expired or not does not affect this value. 


[endsect]



[section:overload2 basic_waitable_timer::expires_from_now (2 of 3 overloads)]


(Deprecated: Use `expires_after()`.) Set the timer's expiry time relative to now. 


  std::size_t expires_from_now(
      const duration & expiry_time);


This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the `asio::error::operation_aborted` error code.


[heading Parameters]
    

[variablelist
  
[[expiry_time][The expiry time to be used for the timer.]]

]


[heading Return Value]
      
The number of asynchronous operations that were cancelled.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
If the timer has already expired when `expires_from_now()` is called, then the handlers for asynchronous wait operations will:


* have already been invoked; or


* have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 


[endsect]



[section:overload3 basic_waitable_timer::expires_from_now (3 of 3 overloads)]


(Deprecated: Use `expires_after()`.) Set the timer's expiry time relative to now. 


  std::size_t expires_from_now(
      const duration & expiry_time,
      asio::error_code & ec);


This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the `asio::error::operation_aborted` error code.


[heading Parameters]
    

[variablelist
  
[[expiry_time][The expiry time to be used for the timer.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of asynchronous operations that were cancelled.


[heading Remarks]
      
If the timer has already expired when `expires_from_now()` is called, then the handlers for asynchronous wait operations will:


* have already been invoked; or


* have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 


[endsect]


[endsect]


[section:expiry basic_waitable_timer::expiry]

[indexterm2 asio.indexterm.basic_waitable_timer.expiry..expiry..basic_waitable_timer] 
Get the timer's expiry time as an absolute time. 


  time_point expiry() const;


This function may be used to obtain the timer's current expiry time. Whether the timer has expired or not does not affect this value. 


[endsect]



[section:get_executor basic_waitable_timer::get_executor]

[indexterm2 asio.indexterm.basic_waitable_timer.get_executor..get_executor..basic_waitable_timer] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:operator_eq_ basic_waitable_timer::operator=]

[indexterm2 asio.indexterm.basic_waitable_timer.operator_eq_..operator=..basic_waitable_timer] 
Move-assign a [link asio.reference.basic_waitable_timer `basic_waitable_timer`] from another. 


  basic_waitable_timer & ``[link asio.reference.basic_waitable_timer.operator_eq_.overload1 operator=]``(
      basic_waitable_timer && other);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.operator_eq_.overload1 more...]]``

  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  enable_if< is_convertible< Executor1, Executor >::value, basic_waitable_timer & >::type ``[link asio.reference.basic_waitable_timer.operator_eq_.overload2 operator=]``(
      basic_waitable_timer< Clock, WaitTraits, Executor1 > && other);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.operator_eq_.overload2 more...]]``


[section:overload1 basic_waitable_timer::operator= (1 of 2 overloads)]


Move-assign a [link asio.reference.basic_waitable_timer `basic_waitable_timer`] from another. 


  basic_waitable_timer & operator=(
      basic_waitable_timer && other);


This assignment operator moves a timer from one object to another. Cancels any outstanding asynchronous operations associated with the target object.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_waitable_timer `basic_waitable_timer`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_waitable_timer(const executor_type&)` constructor. 




[endsect]



[section:overload2 basic_waitable_timer::operator= (2 of 2 overloads)]


Move-assign a [link asio.reference.basic_waitable_timer `basic_waitable_timer`] from another. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  enable_if< is_convertible< Executor1, Executor >::value, basic_waitable_timer & >::type operator=(
      basic_waitable_timer< Clock, WaitTraits, Executor1 > && other);


This assignment operator moves a timer from one object to another. Cancels any outstanding asynchronous operations associated with the target object.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.basic_waitable_timer `basic_waitable_timer`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_waitable_timer(const executor_type&)` constructor. 




[endsect]


[endsect]


[section:time_point basic_waitable_timer::time_point]

[indexterm2 asio.indexterm.basic_waitable_timer.time_point..time_point..basic_waitable_timer] 
The time point type of the clock. 


  typedef clock_type::time_point time_point;



[heading Requirements]

['Header: ][^asio/basic_waitable_timer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:traits_type basic_waitable_timer::traits_type]

[indexterm2 asio.indexterm.basic_waitable_timer.traits_type..traits_type..basic_waitable_timer] 
The wait traits type. 


  typedef WaitTraits traits_type;



[heading Requirements]

['Header: ][^asio/basic_waitable_timer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:wait basic_waitable_timer::wait]

[indexterm2 asio.indexterm.basic_waitable_timer.wait..wait..basic_waitable_timer] 
Perform a blocking wait on the timer. 


  void ``[link asio.reference.basic_waitable_timer.wait.overload1 wait]``();
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.wait.overload1 more...]]``

  void ``[link asio.reference.basic_waitable_timer.wait.overload2 wait]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.wait.overload2 more...]]``


[section:overload1 basic_waitable_timer::wait (1 of 2 overloads)]


Perform a blocking wait on the timer. 


  void wait();


This function is used to wait for the timer to expire. This function blocks and does not return until the timer has expired.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 basic_waitable_timer::wait (2 of 2 overloads)]


Perform a blocking wait on the timer. 


  void wait(
      asio::error_code & ec);


This function is used to wait for the timer to expire. This function blocks and does not return until the timer has expired.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. ]]

]




[endsect]


[endsect]


[section:_basic_waitable_timer basic_waitable_timer::~basic_waitable_timer]

[indexterm2 asio.indexterm.basic_waitable_timer._basic_waitable_timer..~basic_waitable_timer..basic_waitable_timer] 
Destroys the timer. 


  ~basic_waitable_timer();


This function destroys the timer, cancelling any outstanding asynchronous wait operations associated with the timer as if by calling `cancel`. 


[endsect]



[endsect]

[section:basic_waitable_timer__rebind_executor basic_waitable_timer::rebind_executor]


Rebinds the timer type to another executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  struct rebind_executor


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_waitable_timer__rebind_executor.other [*other]]]
    [The timer type when rebound to the specified executor. ]
  
  ]

]

[heading Requirements]

['Header: ][^asio/basic_waitable_timer.hpp]

['Convenience header: ][^asio.hpp]


[section:other basic_waitable_timer::rebind_executor::other]

[indexterm2 asio.indexterm.basic_waitable_timer__rebind_executor.other..other..basic_waitable_timer::rebind_executor] 
The timer type when rebound to the specified executor. 


  typedef basic_waitable_timer< Clock, WaitTraits, Executor1 > other;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_waitable_timer__rebind_executor [*rebind_executor]]]
    [Rebinds the timer type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.clock_type [*clock_type]]]
    [The clock type. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.duration [*duration]]]
    [The duration type of the clock. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.time_point [*time_point]]]
    [The time point type of the clock. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.traits_type [*traits_type]]]
    [The wait traits type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_waitable_timer.async_wait [*async_wait]]]
    [Start an asynchronous wait on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.basic_waitable_timer [*basic_waitable_timer]] [constructor]]
    [Constructor. 
     [hr]
     Constructor to set a particular expiry time as an absolute time. 
     [hr]
     Constructor to set a particular expiry time relative to now. 
     [hr]
     Move-construct a basic_waitable_timer from another. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.cancel [*cancel]]]
    [Cancel any asynchronous operations that are waiting on the timer. 
     [hr]
     (Deprecated: Use non-error_code overload.) Cancel any asynchronous operations that are waiting on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.cancel_one [*cancel_one]]]
    [Cancels one asynchronous operation that is waiting on the timer. 
     [hr]
     (Deprecated: Use non-error_code overload.) Cancels one asynchronous operation that is waiting on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.expires_after [*expires_after]]]
    [Set the timer's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.expires_at [*expires_at]]]
    [(Deprecated: Use expiry().) Get the timer's expiry time as an absolute time. 
     [hr]
     Set the timer's expiry time as an absolute time. 
     [hr]
     (Deprecated: Use non-error_code overload.) Set the timer's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.expires_from_now [*expires_from_now]]]
    [(Deprecated: Use expiry().) Get the timer's expiry time relative to now. 
     [hr]
     (Deprecated: Use expires_after().) Set the timer's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.expiry [*expiry]]]
    [Get the timer's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.operator_eq_ [*operator=]]]
    [Move-assign a basic_waitable_timer from another. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.wait [*wait]]]
    [Perform a blocking wait on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer._basic_waitable_timer [*~basic_waitable_timer]] [destructor]]
    [Destroys the timer. ]
  ]
  
]

The [link asio.reference.basic_waitable_timer `basic_waitable_timer`] class template provides the ability to perform a blocking or asynchronous wait for a timer to expire.

A waitable timer is always in one of two states: "expired" or "not expired". If the `wait()` or `async_wait()` function is called on an expired timer, the wait operation will complete immediately.

Most applications will use one of the [link asio.reference.steady_timer `steady_timer`], [link asio.reference.system_timer `system_timer`] or [link asio.reference.high_resolution_timer `high_resolution_timer`] typedefs.


[heading Remarks]
      
This waitable timer functionality is for use with the C++11 standard library's `<chrono>` facility, or with the Boost.Chrono library.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.


[heading Examples]
  
Performing a blocking wait (C++11): 

   // Construct a timer without setting an expiry time.
   asio::steady_timer timer(my_context);

   // Set an expiry time relative to now.
   timer.expires_after(std::chrono::seconds(5));

   // Wait for the timer to expire.
   timer.wait();





Performing an asynchronous wait (C++11): 

   void handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Timer expired.
     }
   }

   ...

   // Construct a timer with an absolute expiry time.
   asio::steady_timer timer(my_context,
       std::chrono::steady_clock::now() + std::chrono::seconds(60));

   // Start an asynchronous wait.
   timer.async_wait(handler);





[heading Changing an active waitable timer's expiry time]
  


Changing the expiry time of a timer while there are pending asynchronous waits causes those wait operations to be cancelled. To ensure that the action associated with the timer is performed only once, use something like this: used:



   void on_some_event()
   {
     if (my_timer.expires_after(seconds(5)) > 0)
     {
       // We managed to cancel the timer. Start new asynchronous wait.
       my_timer.async_wait(on_timeout);
     }
     else
     {
       // Too late, timer has already expired!
     }
   }

   void on_timeout(const asio::error_code& e)
   {
     if (e != asio::error::operation_aborted)
     {
       // Timer was not cancelled, take necessary action.
     }
   }





* The `asio::basic_waitable_timer::expires_after()` function cancels any pending asynchronous waits, and returns the number of asynchronous waits that were cancelled. If it returns 0 then you were too late and the wait handler has already been executed, or will soon be executed. If it returns 1 then the wait handler was successfully cancelled.


* If a wait handler is cancelled, the [link asio.reference.error_code `error_code`] passed to it contains the value `asio::error::operation_aborted`. 




[heading Requirements]

['Header: ][^asio/basic_waitable_timer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:basic_yield_context basic_yield_context]


Context object the represents the currently executing coroutine. 


  template<
      typename ``[link asio.reference.Handler Handler]``>
  class basic_yield_context


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_yield_context.callee_type [*callee_type]]]
    [The coroutine callee type, used by the implementation. ]
  
  ]

  [

    [[link asio.reference.basic_yield_context.caller_type [*caller_type]]]
    [The coroutine caller type, used by the implementation. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_yield_context.basic_yield_context [*basic_yield_context]] [constructor]]
    [Construct a yield context to represent the specified coroutine. 
     [hr]
     Construct a yield context from another yield context type. ]
  ]
  
  [
    [[link asio.reference.basic_yield_context.operator_lb__rb_ [*operator\[\]]]]
    [Return a yield context that sets the specified error_code. ]
  ]
  
]

The [link asio.reference.basic_yield_context `basic_yield_context`] class is used to represent the currently executing stackful coroutine. A [link asio.reference.basic_yield_context `basic_yield_context`] may be passed as a handler to an asynchronous operation. For example:



   template <typename Handler>
   void my_coroutine(basic_yield_context<Handler> yield)
   {
     ...
     std::size_t n = my_socket.async_read_some(buffer, yield);
     ...
   } 




The initiating function (async\_read\_some in the above example) suspends the current coroutine. The coroutine is resumed when the asynchronous operation completes, and the result of the operation is returned. 

[heading Requirements]

['Header: ][^asio/spawn.hpp]

['Convenience header: ]None

[section:basic_yield_context basic_yield_context::basic_yield_context]

[indexterm2 asio.indexterm.basic_yield_context.basic_yield_context..basic_yield_context..basic_yield_context] 
Construct a yield context to represent the specified coroutine. 


  ``[link asio.reference.basic_yield_context.basic_yield_context.overload1 basic_yield_context]``(
      const detail::weak_ptr< callee_type > & coro,
      caller_type & ca,
      Handler & handler);
  ``  [''''&raquo;''' [link asio.reference.basic_yield_context.basic_yield_context.overload1 more...]]``


Construct a yield context from another yield context type. 


  template<
      typename OtherHandler>
  ``[link asio.reference.basic_yield_context.basic_yield_context.overload2 basic_yield_context]``(
      const basic_yield_context< OtherHandler > & other);
  ``  [''''&raquo;''' [link asio.reference.basic_yield_context.basic_yield_context.overload2 more...]]``


[section:overload1 basic_yield_context::basic_yield_context (1 of 2 overloads)]


Construct a yield context to represent the specified coroutine. 


  basic_yield_context(
      const detail::weak_ptr< callee_type > & coro,
      caller_type & ca,
      Handler & handler);


Most applications do not need to use this constructor. Instead, the `spawn()` function passes a yield context as an argument to the coroutine function. 


[endsect]



[section:overload2 basic_yield_context::basic_yield_context (2 of 2 overloads)]


Construct a yield context from another yield context type. 


  template<
      typename OtherHandler>
  basic_yield_context(
      const basic_yield_context< OtherHandler > & other);


Requires that OtherHandler be convertible to Handler. 


[endsect]


[endsect]


[section:callee_type basic_yield_context::callee_type]

[indexterm2 asio.indexterm.basic_yield_context.callee_type..callee_type..basic_yield_context] 
The coroutine callee type, used by the implementation. 


  typedef implementation_defined callee_type;



When using Boost.Coroutine v1, this type is: 

   typename coroutine<void()> 


When using Boost.Coroutine v2 (unidirectional coroutines), this type is: 

   push_coroutine<void> 




[heading Requirements]

['Header: ][^asio/spawn.hpp]

['Convenience header: ]None


[endsect]



[section:caller_type basic_yield_context::caller_type]

[indexterm2 asio.indexterm.basic_yield_context.caller_type..caller_type..basic_yield_context] 
The coroutine caller type, used by the implementation. 


  typedef implementation_defined caller_type;



When using Boost.Coroutine v1, this type is: 

   typename coroutine<void()>::caller_type 


When using Boost.Coroutine v2 (unidirectional coroutines), this type is: 

   pull_coroutine<void> 




[heading Requirements]

['Header: ][^asio/spawn.hpp]

['Convenience header: ]None


[endsect]



[section:operator_lb__rb_ basic_yield_context::operator\[\]]

[indexterm2 asio.indexterm.basic_yield_context.operator_lb__rb_..operator\[\]..basic_yield_context] 
Return a yield context that sets the specified [link asio.reference.error_code `error_code`]. 


  basic_yield_context operator[](
      asio::error_code & ec) const;


By default, when a yield context is used with an asynchronous operation, a non-success [link asio.reference.error_code `error_code`] is converted to [link asio.reference.system_error `system_error`] and thrown. This operator may be used to specify an [link asio.reference.error_code `error_code`] object that should instead be set with the asynchronous operation's result. For example:



   template <typename Handler>
   void my_coroutine(basic_yield_context<Handler> yield)
   {
     ...
     std::size_t n = my_socket.async_read_some(buffer, yield[ec]);
     if (ec)
     {
       // An error occurred.
     }
     ...
   } 





[endsect]



[endsect]

[section:bind_executor bind_executor]

[indexterm1 asio.indexterm.bind_executor..bind_executor] 
Associate an object of type `T` with an executor of type `Executor`. 

  template<
      typename ``[link asio.reference.Executor1 Executor]``,
      typename T>
  executor_binder< typename decay< T >::type, Executor > ``[link asio.reference.bind_executor.overload1 bind_executor]``(
      const Executor & ex,
      T && t,
      typename enable_if< is_executor< Executor >::value||execution::is_executor< Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.bind_executor.overload1 more...]]``

Associate an object of type `T` with an execution context's executor. 

  template<
      typename ExecutionContext,
      typename T>
  executor_binder< typename decay< T >::type, typename ExecutionContext::executor_type > ``[link asio.reference.bind_executor.overload2 bind_executor]``(
      ExecutionContext & ctx,
      T && t,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.bind_executor.overload2 more...]]``

[heading Requirements]

['Header: ][^asio/bind_executor.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 bind_executor (1 of 2 overloads)]


Associate an object of type `T` with an executor of type `Executor`. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``,
      typename T>
  executor_binder< typename decay< T >::type, Executor > bind_executor(
      const Executor & ex,
      T && t,
      typename enable_if< is_executor< Executor >::value||execution::is_executor< Executor >::value >::type *  = 0);



[endsect]



[section:overload2 bind_executor (2 of 2 overloads)]


Associate an object of type `T` with an execution context's executor. 


  template<
      typename ExecutionContext,
      typename T>
  executor_binder< typename decay< T >::type, typename ExecutionContext::executor_type > bind_executor(
      ExecutionContext & ctx,
      T && t,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);



[endsect]


[endsect]

[section:buffer buffer]

[indexterm1 asio.indexterm.buffer..buffer] 
The `asio::buffer` function is used to create a buffer object to represent raw memory, an array of POD elements, a vector of POD elements, or a std::string. 


Create a new modifiable buffer from an existing buffer. 

  mutable_buffer ``[link asio.reference.buffer.overload1 buffer]``(
      const mutable_buffer & b);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload1 more...]]``

  mutable_buffer ``[link asio.reference.buffer.overload2 buffer]``(
      const mutable_buffer & b,
      std::size_t max_size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload2 more...]]``

Create a new non-modifiable buffer from an existing buffer. 

  const_buffer ``[link asio.reference.buffer.overload3 buffer]``(
      const const_buffer & b);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload3 more...]]``

  const_buffer ``[link asio.reference.buffer.overload4 buffer]``(
      const const_buffer & b,
      std::size_t max_size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload4 more...]]``

Create a new modifiable buffer that represents the given memory range. 

  mutable_buffer ``[link asio.reference.buffer.overload5 buffer]``(
      void * data,
      std::size_t size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload5 more...]]``

Create a new non-modifiable buffer that represents the given memory range. 

  const_buffer ``[link asio.reference.buffer.overload6 buffer]``(
      const void * data,
      std::size_t size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload6 more...]]``

Create a new modifiable buffer that represents the given POD array. 

  template<
      typename PodType,
      std::size_t N>
  mutable_buffer ``[link asio.reference.buffer.overload7 buffer]``(
      PodType (&data)[N]);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload7 more...]]``

  template<
      typename PodType,
      std::size_t N>
  mutable_buffer ``[link asio.reference.buffer.overload8 buffer]``(
      PodType (&data)[N],
      std::size_t max_size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload8 more...]]``

Create a new non-modifiable buffer that represents the given POD array. 

  template<
      typename PodType,
      std::size_t N>
  const_buffer ``[link asio.reference.buffer.overload9 buffer]``(
      const PodType (&data)[N]);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload9 more...]]``

  template<
      typename PodType,
      std::size_t N>
  const_buffer ``[link asio.reference.buffer.overload10 buffer]``(
      const PodType (&data)[N],
      std::size_t max_size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload10 more...]]``

Create a new modifiable buffer that represents the given POD array. 

  template<
      typename PodType,
      std::size_t N>
  mutable_buffer ``[link asio.reference.buffer.overload11 buffer]``(
      boost::array< PodType, N > & data);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload11 more...]]``

  template<
      typename PodType,
      std::size_t N>
  mutable_buffer ``[link asio.reference.buffer.overload12 buffer]``(
      boost::array< PodType, N > & data,
      std::size_t max_size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload12 more...]]``

Create a new non-modifiable buffer that represents the given POD array. 

  template<
      typename PodType,
      std::size_t N>
  const_buffer ``[link asio.reference.buffer.overload13 buffer]``(
      boost::array< const PodType, N > & data);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload13 more...]]``

  template<
      typename PodType,
      std::size_t N>
  const_buffer ``[link asio.reference.buffer.overload14 buffer]``(
      boost::array< const PodType, N > & data,
      std::size_t max_size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload14 more...]]``

  template<
      typename PodType,
      std::size_t N>
  const_buffer ``[link asio.reference.buffer.overload15 buffer]``(
      const boost::array< PodType, N > & data);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload15 more...]]``

  template<
      typename PodType,
      std::size_t N>
  const_buffer ``[link asio.reference.buffer.overload16 buffer]``(
      const boost::array< PodType, N > & data,
      std::size_t max_size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload16 more...]]``

Create a new modifiable buffer that represents the given POD array. 

  template<
      typename PodType,
      std::size_t N>
  mutable_buffer ``[link asio.reference.buffer.overload17 buffer]``(
      std::array< PodType, N > & data);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload17 more...]]``

  template<
      typename PodType,
      std::size_t N>
  mutable_buffer ``[link asio.reference.buffer.overload18 buffer]``(
      std::array< PodType, N > & data,
      std::size_t max_size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload18 more...]]``

Create a new non-modifiable buffer that represents the given POD array. 

  template<
      typename PodType,
      std::size_t N>
  const_buffer ``[link asio.reference.buffer.overload19 buffer]``(
      std::array< const PodType, N > & data);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload19 more...]]``

  template<
      typename PodType,
      std::size_t N>
  const_buffer ``[link asio.reference.buffer.overload20 buffer]``(
      std::array< const PodType, N > & data,
      std::size_t max_size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload20 more...]]``

  template<
      typename PodType,
      std::size_t N>
  const_buffer ``[link asio.reference.buffer.overload21 buffer]``(
      const std::array< PodType, N > & data);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload21 more...]]``

  template<
      typename PodType,
      std::size_t N>
  const_buffer ``[link asio.reference.buffer.overload22 buffer]``(
      const std::array< PodType, N > & data,
      std::size_t max_size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload22 more...]]``

Create a new modifiable buffer that represents the given POD vector. 

  template<
      typename PodType,
      typename Allocator>
  mutable_buffer ``[link asio.reference.buffer.overload23 buffer]``(
      std::vector< PodType, Allocator > & data);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload23 more...]]``

  template<
      typename PodType,
      typename Allocator>
  mutable_buffer ``[link asio.reference.buffer.overload24 buffer]``(
      std::vector< PodType, Allocator > & data,
      std::size_t max_size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload24 more...]]``

Create a new non-modifiable buffer that represents the given POD vector. 

  template<
      typename PodType,
      typename Allocator>
  const_buffer ``[link asio.reference.buffer.overload25 buffer]``(
      const std::vector< PodType, Allocator > & data);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload25 more...]]``

  template<
      typename PodType,
      typename Allocator>
  const_buffer ``[link asio.reference.buffer.overload26 buffer]``(
      const std::vector< PodType, Allocator > & data,
      std::size_t max_size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload26 more...]]``

Create a new modifiable buffer that represents the given string. 

  template<
      typename Elem,
      typename Traits,
      typename Allocator>
  mutable_buffer ``[link asio.reference.buffer.overload27 buffer]``(
      std::basic_string< Elem, Traits, Allocator > & data);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload27 more...]]``

  template<
      typename Elem,
      typename Traits,
      typename Allocator>
  mutable_buffer ``[link asio.reference.buffer.overload28 buffer]``(
      std::basic_string< Elem, Traits, Allocator > & data,
      std::size_t max_size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload28 more...]]``

Create a new non-modifiable buffer that represents the given string. 

  template<
      typename Elem,
      typename Traits,
      typename Allocator>
  const_buffer ``[link asio.reference.buffer.overload29 buffer]``(
      const std::basic_string< Elem, Traits, Allocator > & data);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload29 more...]]``

  template<
      typename Elem,
      typename Traits,
      typename Allocator>
  const_buffer ``[link asio.reference.buffer.overload30 buffer]``(
      const std::basic_string< Elem, Traits, Allocator > & data,
      std::size_t max_size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload30 more...]]``

Create a new modifiable buffer that represents the given string\_view. 

  template<
      typename Elem,
      typename Traits>
  const_buffer ``[link asio.reference.buffer.overload31 buffer]``(
      basic_string_view< Elem, Traits > data);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload31 more...]]``

Create a new non-modifiable buffer that represents the given string. 

  template<
      typename Elem,
      typename Traits>
  const_buffer ``[link asio.reference.buffer.overload32 buffer]``(
      basic_string_view< Elem, Traits > data,
      std::size_t max_size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload32 more...]]``

A buffer object represents a contiguous region of memory as a 2-tuple consisting of a pointer and size in bytes. A tuple of the form `{void*, size_t}` specifies a mutable (modifiable) region of memory. Similarly, a tuple of the form `{const void*, size_t}` specifies a const (non-modifiable) region of memory. These two forms correspond to the classes [link asio.reference.mutable_buffer `mutable_buffer`] and [link asio.reference.const_buffer `const_buffer`], respectively. To mirror C++'s conversion rules, a [link asio.reference.mutable_buffer `mutable_buffer`] is implicitly convertible to a [link asio.reference.const_buffer `const_buffer`], and the opposite conversion is not permitted.

The simplest use case involves reading or writing a single buffer of a specified size:



   sock.send(asio::buffer(data, size)); 




In the above example, the return value of `asio::buffer` meets the requirements of the ConstBufferSequence concept so that it may be directly passed to the socket's write function. A buffer created for modifiable memory also meets the requirements of the MutableBufferSequence concept.

An individual buffer may be created from a builtin array, std::vector, std::array or boost::array of POD elements. This helps prevent buffer overruns by automatically determining the size of the buffer:



   char d1[128];
   size_t bytes_transferred = sock.receive(asio::buffer(d1));

   std::vector<char> d2(128);
   bytes_transferred = sock.receive(asio::buffer(d2));

   std::array<char, 128> d3;
   bytes_transferred = sock.receive(asio::buffer(d3));

   boost::array<char, 128> d4;
   bytes_transferred = sock.receive(asio::buffer(d4)); 




In all three cases above, the buffers created are exactly 128 bytes long. Note that a vector is ['never] automatically resized when creating or using a buffer. The buffer size is determined using the vector's `size()` member function, and not its capacity.


[heading Accessing Buffer Contents]
  


The contents of a buffer may be accessed using the `data()` and `size()` member functions:



   asio::mutable_buffer b1 = ...;
   std::size_t s1 = b1.size();
   unsigned char* p1 = static_cast<unsigned char*>(b1.data());

   asio::const_buffer b2 = ...;
   std::size_t s2 = b2.size();
   const void* p2 = b2.data(); 




The `data()` member function permits violations of type safety, so uses of it in application code should be carefully considered.

For convenience, a [link asio.reference.buffer_size `buffer_size`]  function is provided that works with both buffers and buffer sequences (that is, types meeting the ConstBufferSequence or MutableBufferSequence type requirements). In this case, the function returns the total size of all buffers in the sequence.


[heading Buffer Copying]
  


The [link asio.reference.buffer_copy `buffer_copy`]  function may be used to copy raw bytes between individual buffers and buffer sequences.

In particular, when used with the [link asio.reference.buffer_size `buffer_size`]  function, the [link asio.reference.buffer_copy `buffer_copy`]  function can be used to linearise a sequence of buffers. For example:



   vector<const_buffer> buffers = ...;

   vector<unsigned char> data(asio::buffer_size(buffers));
   asio::buffer_copy(asio::buffer(data), buffers); 




Note that [link asio.reference.buffer_copy `buffer_copy`]  is implemented in terms of `memcpy`, and consequently it cannot be used to copy between overlapping memory regions.


[heading Buffer Invalidation]
  


A buffer object does not have any ownership of the memory it refers to. It is the responsibility of the application to ensure the memory region remains valid until it is no longer required for an I/O operation. When the memory is no longer available, the buffer is said to have been invalidated.

For the `asio::buffer` overloads that accept an argument of type std::vector, the buffer objects returned are invalidated by any vector operation that also invalidates all references, pointers and iterators referring to the elements in the sequence (C++ Std, 23.2.4)

For the `asio::buffer` overloads that accept an argument of type std::basic\_string, the buffer objects returned are invalidated according to the rules defined for invalidation of references, pointers and iterators referring to elements of the sequence (C++ Std, 21.3).


[heading Buffer Arithmetic]
  


Buffer objects may be manipulated using simple arithmetic in a safe way which helps prevent buffer overruns. Consider an array initialised as follows:



   boost::array<char, 6> a = { 'a', 'b', 'c', 'd', 'e' }; 




A buffer object `b1` created using:



   b1 = asio::buffer(a); 




represents the entire array, `{ 'a', 'b', 'c', 'd', 'e' }`. An optional second argument to the `asio::buffer` function may be used to limit the size, in bytes, of the buffer:



   b2 = asio::buffer(a, 3); 




such that `b2` represents the data `{ 'a', 'b', 'c' }`. Even if the size argument exceeds the actual size of the array, the size of the buffer object created will be limited to the array size.

An offset may be applied to an existing buffer to create a new one:



   b3 = b1 + 2; 




where `b3` will set to represent `{ 'c', 'd', 'e' }`. If the offset exceeds the size of the existing buffer, the newly created buffer will be empty.

Both an offset and size may be specified to create a buffer that corresponds to a specific range of bytes within an existing buffer:



   b4 = asio::buffer(b1 + 1, 3); 




so that `b4` will refer to the bytes `{ 'b', 'c', 'd' }`.


[heading Buffers and Scatter-Gather I/O]
  


To read or write using multiple buffers (i.e. scatter-gather I/O), multiple buffer objects may be assigned into a container that supports the MutableBufferSequence (for read) or ConstBufferSequence (for write) concepts:



   char d1[128];
   std::vector<char> d2(128);
   boost::array<char, 128> d3;

   boost::array<mutable_buffer, 3> bufs1 = {
     asio::buffer(d1),
     asio::buffer(d2),
     asio::buffer(d3) };
   bytes_transferred = sock.receive(bufs1);

   std::vector<const_buffer> bufs2;
   bufs2.push_back(asio::buffer(d1));
   bufs2.push_back(asio::buffer(d2));
   bufs2.push_back(asio::buffer(d3));
   bytes_transferred = sock.send(bufs2); 




[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 buffer (1 of 32 overloads)]


Create a new modifiable buffer from an existing buffer. 


  mutable_buffer buffer(
      const mutable_buffer & b);



[heading Return Value]
      
`mutable_buffer(b)`. 




[endsect]



[section:overload2 buffer (2 of 32 overloads)]


Create a new modifiable buffer from an existing buffer. 


  mutable_buffer buffer(
      const mutable_buffer & b,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.mutable_buffer `mutable_buffer`] value equivalent to: 

   mutable_buffer(
       b.data(),
       min(b.size(), max_size_in_bytes)); 







[endsect]



[section:overload3 buffer (3 of 32 overloads)]


Create a new non-modifiable buffer from an existing buffer. 


  const_buffer buffer(
      const const_buffer & b);



[heading Return Value]
      
`const_buffer(b)`. 




[endsect]



[section:overload4 buffer (4 of 32 overloads)]


Create a new non-modifiable buffer from an existing buffer. 


  const_buffer buffer(
      const const_buffer & b,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.const_buffer `const_buffer`] value equivalent to: 

   const_buffer(
       b.data(),
       min(b.size(), max_size_in_bytes)); 







[endsect]



[section:overload5 buffer (5 of 32 overloads)]


Create a new modifiable buffer that represents the given memory range. 


  mutable_buffer buffer(
      void * data,
      std::size_t size_in_bytes);



[heading Return Value]
      
`mutable_buffer(data, size_in_bytes)`. 




[endsect]



[section:overload6 buffer (6 of 32 overloads)]


Create a new non-modifiable buffer that represents the given memory range. 


  const_buffer buffer(
      const void * data,
      std::size_t size_in_bytes);



[heading Return Value]
      
`const_buffer(data, size_in_bytes)`. 




[endsect]



[section:overload7 buffer (7 of 32 overloads)]


Create a new modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  mutable_buffer buffer(
      PodType (&data)[N]);



[heading Return Value]
      
A [link asio.reference.mutable_buffer `mutable_buffer`] value equivalent to: 

   mutable_buffer(
       static_cast<void*>(data),
       N * sizeof(PodType)); 







[endsect]



[section:overload8 buffer (8 of 32 overloads)]


Create a new modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  mutable_buffer buffer(
      PodType (&data)[N],
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.mutable_buffer `mutable_buffer`] value equivalent to: 

   mutable_buffer(
       static_cast<void*>(data),
       min(N * sizeof(PodType), max_size_in_bytes)); 







[endsect]



[section:overload9 buffer (9 of 32 overloads)]


Create a new non-modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  const_buffer buffer(
      const PodType (&data)[N]);



[heading Return Value]
      
A [link asio.reference.const_buffer `const_buffer`] value equivalent to: 

   const_buffer(
       static_cast<const void*>(data),
       N * sizeof(PodType)); 







[endsect]



[section:overload10 buffer (10 of 32 overloads)]


Create a new non-modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  const_buffer buffer(
      const PodType (&data)[N],
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.const_buffer `const_buffer`] value equivalent to: 

   const_buffer(
       static_cast<const void*>(data),
       min(N * sizeof(PodType), max_size_in_bytes)); 







[endsect]



[section:overload11 buffer (11 of 32 overloads)]


Create a new modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  mutable_buffer buffer(
      boost::array< PodType, N > & data);



[heading Return Value]
      
A [link asio.reference.mutable_buffer `mutable_buffer`] value equivalent to: 

   mutable_buffer(
       data.data(),
       data.size() * sizeof(PodType)); 







[endsect]



[section:overload12 buffer (12 of 32 overloads)]


Create a new modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  mutable_buffer buffer(
      boost::array< PodType, N > & data,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.mutable_buffer `mutable_buffer`] value equivalent to: 

   mutable_buffer(
       data.data(),
       min(data.size() * sizeof(PodType), max_size_in_bytes)); 







[endsect]



[section:overload13 buffer (13 of 32 overloads)]


Create a new non-modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  const_buffer buffer(
      boost::array< const PodType, N > & data);



[heading Return Value]
      
A [link asio.reference.const_buffer `const_buffer`] value equivalent to: 

   const_buffer(
       data.data(),
       data.size() * sizeof(PodType)); 







[endsect]



[section:overload14 buffer (14 of 32 overloads)]


Create a new non-modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  const_buffer buffer(
      boost::array< const PodType, N > & data,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.const_buffer `const_buffer`] value equivalent to: 

   const_buffer(
       data.data(),
       min(data.size() * sizeof(PodType), max_size_in_bytes)); 







[endsect]



[section:overload15 buffer (15 of 32 overloads)]


Create a new non-modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  const_buffer buffer(
      const boost::array< PodType, N > & data);



[heading Return Value]
      
A [link asio.reference.const_buffer `const_buffer`] value equivalent to: 

   const_buffer(
       data.data(),
       data.size() * sizeof(PodType)); 







[endsect]



[section:overload16 buffer (16 of 32 overloads)]


Create a new non-modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  const_buffer buffer(
      const boost::array< PodType, N > & data,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.const_buffer `const_buffer`] value equivalent to: 

   const_buffer(
       data.data(),
       min(data.size() * sizeof(PodType), max_size_in_bytes)); 







[endsect]



[section:overload17 buffer (17 of 32 overloads)]


Create a new modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  mutable_buffer buffer(
      std::array< PodType, N > & data);



[heading Return Value]
      
A [link asio.reference.mutable_buffer `mutable_buffer`] value equivalent to: 

   mutable_buffer(
       data.data(),
       data.size() * sizeof(PodType)); 







[endsect]



[section:overload18 buffer (18 of 32 overloads)]


Create a new modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  mutable_buffer buffer(
      std::array< PodType, N > & data,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.mutable_buffer `mutable_buffer`] value equivalent to: 

   mutable_buffer(
       data.data(),
       min(data.size() * sizeof(PodType), max_size_in_bytes)); 







[endsect]



[section:overload19 buffer (19 of 32 overloads)]


Create a new non-modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  const_buffer buffer(
      std::array< const PodType, N > & data);



[heading Return Value]
      
A [link asio.reference.const_buffer `const_buffer`] value equivalent to: 

   const_buffer(
       data.data(),
       data.size() * sizeof(PodType)); 







[endsect]



[section:overload20 buffer (20 of 32 overloads)]


Create a new non-modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  const_buffer buffer(
      std::array< const PodType, N > & data,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.const_buffer `const_buffer`] value equivalent to: 

   const_buffer(
       data.data(),
       min(data.size() * sizeof(PodType), max_size_in_bytes)); 







[endsect]



[section:overload21 buffer (21 of 32 overloads)]


Create a new non-modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  const_buffer buffer(
      const std::array< PodType, N > & data);



[heading Return Value]
      
A [link asio.reference.const_buffer `const_buffer`] value equivalent to: 

   const_buffer(
       data.data(),
       data.size() * sizeof(PodType)); 







[endsect]



[section:overload22 buffer (22 of 32 overloads)]


Create a new non-modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  const_buffer buffer(
      const std::array< PodType, N > & data,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.const_buffer `const_buffer`] value equivalent to: 

   const_buffer(
       data.data(),
       min(data.size() * sizeof(PodType), max_size_in_bytes)); 







[endsect]



[section:overload23 buffer (23 of 32 overloads)]


Create a new modifiable buffer that represents the given POD vector. 


  template<
      typename PodType,
      typename Allocator>
  mutable_buffer buffer(
      std::vector< PodType, Allocator > & data);



[heading Return Value]
      
A [link asio.reference.mutable_buffer `mutable_buffer`] value equivalent to: 

   mutable_buffer(
       data.size() ? &data[0] : 0,
       data.size() * sizeof(PodType)); 





[heading Remarks]
      
The buffer is invalidated by any vector operation that would also invalidate iterators. 




[endsect]



[section:overload24 buffer (24 of 32 overloads)]


Create a new modifiable buffer that represents the given POD vector. 


  template<
      typename PodType,
      typename Allocator>
  mutable_buffer buffer(
      std::vector< PodType, Allocator > & data,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.mutable_buffer `mutable_buffer`] value equivalent to: 

   mutable_buffer(
       data.size() ? &data[0] : 0,
       min(data.size() * sizeof(PodType), max_size_in_bytes)); 





[heading Remarks]
      
The buffer is invalidated by any vector operation that would also invalidate iterators. 




[endsect]



[section:overload25 buffer (25 of 32 overloads)]


Create a new non-modifiable buffer that represents the given POD vector. 


  template<
      typename PodType,
      typename Allocator>
  const_buffer buffer(
      const std::vector< PodType, Allocator > & data);



[heading Return Value]
      
A [link asio.reference.const_buffer `const_buffer`] value equivalent to: 

   const_buffer(
       data.size() ? &data[0] : 0,
       data.size() * sizeof(PodType)); 





[heading Remarks]
      
The buffer is invalidated by any vector operation that would also invalidate iterators. 




[endsect]



[section:overload26 buffer (26 of 32 overloads)]


Create a new non-modifiable buffer that represents the given POD vector. 


  template<
      typename PodType,
      typename Allocator>
  const_buffer buffer(
      const std::vector< PodType, Allocator > & data,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.const_buffer `const_buffer`] value equivalent to: 

   const_buffer(
       data.size() ? &data[0] : 0,
       min(data.size() * sizeof(PodType), max_size_in_bytes)); 





[heading Remarks]
      
The buffer is invalidated by any vector operation that would also invalidate iterators. 




[endsect]



[section:overload27 buffer (27 of 32 overloads)]


Create a new modifiable buffer that represents the given string. 


  template<
      typename Elem,
      typename Traits,
      typename Allocator>
  mutable_buffer buffer(
      std::basic_string< Elem, Traits, Allocator > & data);



[heading Return Value]
      
`mutable_buffer(data.size() ? &data[0] : 0, data.size() * sizeof(Elem))`.


[heading Remarks]
      
The buffer is invalidated by any non-const operation called on the given string object. 




[endsect]



[section:overload28 buffer (28 of 32 overloads)]


Create a new modifiable buffer that represents the given string. 


  template<
      typename Elem,
      typename Traits,
      typename Allocator>
  mutable_buffer buffer(
      std::basic_string< Elem, Traits, Allocator > & data,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.mutable_buffer `mutable_buffer`] value equivalent to: 

   mutable_buffer(
       data.size() ? &data[0] : 0,
       min(data.size() * sizeof(Elem), max_size_in_bytes)); 





[heading Remarks]
      
The buffer is invalidated by any non-const operation called on the given string object. 




[endsect]



[section:overload29 buffer (29 of 32 overloads)]


Create a new non-modifiable buffer that represents the given string. 


  template<
      typename Elem,
      typename Traits,
      typename Allocator>
  const_buffer buffer(
      const std::basic_string< Elem, Traits, Allocator > & data);



[heading Return Value]
      
`const_buffer(data.data(), data.size() * sizeof(Elem))`.


[heading Remarks]
      
The buffer is invalidated by any non-const operation called on the given string object. 




[endsect]



[section:overload30 buffer (30 of 32 overloads)]


Create a new non-modifiable buffer that represents the given string. 


  template<
      typename Elem,
      typename Traits,
      typename Allocator>
  const_buffer buffer(
      const std::basic_string< Elem, Traits, Allocator > & data,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.const_buffer `const_buffer`] value equivalent to: 

   const_buffer(
       data.data(),
       min(data.size() * sizeof(Elem), max_size_in_bytes)); 





[heading Remarks]
      
The buffer is invalidated by any non-const operation called on the given string object. 




[endsect]



[section:overload31 buffer (31 of 32 overloads)]


Create a new modifiable buffer that represents the given string\_view. 


  template<
      typename Elem,
      typename Traits>
  const_buffer buffer(
      basic_string_view< Elem, Traits > data);



[heading Return Value]
      
`mutable_buffer(data.size() ? &data[0] : 0, data.size() * sizeof(Elem))`. 




[endsect]



[section:overload32 buffer (32 of 32 overloads)]


Create a new non-modifiable buffer that represents the given string. 


  template<
      typename Elem,
      typename Traits>
  const_buffer buffer(
      basic_string_view< Elem, Traits > data,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.mutable_buffer `mutable_buffer`] value equivalent to: 

   mutable_buffer(
       data.size() ? &data[0] : 0,
       min(data.size() * sizeof(Elem), max_size_in_bytes)); 







[endsect]


[endsect]

[section:buffer_cast buffer_cast]

[indexterm1 asio.indexterm.buffer_cast..buffer_cast] 
(Deprecated: Use the `data()` member function.) The `asio::buffer_cast` function is used to obtain a pointer to the underlying memory region associated with a buffer. 


Cast a non-modifiable buffer to a specified pointer to POD type. 

  template<
      typename PointerToPodType>
  PointerToPodType ``[link asio.reference.buffer_cast.overload1 buffer_cast]``(
      const mutable_buffer & b);
  ``  [''''&raquo;''' [link asio.reference.buffer_cast.overload1 more...]]``

  template<
      typename PointerToPodType>
  PointerToPodType ``[link asio.reference.buffer_cast.overload2 buffer_cast]``(
      const const_buffer & b);
  ``  [''''&raquo;''' [link asio.reference.buffer_cast.overload2 more...]]``


[heading Examples:]
  


To access the memory of a non-modifiable buffer, use: 

   asio::const_buffer b1 = ...;
   const unsigned char* p1 = asio::buffer_cast<const unsigned char*>(b1);




To access the memory of a modifiable buffer, use: 

   asio::mutable_buffer b2 = ...;
   unsigned char* p2 = asio::buffer_cast<unsigned char*>(b2);




The `asio::buffer_cast` function permits violations of type safety, so uses of it in application code should be carefully considered. 

[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 buffer_cast (1 of 2 overloads)]


Cast a non-modifiable buffer to a specified pointer to POD type. 


  template<
      typename PointerToPodType>
  PointerToPodType buffer_cast(
      const mutable_buffer & b);



[endsect]



[section:overload2 buffer_cast (2 of 2 overloads)]


Cast a non-modifiable buffer to a specified pointer to POD type. 


  template<
      typename PointerToPodType>
  PointerToPodType buffer_cast(
      const const_buffer & b);



[endsect]


[endsect]

[section:buffer_copy buffer_copy]

[indexterm1 asio.indexterm.buffer_copy..buffer_copy] 
The `asio::buffer_copy` function is used to copy bytes from a source buffer (or buffer sequence) to a target buffer (or buffer sequence). 


Copies bytes from a source buffer sequence to a target buffer sequence. 

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.buffer_copy.overload1 buffer_copy]``(
      const MutableBufferSequence & target,
      const ConstBufferSequence & source);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload1 more...]]``

Copies a limited number of bytes from a source buffer sequence to a target buffer sequence. 

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.buffer_copy.overload2 buffer_copy]``(
      const MutableBufferSequence & target,
      const ConstBufferSequence & source,
      std::size_t max_bytes_to_copy);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload2 more...]]``

The `buffer_copy` function is available in two forms:


* A 2-argument form: `buffer_copy(target, source)` 


* A 3-argument form: `buffer_copy(target, source, max_bytes_to_copy)` 

Both forms return the number of bytes actually copied. The number of bytes copied is the lesser of:


* `buffer_size(target)` 


* `buffer_size(source)` 


* `If` specified, `max_bytes_to_copy`.

This prevents buffer overflow, regardless of the buffer sizes used in the copy operation.

Note that [link asio.reference.buffer_copy `buffer_copy`]  is implemented in terms of `memcpy`, and consequently it cannot be used to copy between overlapping memory regions. 

[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 buffer_copy (1 of 2 overloads)]


Copies bytes from a source buffer sequence to a target buffer sequence. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t buffer_copy(
      const MutableBufferSequence & target,
      const ConstBufferSequence & source);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer sequence representing the memory regions to which the bytes will be copied.]]

[[source][A non-modifiable buffer sequence representing the memory regions from which the bytes will be copied.]]

]


[heading Return Value]
      
The number of bytes copied.


[heading Remarks]
      
The number of bytes copied is the lesser of:


* `buffer_size(target)` 


* `buffer_size(source)` 

This function is implemented in terms of `memcpy`, and consequently it cannot be used to copy between overlapping memory regions. 


[endsect]



[section:overload2 buffer_copy (2 of 2 overloads)]


Copies a limited number of bytes from a source buffer sequence to a target buffer sequence. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t buffer_copy(
      const MutableBufferSequence & target,
      const ConstBufferSequence & source,
      std::size_t max_bytes_to_copy);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer sequence representing the memory regions to which the bytes will be copied.]]

[[source][A non-modifiable buffer sequence representing the memory regions from which the bytes will be copied.]]

[[max_bytes_to_copy][The maximum number of bytes to be copied.]]

]


[heading Return Value]
      
The number of bytes copied.


[heading Remarks]
      
The number of bytes copied is the lesser of:


* `buffer_size(target)` 


* `buffer_size(source)` 


* `max_bytes_to_copy` 

This function is implemented in terms of `memcpy`, and consequently it cannot be used to copy between overlapping memory regions. 


[endsect]


[endsect]

[section:buffer_sequence_begin buffer_sequence_begin]

[indexterm1 asio.indexterm.buffer_sequence_begin..buffer_sequence_begin] 
The `asio::buffer_sequence_begin` function returns an iterator pointing to the first element in a buffer sequence. 


Get an iterator to the first element in a buffer sequence. 

  template<
      typename MutableBuffer>
  const mutable_buffer * ``[link asio.reference.buffer_sequence_begin.overload1 buffer_sequence_begin]``(
      const MutableBuffer & b,
      typename enable_if< is_convertible< const MutableBuffer *, const mutable_buffer * >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_sequence_begin.overload1 more...]]``

  template<
      typename ConstBuffer>
  const const_buffer * ``[link asio.reference.buffer_sequence_begin.overload2 buffer_sequence_begin]``(
      const ConstBuffer & b,
      typename enable_if< is_convertible< const ConstBuffer *, const const_buffer * >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_sequence_begin.overload2 more...]]``

  template<
      typename C>
  auto ``[link asio.reference.buffer_sequence_begin.overload3 buffer_sequence_begin]``(
      C & c,
      typename enable_if< !is_convertible< const C *, const mutable_buffer * >::value &&!is_convertible< const C *, const const_buffer * >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_sequence_begin.overload3 more...]]``

  template<
      typename C>
  auto ``[link asio.reference.buffer_sequence_begin.overload4 buffer_sequence_begin]``(
      const C & c,
      typename enable_if< !is_convertible< const C *, const mutable_buffer * >::value &&!is_convertible< const C *, const const_buffer * >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_sequence_begin.overload4 more...]]``

[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 buffer_sequence_begin (1 of 4 overloads)]


Get an iterator to the first element in a buffer sequence. 


  template<
      typename MutableBuffer>
  const mutable_buffer * buffer_sequence_begin(
      const MutableBuffer & b,
      typename enable_if< is_convertible< const MutableBuffer *, const mutable_buffer * >::value >::type *  = 0);



[endsect]



[section:overload2 buffer_sequence_begin (2 of 4 overloads)]


Get an iterator to the first element in a buffer sequence. 


  template<
      typename ConstBuffer>
  const const_buffer * buffer_sequence_begin(
      const ConstBuffer & b,
      typename enable_if< is_convertible< const ConstBuffer *, const const_buffer * >::value >::type *  = 0);



[endsect]



[section:overload3 buffer_sequence_begin (3 of 4 overloads)]


Get an iterator to the first element in a buffer sequence. 


  template<
      typename C>
  auto buffer_sequence_begin(
      C & c,
      typename enable_if< !is_convertible< const C *, const mutable_buffer * >::value &&!is_convertible< const C *, const const_buffer * >::value >::type *  = 0);



[endsect]



[section:overload4 buffer_sequence_begin (4 of 4 overloads)]


Get an iterator to the first element in a buffer sequence. 


  template<
      typename C>
  auto buffer_sequence_begin(
      const C & c,
      typename enable_if< !is_convertible< const C *, const mutable_buffer * >::value &&!is_convertible< const C *, const const_buffer * >::value >::type *  = 0);



[endsect]


[endsect]

[section:buffer_sequence_end buffer_sequence_end]

[indexterm1 asio.indexterm.buffer_sequence_end..buffer_sequence_end] 
The `asio::buffer_sequence_end` function returns an iterator pointing to one past the end element in a buffer sequence. 


Get an iterator to one past the end element in a buffer sequence. 

  template<
      typename MutableBuffer>
  const mutable_buffer * ``[link asio.reference.buffer_sequence_end.overload1 buffer_sequence_end]``(
      const MutableBuffer & b,
      typename enable_if< is_convertible< const MutableBuffer *, const mutable_buffer * >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_sequence_end.overload1 more...]]``

  template<
      typename ConstBuffer>
  const const_buffer * ``[link asio.reference.buffer_sequence_end.overload2 buffer_sequence_end]``(
      const ConstBuffer & b,
      typename enable_if< is_convertible< const ConstBuffer *, const const_buffer * >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_sequence_end.overload2 more...]]``

  template<
      typename C>
  auto ``[link asio.reference.buffer_sequence_end.overload3 buffer_sequence_end]``(
      C & c,
      typename enable_if< !is_convertible< const C *, const mutable_buffer * >::value &&!is_convertible< const C *, const const_buffer * >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_sequence_end.overload3 more...]]``

  template<
      typename C>
  auto ``[link asio.reference.buffer_sequence_end.overload4 buffer_sequence_end]``(
      const C & c,
      typename enable_if< !is_convertible< const C *, const mutable_buffer * >::value &&!is_convertible< const C *, const const_buffer * >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_sequence_end.overload4 more...]]``

[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 buffer_sequence_end (1 of 4 overloads)]


Get an iterator to one past the end element in a buffer sequence. 


  template<
      typename MutableBuffer>
  const mutable_buffer * buffer_sequence_end(
      const MutableBuffer & b,
      typename enable_if< is_convertible< const MutableBuffer *, const mutable_buffer * >::value >::type *  = 0);



[endsect]



[section:overload2 buffer_sequence_end (2 of 4 overloads)]


Get an iterator to one past the end element in a buffer sequence. 


  template<
      typename ConstBuffer>
  const const_buffer * buffer_sequence_end(
      const ConstBuffer & b,
      typename enable_if< is_convertible< const ConstBuffer *, const const_buffer * >::value >::type *  = 0);



[endsect]



[section:overload3 buffer_sequence_end (3 of 4 overloads)]


Get an iterator to one past the end element in a buffer sequence. 


  template<
      typename C>
  auto buffer_sequence_end(
      C & c,
      typename enable_if< !is_convertible< const C *, const mutable_buffer * >::value &&!is_convertible< const C *, const const_buffer * >::value >::type *  = 0);



[endsect]



[section:overload4 buffer_sequence_end (4 of 4 overloads)]


Get an iterator to one past the end element in a buffer sequence. 


  template<
      typename C>
  auto buffer_sequence_end(
      const C & c,
      typename enable_if< !is_convertible< const C *, const mutable_buffer * >::value &&!is_convertible< const C *, const const_buffer * >::value >::type *  = 0);



[endsect]


[endsect]


[section:buffer_size buffer_size]

[indexterm1 asio.indexterm.buffer_size..buffer_size] 
Get the total number of bytes in a buffer sequence. 


  template<
      typename BufferSequence>
  std::size_t buffer_size(
      const BufferSequence & b);


The `buffer_size` function determines the total size of all buffers in the buffer sequence, as if computed as follows:



   size_t total_size = 0;
   auto i = asio::buffer_sequence_begin(buffers);
   auto end = asio::buffer_sequence_end(buffers);
   for (; i != end; ++i)
   {
     const_buffer b(*i);
     total_size += b.size();
   }
   return total_size; 




The `BufferSequence` template parameter may meet either of the `ConstBufferSequence` or `MutableBufferSequence` type requirements. 

[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:buffered_read_stream buffered_read_stream]


Adds buffering to the read-related operations of a stream. 


  template<
      typename Stream>
  class buffered_read_stream :
    noncopyable


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.buffered_read_stream.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.buffered_read_stream.lowest_layer_type [*lowest_layer_type]]]
    [The type of the lowest layer. ]
  
  ]

  [

    [[link asio.reference.buffered_read_stream.next_layer_type [*next_layer_type]]]
    [The type of the next layer. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.buffered_read_stream.async_fill [*async_fill]]]
    [Start an asynchronous fill. ]
  ]
  
  [
    [[link asio.reference.buffered_read_stream.async_read_some [*async_read_some]]]
    [Start an asynchronous read. The buffer into which the data will be read must be valid for the lifetime of the asynchronous operation. ]
  ]
  
  [
    [[link asio.reference.buffered_read_stream.async_write_some [*async_write_some]]]
    [Start an asynchronous write. The data being written must be valid for the lifetime of the asynchronous operation. ]
  ]
  
  [
    [[link asio.reference.buffered_read_stream.buffered_read_stream [*buffered_read_stream]] [constructor]]
    [Construct, passing the specified argument to initialise the next layer. ]
  ]
  
  [
    [[link asio.reference.buffered_read_stream.close [*close]]]
    [Close the stream. ]
  ]
  
  [
    [[link asio.reference.buffered_read_stream.fill [*fill]]]
    [Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation. Throws an exception on failure. 
     [hr]
     Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation, or 0 if an error occurred. ]
  ]
  
  [
    [[link asio.reference.buffered_read_stream.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.buffered_read_stream.in_avail [*in_avail]]]
    [Determine the amount of data that may be read without blocking. ]
  ]
  
  [
    [[link asio.reference.buffered_read_stream.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.buffered_read_stream.next_layer [*next_layer]]]
    [Get a reference to the next layer. ]
  ]
  
  [
    [[link asio.reference.buffered_read_stream.peek [*peek]]]
    [Peek at the incoming data on the stream. Returns the number of bytes read. Throws an exception on failure. 
     [hr]
     Peek at the incoming data on the stream. Returns the number of bytes read, or 0 if an error occurred. ]
  ]
  
  [
    [[link asio.reference.buffered_read_stream.read_some [*read_some]]]
    [Read some data from the stream. Returns the number of bytes read. Throws an exception on failure. 
     [hr]
     Read some data from the stream. Returns the number of bytes read or 0 if an error occurred. ]
  ]
  
  [
    [[link asio.reference.buffered_read_stream.write_some [*write_some]]]
    [Write the given data to the stream. Returns the number of bytes written. Throws an exception on failure. 
     [hr]
     Write the given data to the stream. Returns the number of bytes written, or 0 if an error occurred. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.buffered_read_stream.default_buffer_size [*default_buffer_size]] [static]]
    [The default buffer size. ]
  ]

]

The [link asio.reference.buffered_read_stream `buffered_read_stream`] class template can be used to add buffering to the synchronous and asynchronous read operations of a stream.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.




[heading Requirements]

['Header: ][^asio/buffered_read_stream.hpp]

['Convenience header: ][^asio.hpp]


[section:async_fill buffered_read_stream::async_fill]

[indexterm2 asio.indexterm.buffered_read_stream.async_fill..async_fill..buffered_read_stream] 
Start an asynchronous fill. 


  template<
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_fill(
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);



[endsect]



[section:async_read_some buffered_read_stream::async_read_some]

[indexterm2 asio.indexterm.buffered_read_stream.async_read_some..async_read_some..buffered_read_stream] 
Start an asynchronous read. The buffer into which the data will be read must be valid for the lifetime of the asynchronous operation. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_some(
      const MutableBufferSequence & buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);



[endsect]



[section:async_write_some buffered_read_stream::async_write_some]

[indexterm2 asio.indexterm.buffered_read_stream.async_write_some..async_write_some..buffered_read_stream] 
Start an asynchronous write. The data being written must be valid for the lifetime of the asynchronous operation. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_write_some(
      const ConstBufferSequence & buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);



[endsect]


[section:buffered_read_stream buffered_read_stream::buffered_read_stream]

[indexterm2 asio.indexterm.buffered_read_stream.buffered_read_stream..buffered_read_stream..buffered_read_stream] 
Construct, passing the specified argument to initialise the next layer. 


  template<
      typename Arg>
  explicit ``[link asio.reference.buffered_read_stream.buffered_read_stream.overload1 buffered_read_stream]``(
      Arg & a);
  ``  [''''&raquo;''' [link asio.reference.buffered_read_stream.buffered_read_stream.overload1 more...]]``

  template<
      typename Arg>
  ``[link asio.reference.buffered_read_stream.buffered_read_stream.overload2 buffered_read_stream]``(
      Arg & a,
      std::size_t buffer_size);
  ``  [''''&raquo;''' [link asio.reference.buffered_read_stream.buffered_read_stream.overload2 more...]]``


[section:overload1 buffered_read_stream::buffered_read_stream (1 of 2 overloads)]


Construct, passing the specified argument to initialise the next layer. 


  template<
      typename Arg>
  buffered_read_stream(
      Arg & a);



[endsect]



[section:overload2 buffered_read_stream::buffered_read_stream (2 of 2 overloads)]


Construct, passing the specified argument to initialise the next layer. 


  template<
      typename Arg>
  buffered_read_stream(
      Arg & a,
      std::size_t buffer_size);



[endsect]


[endsect]

[section:close buffered_read_stream::close]

[indexterm2 asio.indexterm.buffered_read_stream.close..close..buffered_read_stream] 
Close the stream. 


  void ``[link asio.reference.buffered_read_stream.close.overload1 close]``();
  ``  [''''&raquo;''' [link asio.reference.buffered_read_stream.close.overload1 more...]]``

  void ``[link asio.reference.buffered_read_stream.close.overload2 close]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.buffered_read_stream.close.overload2 more...]]``


[section:overload1 buffered_read_stream::close (1 of 2 overloads)]


Close the stream. 


  void close();



[endsect]



[section:overload2 buffered_read_stream::close (2 of 2 overloads)]


Close the stream. 


  void close(
      asio::error_code & ec);



[endsect]


[endsect]


[section:default_buffer_size buffered_read_stream::default_buffer_size]

[indexterm2 asio.indexterm.buffered_read_stream.default_buffer_size..default_buffer_size..buffered_read_stream] 
The default buffer size. 


  static const std::size_t default_buffer_size = implementation_defined;



[endsect]



[section:executor_type buffered_read_stream::executor_type]

[indexterm2 asio.indexterm.buffered_read_stream.executor_type..executor_type..buffered_read_stream] 
The type of the executor associated with the object. 


  typedef lowest_layer_type::executor_type executor_type;



[heading Requirements]

['Header: ][^asio/buffered_read_stream.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:fill buffered_read_stream::fill]

[indexterm2 asio.indexterm.buffered_read_stream.fill..fill..buffered_read_stream] 
Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation. Throws an exception on failure. 


  std::size_t ``[link asio.reference.buffered_read_stream.fill.overload1 fill]``();
  ``  [''''&raquo;''' [link asio.reference.buffered_read_stream.fill.overload1 more...]]``


Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation, or 0 if an error occurred. 


  std::size_t ``[link asio.reference.buffered_read_stream.fill.overload2 fill]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.buffered_read_stream.fill.overload2 more...]]``


[section:overload1 buffered_read_stream::fill (1 of 2 overloads)]


Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation. Throws an exception on failure. 


  std::size_t fill();



[endsect]



[section:overload2 buffered_read_stream::fill (2 of 2 overloads)]


Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation, or 0 if an error occurred. 


  std::size_t fill(
      asio::error_code & ec);



[endsect]


[endsect]


[section:get_executor buffered_read_stream::get_executor]

[indexterm2 asio.indexterm.buffered_read_stream.get_executor..get_executor..buffered_read_stream] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:in_avail buffered_read_stream::in_avail]

[indexterm2 asio.indexterm.buffered_read_stream.in_avail..in_avail..buffered_read_stream] 
Determine the amount of data that may be read without blocking. 


  std::size_t ``[link asio.reference.buffered_read_stream.in_avail.overload1 in_avail]``();
  ``  [''''&raquo;''' [link asio.reference.buffered_read_stream.in_avail.overload1 more...]]``

  std::size_t ``[link asio.reference.buffered_read_stream.in_avail.overload2 in_avail]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.buffered_read_stream.in_avail.overload2 more...]]``


[section:overload1 buffered_read_stream::in_avail (1 of 2 overloads)]


Determine the amount of data that may be read without blocking. 


  std::size_t in_avail();



[endsect]



[section:overload2 buffered_read_stream::in_avail (2 of 2 overloads)]


Determine the amount of data that may be read without blocking. 


  std::size_t in_avail(
      asio::error_code & ec);



[endsect]


[endsect]

[section:lowest_layer buffered_read_stream::lowest_layer]

[indexterm2 asio.indexterm.buffered_read_stream.lowest_layer..lowest_layer..buffered_read_stream] 
Get a reference to the lowest layer. 


  lowest_layer_type & ``[link asio.reference.buffered_read_stream.lowest_layer.overload1 lowest_layer]``();
  ``  [''''&raquo;''' [link asio.reference.buffered_read_stream.lowest_layer.overload1 more...]]``


Get a const reference to the lowest layer. 


  const lowest_layer_type & ``[link asio.reference.buffered_read_stream.lowest_layer.overload2 lowest_layer]``() const;
  ``  [''''&raquo;''' [link asio.reference.buffered_read_stream.lowest_layer.overload2 more...]]``


[section:overload1 buffered_read_stream::lowest_layer (1 of 2 overloads)]


Get a reference to the lowest layer. 


  lowest_layer_type & lowest_layer();



[endsect]



[section:overload2 buffered_read_stream::lowest_layer (2 of 2 overloads)]


Get a const reference to the lowest layer. 


  const lowest_layer_type & lowest_layer() const;



[endsect]


[endsect]


[section:lowest_layer_type buffered_read_stream::lowest_layer_type]

[indexterm2 asio.indexterm.buffered_read_stream.lowest_layer_type..lowest_layer_type..buffered_read_stream] 
The type of the lowest layer. 


  typedef next_layer_type::lowest_layer_type lowest_layer_type;



[heading Requirements]

['Header: ][^asio/buffered_read_stream.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:next_layer buffered_read_stream::next_layer]

[indexterm2 asio.indexterm.buffered_read_stream.next_layer..next_layer..buffered_read_stream] 
Get a reference to the next layer. 


  next_layer_type & next_layer();



[endsect]



[section:next_layer_type buffered_read_stream::next_layer_type]

[indexterm2 asio.indexterm.buffered_read_stream.next_layer_type..next_layer_type..buffered_read_stream] 
The type of the next layer. 


  typedef remove_reference< Stream >::type next_layer_type;



[heading Requirements]

['Header: ][^asio/buffered_read_stream.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:peek buffered_read_stream::peek]

[indexterm2 asio.indexterm.buffered_read_stream.peek..peek..buffered_read_stream] 
Peek at the incoming data on the stream. Returns the number of bytes read. Throws an exception on failure. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.buffered_read_stream.peek.overload1 peek]``(
      const MutableBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.buffered_read_stream.peek.overload1 more...]]``


Peek at the incoming data on the stream. Returns the number of bytes read, or 0 if an error occurred. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.buffered_read_stream.peek.overload2 peek]``(
      const MutableBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.buffered_read_stream.peek.overload2 more...]]``


[section:overload1 buffered_read_stream::peek (1 of 2 overloads)]


Peek at the incoming data on the stream. Returns the number of bytes read. Throws an exception on failure. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t peek(
      const MutableBufferSequence & buffers);



[endsect]



[section:overload2 buffered_read_stream::peek (2 of 2 overloads)]


Peek at the incoming data on the stream. Returns the number of bytes read, or 0 if an error occurred. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t peek(
      const MutableBufferSequence & buffers,
      asio::error_code & ec);



[endsect]


[endsect]

[section:read_some buffered_read_stream::read_some]

[indexterm2 asio.indexterm.buffered_read_stream.read_some..read_some..buffered_read_stream] 
Read some data from the stream. Returns the number of bytes read. Throws an exception on failure. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.buffered_read_stream.read_some.overload1 read_some]``(
      const MutableBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.buffered_read_stream.read_some.overload1 more...]]``


Read some data from the stream. Returns the number of bytes read or 0 if an error occurred. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.buffered_read_stream.read_some.overload2 read_some]``(
      const MutableBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.buffered_read_stream.read_some.overload2 more...]]``


[section:overload1 buffered_read_stream::read_some (1 of 2 overloads)]


Read some data from the stream. Returns the number of bytes read. Throws an exception on failure. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_some(
      const MutableBufferSequence & buffers);



[endsect]



[section:overload2 buffered_read_stream::read_some (2 of 2 overloads)]


Read some data from the stream. Returns the number of bytes read or 0 if an error occurred. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_some(
      const MutableBufferSequence & buffers,
      asio::error_code & ec);



[endsect]


[endsect]

[section:write_some buffered_read_stream::write_some]

[indexterm2 asio.indexterm.buffered_read_stream.write_some..write_some..buffered_read_stream] 
Write the given data to the stream. Returns the number of bytes written. Throws an exception on failure. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.buffered_read_stream.write_some.overload1 write_some]``(
      const ConstBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.buffered_read_stream.write_some.overload1 more...]]``


Write the given data to the stream. Returns the number of bytes written, or 0 if an error occurred. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.buffered_read_stream.write_some.overload2 write_some]``(
      const ConstBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.buffered_read_stream.write_some.overload2 more...]]``


[section:overload1 buffered_read_stream::write_some (1 of 2 overloads)]


Write the given data to the stream. Returns the number of bytes written. Throws an exception on failure. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_some(
      const ConstBufferSequence & buffers);



[endsect]



[section:overload2 buffered_read_stream::write_some (2 of 2 overloads)]


Write the given data to the stream. Returns the number of bytes written, or 0 if an error occurred. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_some(
      const ConstBufferSequence & buffers,
      asio::error_code & ec);



[endsect]


[endsect]


[endsect]

[section:buffered_stream buffered_stream]


Adds buffering to the read- and write-related operations of a stream. 


  template<
      typename Stream>
  class buffered_stream :
    noncopyable


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.buffered_stream.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.buffered_stream.lowest_layer_type [*lowest_layer_type]]]
    [The type of the lowest layer. ]
  
  ]

  [

    [[link asio.reference.buffered_stream.next_layer_type [*next_layer_type]]]
    [The type of the next layer. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.buffered_stream.async_fill [*async_fill]]]
    [Start an asynchronous fill. ]
  ]
  
  [
    [[link asio.reference.buffered_stream.async_flush [*async_flush]]]
    [Start an asynchronous flush. ]
  ]
  
  [
    [[link asio.reference.buffered_stream.async_read_some [*async_read_some]]]
    [Start an asynchronous read. The buffer into which the data will be read must be valid for the lifetime of the asynchronous operation. ]
  ]
  
  [
    [[link asio.reference.buffered_stream.async_write_some [*async_write_some]]]
    [Start an asynchronous write. The data being written must be valid for the lifetime of the asynchronous operation. ]
  ]
  
  [
    [[link asio.reference.buffered_stream.buffered_stream [*buffered_stream]] [constructor]]
    [Construct, passing the specified argument to initialise the next layer. ]
  ]
  
  [
    [[link asio.reference.buffered_stream.close [*close]]]
    [Close the stream. ]
  ]
  
  [
    [[link asio.reference.buffered_stream.fill [*fill]]]
    [Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation. Throws an exception on failure. 
     [hr]
     Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation, or 0 if an error occurred. ]
  ]
  
  [
    [[link asio.reference.buffered_stream.flush [*flush]]]
    [Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation. Throws an exception on failure. 
     [hr]
     Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation, or 0 if an error occurred. ]
  ]
  
  [
    [[link asio.reference.buffered_stream.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.buffered_stream.in_avail [*in_avail]]]
    [Determine the amount of data that may be read without blocking. ]
  ]
  
  [
    [[link asio.reference.buffered_stream.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.buffered_stream.next_layer [*next_layer]]]
    [Get a reference to the next layer. ]
  ]
  
  [
    [[link asio.reference.buffered_stream.peek [*peek]]]
    [Peek at the incoming data on the stream. Returns the number of bytes read. Throws an exception on failure. 
     [hr]
     Peek at the incoming data on the stream. Returns the number of bytes read, or 0 if an error occurred. ]
  ]
  
  [
    [[link asio.reference.buffered_stream.read_some [*read_some]]]
    [Read some data from the stream. Returns the number of bytes read. Throws an exception on failure. 
     [hr]
     Read some data from the stream. Returns the number of bytes read or 0 if an error occurred. ]
  ]
  
  [
    [[link asio.reference.buffered_stream.write_some [*write_some]]]
    [Write the given data to the stream. Returns the number of bytes written. Throws an exception on failure. 
     [hr]
     Write the given data to the stream. Returns the number of bytes written, or 0 if an error occurred. ]
  ]
  
]

The [link asio.reference.buffered_stream `buffered_stream`] class template can be used to add buffering to the synchronous and asynchronous read and write operations of a stream.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.




[heading Requirements]

['Header: ][^asio/buffered_stream.hpp]

['Convenience header: ][^asio.hpp]


[section:async_fill buffered_stream::async_fill]

[indexterm2 asio.indexterm.buffered_stream.async_fill..async_fill..buffered_stream] 
Start an asynchronous fill. 


  template<
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_fill(
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);



[endsect]



[section:async_flush buffered_stream::async_flush]

[indexterm2 asio.indexterm.buffered_stream.async_flush..async_flush..buffered_stream] 
Start an asynchronous flush. 


  template<
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_flush(
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);



[endsect]



[section:async_read_some buffered_stream::async_read_some]

[indexterm2 asio.indexterm.buffered_stream.async_read_some..async_read_some..buffered_stream] 
Start an asynchronous read. The buffer into which the data will be read must be valid for the lifetime of the asynchronous operation. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_some(
      const MutableBufferSequence & buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);



[endsect]



[section:async_write_some buffered_stream::async_write_some]

[indexterm2 asio.indexterm.buffered_stream.async_write_some..async_write_some..buffered_stream] 
Start an asynchronous write. The data being written must be valid for the lifetime of the asynchronous operation. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_write_some(
      const ConstBufferSequence & buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);



[endsect]


[section:buffered_stream buffered_stream::buffered_stream]

[indexterm2 asio.indexterm.buffered_stream.buffered_stream..buffered_stream..buffered_stream] 
Construct, passing the specified argument to initialise the next layer. 


  template<
      typename Arg>
  explicit ``[link asio.reference.buffered_stream.buffered_stream.overload1 buffered_stream]``(
      Arg & a);
  ``  [''''&raquo;''' [link asio.reference.buffered_stream.buffered_stream.overload1 more...]]``

  template<
      typename Arg>
  explicit ``[link asio.reference.buffered_stream.buffered_stream.overload2 buffered_stream]``(
      Arg & a,
      std::size_t read_buffer_size,
      std::size_t write_buffer_size);
  ``  [''''&raquo;''' [link asio.reference.buffered_stream.buffered_stream.overload2 more...]]``


[section:overload1 buffered_stream::buffered_stream (1 of 2 overloads)]


Construct, passing the specified argument to initialise the next layer. 


  template<
      typename Arg>
  buffered_stream(
      Arg & a);



[endsect]



[section:overload2 buffered_stream::buffered_stream (2 of 2 overloads)]


Construct, passing the specified argument to initialise the next layer. 


  template<
      typename Arg>
  buffered_stream(
      Arg & a,
      std::size_t read_buffer_size,
      std::size_t write_buffer_size);



[endsect]


[endsect]

[section:close buffered_stream::close]

[indexterm2 asio.indexterm.buffered_stream.close..close..buffered_stream] 
Close the stream. 


  void ``[link asio.reference.buffered_stream.close.overload1 close]``();
  ``  [''''&raquo;''' [link asio.reference.buffered_stream.close.overload1 more...]]``

  void ``[link asio.reference.buffered_stream.close.overload2 close]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.buffered_stream.close.overload2 more...]]``


[section:overload1 buffered_stream::close (1 of 2 overloads)]


Close the stream. 


  void close();



[endsect]



[section:overload2 buffered_stream::close (2 of 2 overloads)]


Close the stream. 


  void close(
      asio::error_code & ec);



[endsect]


[endsect]


[section:executor_type buffered_stream::executor_type]

[indexterm2 asio.indexterm.buffered_stream.executor_type..executor_type..buffered_stream] 
The type of the executor associated with the object. 


  typedef lowest_layer_type::executor_type executor_type;



[heading Requirements]

['Header: ][^asio/buffered_stream.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:fill buffered_stream::fill]

[indexterm2 asio.indexterm.buffered_stream.fill..fill..buffered_stream] 
Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation. Throws an exception on failure. 


  std::size_t ``[link asio.reference.buffered_stream.fill.overload1 fill]``();
  ``  [''''&raquo;''' [link asio.reference.buffered_stream.fill.overload1 more...]]``


Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation, or 0 if an error occurred. 


  std::size_t ``[link asio.reference.buffered_stream.fill.overload2 fill]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.buffered_stream.fill.overload2 more...]]``


[section:overload1 buffered_stream::fill (1 of 2 overloads)]


Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation. Throws an exception on failure. 


  std::size_t fill();



[endsect]



[section:overload2 buffered_stream::fill (2 of 2 overloads)]


Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation, or 0 if an error occurred. 


  std::size_t fill(
      asio::error_code & ec);



[endsect]


[endsect]

[section:flush buffered_stream::flush]

[indexterm2 asio.indexterm.buffered_stream.flush..flush..buffered_stream] 
Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation. Throws an exception on failure. 


  std::size_t ``[link asio.reference.buffered_stream.flush.overload1 flush]``();
  ``  [''''&raquo;''' [link asio.reference.buffered_stream.flush.overload1 more...]]``


Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation, or 0 if an error occurred. 


  std::size_t ``[link asio.reference.buffered_stream.flush.overload2 flush]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.buffered_stream.flush.overload2 more...]]``


[section:overload1 buffered_stream::flush (1 of 2 overloads)]


Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation. Throws an exception on failure. 


  std::size_t flush();



[endsect]



[section:overload2 buffered_stream::flush (2 of 2 overloads)]


Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation, or 0 if an error occurred. 


  std::size_t flush(
      asio::error_code & ec);



[endsect]


[endsect]


[section:get_executor buffered_stream::get_executor]

[indexterm2 asio.indexterm.buffered_stream.get_executor..get_executor..buffered_stream] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:in_avail buffered_stream::in_avail]

[indexterm2 asio.indexterm.buffered_stream.in_avail..in_avail..buffered_stream] 
Determine the amount of data that may be read without blocking. 


  std::size_t ``[link asio.reference.buffered_stream.in_avail.overload1 in_avail]``();
  ``  [''''&raquo;''' [link asio.reference.buffered_stream.in_avail.overload1 more...]]``

  std::size_t ``[link asio.reference.buffered_stream.in_avail.overload2 in_avail]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.buffered_stream.in_avail.overload2 more...]]``


[section:overload1 buffered_stream::in_avail (1 of 2 overloads)]


Determine the amount of data that may be read without blocking. 


  std::size_t in_avail();



[endsect]



[section:overload2 buffered_stream::in_avail (2 of 2 overloads)]


Determine the amount of data that may be read without blocking. 


  std::size_t in_avail(
      asio::error_code & ec);



[endsect]


[endsect]

[section:lowest_layer buffered_stream::lowest_layer]

[indexterm2 asio.indexterm.buffered_stream.lowest_layer..lowest_layer..buffered_stream] 
Get a reference to the lowest layer. 


  lowest_layer_type & ``[link asio.reference.buffered_stream.lowest_layer.overload1 lowest_layer]``();
  ``  [''''&raquo;''' [link asio.reference.buffered_stream.lowest_layer.overload1 more...]]``


Get a const reference to the lowest layer. 


  const lowest_layer_type & ``[link asio.reference.buffered_stream.lowest_layer.overload2 lowest_layer]``() const;
  ``  [''''&raquo;''' [link asio.reference.buffered_stream.lowest_layer.overload2 more...]]``


[section:overload1 buffered_stream::lowest_layer (1 of 2 overloads)]


Get a reference to the lowest layer. 


  lowest_layer_type & lowest_layer();



[endsect]



[section:overload2 buffered_stream::lowest_layer (2 of 2 overloads)]


Get a const reference to the lowest layer. 


  const lowest_layer_type & lowest_layer() const;



[endsect]


[endsect]


[section:lowest_layer_type buffered_stream::lowest_layer_type]

[indexterm2 asio.indexterm.buffered_stream.lowest_layer_type..lowest_layer_type..buffered_stream] 
The type of the lowest layer. 


  typedef next_layer_type::lowest_layer_type lowest_layer_type;



[heading Requirements]

['Header: ][^asio/buffered_stream.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:next_layer buffered_stream::next_layer]

[indexterm2 asio.indexterm.buffered_stream.next_layer..next_layer..buffered_stream] 
Get a reference to the next layer. 


  next_layer_type & next_layer();



[endsect]



[section:next_layer_type buffered_stream::next_layer_type]

[indexterm2 asio.indexterm.buffered_stream.next_layer_type..next_layer_type..buffered_stream] 
The type of the next layer. 


  typedef remove_reference< Stream >::type next_layer_type;



[heading Requirements]

['Header: ][^asio/buffered_stream.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:peek buffered_stream::peek]

[indexterm2 asio.indexterm.buffered_stream.peek..peek..buffered_stream] 
Peek at the incoming data on the stream. Returns the number of bytes read. Throws an exception on failure. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.buffered_stream.peek.overload1 peek]``(
      const MutableBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.buffered_stream.peek.overload1 more...]]``


Peek at the incoming data on the stream. Returns the number of bytes read, or 0 if an error occurred. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.buffered_stream.peek.overload2 peek]``(
      const MutableBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.buffered_stream.peek.overload2 more...]]``


[section:overload1 buffered_stream::peek (1 of 2 overloads)]


Peek at the incoming data on the stream. Returns the number of bytes read. Throws an exception on failure. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t peek(
      const MutableBufferSequence & buffers);



[endsect]



[section:overload2 buffered_stream::peek (2 of 2 overloads)]


Peek at the incoming data on the stream. Returns the number of bytes read, or 0 if an error occurred. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t peek(
      const MutableBufferSequence & buffers,
      asio::error_code & ec);



[endsect]


[endsect]

[section:read_some buffered_stream::read_some]

[indexterm2 asio.indexterm.buffered_stream.read_some..read_some..buffered_stream] 
Read some data from the stream. Returns the number of bytes read. Throws an exception on failure. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.buffered_stream.read_some.overload1 read_some]``(
      const MutableBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.buffered_stream.read_some.overload1 more...]]``


Read some data from the stream. Returns the number of bytes read or 0 if an error occurred. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.buffered_stream.read_some.overload2 read_some]``(
      const MutableBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.buffered_stream.read_some.overload2 more...]]``


[section:overload1 buffered_stream::read_some (1 of 2 overloads)]


Read some data from the stream. Returns the number of bytes read. Throws an exception on failure. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_some(
      const MutableBufferSequence & buffers);



[endsect]



[section:overload2 buffered_stream::read_some (2 of 2 overloads)]


Read some data from the stream. Returns the number of bytes read or 0 if an error occurred. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_some(
      const MutableBufferSequence & buffers,
      asio::error_code & ec);



[endsect]


[endsect]

[section:write_some buffered_stream::write_some]

[indexterm2 asio.indexterm.buffered_stream.write_some..write_some..buffered_stream] 
Write the given data to the stream. Returns the number of bytes written. Throws an exception on failure. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.buffered_stream.write_some.overload1 write_some]``(
      const ConstBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.buffered_stream.write_some.overload1 more...]]``


Write the given data to the stream. Returns the number of bytes written, or 0 if an error occurred. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.buffered_stream.write_some.overload2 write_some]``(
      const ConstBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.buffered_stream.write_some.overload2 more...]]``


[section:overload1 buffered_stream::write_some (1 of 2 overloads)]


Write the given data to the stream. Returns the number of bytes written. Throws an exception on failure. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_some(
      const ConstBufferSequence & buffers);



[endsect]



[section:overload2 buffered_stream::write_some (2 of 2 overloads)]


Write the given data to the stream. Returns the number of bytes written, or 0 if an error occurred. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_some(
      const ConstBufferSequence & buffers,
      asio::error_code & ec);



[endsect]


[endsect]


[endsect]

[section:buffered_write_stream buffered_write_stream]


Adds buffering to the write-related operations of a stream. 


  template<
      typename Stream>
  class buffered_write_stream :
    noncopyable


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.buffered_write_stream.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.buffered_write_stream.lowest_layer_type [*lowest_layer_type]]]
    [The type of the lowest layer. ]
  
  ]

  [

    [[link asio.reference.buffered_write_stream.next_layer_type [*next_layer_type]]]
    [The type of the next layer. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.buffered_write_stream.async_flush [*async_flush]]]
    [Start an asynchronous flush. ]
  ]
  
  [
    [[link asio.reference.buffered_write_stream.async_read_some [*async_read_some]]]
    [Start an asynchronous read. The buffer into which the data will be read must be valid for the lifetime of the asynchronous operation. ]
  ]
  
  [
    [[link asio.reference.buffered_write_stream.async_write_some [*async_write_some]]]
    [Start an asynchronous write. The data being written must be valid for the lifetime of the asynchronous operation. ]
  ]
  
  [
    [[link asio.reference.buffered_write_stream.buffered_write_stream [*buffered_write_stream]] [constructor]]
    [Construct, passing the specified argument to initialise the next layer. ]
  ]
  
  [
    [[link asio.reference.buffered_write_stream.close [*close]]]
    [Close the stream. ]
  ]
  
  [
    [[link asio.reference.buffered_write_stream.flush [*flush]]]
    [Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation. Throws an exception on failure. 
     [hr]
     Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation, or 0 if an error occurred. ]
  ]
  
  [
    [[link asio.reference.buffered_write_stream.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.buffered_write_stream.in_avail [*in_avail]]]
    [Determine the amount of data that may be read without blocking. ]
  ]
  
  [
    [[link asio.reference.buffered_write_stream.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.buffered_write_stream.next_layer [*next_layer]]]
    [Get a reference to the next layer. ]
  ]
  
  [
    [[link asio.reference.buffered_write_stream.peek [*peek]]]
    [Peek at the incoming data on the stream. Returns the number of bytes read. Throws an exception on failure. 
     [hr]
     Peek at the incoming data on the stream. Returns the number of bytes read, or 0 if an error occurred. ]
  ]
  
  [
    [[link asio.reference.buffered_write_stream.read_some [*read_some]]]
    [Read some data from the stream. Returns the number of bytes read. Throws an exception on failure. 
     [hr]
     Read some data from the stream. Returns the number of bytes read or 0 if an error occurred. ]
  ]
  
  [
    [[link asio.reference.buffered_write_stream.write_some [*write_some]]]
    [Write the given data to the stream. Returns the number of bytes written. Throws an exception on failure. 
     [hr]
     Write the given data to the stream. Returns the number of bytes written, or 0 if an error occurred and the error handler did not throw. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.buffered_write_stream.default_buffer_size [*default_buffer_size]] [static]]
    [The default buffer size. ]
  ]

]

The [link asio.reference.buffered_write_stream `buffered_write_stream`] class template can be used to add buffering to the synchronous and asynchronous write operations of a stream.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.




[heading Requirements]

['Header: ][^asio/buffered_write_stream.hpp]

['Convenience header: ][^asio.hpp]


[section:async_flush buffered_write_stream::async_flush]

[indexterm2 asio.indexterm.buffered_write_stream.async_flush..async_flush..buffered_write_stream] 
Start an asynchronous flush. 


  template<
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_flush(
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);



[endsect]



[section:async_read_some buffered_write_stream::async_read_some]

[indexterm2 asio.indexterm.buffered_write_stream.async_read_some..async_read_some..buffered_write_stream] 
Start an asynchronous read. The buffer into which the data will be read must be valid for the lifetime of the asynchronous operation. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_some(
      const MutableBufferSequence & buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);



[endsect]



[section:async_write_some buffered_write_stream::async_write_some]

[indexterm2 asio.indexterm.buffered_write_stream.async_write_some..async_write_some..buffered_write_stream] 
Start an asynchronous write. The data being written must be valid for the lifetime of the asynchronous operation. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_write_some(
      const ConstBufferSequence & buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);



[endsect]


[section:buffered_write_stream buffered_write_stream::buffered_write_stream]

[indexterm2 asio.indexterm.buffered_write_stream.buffered_write_stream..buffered_write_stream..buffered_write_stream] 
Construct, passing the specified argument to initialise the next layer. 


  template<
      typename Arg>
  explicit ``[link asio.reference.buffered_write_stream.buffered_write_stream.overload1 buffered_write_stream]``(
      Arg & a);
  ``  [''''&raquo;''' [link asio.reference.buffered_write_stream.buffered_write_stream.overload1 more...]]``

  template<
      typename Arg>
  ``[link asio.reference.buffered_write_stream.buffered_write_stream.overload2 buffered_write_stream]``(
      Arg & a,
      std::size_t buffer_size);
  ``  [''''&raquo;''' [link asio.reference.buffered_write_stream.buffered_write_stream.overload2 more...]]``


[section:overload1 buffered_write_stream::buffered_write_stream (1 of 2 overloads)]


Construct, passing the specified argument to initialise the next layer. 


  template<
      typename Arg>
  buffered_write_stream(
      Arg & a);



[endsect]



[section:overload2 buffered_write_stream::buffered_write_stream (2 of 2 overloads)]


Construct, passing the specified argument to initialise the next layer. 


  template<
      typename Arg>
  buffered_write_stream(
      Arg & a,
      std::size_t buffer_size);



[endsect]


[endsect]

[section:close buffered_write_stream::close]

[indexterm2 asio.indexterm.buffered_write_stream.close..close..buffered_write_stream] 
Close the stream. 


  void ``[link asio.reference.buffered_write_stream.close.overload1 close]``();
  ``  [''''&raquo;''' [link asio.reference.buffered_write_stream.close.overload1 more...]]``

  void ``[link asio.reference.buffered_write_stream.close.overload2 close]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.buffered_write_stream.close.overload2 more...]]``


[section:overload1 buffered_write_stream::close (1 of 2 overloads)]


Close the stream. 


  void close();



[endsect]



[section:overload2 buffered_write_stream::close (2 of 2 overloads)]


Close the stream. 


  void close(
      asio::error_code & ec);



[endsect]


[endsect]


[section:default_buffer_size buffered_write_stream::default_buffer_size]

[indexterm2 asio.indexterm.buffered_write_stream.default_buffer_size..default_buffer_size..buffered_write_stream] 
The default buffer size. 


  static const std::size_t default_buffer_size = implementation_defined;



[endsect]



[section:executor_type buffered_write_stream::executor_type]

[indexterm2 asio.indexterm.buffered_write_stream.executor_type..executor_type..buffered_write_stream] 
The type of the executor associated with the object. 


  typedef lowest_layer_type::executor_type executor_type;



[heading Requirements]

['Header: ][^asio/buffered_write_stream.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:flush buffered_write_stream::flush]

[indexterm2 asio.indexterm.buffered_write_stream.flush..flush..buffered_write_stream] 
Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation. Throws an exception on failure. 


  std::size_t ``[link asio.reference.buffered_write_stream.flush.overload1 flush]``();
  ``  [''''&raquo;''' [link asio.reference.buffered_write_stream.flush.overload1 more...]]``


Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation, or 0 if an error occurred. 


  std::size_t ``[link asio.reference.buffered_write_stream.flush.overload2 flush]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.buffered_write_stream.flush.overload2 more...]]``


[section:overload1 buffered_write_stream::flush (1 of 2 overloads)]


Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation. Throws an exception on failure. 


  std::size_t flush();



[endsect]



[section:overload2 buffered_write_stream::flush (2 of 2 overloads)]


Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation, or 0 if an error occurred. 


  std::size_t flush(
      asio::error_code & ec);



[endsect]


[endsect]


[section:get_executor buffered_write_stream::get_executor]

[indexterm2 asio.indexterm.buffered_write_stream.get_executor..get_executor..buffered_write_stream] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:in_avail buffered_write_stream::in_avail]

[indexterm2 asio.indexterm.buffered_write_stream.in_avail..in_avail..buffered_write_stream] 
Determine the amount of data that may be read without blocking. 


  std::size_t ``[link asio.reference.buffered_write_stream.in_avail.overload1 in_avail]``();
  ``  [''''&raquo;''' [link asio.reference.buffered_write_stream.in_avail.overload1 more...]]``

  std::size_t ``[link asio.reference.buffered_write_stream.in_avail.overload2 in_avail]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.buffered_write_stream.in_avail.overload2 more...]]``


[section:overload1 buffered_write_stream::in_avail (1 of 2 overloads)]


Determine the amount of data that may be read without blocking. 


  std::size_t in_avail();



[endsect]



[section:overload2 buffered_write_stream::in_avail (2 of 2 overloads)]


Determine the amount of data that may be read without blocking. 


  std::size_t in_avail(
      asio::error_code & ec);



[endsect]


[endsect]

[section:lowest_layer buffered_write_stream::lowest_layer]

[indexterm2 asio.indexterm.buffered_write_stream.lowest_layer..lowest_layer..buffered_write_stream] 
Get a reference to the lowest layer. 


  lowest_layer_type & ``[link asio.reference.buffered_write_stream.lowest_layer.overload1 lowest_layer]``();
  ``  [''''&raquo;''' [link asio.reference.buffered_write_stream.lowest_layer.overload1 more...]]``


Get a const reference to the lowest layer. 


  const lowest_layer_type & ``[link asio.reference.buffered_write_stream.lowest_layer.overload2 lowest_layer]``() const;
  ``  [''''&raquo;''' [link asio.reference.buffered_write_stream.lowest_layer.overload2 more...]]``


[section:overload1 buffered_write_stream::lowest_layer (1 of 2 overloads)]


Get a reference to the lowest layer. 


  lowest_layer_type & lowest_layer();



[endsect]



[section:overload2 buffered_write_stream::lowest_layer (2 of 2 overloads)]


Get a const reference to the lowest layer. 


  const lowest_layer_type & lowest_layer() const;



[endsect]


[endsect]


[section:lowest_layer_type buffered_write_stream::lowest_layer_type]

[indexterm2 asio.indexterm.buffered_write_stream.lowest_layer_type..lowest_layer_type..buffered_write_stream] 
The type of the lowest layer. 


  typedef next_layer_type::lowest_layer_type lowest_layer_type;



[heading Requirements]

['Header: ][^asio/buffered_write_stream.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:next_layer buffered_write_stream::next_layer]

[indexterm2 asio.indexterm.buffered_write_stream.next_layer..next_layer..buffered_write_stream] 
Get a reference to the next layer. 


  next_layer_type & next_layer();



[endsect]



[section:next_layer_type buffered_write_stream::next_layer_type]

[indexterm2 asio.indexterm.buffered_write_stream.next_layer_type..next_layer_type..buffered_write_stream] 
The type of the next layer. 


  typedef remove_reference< Stream >::type next_layer_type;



[heading Requirements]

['Header: ][^asio/buffered_write_stream.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:peek buffered_write_stream::peek]

[indexterm2 asio.indexterm.buffered_write_stream.peek..peek..buffered_write_stream] 
Peek at the incoming data on the stream. Returns the number of bytes read. Throws an exception on failure. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.buffered_write_stream.peek.overload1 peek]``(
      const MutableBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.buffered_write_stream.peek.overload1 more...]]``


Peek at the incoming data on the stream. Returns the number of bytes read, or 0 if an error occurred. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.buffered_write_stream.peek.overload2 peek]``(
      const MutableBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.buffered_write_stream.peek.overload2 more...]]``


[section:overload1 buffered_write_stream::peek (1 of 2 overloads)]


Peek at the incoming data on the stream. Returns the number of bytes read. Throws an exception on failure. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t peek(
      const MutableBufferSequence & buffers);



[endsect]



[section:overload2 buffered_write_stream::peek (2 of 2 overloads)]


Peek at the incoming data on the stream. Returns the number of bytes read, or 0 if an error occurred. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t peek(
      const MutableBufferSequence & buffers,
      asio::error_code & ec);



[endsect]


[endsect]

[section:read_some buffered_write_stream::read_some]

[indexterm2 asio.indexterm.buffered_write_stream.read_some..read_some..buffered_write_stream] 
Read some data from the stream. Returns the number of bytes read. Throws an exception on failure. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.buffered_write_stream.read_some.overload1 read_some]``(
      const MutableBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.buffered_write_stream.read_some.overload1 more...]]``


Read some data from the stream. Returns the number of bytes read or 0 if an error occurred. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.buffered_write_stream.read_some.overload2 read_some]``(
      const MutableBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.buffered_write_stream.read_some.overload2 more...]]``


[section:overload1 buffered_write_stream::read_some (1 of 2 overloads)]


Read some data from the stream. Returns the number of bytes read. Throws an exception on failure. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_some(
      const MutableBufferSequence & buffers);



[endsect]



[section:overload2 buffered_write_stream::read_some (2 of 2 overloads)]


Read some data from the stream. Returns the number of bytes read or 0 if an error occurred. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_some(
      const MutableBufferSequence & buffers,
      asio::error_code & ec);



[endsect]


[endsect]

[section:write_some buffered_write_stream::write_some]

[indexterm2 asio.indexterm.buffered_write_stream.write_some..write_some..buffered_write_stream] 
Write the given data to the stream. Returns the number of bytes written. Throws an exception on failure. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.buffered_write_stream.write_some.overload1 write_some]``(
      const ConstBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.buffered_write_stream.write_some.overload1 more...]]``


Write the given data to the stream. Returns the number of bytes written, or 0 if an error occurred and the error handler did not throw. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.buffered_write_stream.write_some.overload2 write_some]``(
      const ConstBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.buffered_write_stream.write_some.overload2 more...]]``


[section:overload1 buffered_write_stream::write_some (1 of 2 overloads)]


Write the given data to the stream. Returns the number of bytes written. Throws an exception on failure. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_some(
      const ConstBufferSequence & buffers);



[endsect]



[section:overload2 buffered_write_stream::write_some (2 of 2 overloads)]


Write the given data to the stream. Returns the number of bytes written, or 0 if an error occurred and the error handler did not throw. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_some(
      const ConstBufferSequence & buffers,
      asio::error_code & ec);



[endsect]


[endsect]


[endsect]


[section:buffers_begin buffers_begin]

[indexterm1 asio.indexterm.buffers_begin..buffers_begin] 
Construct an iterator representing the beginning of the buffers' data. 


  template<
      typename BufferSequence>
  buffers_iterator< BufferSequence > buffers_begin(
      const BufferSequence & buffers);


[heading Requirements]

['Header: ][^asio/buffers_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:buffers_end buffers_end]

[indexterm1 asio.indexterm.buffers_end..buffers_end] 
Construct an iterator representing the end of the buffers' data. 


  template<
      typename BufferSequence>
  buffers_iterator< BufferSequence > buffers_end(
      const BufferSequence & buffers);


[heading Requirements]

['Header: ][^asio/buffers_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:buffers_iterator buffers_iterator]


A random access iterator over the bytes in a buffer sequence. 


  template<
      typename BufferSequence,
      typename ByteType = char>
  class buffers_iterator


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.buffers_iterator.difference_type [*difference_type]]]
    [The type used for the distance between two iterators. ]
  
  ]

  [

    [[link asio.reference.buffers_iterator.iterator_category [*iterator_category]]]
    [The iterator category. ]
  
  ]

  [

    [[link asio.reference.buffers_iterator.pointer [*pointer]]]
    [The type of the result of applying operator->() to the iterator. ]
  
  ]

  [

    [[link asio.reference.buffers_iterator.reference [*reference]]]
    [The type of the result of applying operator*() to the iterator. ]
  
  ]

  [

    [[link asio.reference.buffers_iterator.value_type [*value_type]]]
    [The type of the value pointed to by the iterator. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.buffers_iterator.begin [*begin]] [static]]
    [Construct an iterator representing the beginning of the buffers' data. ]
  ]
  
  [
    [[link asio.reference.buffers_iterator.buffers_iterator [*buffers_iterator]] [constructor]]
    [Default constructor. Creates an iterator in an undefined state. ]
  ]
  
  [
    [[link asio.reference.buffers_iterator.end [*end]] [static]]
    [Construct an iterator representing the end of the buffers' data. ]
  ]
  
  [
    [[link asio.reference.buffers_iterator.operator__star_ [*operator *]]]
    [Dereference an iterator. ]
  ]
  
  [
    [[link asio.reference.buffers_iterator.operator_plus__plus_ [*operator++]]]
    [Increment operator (prefix). 
     [hr]
     Increment operator (postfix). ]
  ]
  
  [
    [[link asio.reference.buffers_iterator.operator_plus__eq_ [*operator+=]]]
    [Addition operator. ]
  ]
  
  [
    [[link asio.reference.buffers_iterator.operator_minus__minus_ [*operator--]]]
    [Decrement operator (prefix). 
     [hr]
     Decrement operator (postfix). ]
  ]
  
  [
    [[link asio.reference.buffers_iterator.operator_minus__eq_ [*operator-=]]]
    [Subtraction operator. ]
  ]
  
  [
    [[link asio.reference.buffers_iterator.operator_arrow_ [*operator->]]]
    [Dereference an iterator. ]
  ]
  
  [
    [[link asio.reference.buffers_iterator.operator_lb__rb_ [*operator\[\]]]]
    [Access an individual element. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.buffers_iterator.operator_not__eq_ [*operator!=]]]
    [Test two iterators for inequality. ]
  ]
  
  [
    [[link asio.reference.buffers_iterator.operator_plus_ [*operator+]]]
    [Addition operator. ]
  ]
  
  [
    [[link asio.reference.buffers_iterator.operator_minus_ [*operator-]]]
    [Subtraction operator. ]
  ]
  
  [
    [[link asio.reference.buffers_iterator.operator_lt_ [*operator<]]]
    [Compare two iterators. ]
  ]
  
  [
    [[link asio.reference.buffers_iterator.operator_lt__eq_ [*operator<=]]]
    [Compare two iterators. ]
  ]
  
  [
    [[link asio.reference.buffers_iterator.operator_eq__eq_ [*operator==]]]
    [Test two iterators for equality. ]
  ]
  
  [
    [[link asio.reference.buffers_iterator.operator_gt_ [*operator>]]]
    [Compare two iterators. ]
  ]
  
  [
    [[link asio.reference.buffers_iterator.operator_gt__eq_ [*operator>=]]]
    [Compare two iterators. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/buffers_iterator.hpp]

['Convenience header: ][^asio.hpp]


[section:begin buffers_iterator::begin]

[indexterm2 asio.indexterm.buffers_iterator.begin..begin..buffers_iterator] 
Construct an iterator representing the beginning of the buffers' data. 


  static buffers_iterator begin(
      const BufferSequence & buffers);



[endsect]



[section:buffers_iterator buffers_iterator::buffers_iterator]

[indexterm2 asio.indexterm.buffers_iterator.buffers_iterator..buffers_iterator..buffers_iterator] 
Default constructor. Creates an iterator in an undefined state. 


  buffers_iterator();



[endsect]



[section:difference_type buffers_iterator::difference_type]

[indexterm2 asio.indexterm.buffers_iterator.difference_type..difference_type..buffers_iterator] 
The type used for the distance between two iterators. 


  typedef std::ptrdiff_t difference_type;



[heading Requirements]

['Header: ][^asio/buffers_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:end buffers_iterator::end]

[indexterm2 asio.indexterm.buffers_iterator.end..end..buffers_iterator] 
Construct an iterator representing the end of the buffers' data. 


  static buffers_iterator end(
      const BufferSequence & buffers);



[endsect]



[section:iterator_category buffers_iterator::iterator_category]

[indexterm2 asio.indexterm.buffers_iterator.iterator_category..iterator_category..buffers_iterator] 
The iterator category. 


  typedef std::random_access_iterator_tag iterator_category;



[heading Requirements]

['Header: ][^asio/buffers_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator__star_ buffers_iterator::operator *]

[indexterm2 asio.indexterm.buffers_iterator.operator__star_..operator *..buffers_iterator] 
Dereference an iterator. 


  reference operator *() const;



[endsect]



[section:operator_not__eq_ buffers_iterator::operator!=]

[indexterm2 asio.indexterm.buffers_iterator.operator_not__eq_..operator!=..buffers_iterator] 
Test two iterators for inequality. 


  friend bool operator!=(
      const buffers_iterator & a,
      const buffers_iterator & b);


[heading Requirements]

['Header: ][^asio/buffers_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:operator_plus_ buffers_iterator::operator+]

[indexterm2 asio.indexterm.buffers_iterator.operator_plus_..operator+..buffers_iterator] 
Addition operator. 


  friend buffers_iterator ``[link asio.reference.buffers_iterator.operator_plus_.overload1 operator+]``(
      const buffers_iterator & iter,
      std::ptrdiff_t difference);
  ``  [''''&raquo;''' [link asio.reference.buffers_iterator.operator_plus_.overload1 more...]]``

  friend buffers_iterator ``[link asio.reference.buffers_iterator.operator_plus_.overload2 operator+]``(
      std::ptrdiff_t difference,
      const buffers_iterator & iter);
  ``  [''''&raquo;''' [link asio.reference.buffers_iterator.operator_plus_.overload2 more...]]``


[section:overload1 buffers_iterator::operator+ (1 of 2 overloads)]


Addition operator. 


  friend buffers_iterator operator+(
      const buffers_iterator & iter,
      std::ptrdiff_t difference);


[heading Requirements]

['Header: ][^asio/buffers_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:overload2 buffers_iterator::operator+ (2 of 2 overloads)]


Addition operator. 


  friend buffers_iterator operator+(
      std::ptrdiff_t difference,
      const buffers_iterator & iter);


[heading Requirements]

['Header: ][^asio/buffers_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[endsect]

[section:operator_plus__plus_ buffers_iterator::operator++]

[indexterm2 asio.indexterm.buffers_iterator.operator_plus__plus_..operator++..buffers_iterator] 
Increment operator (prefix). 


  buffers_iterator & ``[link asio.reference.buffers_iterator.operator_plus__plus_.overload1 operator++]``();
  ``  [''''&raquo;''' [link asio.reference.buffers_iterator.operator_plus__plus_.overload1 more...]]``


Increment operator (postfix). 


  buffers_iterator ``[link asio.reference.buffers_iterator.operator_plus__plus_.overload2 operator++]``(
      int );
  ``  [''''&raquo;''' [link asio.reference.buffers_iterator.operator_plus__plus_.overload2 more...]]``


[section:overload1 buffers_iterator::operator++ (1 of 2 overloads)]


Increment operator (prefix). 


  buffers_iterator & operator++();



[endsect]



[section:overload2 buffers_iterator::operator++ (2 of 2 overloads)]


Increment operator (postfix). 


  buffers_iterator operator++(
      int );



[endsect]


[endsect]


[section:operator_plus__eq_ buffers_iterator::operator+=]

[indexterm2 asio.indexterm.buffers_iterator.operator_plus__eq_..operator+=..buffers_iterator] 
Addition operator. 


  buffers_iterator & operator+=(
      std::ptrdiff_t difference);



[endsect]


[section:operator_minus_ buffers_iterator::operator-]

[indexterm2 asio.indexterm.buffers_iterator.operator_minus_..operator-..buffers_iterator] 
Subtraction operator. 


  friend buffers_iterator ``[link asio.reference.buffers_iterator.operator_minus_.overload1 operator-]``(
      const buffers_iterator & iter,
      std::ptrdiff_t difference);
  ``  [''''&raquo;''' [link asio.reference.buffers_iterator.operator_minus_.overload1 more...]]``

  friend std::ptrdiff_t ``[link asio.reference.buffers_iterator.operator_minus_.overload2 operator-]``(
      const buffers_iterator & a,
      const buffers_iterator & b);
  ``  [''''&raquo;''' [link asio.reference.buffers_iterator.operator_minus_.overload2 more...]]``


[section:overload1 buffers_iterator::operator- (1 of 2 overloads)]


Subtraction operator. 


  friend buffers_iterator operator-(
      const buffers_iterator & iter,
      std::ptrdiff_t difference);


[heading Requirements]

['Header: ][^asio/buffers_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:overload2 buffers_iterator::operator- (2 of 2 overloads)]


Subtraction operator. 


  friend std::ptrdiff_t operator-(
      const buffers_iterator & a,
      const buffers_iterator & b);


[heading Requirements]

['Header: ][^asio/buffers_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[endsect]

[section:operator_minus__minus_ buffers_iterator::operator--]

[indexterm2 asio.indexterm.buffers_iterator.operator_minus__minus_..operator--..buffers_iterator] 
Decrement operator (prefix). 


  buffers_iterator & ``[link asio.reference.buffers_iterator.operator_minus__minus_.overload1 operator--]``();
  ``  [''''&raquo;''' [link asio.reference.buffers_iterator.operator_minus__minus_.overload1 more...]]``


Decrement operator (postfix). 


  buffers_iterator ``[link asio.reference.buffers_iterator.operator_minus__minus_.overload2 operator--]``(
      int );
  ``  [''''&raquo;''' [link asio.reference.buffers_iterator.operator_minus__minus_.overload2 more...]]``


[section:overload1 buffers_iterator::operator-- (1 of 2 overloads)]


Decrement operator (prefix). 


  buffers_iterator & operator--();



[endsect]



[section:overload2 buffers_iterator::operator-- (2 of 2 overloads)]


Decrement operator (postfix). 


  buffers_iterator operator--(
      int );



[endsect]


[endsect]


[section:operator_minus__eq_ buffers_iterator::operator-=]

[indexterm2 asio.indexterm.buffers_iterator.operator_minus__eq_..operator-=..buffers_iterator] 
Subtraction operator. 


  buffers_iterator & operator-=(
      std::ptrdiff_t difference);



[endsect]



[section:operator_arrow_ buffers_iterator::operator->]

[indexterm2 asio.indexterm.buffers_iterator.operator_arrow_..operator->..buffers_iterator] 
Dereference an iterator. 


  pointer operator->() const;



[endsect]



[section:operator_lt_ buffers_iterator::operator<]

[indexterm2 asio.indexterm.buffers_iterator.operator_lt_..operator<..buffers_iterator] 
Compare two iterators. 


  friend bool operator<(
      const buffers_iterator & a,
      const buffers_iterator & b);


[heading Requirements]

['Header: ][^asio/buffers_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_lt__eq_ buffers_iterator::operator<=]

[indexterm2 asio.indexterm.buffers_iterator.operator_lt__eq_..operator<=..buffers_iterator] 
Compare two iterators. 


  friend bool operator<=(
      const buffers_iterator & a,
      const buffers_iterator & b);


[heading Requirements]

['Header: ][^asio/buffers_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq__eq_ buffers_iterator::operator==]

[indexterm2 asio.indexterm.buffers_iterator.operator_eq__eq_..operator==..buffers_iterator] 
Test two iterators for equality. 


  friend bool operator==(
      const buffers_iterator & a,
      const buffers_iterator & b);


[heading Requirements]

['Header: ][^asio/buffers_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_gt_ buffers_iterator::operator>]

[indexterm2 asio.indexterm.buffers_iterator.operator_gt_..operator>..buffers_iterator] 
Compare two iterators. 


  friend bool operator>(
      const buffers_iterator & a,
      const buffers_iterator & b);


[heading Requirements]

['Header: ][^asio/buffers_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_gt__eq_ buffers_iterator::operator>=]

[indexterm2 asio.indexterm.buffers_iterator.operator_gt__eq_..operator>=..buffers_iterator] 
Compare two iterators. 


  friend bool operator>=(
      const buffers_iterator & a,
      const buffers_iterator & b);


[heading Requirements]

['Header: ][^asio/buffers_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_lb__rb_ buffers_iterator::operator\[\]]

[indexterm2 asio.indexterm.buffers_iterator.operator_lb__rb_..operator\[\]..buffers_iterator] 
Access an individual element. 


  reference operator[](
      std::ptrdiff_t difference) const;



[endsect]



[section:pointer buffers_iterator::pointer]

[indexterm2 asio.indexterm.buffers_iterator.pointer..pointer..buffers_iterator] 
The type of the result of applying `operator->()` to the iterator. 


  typedef const_or_non_const_ByteType * pointer;



If the buffer sequence stores buffer objects that are convertible to [link asio.reference.mutable_buffer `mutable_buffer`], this is a pointer to a non-const ByteType. Otherwise, a pointer to a const ByteType. 

[heading Requirements]

['Header: ][^asio/buffers_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:reference buffers_iterator::reference]

[indexterm2 asio.indexterm.buffers_iterator.reference..reference..buffers_iterator] 
The type of the result of applying `operator*()` to the iterator. 


  typedef const_or_non_const_ByteType & reference;



If the buffer sequence stores buffer objects that are convertible to [link asio.reference.mutable_buffer `mutable_buffer`], this is a reference to a non-const ByteType. Otherwise, a reference to a const ByteType. 

[heading Requirements]

['Header: ][^asio/buffers_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:value_type buffers_iterator::value_type]

[indexterm2 asio.indexterm.buffers_iterator.value_type..value_type..buffers_iterator] 
The type of the value pointed to by the iterator. 


  typedef ByteType value_type;



[heading Requirements]

['Header: ][^asio/buffers_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:can_prefer can_prefer]


A type trait that determines whether a `prefer` expression is well-formed. 


  template<
      typename T,
      typename... Properties>
  struct can_prefer


Class template `can_prefer` is a trait that is derived from `true_type` if the expression `asio::prefer(std::declval<T>(), std::declval<Properties>()...)` is well formed; otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/prefer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]

[section:can_query can_query]


A type trait that determines whether a `query` expression is well-formed. 


  template<
      typename T,
      typename Property>
  struct can_query


Class template `can_query` is a trait that is derived from `true_type` if the expression `asio::query(std::declval<T>(), std::declval<Property>())` is well formed; otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/query.hpp]

['Convenience header: ][^asio.hpp]


[endsect]

[section:can_require can_require]


A type trait that determines whether a `require` expression is well-formed. 


  template<
      typename T,
      typename... Properties>
  struct can_require


Class template `can_require` is a trait that is derived from `true_type` if the expression `asio::require(std::declval<T>(), std::declval<Properties>()...)` is well formed; otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/require.hpp]

['Convenience header: ][^asio.hpp]


[endsect]

[section:can_require_concept can_require_concept]


A type trait that determines whether a `require_concept` expression is well-formed. 


  template<
      typename T,
      typename Property>
  struct can_require_concept


Class template `can_require_concept` is a trait that is derived from `true_type` if the expression `asio::require_concept(std::declval<T>(), std::declval<Property>())` is well formed; otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/require_concept.hpp]

['Convenience header: ][^asio.hpp]


[endsect]

[section:co_spawn co_spawn]

[indexterm1 asio.indexterm.co_spawn..co_spawn] 
Spawn a new coroutined-based thread of execution. 

  template<
      typename ``[link asio.reference.Executor1 Executor]``,
      typename T,
      typename ``[link asio.reference.Executor1 AwaitableExecutor]``,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.co_spawn.overload1 co_spawn]``(
      const Executor & ex,
      awaitable< T, AwaitableExecutor > a,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< (is_executor< Executor >::value||execution::is_executor< Executor >::value)&&is_convertible< Executor, AwaitableExecutor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.co_spawn.overload1 more...]]``

  template<
      typename ``[link asio.reference.Executor1 Executor]``,
      typename ``[link asio.reference.Executor1 AwaitableExecutor]``,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.co_spawn.overload2 co_spawn]``(
      const Executor & ex,
      awaitable< void, AwaitableExecutor > a,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< (is_executor< Executor >::value||execution::is_executor< Executor >::value)&&is_convertible< Executor, AwaitableExecutor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.co_spawn.overload2 more...]]``

  template<
      typename ExecutionContext,
      typename T,
      typename ``[link asio.reference.Executor1 AwaitableExecutor]``,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.co_spawn.overload3 co_spawn]``(
      ExecutionContext & ctx,
      awaitable< T, AwaitableExecutor > a,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value &&is_convertible< typename ExecutionContext::executor_type, AwaitableExecutor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.co_spawn.overload3 more...]]``

  template<
      typename ExecutionContext,
      typename ``[link asio.reference.Executor1 AwaitableExecutor]``,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.co_spawn.overload4 co_spawn]``(
      ExecutionContext & ctx,
      awaitable< void, AwaitableExecutor > a,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value &&is_convertible< typename ExecutionContext::executor_type, AwaitableExecutor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.co_spawn.overload4 more...]]``

  template<
      typename ``[link asio.reference.Executor1 Executor]``,
      typename F,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.co_spawn.overload5 co_spawn]``(
      const Executor & ex,
      F && f,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_executor< Executor >::value||execution::is_executor< Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.co_spawn.overload5 more...]]``

  template<
      typename ExecutionContext,
      typename F,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.co_spawn.overload6 co_spawn]``(
      ExecutionContext & ctx,
      F && f,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.co_spawn.overload6 more...]]``

[heading Requirements]

['Header: ][^asio/co_spawn.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 co_spawn (1 of 6 overloads)]


Spawn a new coroutined-based thread of execution. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``,
      typename T,
      typename ``[link asio.reference.Executor1 AwaitableExecutor]``,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` co_spawn(
      const Executor & ex,
      awaitable< T, AwaitableExecutor > a,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< (is_executor< Executor >::value||execution::is_executor< Executor >::value)&&is_convertible< Executor, AwaitableExecutor >::value >::type *  = 0);



[heading Parameters]
    

[variablelist
  
[[ex][The executor that will be used to schedule the new thread of execution.]]

[[a][The [link asio.reference.awaitable `awaitable`] object that is the result of calling the coroutine's entry point function.]]

[[token][The completion token that will handle the notification that the thread of execution has completed. The function signature of the completion handler must be: 
``
   void handler(std::exception_ptr, T); 
``
]]

]


[heading Example]
  


   asio::awaitable<std::size_t> echo(tcp::socket socket)
   {
     std::size_t bytes_transferred = 0;

     try
     {
       char data[1024];
       for (;;)
       {
         std::size_t n = co_await socket.async_read_some(
             asio::buffer(data), asio::use_awaitable);

         co_await asio::async_write(socket,
             asio::buffer(data, n), asio::use_awaitable);

         bytes_transferred += n;
       }
     }
     catch (const std::exception&)
     {
     }

     co_return bytes_transferred;
   }

   // ...

   asio::co_spawn(my_executor,
     echo(std::move(my_tcp_socket)),
     [](std::exception_ptr e, std::size_t n)
     {
       std::cout << "transferred " << n << "\n";
     });







[endsect]



[section:overload2 co_spawn (2 of 6 overloads)]


Spawn a new coroutined-based thread of execution. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``,
      typename ``[link asio.reference.Executor1 AwaitableExecutor]``,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` co_spawn(
      const Executor & ex,
      awaitable< void, AwaitableExecutor > a,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< (is_executor< Executor >::value||execution::is_executor< Executor >::value)&&is_convertible< Executor, AwaitableExecutor >::value >::type *  = 0);



[heading Parameters]
    

[variablelist
  
[[ex][The executor that will be used to schedule the new thread of execution.]]

[[a][The [link asio.reference.awaitable `awaitable`] object that is the result of calling the coroutine's entry point function.]]

[[token][The completion token that will handle the notification that the thread of execution has completed. The function signature of the completion handler must be: 
``
   void handler(std::exception_ptr); 
``
]]

]


[heading Example]
  


   asio::awaitable<void> echo(tcp::socket socket)
   {
     try
     {
       char data[1024];
       for (;;)
       {
         std::size_t n = co_await socket.async_read_some(
             asio::buffer(data), asio::use_awaitable);

         co_await asio::async_write(socket,
             asio::buffer(data, n), asio::use_awaitable);
       }
     }
     catch (const std::exception& e)
     {
       std::cerr << "Exception: " << e.what() << "\n";
     }
   }

   // ...

   asio::co_spawn(my_executor,
     echo(std::move(my_tcp_socket)),
     asio::detached);







[endsect]



[section:overload3 co_spawn (3 of 6 overloads)]


Spawn a new coroutined-based thread of execution. 


  template<
      typename ExecutionContext,
      typename T,
      typename ``[link asio.reference.Executor1 AwaitableExecutor]``,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` co_spawn(
      ExecutionContext & ctx,
      awaitable< T, AwaitableExecutor > a,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value &&is_convertible< typename ExecutionContext::executor_type, AwaitableExecutor >::value >::type *  = 0);



[heading Parameters]
    

[variablelist
  
[[ctx][An execution context that will provide the executor to be used to schedule the new thread of execution.]]

[[a][The [link asio.reference.awaitable `awaitable`] object that is the result of calling the coroutine's entry point function.]]

[[token][The completion token that will handle the notification that the thread of execution has completed. The function signature of the completion handler must be: 
``
   void handler(std::exception_ptr); 
``
]]

]


[heading Example]
  


   asio::awaitable<std::size_t> echo(tcp::socket socket)
   {
     std::size_t bytes_transferred = 0;

     try
     {
       char data[1024];
       for (;;)
       {
         std::size_t n = co_await socket.async_read_some(
             asio::buffer(data), asio::use_awaitable);

         co_await asio::async_write(socket,
             asio::buffer(data, n), asio::use_awaitable);

         bytes_transferred += n;
       }
     }
     catch (const std::exception&)
     {
     }

     co_return bytes_transferred;
   }

   // ...

   asio::co_spawn(my_io_context,
     echo(std::move(my_tcp_socket)),
     [](std::exception_ptr e, std::size_t n)
     {
       std::cout << "transferred " << n << "\n";
     });







[endsect]



[section:overload4 co_spawn (4 of 6 overloads)]


Spawn a new coroutined-based thread of execution. 


  template<
      typename ExecutionContext,
      typename ``[link asio.reference.Executor1 AwaitableExecutor]``,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` co_spawn(
      ExecutionContext & ctx,
      awaitable< void, AwaitableExecutor > a,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value &&is_convertible< typename ExecutionContext::executor_type, AwaitableExecutor >::value >::type *  = 0);



[heading Parameters]
    

[variablelist
  
[[ctx][An execution context that will provide the executor to be used to schedule the new thread of execution.]]

[[a][The [link asio.reference.awaitable `awaitable`] object that is the result of calling the coroutine's entry point function.]]

[[token][The completion token that will handle the notification that the thread of execution has completed. The function signature of the completion handler must be: 
``
   void handler(std::exception_ptr); 
``
]]

]


[heading Example]
  


   asio::awaitable<void> echo(tcp::socket socket)
   {
     try
     {
       char data[1024];
       for (;;)
       {
         std::size_t n = co_await socket.async_read_some(
             asio::buffer(data), asio::use_awaitable);

         co_await asio::async_write(socket,
             asio::buffer(data, n), asio::use_awaitable);
       }
     }
     catch (const std::exception& e)
     {
       std::cerr << "Exception: " << e.what() << "\n";
     }
   }

   // ...

   asio::co_spawn(my_io_context,
     echo(std::move(my_tcp_socket)),
     asio::detached);







[endsect]



[section:overload5 co_spawn (5 of 6 overloads)]


Spawn a new coroutined-based thread of execution. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``,
      typename F,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` co_spawn(
      const Executor & ex,
      F && f,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_executor< Executor >::value||execution::is_executor< Executor >::value >::type *  = 0);



[heading Parameters]
    

[variablelist
  
[[ex][The executor that will be used to schedule the new thread of execution.]]

[[f][A nullary function object with a return type of the form `asio::awaitable<R,E>` that will be used as the coroutine's entry point.]]

[[token][The completion token that will handle the notification that the thread of execution has completed. If `R` is `void`, the function signature of the completion handler must be:]]

]



   void handler(std::exception_ptr); 


Otherwise, the function signature of the completion handler must be: 

   void handler(std::exception_ptr, R); 





[heading Example]
  


   asio::awaitable<std::size_t> echo(tcp::socket socket)
   {
     std::size_t bytes_transferred = 0;

     try
     {
       char data[1024];
       for (;;)
       {
         std::size_t n = co_await socket.async_read_some(
             asio::buffer(data), asio::use_awaitable);

         co_await asio::async_write(socket,
             asio::buffer(data, n), asio::use_awaitable);

         bytes_transferred += n;
       }
     }
     catch (const std::exception&)
     {
     }

     co_return bytes_transferred;
   }

   // ...

   asio::co_spawn(my_executor,
     [socket = std::move(my_tcp_socket)]() mutable
       -> asio::awaitable<void>
     {
       try
       {
         char data[1024];
         for (;;)
         {
           std::size_t n = co_await socket.async_read_some(
               asio::buffer(data), asio::use_awaitable);

           co_await asio::async_write(socket,
               asio::buffer(data, n), asio::use_awaitable);
         }
       }
       catch (const std::exception& e)
       {
         std::cerr << "Exception: " << e.what() << "\n";
       }
     }, asio::detached);







[endsect]



[section:overload6 co_spawn (6 of 6 overloads)]


Spawn a new coroutined-based thread of execution. 


  template<
      typename ExecutionContext,
      typename F,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` co_spawn(
      ExecutionContext & ctx,
      F && f,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);



[heading Parameters]
    

[variablelist
  
[[ctx][An execution context that will provide the executor to be used to schedule the new thread of execution.]]

[[f][A nullary function object with a return type of the form `asio::awaitable<R,E>` that will be used as the coroutine's entry point.]]

[[token][The completion token that will handle the notification that the thread of execution has completed. If `R` is `void`, the function signature of the completion handler must be:]]

]



   void handler(std::exception_ptr); 


Otherwise, the function signature of the completion handler must be: 

   void handler(std::exception_ptr, R); 





[heading Example]
  


   asio::awaitable<std::size_t> echo(tcp::socket socket)
   {
     std::size_t bytes_transferred = 0;

     try
     {
       char data[1024];
       for (;;)
       {
         std::size_t n = co_await socket.async_read_some(
             asio::buffer(data), asio::use_awaitable);

         co_await asio::async_write(socket,
             asio::buffer(data, n), asio::use_awaitable);

         bytes_transferred += n;
       }
     }
     catch (const std::exception&)
     {
     }

     co_return bytes_transferred;
   }

   // ...

   asio::co_spawn(my_io_context,
     [socket = std::move(my_tcp_socket)]() mutable
       -> asio::awaitable<void>
     {
       try
       {
         char data[1024];
         for (;;)
         {
           std::size_t n = co_await socket.async_read_some(
               asio::buffer(data), asio::use_awaitable);

           co_await asio::async_write(socket,
               asio::buffer(data, n), asio::use_awaitable);
         }
       }
       catch (const std::exception& e)
       {
         std::cerr << "Exception: " << e.what() << "\n";
       }
     }, asio::detached);







[endsect]


[endsect]

[section:connect connect]

[indexterm1 asio.indexterm.connect..connect] 
The `connect` function is a composed operation that establishes a socket connection by trying each endpoint in a sequence. 


Establishes a socket connection by trying each endpoint in a sequence. 

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename ``[link asio.reference.EndpointSequence EndpointSequence]``>
  Protocol::endpoint ``[link asio.reference.connect.overload1 connect]``(
      basic_socket< Protocol, Executor > & s,
      const EndpointSequence & endpoints,
      typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.connect.overload1 more...]]``

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename ``[link asio.reference.EndpointSequence EndpointSequence]``>
  Protocol::endpoint ``[link asio.reference.connect.overload2 connect]``(
      basic_socket< Protocol, Executor > & s,
      const EndpointSequence & endpoints,
      asio::error_code & ec,
      typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.connect.overload2 more...]]``

(Deprecated: Use range overload.) Establishes a socket connection by trying each endpoint in a sequence. 

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator>
  Iterator ``[link asio.reference.connect.overload3 connect]``(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.connect.overload3 more...]]``

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator>
  Iterator ``[link asio.reference.connect.overload4 connect]``(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      asio::error_code & ec,
      typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.connect.overload4 more...]]``

Establishes a socket connection by trying each endpoint in a sequence. 

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator>
  Iterator ``[link asio.reference.connect.overload5 connect]``(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      Iterator end);
  ``  [''''&raquo;''' [link asio.reference.connect.overload5 more...]]``

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator>
  Iterator ``[link asio.reference.connect.overload6 connect]``(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      Iterator end,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.connect.overload6 more...]]``

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename ``[link asio.reference.EndpointSequence EndpointSequence]``,
      typename ``[link asio.reference.ConnectCondition ConnectCondition]``>
  Protocol::endpoint ``[link asio.reference.connect.overload7 connect]``(
      basic_socket< Protocol, Executor > & s,
      const EndpointSequence & endpoints,
      ConnectCondition connect_condition,
      typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.connect.overload7 more...]]``

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename ``[link asio.reference.EndpointSequence EndpointSequence]``,
      typename ``[link asio.reference.ConnectCondition ConnectCondition]``>
  Protocol::endpoint ``[link asio.reference.connect.overload8 connect]``(
      basic_socket< Protocol, Executor > & s,
      const EndpointSequence & endpoints,
      ConnectCondition connect_condition,
      asio::error_code & ec,
      typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.connect.overload8 more...]]``

(Deprecated: Use range overload.) Establishes a socket connection by trying each endpoint in a sequence. 

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator,
      typename ``[link asio.reference.ConnectCondition ConnectCondition]``>
  Iterator ``[link asio.reference.connect.overload9 connect]``(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      ConnectCondition connect_condition,
      typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.connect.overload9 more...]]``

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator,
      typename ``[link asio.reference.ConnectCondition ConnectCondition]``>
  Iterator ``[link asio.reference.connect.overload10 connect]``(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      ConnectCondition connect_condition,
      asio::error_code & ec,
      typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.connect.overload10 more...]]``

Establishes a socket connection by trying each endpoint in a sequence. 

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator,
      typename ``[link asio.reference.ConnectCondition ConnectCondition]``>
  Iterator ``[link asio.reference.connect.overload11 connect]``(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      Iterator end,
      ConnectCondition connect_condition);
  ``  [''''&raquo;''' [link asio.reference.connect.overload11 more...]]``

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator,
      typename ``[link asio.reference.ConnectCondition ConnectCondition]``>
  Iterator ``[link asio.reference.connect.overload12 connect]``(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      Iterator end,
      ConnectCondition connect_condition,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.connect.overload12 more...]]``

[heading Requirements]

['Header: ][^asio/connect.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 connect (1 of 12 overloads)]


Establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename ``[link asio.reference.EndpointSequence EndpointSequence]``>
  Protocol::endpoint connect(
      basic_socket< Protocol, Executor > & s,
      const EndpointSequence & endpoints,
      typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);


This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's `connect` member function, once for each endpoint in the sequence, until a connection is successfully established.


[heading Parameters]
    

[variablelist
  
[[s][The socket to be connected. If the socket is already open, it will be closed.]]

[[endpoints][A sequence of endpoints.]]

]


[heading Return Value]
      
The successfully connected endpoint.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. If the sequence is empty, the associated `error_code` is `asio::error::not_found`. Otherwise, contains the error from the last connection attempt.]]

]


[heading Example]
  


   tcp::resolver r(my_context);
   tcp::resolver::query q("host", "service");
   tcp::socket s(my_context);
   asio::connect(s, r.resolve(q)); 







[endsect]



[section:overload2 connect (2 of 12 overloads)]


Establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename ``[link asio.reference.EndpointSequence EndpointSequence]``>
  Protocol::endpoint connect(
      basic_socket< Protocol, Executor > & s,
      const EndpointSequence & endpoints,
      asio::error_code & ec,
      typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);


This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's `connect` member function, once for each endpoint in the sequence, until a connection is successfully established.


[heading Parameters]
    

[variablelist
  
[[s][The socket to be connected. If the socket is already open, it will be closed.]]

[[endpoints][A sequence of endpoints.]]

[[ec][Set to indicate what error occurred, if any. If the sequence is empty, set to `asio::error::not_found`. Otherwise, contains the error from the last connection attempt.]]

]


[heading Return Value]
      
On success, the successfully connected endpoint. Otherwise, a default-constructed endpoint.


[heading Example]
  


   tcp::resolver r(my_context);
   tcp::resolver::query q("host", "service");
   tcp::socket s(my_context);
   asio::error_code ec;
   asio::connect(s, r.resolve(q), ec);
   if (ec)
   {
     // An error occurred.
   } 







[endsect]



[section:overload3 connect (3 of 12 overloads)]


(Deprecated: Use range overload.) Establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator>
  Iterator connect(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);


This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's `connect` member function, once for each endpoint in the sequence, until a connection is successfully established.


[heading Parameters]
    

[variablelist
  
[[s][The socket to be connected. If the socket is already open, it will be closed.]]

[[begin][An iterator pointing to the start of a sequence of endpoints.]]

]


[heading Return Value]
      
On success, an iterator denoting the successfully connected endpoint. Otherwise, the end iterator.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. If the sequence is empty, the associated `error_code` is `asio::error::not_found`. Otherwise, contains the error from the last connection attempt.]]

]


[heading Remarks]
      
This overload assumes that a default constructed object of type `Iterator` represents the end of the sequence. This is a valid assumption for iterator types such as `asio::ip::tcp::resolver::iterator`. 




[endsect]



[section:overload4 connect (4 of 12 overloads)]


(Deprecated: Use range overload.) Establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator>
  Iterator connect(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      asio::error_code & ec,
      typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);


This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's `connect` member function, once for each endpoint in the sequence, until a connection is successfully established.


[heading Parameters]
    

[variablelist
  
[[s][The socket to be connected. If the socket is already open, it will be closed.]]

[[begin][An iterator pointing to the start of a sequence of endpoints.]]

[[ec][Set to indicate what error occurred, if any. If the sequence is empty, set to `asio::error::not_found`. Otherwise, contains the error from the last connection attempt.]]

]


[heading Return Value]
      
On success, an iterator denoting the successfully connected endpoint. Otherwise, the end iterator.


[heading Remarks]
      
This overload assumes that a default constructed object of type `Iterator` represents the end of the sequence. This is a valid assumption for iterator types such as `asio::ip::tcp::resolver::iterator`. 




[endsect]



[section:overload5 connect (5 of 12 overloads)]


Establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator>
  Iterator connect(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      Iterator end);


This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's `connect` member function, once for each endpoint in the sequence, until a connection is successfully established.


[heading Parameters]
    

[variablelist
  
[[s][The socket to be connected. If the socket is already open, it will be closed.]]

[[begin][An iterator pointing to the start of a sequence of endpoints.]]

[[end][An iterator pointing to the end of a sequence of endpoints.]]

]


[heading Return Value]
      
An iterator denoting the successfully connected endpoint.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. If the sequence is empty, the associated `error_code` is `asio::error::not_found`. Otherwise, contains the error from the last connection attempt.]]

]


[heading Example]
  


   tcp::resolver r(my_context);
   tcp::resolver::query q("host", "service");
   tcp::resolver::results_type e = r.resolve(q);
   tcp::socket s(my_context);
   asio::connect(s, e.begin(), e.end()); 







[endsect]



[section:overload6 connect (6 of 12 overloads)]


Establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator>
  Iterator connect(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      Iterator end,
      asio::error_code & ec);


This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's `connect` member function, once for each endpoint in the sequence, until a connection is successfully established.


[heading Parameters]
    

[variablelist
  
[[s][The socket to be connected. If the socket is already open, it will be closed.]]

[[begin][An iterator pointing to the start of a sequence of endpoints.]]

[[end][An iterator pointing to the end of a sequence of endpoints.]]

[[ec][Set to indicate what error occurred, if any. If the sequence is empty, set to `asio::error::not_found`. Otherwise, contains the error from the last connection attempt.]]

]


[heading Return Value]
      
On success, an iterator denoting the successfully connected endpoint. Otherwise, the end iterator.


[heading Example]
  


   tcp::resolver r(my_context);
   tcp::resolver::query q("host", "service");
   tcp::resolver::results_type e = r.resolve(q);
   tcp::socket s(my_context);
   asio::error_code ec;
   asio::connect(s, e.begin(), e.end(), ec);
   if (ec)
   {
     // An error occurred.
   } 







[endsect]



[section:overload7 connect (7 of 12 overloads)]


Establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename ``[link asio.reference.EndpointSequence EndpointSequence]``,
      typename ``[link asio.reference.ConnectCondition ConnectCondition]``>
  Protocol::endpoint connect(
      basic_socket< Protocol, Executor > & s,
      const EndpointSequence & endpoints,
      ConnectCondition connect_condition,
      typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);


This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's `connect` member function, once for each endpoint in the sequence, until a connection is successfully established.


[heading Parameters]
    

[variablelist
  
[[s][The socket to be connected. If the socket is already open, it will be closed.]]

[[endpoints][A sequence of endpoints.]]

[[connect_condition][A function object that is called prior to each connection attempt. The signature of the function object must be: 
``
   bool connect_condition(
       const asio::error_code& ec,
       const typename Protocol::endpoint& next); 
``
The `ec` parameter contains the result from the most recent connect operation. Before the first connection attempt, `ec` is always set to indicate success. The `next` parameter is the next endpoint to be tried. The function object should return true if the next endpoint should be tried, and false if it should be skipped.]]

]


[heading Return Value]
      
The successfully connected endpoint.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. If the sequence is empty, the associated `error_code` is `asio::error::not_found`. Otherwise, contains the error from the last connection attempt.]]

]


[heading Example]
  
The following connect condition function object can be used to output information about the individual connection attempts: 

   struct my_connect_condition
   {
     bool operator()(
         const asio::error_code& ec,
         const::tcp::endpoint& next)
     {
       if (ec) std::cout << "Error: " << ec.message() << std::endl;
       std::cout << "Trying: " << next << std::endl;
       return true;
     }
   }; 


It would be used with the `asio::connect` function as follows: 

   tcp::resolver r(my_context);
   tcp::resolver::query q("host", "service");
   tcp::socket s(my_context);
   tcp::endpoint e = asio::connect(s,
       r.resolve(q), my_connect_condition());
   std::cout << "Connected to: " << e << std::endl; 







[endsect]



[section:overload8 connect (8 of 12 overloads)]


Establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename ``[link asio.reference.EndpointSequence EndpointSequence]``,
      typename ``[link asio.reference.ConnectCondition ConnectCondition]``>
  Protocol::endpoint connect(
      basic_socket< Protocol, Executor > & s,
      const EndpointSequence & endpoints,
      ConnectCondition connect_condition,
      asio::error_code & ec,
      typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);


This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's `connect` member function, once for each endpoint in the sequence, until a connection is successfully established.


[heading Parameters]
    

[variablelist
  
[[s][The socket to be connected. If the socket is already open, it will be closed.]]

[[endpoints][A sequence of endpoints.]]

[[connect_condition][A function object that is called prior to each connection attempt. The signature of the function object must be: 
``
   bool connect_condition(
       const asio::error_code& ec,
       const typename Protocol::endpoint& next); 
``
The `ec` parameter contains the result from the most recent connect operation. Before the first connection attempt, `ec` is always set to indicate success. The `next` parameter is the next endpoint to be tried. The function object should return true if the next endpoint should be tried, and false if it should be skipped.]]

[[ec][Set to indicate what error occurred, if any. If the sequence is empty, set to `asio::error::not_found`. Otherwise, contains the error from the last connection attempt.]]

]


[heading Return Value]
      
On success, the successfully connected endpoint. Otherwise, a default-constructed endpoint.


[heading Example]
  
The following connect condition function object can be used to output information about the individual connection attempts: 

   struct my_connect_condition
   {
     bool operator()(
         const asio::error_code& ec,
         const::tcp::endpoint& next)
     {
       if (ec) std::cout << "Error: " << ec.message() << std::endl;
       std::cout << "Trying: " << next << std::endl;
       return true;
     }
   }; 


It would be used with the `asio::connect` function as follows: 

   tcp::resolver r(my_context);
   tcp::resolver::query q("host", "service");
   tcp::socket s(my_context);
   asio::error_code ec;
   tcp::endpoint e = asio::connect(s,
       r.resolve(q), my_connect_condition(), ec);
   if (ec)
   {
     // An error occurred.
   }
   else
   {
     std::cout << "Connected to: " << e << std::endl;
   } 







[endsect]



[section:overload9 connect (9 of 12 overloads)]


(Deprecated: Use range overload.) Establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator,
      typename ``[link asio.reference.ConnectCondition ConnectCondition]``>
  Iterator connect(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      ConnectCondition connect_condition,
      typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);


This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's `connect` member function, once for each endpoint in the sequence, until a connection is successfully established.


[heading Parameters]
    

[variablelist
  
[[s][The socket to be connected. If the socket is already open, it will be closed.]]

[[begin][An iterator pointing to the start of a sequence of endpoints.]]

[[connect_condition][A function object that is called prior to each connection attempt. The signature of the function object must be: 
``
   bool connect_condition(
       const asio::error_code& ec,
       const typename Protocol::endpoint& next); 
``
The `ec` parameter contains the result from the most recent connect operation. Before the first connection attempt, `ec` is always set to indicate success. The `next` parameter is the next endpoint to be tried. The function object should return true if the next endpoint should be tried, and false if it should be skipped.]]

]


[heading Return Value]
      
On success, an iterator denoting the successfully connected endpoint. Otherwise, the end iterator.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. If the sequence is empty, the associated `error_code` is `asio::error::not_found`. Otherwise, contains the error from the last connection attempt.]]

]


[heading Remarks]
      
This overload assumes that a default constructed object of type `Iterator` represents the end of the sequence. This is a valid assumption for iterator types such as `asio::ip::tcp::resolver::iterator`. 




[endsect]



[section:overload10 connect (10 of 12 overloads)]


(Deprecated: Use range overload.) Establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator,
      typename ``[link asio.reference.ConnectCondition ConnectCondition]``>
  Iterator connect(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      ConnectCondition connect_condition,
      asio::error_code & ec,
      typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);


This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's `connect` member function, once for each endpoint in the sequence, until a connection is successfully established.


[heading Parameters]
    

[variablelist
  
[[s][The socket to be connected. If the socket is already open, it will be closed.]]

[[begin][An iterator pointing to the start of a sequence of endpoints.]]

[[connect_condition][A function object that is called prior to each connection attempt. The signature of the function object must be: 
``
   bool connect_condition(
       const asio::error_code& ec,
       const typename Protocol::endpoint& next); 
``
The `ec` parameter contains the result from the most recent connect operation. Before the first connection attempt, `ec` is always set to indicate success. The `next` parameter is the next endpoint to be tried. The function object should return true if the next endpoint should be tried, and false if it should be skipped.]]

[[ec][Set to indicate what error occurred, if any. If the sequence is empty, set to `asio::error::not_found`. Otherwise, contains the error from the last connection attempt.]]

]


[heading Return Value]
      
On success, an iterator denoting the successfully connected endpoint. Otherwise, the end iterator.


[heading Remarks]
      
This overload assumes that a default constructed object of type `Iterator` represents the end of the sequence. This is a valid assumption for iterator types such as `asio::ip::tcp::resolver::iterator`. 




[endsect]



[section:overload11 connect (11 of 12 overloads)]


Establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator,
      typename ``[link asio.reference.ConnectCondition ConnectCondition]``>
  Iterator connect(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      Iterator end,
      ConnectCondition connect_condition);


This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's `connect` member function, once for each endpoint in the sequence, until a connection is successfully established.


[heading Parameters]
    

[variablelist
  
[[s][The socket to be connected. If the socket is already open, it will be closed.]]

[[begin][An iterator pointing to the start of a sequence of endpoints.]]

[[end][An iterator pointing to the end of a sequence of endpoints.]]

[[connect_condition][A function object that is called prior to each connection attempt. The signature of the function object must be: 
``
   bool connect_condition(
       const asio::error_code& ec,
       const typename Protocol::endpoint& next); 
``
The `ec` parameter contains the result from the most recent connect operation. Before the first connection attempt, `ec` is always set to indicate success. The `next` parameter is the next endpoint to be tried. The function object should return true if the next endpoint should be tried, and false if it should be skipped.]]

]


[heading Return Value]
      
An iterator denoting the successfully connected endpoint.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. If the sequence is empty, the associated `error_code` is `asio::error::not_found`. Otherwise, contains the error from the last connection attempt.]]

]


[heading Example]
  
The following connect condition function object can be used to output information about the individual connection attempts: 

   struct my_connect_condition
   {
     bool operator()(
         const asio::error_code& ec,
         const::tcp::endpoint& next)
     {
       if (ec) std::cout << "Error: " << ec.message() << std::endl;
       std::cout << "Trying: " << next << std::endl;
       return true;
     }
   }; 


It would be used with the `asio::connect` function as follows: 

   tcp::resolver r(my_context);
   tcp::resolver::query q("host", "service");
   tcp::resolver::results_type e = r.resolve(q);
   tcp::socket s(my_context);
   tcp::resolver::results_type::iterator i = asio::connect(
       s, e.begin(), e.end(), my_connect_condition());
   std::cout << "Connected to: " << i->endpoint() << std::endl; 







[endsect]



[section:overload12 connect (12 of 12 overloads)]


Establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Iterator,
      typename ``[link asio.reference.ConnectCondition ConnectCondition]``>
  Iterator connect(
      basic_socket< Protocol, Executor > & s,
      Iterator begin,
      Iterator end,
      ConnectCondition connect_condition,
      asio::error_code & ec);


This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's `connect` member function, once for each endpoint in the sequence, until a connection is successfully established.


[heading Parameters]
    

[variablelist
  
[[s][The socket to be connected. If the socket is already open, it will be closed.]]

[[begin][An iterator pointing to the start of a sequence of endpoints.]]

[[end][An iterator pointing to the end of a sequence of endpoints.]]

[[connect_condition][A function object that is called prior to each connection attempt. The signature of the function object must be: 
``
   bool connect_condition(
       const asio::error_code& ec,
       const typename Protocol::endpoint& next); 
``
The `ec` parameter contains the result from the most recent connect operation. Before the first connection attempt, `ec` is always set to indicate success. The `next` parameter is the next endpoint to be tried. The function object should return true if the next endpoint should be tried, and false if it should be skipped.]]

[[ec][Set to indicate what error occurred, if any. If the sequence is empty, set to `asio::error::not_found`. Otherwise, contains the error from the last connection attempt.]]

]


[heading Return Value]
      
On success, an iterator denoting the successfully connected endpoint. Otherwise, the end iterator.


[heading Example]
  
The following connect condition function object can be used to output information about the individual connection attempts: 

   struct my_connect_condition
   {
     bool operator()(
         const asio::error_code& ec,
         const::tcp::endpoint& next)
     {
       if (ec) std::cout << "Error: " << ec.message() << std::endl;
       std::cout << "Trying: " << next << std::endl;
       return true;
     }
   }; 


It would be used with the `asio::connect` function as follows: 

   tcp::resolver r(my_context);
   tcp::resolver::query q("host", "service");
   tcp::resolver::results_type e = r.resolve(q);
   tcp::socket s(my_context);
   asio::error_code ec;
   tcp::resolver::results_type::iterator i = asio::connect(
       s, e.begin(), e.end(), my_connect_condition());
   if (ec)
   {
     // An error occurred.
   }
   else
   {
     std::cout << "Connected to: " << i->endpoint() << std::endl;
   } 







[endsect]


[endsect]

[section:const_buffer const_buffer]


Holds a buffer that cannot be modified. 


  class const_buffer


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.const_buffer.const_buffer [*const_buffer]] [constructor]]
    [Construct an empty buffer. 
     [hr]
     Construct a buffer to represent a given memory range. 
     [hr]
     Construct a non-modifiable buffer from a modifiable one. ]
  ]
  
  [
    [[link asio.reference.const_buffer.data [*data]]]
    [Get a pointer to the beginning of the memory range. ]
  ]
  
  [
    [[link asio.reference.const_buffer.operator_plus__eq_ [*operator+=]]]
    [Move the start of the buffer by the specified number of bytes. ]
  ]
  
  [
    [[link asio.reference.const_buffer.size [*size]]]
    [Get the size of the memory range. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.const_buffer.operator_plus_ [*operator+]]]
    [Create a new non-modifiable buffer that is offset from the start of another. ]
  ]
  
]

The [link asio.reference.const_buffer `const_buffer`] class provides a safe representation of a buffer that cannot be modified. It does not own the underlying data, and so is cheap to copy or assign.


[heading Accessing Buffer Contents]
  


The contents of a buffer may be accessed using the `data()` and `size()` member functions:



   asio::const_buffer b1 = ...;
   std::size_t s1 = b1.size();
   const unsigned char* p1 = static_cast<const unsigned char*>(b1.data());




The `data()` member function permits violations of type safety, so uses of it in application code should be carefully considered. 

[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]

[section:const_buffer const_buffer::const_buffer]

[indexterm2 asio.indexterm.const_buffer.const_buffer..const_buffer..const_buffer] 
Construct an empty buffer. 


  ``[link asio.reference.const_buffer.const_buffer.overload1 const_buffer]``();
  ``  [''''&raquo;''' [link asio.reference.const_buffer.const_buffer.overload1 more...]]``


Construct a buffer to represent a given memory range. 


  ``[link asio.reference.const_buffer.const_buffer.overload2 const_buffer]``(
      const void * data,
      std::size_t size);
  ``  [''''&raquo;''' [link asio.reference.const_buffer.const_buffer.overload2 more...]]``


Construct a non-modifiable buffer from a modifiable one. 


  ``[link asio.reference.const_buffer.const_buffer.overload3 const_buffer]``(
      const mutable_buffer & b);
  ``  [''''&raquo;''' [link asio.reference.const_buffer.const_buffer.overload3 more...]]``


[section:overload1 const_buffer::const_buffer (1 of 3 overloads)]


Construct an empty buffer. 


  const_buffer();



[endsect]



[section:overload2 const_buffer::const_buffer (2 of 3 overloads)]


Construct a buffer to represent a given memory range. 


  const_buffer(
      const void * data,
      std::size_t size);



[endsect]



[section:overload3 const_buffer::const_buffer (3 of 3 overloads)]


Construct a non-modifiable buffer from a modifiable one. 


  const_buffer(
      const mutable_buffer & b);



[endsect]


[endsect]


[section:data const_buffer::data]

[indexterm2 asio.indexterm.const_buffer.data..data..const_buffer] 
Get a pointer to the beginning of the memory range. 


  const void * data() const;



[endsect]


[section:operator_plus_ const_buffer::operator+]

[indexterm2 asio.indexterm.const_buffer.operator_plus_..operator+..const_buffer] 
Create a new non-modifiable buffer that is offset from the start of another. 


  const_buffer ``[link asio.reference.const_buffer.operator_plus_.overload1 operator+]``(
      const const_buffer & b,
      std::size_t n);
  ``  [''''&raquo;''' [link asio.reference.const_buffer.operator_plus_.overload1 more...]]``

  const_buffer ``[link asio.reference.const_buffer.operator_plus_.overload2 operator+]``(
      std::size_t n,
      const const_buffer & b);
  ``  [''''&raquo;''' [link asio.reference.const_buffer.operator_plus_.overload2 more...]]``


[section:overload1 const_buffer::operator+ (1 of 2 overloads)]


Create a new non-modifiable buffer that is offset from the start of another. 


  const_buffer operator+(
      const const_buffer & b,
      std::size_t n);



[endsect]



[section:overload2 const_buffer::operator+ (2 of 2 overloads)]


Create a new non-modifiable buffer that is offset from the start of another. 


  const_buffer operator+(
      std::size_t n,
      const const_buffer & b);



[endsect]


[endsect]


[section:operator_plus__eq_ const_buffer::operator+=]

[indexterm2 asio.indexterm.const_buffer.operator_plus__eq_..operator+=..const_buffer] 
Move the start of the buffer by the specified number of bytes. 


  const_buffer & operator+=(
      std::size_t n);



[endsect]



[section:size const_buffer::size]

[indexterm2 asio.indexterm.const_buffer.size..size..const_buffer] 
Get the size of the memory range. 


  std::size_t size() const;



[endsect]



[endsect]

[section:const_buffers_1 const_buffers_1]


(Deprecated: Use [link asio.reference.const_buffer `const_buffer`].) Adapts a single non-modifiable buffer so that it meets the requirements of the ConstBufferSequence concept. 


  class const_buffers_1 :
    public const_buffer


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.const_buffers_1.const_iterator [*const_iterator]]]
    [A random-access iterator type that may be used to read elements. ]
  
  ]

  [

    [[link asio.reference.const_buffers_1.value_type [*value_type]]]
    [The type for each element in the list of buffers. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.const_buffers_1.begin [*begin]]]
    [Get a random-access iterator to the first element. ]
  ]
  
  [
    [[link asio.reference.const_buffers_1.const_buffers_1 [*const_buffers_1]] [constructor]]
    [Construct to represent a given memory range. 
     [hr]
     Construct to represent a single non-modifiable buffer. ]
  ]
  
  [
    [[link asio.reference.const_buffers_1.data [*data]]]
    [Get a pointer to the beginning of the memory range. ]
  ]
  
  [
    [[link asio.reference.const_buffers_1.end [*end]]]
    [Get a random-access iterator for one past the last element. ]
  ]
  
  [
    [[link asio.reference.const_buffers_1.operator_plus__eq_ [*operator+=]]]
    [Move the start of the buffer by the specified number of bytes. ]
  ]
  
  [
    [[link asio.reference.const_buffers_1.size [*size]]]
    [Get the size of the memory range. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.const_buffers_1.operator_plus_ [*operator+]]]
    [Create a new non-modifiable buffer that is offset from the start of another. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[section:begin const_buffers_1::begin]

[indexterm2 asio.indexterm.const_buffers_1.begin..begin..const_buffers_1] 
Get a random-access iterator to the first element. 


  const_iterator begin() const;



[endsect]


[section:const_buffers_1 const_buffers_1::const_buffers_1]

[indexterm2 asio.indexterm.const_buffers_1.const_buffers_1..const_buffers_1..const_buffers_1] 
Construct to represent a given memory range. 


  ``[link asio.reference.const_buffers_1.const_buffers_1.overload1 const_buffers_1]``(
      const void * data,
      std::size_t size);
  ``  [''''&raquo;''' [link asio.reference.const_buffers_1.const_buffers_1.overload1 more...]]``


Construct to represent a single non-modifiable buffer. 


  explicit ``[link asio.reference.const_buffers_1.const_buffers_1.overload2 const_buffers_1]``(
      const const_buffer & b);
  ``  [''''&raquo;''' [link asio.reference.const_buffers_1.const_buffers_1.overload2 more...]]``


[section:overload1 const_buffers_1::const_buffers_1 (1 of 2 overloads)]


Construct to represent a given memory range. 


  const_buffers_1(
      const void * data,
      std::size_t size);



[endsect]



[section:overload2 const_buffers_1::const_buffers_1 (2 of 2 overloads)]


Construct to represent a single non-modifiable buffer. 


  const_buffers_1(
      const const_buffer & b);



[endsect]


[endsect]


[section:const_iterator const_buffers_1::const_iterator]

[indexterm2 asio.indexterm.const_buffers_1.const_iterator..const_iterator..const_buffers_1] 
A random-access iterator type that may be used to read elements. 


  typedef const const_buffer * const_iterator;



[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:data const_buffers_1::data]


['Inherited from const_buffer.]

[indexterm2 asio.indexterm.const_buffers_1.data..data..const_buffers_1] 
Get a pointer to the beginning of the memory range. 


  const void * data() const;



[endsect]



[section:end const_buffers_1::end]

[indexterm2 asio.indexterm.const_buffers_1.end..end..const_buffers_1] 
Get a random-access iterator for one past the last element. 


  const_iterator end() const;



[endsect]


[section:operator_plus_ const_buffers_1::operator+]

[indexterm2 asio.indexterm.const_buffers_1.operator_plus_..operator+..const_buffers_1] 
Create a new non-modifiable buffer that is offset from the start of another. 


  const_buffer ``[link asio.reference.const_buffers_1.operator_plus_.overload1 operator+]``(
      const const_buffer & b,
      std::size_t n);
  ``  [''''&raquo;''' [link asio.reference.const_buffers_1.operator_plus_.overload1 more...]]``

  const_buffer ``[link asio.reference.const_buffers_1.operator_plus_.overload2 operator+]``(
      std::size_t n,
      const const_buffer & b);
  ``  [''''&raquo;''' [link asio.reference.const_buffers_1.operator_plus_.overload2 more...]]``


[section:overload1 const_buffers_1::operator+ (1 of 2 overloads)]


['Inherited from const_buffer.]


Create a new non-modifiable buffer that is offset from the start of another. 


  const_buffer operator+(
      const const_buffer & b,
      std::size_t n);



[endsect]



[section:overload2 const_buffers_1::operator+ (2 of 2 overloads)]


['Inherited from const_buffer.]


Create a new non-modifiable buffer that is offset from the start of another. 


  const_buffer operator+(
      std::size_t n,
      const const_buffer & b);



[endsect]


[endsect]


[section:operator_plus__eq_ const_buffers_1::operator+=]


['Inherited from const_buffer.]

[indexterm2 asio.indexterm.const_buffers_1.operator_plus__eq_..operator+=..const_buffers_1] 
Move the start of the buffer by the specified number of bytes. 


  const_buffer & operator+=(
      std::size_t n);



[endsect]



[section:size const_buffers_1::size]


['Inherited from const_buffer.]

[indexterm2 asio.indexterm.const_buffers_1.size..size..const_buffers_1] 
Get the size of the memory range. 


  std::size_t size() const;



[endsect]



[section:value_type const_buffers_1::value_type]

[indexterm2 asio.indexterm.const_buffers_1.value_type..value_type..const_buffers_1] 
The type for each element in the list of buffers. 


  typedef const_buffer value_type;


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.const_buffer.const_buffer [*const_buffer]] [constructor]]
    [Construct an empty buffer. 
     [hr]
     Construct a buffer to represent a given memory range. 
     [hr]
     Construct a non-modifiable buffer from a modifiable one. ]
  ]
  
  [
    [[link asio.reference.const_buffer.data [*data]]]
    [Get a pointer to the beginning of the memory range. ]
  ]
  
  [
    [[link asio.reference.const_buffer.operator_plus__eq_ [*operator+=]]]
    [Move the start of the buffer by the specified number of bytes. ]
  ]
  
  [
    [[link asio.reference.const_buffer.size [*size]]]
    [Get the size of the memory range. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.const_buffer.operator_plus_ [*operator+]]]
    [Create a new non-modifiable buffer that is offset from the start of another. ]
  ]
  
]

The [link asio.reference.const_buffer `const_buffer`] class provides a safe representation of a buffer that cannot be modified. It does not own the underlying data, and so is cheap to copy or assign.


[heading Accessing Buffer Contents]
  


The contents of a buffer may be accessed using the `data()` and `size()` member functions:



   asio::const_buffer b1 = ...;
   std::size_t s1 = b1.size();
   const unsigned char* p1 = static_cast<const unsigned char*>(b1.data());




The `data()` member function permits violations of type safety, so uses of it in application code should be carefully considered. 


[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:coroutine coroutine]


Provides support for implementing stackless coroutines. 


  class coroutine


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.coroutine.coroutine [*coroutine]] [constructor]]
    [Constructs a coroutine in its initial state. ]
  ]
  
  [
    [[link asio.reference.coroutine.is_child [*is_child]]]
    [Returns true if the coroutine is the child of a fork. ]
  ]
  
  [
    [[link asio.reference.coroutine.is_complete [*is_complete]]]
    [Returns true if the coroutine has reached its terminal state. ]
  ]
  
  [
    [[link asio.reference.coroutine.is_parent [*is_parent]]]
    [Returns true if the coroutine is the parent of a fork. ]
  ]
  
]

The `coroutine` class may be used to implement stackless coroutines. The class itself is used to store the current state of the coroutine.

Coroutines are copy-constructible and assignable, and the space overhead is a single int. They can be used as a base class:



   class session : coroutine
   {
     ...
   }; 




or as a data member:



   class session
   {
     ...
     coroutine coro_;
   }; 




or even bound in as a function argument using lambdas or `bind()`. The important thing is that as the application maintains a copy of the object for as long as the coroutine must be kept alive.


[heading Pseudo-keywords]
  


A coroutine is used in conjunction with certain "pseudo-keywords", which are implemented as macros. These macros are defined by a header file:



   #include <asio/yield.hpp>




and may conversely be undefined as follows:



   #include <asio/unyield.hpp>




[*reenter]

The `reenter` macro is used to define the body of a coroutine. It takes a single argument: a pointer or reference to a coroutine object. For example, if the base class is a coroutine object you may write:



   reenter (this)
   {
     ... coroutine body ...
   } 




and if a data member or other variable you can write:



   reenter (coro_)
   {
     ... coroutine body ...
   } 




When `reenter` is executed at runtime, control jumps to the location of the last `yield` or `fork`.

The coroutine body may also be a single statement, such as:



   reenter (this) for (;;)
   {
     ...
   } 




[*Limitation:] The `reenter` macro is implemented using a switch. This means that you must take care when using local variables within the coroutine body. The local variable is not allowed in a position where reentering the coroutine could bypass the variable definition.

[*yield ['statement]]

This form of the `yield` keyword is often used with asynchronous operations:



   yield socket_->async_read_some(buffer(*buffer_), *this); 




This divides into four logical steps:


* `yield` saves the current state of the coroutine. 

* The statement initiates the asynchronous operation. 

* The resume point is defined immediately following the statement. 

* Control is transferred to the end of the coroutine body.

When the asynchronous operation completes, the function object is invoked and `reenter` causes control to transfer to the resume point. It is important to remember to carry the coroutine state forward with the asynchronous operation. In the above snippet, the current class is a function object object with a coroutine object as base class or data member.

The statement may also be a compound statement, and this permits us to define local variables with limited scope:



   yield
   {
     mutable_buffers_1 b = buffer(*buffer_);
     socket_->async_read_some(b, *this);
   } 




[*yield return ['expression] ;]

This form of `yield` is often used in generators or coroutine-based parsers. For example, the function object:



   struct interleave : coroutine
   {
     istream& is1;
     istream& is2;
     char operator()(char c)
     {
       reenter (this) for (;;)
       {
         yield return is1.get();
         yield return is2.get();
       }
     }
   }; 




defines a trivial coroutine that interleaves the characters from two input streams.

This type of `yield` divides into three logical steps:


* `yield` saves the current state of the coroutine. 

* The resume point is defined immediately following the semicolon. 

* The value of the expression is returned from the function.

[*yield ;]

This form of `yield` is equivalent to the following steps:


* `yield` saves the current state of the coroutine. 

* The resume point is defined immediately following the semicolon. 

* Control is transferred to the end of the coroutine body.

This form might be applied when coroutines are used for cooperative threading and scheduling is explicitly managed. For example:



   struct task : coroutine
   {
     ...
     void operator()()
     {
       reenter (this)
       {
         while (... not finished ...)
         {
           ... do something ...
           yield;
           ... do some more ...
           yield;
         }
       }
     }
     ...
   };
   ...
   task t1, t2;
   for (;;)
   {
     t1();
     t2();
   } 




[*yield break ;]

The final form of `yield` is used to explicitly terminate the coroutine. This form is comprised of two steps:


* `yield` sets the coroutine state to indicate termination. 

* Control is transferred to the end of the coroutine body.

Once terminated, calls to `is_complete()` return true and the coroutine cannot be reentered.

Note that a coroutine may also be implicitly terminated if the coroutine body is exited without a yield, e.g. by return, throw or by running to the end of the body.

[*fork ['statement]]

The `fork` pseudo-keyword is used when "forking" a coroutine, i.e. splitting it into two (or more) copies. One use of `fork` is in a server, where a new coroutine is created to handle each client connection:



   reenter (this)
   {
     do
     {
       socket_.reset(new tcp::socket(my_context_));
       yield acceptor->async_accept(*socket_, *this);
       fork server(*this)();
     } while (is_parent());
     ... client-specific handling follows ...
   } 




The logical steps involved in a `fork` are:


* `fork` saves the current state of the coroutine. 

* The statement creates a copy of the coroutine and either executes it immediately or schedules it for later execution. 

* The resume point is defined immediately following the semicolon. 

* For the "parent", control immediately continues from the next line.

The functions `is_parent()` and `is_child()` can be used to differentiate between parent and child. You would use these functions to alter subsequent control flow.

Note that `fork` doesn't do the actual forking by itself. It is the application's responsibility to create a clone of the coroutine and call it. The clone can be called immediately, as above, or scheduled for delayed execution using something like [link asio.reference.post `post`].


[heading Alternate macro names]
  


If preferred, an application can use macro names that follow a more typical naming convention, rather than the pseudo-keywords. These are:


* `ASIO_CORO_REENTER` instead of `reenter` 

* `ASIO_CORO_YIELD` instead of `yield` 

* `ASIO_CORO_FORK` instead of `fork` 



[heading Requirements]

['Header: ][^asio/coroutine.hpp]

['Convenience header: ][^asio.hpp]


[section:coroutine coroutine::coroutine]

[indexterm2 asio.indexterm.coroutine.coroutine..coroutine..coroutine] 
Constructs a coroutine in its initial state. 


  coroutine();



[endsect]



[section:is_child coroutine::is_child]

[indexterm2 asio.indexterm.coroutine.is_child..is_child..coroutine] 
Returns true if the coroutine is the child of a fork. 


  bool is_child() const;



[endsect]



[section:is_complete coroutine::is_complete]

[indexterm2 asio.indexterm.coroutine.is_complete..is_complete..coroutine] 
Returns true if the coroutine has reached its terminal state. 


  bool is_complete() const;



[endsect]



[section:is_parent coroutine::is_parent]

[indexterm2 asio.indexterm.coroutine.is_parent..is_parent..coroutine] 
Returns true if the coroutine is the parent of a fork. 


  bool is_parent() const;



[endsect]



[endsect]


[section:deadline_timer deadline_timer]

[indexterm1 asio.indexterm.deadline_timer..deadline_timer] 
Typedef for the typical usage of timer. Uses a UTC clock. 


  typedef basic_deadline_timer< boost::posix_time::ptime > deadline_timer;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_deadline_timer__rebind_executor [*rebind_executor]]]
    [Rebinds the timer type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_deadline_timer.duration_type [*duration_type]]]
    [The duration type. ]
  
  ]

  [

    [[link asio.reference.basic_deadline_timer.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_deadline_timer.time_type [*time_type]]]
    [The time type. ]
  
  ]

  [

    [[link asio.reference.basic_deadline_timer.traits_type [*traits_type]]]
    [The time traits type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_deadline_timer.async_wait [*async_wait]]]
    [Start an asynchronous wait on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.basic_deadline_timer [*basic_deadline_timer]] [constructor]]
    [Constructor. 
     [hr]
     Constructor to set a particular expiry time as an absolute time. 
     [hr]
     Constructor to set a particular expiry time relative to now. 
     [hr]
     Move-construct a basic_deadline_timer from another. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.cancel [*cancel]]]
    [Cancel any asynchronous operations that are waiting on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.cancel_one [*cancel_one]]]
    [Cancels one asynchronous operation that is waiting on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.expires_at [*expires_at]]]
    [Get the timer's expiry time as an absolute time. 
     [hr]
     Set the timer's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.expires_from_now [*expires_from_now]]]
    [Get the timer's expiry time relative to now. 
     [hr]
     Set the timer's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.operator_eq_ [*operator=]]]
    [Move-assign a basic_deadline_timer from another. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.wait [*wait]]]
    [Perform a blocking wait on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer._basic_deadline_timer [*~basic_deadline_timer]] [destructor]]
    [Destroys the timer. ]
  ]
  
]

The [link asio.reference.basic_deadline_timer `basic_deadline_timer`] class template provides the ability to perform a blocking or asynchronous wait for a timer to expire.

A deadline timer is always in one of two states: "expired" or "not expired". If the `wait()` or `async_wait()` function is called on an expired timer, the wait operation will complete immediately.

Most applications will use the [link asio.reference.deadline_timer `deadline_timer`] typedef.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.


[heading Examples]
  
Performing a blocking wait: 

   // Construct a timer without setting an expiry time.
   asio::deadline_timer timer(my_context);

   // Set an expiry time relative to now.
   timer.expires_from_now(boost::posix_time::seconds(5));

   // Wait for the timer to expire.
   timer.wait();





Performing an asynchronous wait: 

   void handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Timer expired.
     }
   }

   ...

   // Construct a timer with an absolute expiry time.
   asio::deadline_timer timer(my_context,
       boost::posix_time::time_from_string("2005-12-07 23:59:59.000"));

   // Start an asynchronous wait.
   timer.async_wait(handler);





[heading Changing an active deadline_timer's expiry time]
  


Changing the expiry time of a timer while there are pending asynchronous waits causes those wait operations to be cancelled. To ensure that the action associated with the timer is performed only once, use something like this: used:



   void on_some_event()
   {
     if (my_timer.expires_from_now(seconds(5)) > 0)
     {
       // We managed to cancel the timer. Start new asynchronous wait.
       my_timer.async_wait(on_timeout);
     }
     else
     {
       // Too late, timer has already expired!
     }
   }

   void on_timeout(const asio::error_code& e)
   {
     if (e != asio::error::operation_aborted)
     {
       // Timer was not cancelled, take necessary action.
     }
   }





* The `asio::basic_deadline_timer::expires_from_now()` function cancels any pending asynchronous waits, and returns the number of asynchronous waits that were cancelled. If it returns 0 then you were too late and the wait handler has already been executed, or will soon be executed. If it returns 1 then the wait handler was successfully cancelled.


* If a wait handler is cancelled, the [link asio.reference.error_code `error_code`] passed to it contains the value `asio::error::operation_aborted`. 




[heading Requirements]

['Header: ][^asio/deadline_timer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:default_completion_token default_completion_token]


Traits type used to determine the default completion token type associated with a type (such as an executor). 


  template<
      typename T>
  struct default_completion_token


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.default_completion_token.type [*type]]]
    [If T has a nested type default_completion_token_type, T::default_completion_token_type. Otherwise the typedef type is not defined. ]
  
  ]

]

A program may specialise this traits type if the `T` template parameter in the specialisation is a user-defined type.

Specialisations of this trait may provide a nested typedef `type`, which is a default-constructible completion token type. 

[heading Requirements]

['Header: ][^asio/async_result.hpp]

['Convenience header: ][^asio.hpp]


[section:type default_completion_token::type]

[indexterm2 asio.indexterm.default_completion_token.type..type..default_completion_token] 
If `T` has a nested type `default_completion_token_type`, `T::default_completion_token_type`. Otherwise the typedef `type` is not defined. 


  typedef see_below type;



[heading Requirements]

['Header: ][^asio/async_result.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:defer defer]

[indexterm1 asio.indexterm.defer..defer] 
Submits a completion token or function object for execution. 

  template<
      typename CompletionToken>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.defer.overload1 defer]``(
      CompletionToken && token);
  ``  [''''&raquo;''' [link asio.reference.defer.overload1 more...]]``

  template<
      typename ``[link asio.reference.Executor1 Executor]``,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.defer.overload2 defer]``(
      const Executor & ex,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< execution::is_executor< Executor >::value||is_executor< Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.defer.overload2 more...]]``

  template<
      typename ExecutionContext,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.defer.overload3 defer]``(
      ExecutionContext & ctx,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.defer.overload3 more...]]``

[heading Requirements]

['Header: ][^asio/defer.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 defer (1 of 3 overloads)]


Submits a completion token or function object for execution. 


  template<
      typename CompletionToken>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` defer(
      CompletionToken && token);


This function submits an object for execution using the object's associated executor. The function object is queued for execution, and is never called from the current thread prior to returning from `defer()`.

The use of `defer()`, rather than [link asio.reference.post `post`] , indicates the caller's preference that the executor defer the queueing of the function object. This may allow the executor to optimise queueing for cases when the function object represents a continuation of the current call context.

This function has the following effects:


* Constructs a function object handler of type `Handler`, initialized with `handler(forward<CompletionToken>(token))`.


* Constructs an object `result` of type `async_result<Handler>`, initializing the object as `result(handler)`.


* Obtains the handler's associated executor object `ex` by performing `get_associated_executor(handler)`.


* Obtains the handler's associated allocator object `alloc` by performing `get_associated_allocator(handler)`.


* Performs `ex.defer(std::move(handler), alloc)`.


* Returns `result.get()`. 




[endsect]



[section:overload2 defer (2 of 3 overloads)]


Submits a completion token or function object for execution. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` defer(
      const Executor & ex,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< execution::is_executor< Executor >::value||is_executor< Executor >::value >::type *  = 0);


This function submits an object for execution using the specified executor. The function object is queued for execution, and is never called from the current thread prior to returning from `defer()`.

The use of `defer()`, rather than [link asio.reference.post `post`] , indicates the caller's preference that the executor defer the queueing of the function object. This may allow the executor to optimise queueing for cases when the function object represents a continuation of the current call context.

This function has the following effects:


* Constructs a function object handler of type `Handler`, initialized with `handler(forward<CompletionToken>(token))`.


* Constructs an object `result` of type `async_result<Handler>`, initializing the object as `result(handler)`.


* Obtains the handler's associated executor object `ex1` by performing `get_associated_executor(handler)`.


* Creates a work object `w` by performing `make_work(ex1)`.


* Obtains the handler's associated allocator object `alloc` by performing `get_associated_allocator(handler)`.


* Constructs a function object `f` with a function call operator that performs `ex1.dispatch(std::move(handler), alloc)` followed by `w.reset()`.


* Performs `Executor(ex).defer(std::move(f), alloc)`.


* Returns `result.get()`. 




[endsect]



[section:overload3 defer (3 of 3 overloads)]


Submits a completion token or function object for execution. 


  template<
      typename ExecutionContext,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` defer(
      ExecutionContext & ctx,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);



[heading Return Value]
      
`defer(ctx.get_executor(), forward<CompletionToken>(token))`. 




[endsect]


[endsect]


[section:detached detached]

[indexterm1 asio.indexterm.detached..detached] 
A special value, similar to std::nothrow. 


  constexpr detached_t detached;


See the documentation for [link asio.reference.detached_t `detached_t`] for a usage example. 

[heading Requirements]

['Header: ][^asio/detached.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:detached_t detached_t]


Class used to specify that an asynchronous operation is detached. 


  class detached_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.detached_t__executor_with_default [*executor_with_default]]]
    [Adapts an executor to add the detached_t completion token as the default. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.detached_t.as_default_on [*as_default_on]] [static]]
    [Function helper to adapt an I/O object to use detached_t as its default completion token type. ]
  ]
  
  [
    [[link asio.reference.detached_t.detached_t [*detached_t]] [constructor]]
    [Constructor. ]
  ]
  
]

The [link asio.reference.detached_t `detached_t`] class is used to indicate that an asynchronous operation is detached. That is, there is no completion handler waiting for the operation's result. A [link asio.reference.detached_t `detached_t`] object may be passed as a handler to an asynchronous operation, typically using the special value `asio::detached`. For example:



   my_socket.async_send(my_buffer, asio::detached);




[heading Requirements]

['Header: ][^asio/detached.hpp]

['Convenience header: ][^asio.hpp]


[section:as_default_on detached_t::as_default_on]

[indexterm2 asio.indexterm.detached_t.as_default_on..as_default_on..detached_t] 
Function helper to adapt an I/O object to use `detached_t` as its default completion token type. 


  template<
      typename T>
  static decay< T >::type::template rebind_executor< executor_with_default< typename decay< T >::type::executor_type > >::other as_default_on(
      T && object);



[endsect]



[section:detached_t detached_t::detached_t]

[indexterm2 asio.indexterm.detached_t.detached_t..detached_t..detached_t] 
Constructor. 


  constexpr detached_t();



[endsect]



[endsect]

[section:detached_t__executor_with_default detached_t::executor_with_default]


Adapts an executor to add the `detached_t` completion token as the default. 


  template<
      typename ``[link asio.reference.Executor1 InnerExecutor]``>
  struct executor_with_default


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.detached_t__executor_with_default.default_completion_token_type [*default_completion_token_type]]]
    [Specify detached_t as the default completion token type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.detached_t__executor_with_default.executor_with_default [*executor_with_default]] [constructor]]
    [Construct the adapted executor from the inner executor type. 
     [hr]
     Convert the specified executor to the inner executor type, then use that to construct the adapted executor. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/detached.hpp]

['Convenience header: ][^asio.hpp]


[section:default_completion_token_type detached_t::executor_with_default::default_completion_token_type]

[indexterm2 asio.indexterm.detached_t__executor_with_default.default_completion_token_type..default_completion_token_type..detached_t::executor_with_default] 
Specify `detached_t` as the default completion token type. 


  typedef detached_t default_completion_token_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.detached_t__executor_with_default [*executor_with_default]]]
    [Adapts an executor to add the detached_t completion token as the default. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.detached_t.as_default_on [*as_default_on]] [static]]
    [Function helper to adapt an I/O object to use detached_t as its default completion token type. ]
  ]
  
  [
    [[link asio.reference.detached_t.detached_t [*detached_t]] [constructor]]
    [Constructor. ]
  ]
  
]

The [link asio.reference.detached_t `detached_t`] class is used to indicate that an asynchronous operation is detached. That is, there is no completion handler waiting for the operation's result. A [link asio.reference.detached_t `detached_t`] object may be passed as a handler to an asynchronous operation, typically using the special value `asio::detached`. For example:



   my_socket.async_send(my_buffer, asio::detached);





[heading Requirements]

['Header: ][^asio/detached.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:executor_with_default detached_t::executor_with_default::executor_with_default]

[indexterm2 asio.indexterm.detached_t__executor_with_default.executor_with_default..executor_with_default..detached_t::executor_with_default] 
Construct the adapted executor from the inner executor type. 


  ``[link asio.reference.detached_t__executor_with_default.executor_with_default.overload1 executor_with_default]``(
      const InnerExecutor & ex);
  ``  [''''&raquo;''' [link asio.reference.detached_t__executor_with_default.executor_with_default.overload1 more...]]``


Convert the specified executor to the inner executor type, then use that to construct the adapted executor. 


  template<
      typename ``[link asio.reference.Executor1 OtherExecutor]``>
  ``[link asio.reference.detached_t__executor_with_default.executor_with_default.overload2 executor_with_default]``(
      const OtherExecutor & ex,
      typename enable_if< is_convertible< OtherExecutor, InnerExecutor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.detached_t__executor_with_default.executor_with_default.overload2 more...]]``


[section:overload1 detached_t::executor_with_default::executor_with_default (1 of 2 overloads)]


Construct the adapted executor from the inner executor type. 


  executor_with_default(
      const InnerExecutor & ex);



[endsect]



[section:overload2 detached_t::executor_with_default::executor_with_default (2 of 2 overloads)]


Convert the specified executor to the inner executor type, then use that to construct the adapted executor. 


  template<
      typename ``[link asio.reference.Executor1 OtherExecutor]``>
  executor_with_default(
      const OtherExecutor & ex,
      typename enable_if< is_convertible< OtherExecutor, InnerExecutor >::value >::type *  = 0);



[endsect]


[endsect]


[endsect]

[section:dispatch dispatch]

[indexterm1 asio.indexterm.dispatch..dispatch] 
Submits a completion token or function object for execution. 

  template<
      typename CompletionToken>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.dispatch.overload1 dispatch]``(
      CompletionToken && token);
  ``  [''''&raquo;''' [link asio.reference.dispatch.overload1 more...]]``

  template<
      typename ``[link asio.reference.Executor1 Executor]``,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.dispatch.overload2 dispatch]``(
      const Executor & ex,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< execution::is_executor< Executor >::value||is_executor< Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.dispatch.overload2 more...]]``

  template<
      typename ExecutionContext,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.dispatch.overload3 dispatch]``(
      ExecutionContext & ctx,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.dispatch.overload3 more...]]``

[heading Requirements]

['Header: ][^asio/dispatch.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 dispatch (1 of 3 overloads)]


Submits a completion token or function object for execution. 


  template<
      typename CompletionToken>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` dispatch(
      CompletionToken && token);


This function submits an object for execution using the object's associated executor. The function object may be called from the current thread prior to returning from `dispatch()`. Otherwise, it is queued for execution.

This function has the following effects:


* Constructs a function object handler of type `Handler`, initialized with `handler(forward<CompletionToken>(token))`.


* Constructs an object `result` of type `async_result<Handler>`, initializing the object as `result(handler)`.


* Obtains the handler's associated executor object `ex` by performing `get_associated_executor(handler)`.


* Obtains the handler's associated allocator object `alloc` by performing `get_associated_allocator(handler)`.


* Performs `ex.dispatch(std::move(handler), alloc)`.


* Returns `result.get()`. 




[endsect]



[section:overload2 dispatch (2 of 3 overloads)]


Submits a completion token or function object for execution. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` dispatch(
      const Executor & ex,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< execution::is_executor< Executor >::value||is_executor< Executor >::value >::type *  = 0);


This function submits an object for execution using the specified executor. The function object may be called from the current thread prior to returning from `dispatch()`. Otherwise, it is queued for execution.

This function has the following effects:


* Constructs a function object handler of type `Handler`, initialized with `handler(forward<CompletionToken>(token))`.


* Constructs an object `result` of type `async_result<Handler>`, initializing the object as `result(handler)`.


* Obtains the handler's associated executor object `ex1` by performing `get_associated_executor(handler)`.


* Creates a work object `w` by performing `make_work(ex1)`.


* Obtains the handler's associated allocator object `alloc` by performing `get_associated_allocator(handler)`.


* Constructs a function object `f` with a function call operator that performs `ex1.dispatch(std::move(handler), alloc)` followed by `w.reset()`.


* Performs `Executor(ex).dispatch(std::move(f), alloc)`.


* Returns `result.get()`. 




[endsect]



[section:overload3 dispatch (3 of 3 overloads)]


Submits a completion token or function object for execution. 


  template<
      typename ExecutionContext,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` dispatch(
      ExecutionContext & ctx,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);



[heading Return Value]
      
`dispatch(ctx.get_executor(), forward<CompletionToken>(token))`. 




[endsect]


[endsect]

[section:dynamic_buffer dynamic_buffer]

[indexterm1 asio.indexterm.dynamic_buffer..dynamic_buffer] 
The `asio::dynamic_buffer` function is used to create a dynamically resized buffer from a `std::basic_string` or `std::vector`. 


Create a new dynamic buffer that represents the given string. 

  template<
      typename Elem,
      typename Traits,
      typename Allocator>
  dynamic_string_buffer< Elem, Traits, Allocator > ``[link asio.reference.dynamic_buffer.overload1 dynamic_buffer]``(
      std::basic_string< Elem, Traits, Allocator > & data);
  ``  [''''&raquo;''' [link asio.reference.dynamic_buffer.overload1 more...]]``

  template<
      typename Elem,
      typename Traits,
      typename Allocator>
  dynamic_string_buffer< Elem, Traits, Allocator > ``[link asio.reference.dynamic_buffer.overload2 dynamic_buffer]``(
      std::basic_string< Elem, Traits, Allocator > & data,
      std::size_t max_size);
  ``  [''''&raquo;''' [link asio.reference.dynamic_buffer.overload2 more...]]``

Create a new dynamic buffer that represents the given vector. 

  template<
      typename Elem,
      typename Allocator>
  dynamic_vector_buffer< Elem, Allocator > ``[link asio.reference.dynamic_buffer.overload3 dynamic_buffer]``(
      std::vector< Elem, Allocator > & data);
  ``  [''''&raquo;''' [link asio.reference.dynamic_buffer.overload3 more...]]``

  template<
      typename Elem,
      typename Allocator>
  dynamic_vector_buffer< Elem, Allocator > ``[link asio.reference.dynamic_buffer.overload4 dynamic_buffer]``(
      std::vector< Elem, Allocator > & data,
      std::size_t max_size);
  ``  [''''&raquo;''' [link asio.reference.dynamic_buffer.overload4 more...]]``

[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 dynamic_buffer (1 of 4 overloads)]


Create a new dynamic buffer that represents the given string. 


  template<
      typename Elem,
      typename Traits,
      typename Allocator>
  dynamic_string_buffer< Elem, Traits, Allocator > dynamic_buffer(
      std::basic_string< Elem, Traits, Allocator > & data);



[heading Return Value]
      
`dynamic_string_buffer<Elem, Traits, Allocator>(data)`. 




[endsect]



[section:overload2 dynamic_buffer (2 of 4 overloads)]


Create a new dynamic buffer that represents the given string. 


  template<
      typename Elem,
      typename Traits,
      typename Allocator>
  dynamic_string_buffer< Elem, Traits, Allocator > dynamic_buffer(
      std::basic_string< Elem, Traits, Allocator > & data,
      std::size_t max_size);



[heading Return Value]
      
`dynamic_string_buffer<Elem, Traits, Allocator>(data, max_size)`. 




[endsect]



[section:overload3 dynamic_buffer (3 of 4 overloads)]


Create a new dynamic buffer that represents the given vector. 


  template<
      typename Elem,
      typename Allocator>
  dynamic_vector_buffer< Elem, Allocator > dynamic_buffer(
      std::vector< Elem, Allocator > & data);



[heading Return Value]
      
`dynamic_vector_buffer<Elem, Allocator>(data)`. 




[endsect]



[section:overload4 dynamic_buffer (4 of 4 overloads)]


Create a new dynamic buffer that represents the given vector. 


  template<
      typename Elem,
      typename Allocator>
  dynamic_vector_buffer< Elem, Allocator > dynamic_buffer(
      std::vector< Elem, Allocator > & data,
      std::size_t max_size);



[heading Return Value]
      
`dynamic_vector_buffer<Elem, Allocator>(data, max_size)`. 




[endsect]


[endsect]

[section:dynamic_string_buffer dynamic_string_buffer]


Adapt a basic\_string to the DynamicBuffer requirements. 


  template<
      typename Elem,
      typename Traits,
      typename Allocator>
  class dynamic_string_buffer


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.dynamic_string_buffer.const_buffers_type [*const_buffers_type]]]
    [The type used to represent a sequence of constant buffers that refers to the underlying memory. ]
  
  ]

  [

    [[link asio.reference.dynamic_string_buffer.mutable_buffers_type [*mutable_buffers_type]]]
    [The type used to represent a sequence of mutable buffers that refers to the underlying memory. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.dynamic_string_buffer.capacity [*capacity]]]
    [Get the maximum size that the buffer may grow to without triggering reallocation. ]
  ]
  
  [
    [[link asio.reference.dynamic_string_buffer.commit [*commit]]]
    [DynamicBuffer_v1: Move bytes from the output sequence to the input sequence. ]
  ]
  
  [
    [[link asio.reference.dynamic_string_buffer.consume [*consume]]]
    [DynamicBuffer_v1: Remove characters from the input sequence. DynamicBuffer_v2: Consume the specified number of bytes from the beginning of the underlying memory. ]
  ]
  
  [
    [[link asio.reference.dynamic_string_buffer.data [*data]]]
    [DynamicBuffer_v1: Get a list of buffers that represents the input sequence. 
     [hr]
     DynamicBuffer_v2: Get a sequence of buffers that represents the underlying memory. ]
  ]
  
  [
    [[link asio.reference.dynamic_string_buffer.dynamic_string_buffer [*dynamic_string_buffer]] [constructor]]
    [Construct a dynamic buffer from a string. 
     [hr]
     DynamicBuffer_v2: Copy construct a dynamic buffer. 
     [hr]
     Move construct a dynamic buffer. ]
  ]
  
  [
    [[link asio.reference.dynamic_string_buffer.grow [*grow]]]
    [DynamicBuffer_v2: Grow the underlying memory by the specified number of bytes. ]
  ]
  
  [
    [[link asio.reference.dynamic_string_buffer.max_size [*max_size]]]
    [Get the maximum size of the dynamic buffer. ]
  ]
  
  [
    [[link asio.reference.dynamic_string_buffer.prepare [*prepare]]]
    [DynamicBuffer_v1: Get a list of buffers that represents the output sequence, with the given size. ]
  ]
  
  [
    [[link asio.reference.dynamic_string_buffer.shrink [*shrink]]]
    [DynamicBuffer_v2: Shrink the underlying memory by the specified number of bytes. ]
  ]
  
  [
    [[link asio.reference.dynamic_string_buffer.size [*size]]]
    [DynamicBuffer_v1: Get the size of the input sequence. DynamicBuffer_v2: Get the current size of the underlying memory. ]
  ]
  
]

Requires that `sizeof(Elem) == 1`. 

[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[section:capacity dynamic_string_buffer::capacity]

[indexterm2 asio.indexterm.dynamic_string_buffer.capacity..capacity..dynamic_string_buffer] 
Get the maximum size that the buffer may grow to without triggering reallocation. 


  std::size_t capacity() const;



[heading Return Value]
      
The current capacity of the underlying string if less than `max_size()`. Otherwise returns `max_size()`. 




[endsect]



[section:commit dynamic_string_buffer::commit]

[indexterm2 asio.indexterm.dynamic_string_buffer.commit..commit..dynamic_string_buffer] 
[*DynamicBuffer\_v1:] Move bytes from the output sequence to the input sequence. 


  void commit(
      std::size_t n);



[heading Parameters]
    

[variablelist
  
[[n][The number of bytes to append from the start of the output sequence to the end of the input sequence. The remainder of the output sequence is discarded.]]

]

Requires a preceding call `prepare(x)` where `x >= n`, and no intervening operations that modify the input or output sequence.


[heading Remarks]
      
If `n` is greater than the size of the output sequence, the entire output sequence is moved to the input sequence and no error is issued. 




[endsect]



[section:const_buffers_type dynamic_string_buffer::const_buffers_type]

[indexterm2 asio.indexterm.dynamic_string_buffer.const_buffers_type..const_buffers_type..dynamic_string_buffer] 
The type used to represent a sequence of constant buffers that refers to the underlying memory. 


  typedef const_buffer const_buffers_type;


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.const_buffer.const_buffer [*const_buffer]] [constructor]]
    [Construct an empty buffer. 
     [hr]
     Construct a buffer to represent a given memory range. 
     [hr]
     Construct a non-modifiable buffer from a modifiable one. ]
  ]
  
  [
    [[link asio.reference.const_buffer.data [*data]]]
    [Get a pointer to the beginning of the memory range. ]
  ]
  
  [
    [[link asio.reference.const_buffer.operator_plus__eq_ [*operator+=]]]
    [Move the start of the buffer by the specified number of bytes. ]
  ]
  
  [
    [[link asio.reference.const_buffer.size [*size]]]
    [Get the size of the memory range. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.const_buffer.operator_plus_ [*operator+]]]
    [Create a new non-modifiable buffer that is offset from the start of another. ]
  ]
  
]

The [link asio.reference.const_buffer `const_buffer`] class provides a safe representation of a buffer that cannot be modified. It does not own the underlying data, and so is cheap to copy or assign.


[heading Accessing Buffer Contents]
  


The contents of a buffer may be accessed using the `data()` and `size()` member functions:



   asio::const_buffer b1 = ...;
   std::size_t s1 = b1.size();
   const unsigned char* p1 = static_cast<const unsigned char*>(b1.data());




The `data()` member function permits violations of type safety, so uses of it in application code should be carefully considered. 


[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:consume dynamic_string_buffer::consume]

[indexterm2 asio.indexterm.dynamic_string_buffer.consume..consume..dynamic_string_buffer] 
[*DynamicBuffer\_v1:] Remove characters from the input sequence. [*DynamicBuffer\_v2:] Consume the specified number of bytes from the beginning of the underlying memory. 


  void consume(
      std::size_t n);


[*DynamicBuffer\_v1:] Removes `n` characters from the beginning of the input sequence.
[heading Remarks]
      
If `n` is greater than the size of the input sequence, the entire input sequence is consumed and no error is issued.

[*DynamicBuffer\_v2:] Erases `n` bytes from the beginning of the string. If `n` is greater than the current size of the string, the string is emptied. 


[endsect]


[section:data dynamic_string_buffer::data]

[indexterm2 asio.indexterm.dynamic_string_buffer.data..data..dynamic_string_buffer] 
[*DynamicBuffer\_v1:] Get a list of buffers that represents the input sequence. 


  const_buffers_type ``[link asio.reference.dynamic_string_buffer.data.overload1 data]``() const;
  ``  [''''&raquo;''' [link asio.reference.dynamic_string_buffer.data.overload1 more...]]``


[*DynamicBuffer\_v2:] Get a sequence of buffers that represents the underlying memory. 


  mutable_buffers_type ``[link asio.reference.dynamic_string_buffer.data.overload2 data]``(
      std::size_t pos,
      std::size_t n);
  ``  [''''&raquo;''' [link asio.reference.dynamic_string_buffer.data.overload2 more...]]``

  const_buffers_type ``[link asio.reference.dynamic_string_buffer.data.overload3 data]``(
      std::size_t pos,
      std::size_t n) const;
  ``  [''''&raquo;''' [link asio.reference.dynamic_string_buffer.data.overload3 more...]]``


[section:overload1 dynamic_string_buffer::data (1 of 3 overloads)]


[*DynamicBuffer\_v1:] Get a list of buffers that represents the input sequence. 


  const_buffers_type data() const;



[heading Return Value]
      
An object of type `const_buffers_type` that satisfies ConstBufferSequence requirements, representing the basic\_string memory in the input sequence.


[heading Remarks]
      
The returned object is invalidated by any `dynamic_string_buffer` or `basic_string` member function that resizes or erases the string. 




[endsect]



[section:overload2 dynamic_string_buffer::data (2 of 3 overloads)]


[*DynamicBuffer\_v2:] Get a sequence of buffers that represents the underlying memory. 


  mutable_buffers_type data(
      std::size_t pos,
      std::size_t n);



[heading Parameters]
    

[variablelist
  
[[pos][Position of the first byte to represent in the buffer sequence]]

[[n][The number of bytes to return in the buffer sequence. If the underlying memory is shorter, the buffer sequence represents as many bytes as are available.]]

]


[heading Return Value]
      
An object of type `mutable_buffers_type` that satisfies MutableBufferSequence requirements, representing the basic\_string memory.


[heading Remarks]
      
The returned object is invalidated by any `dynamic_string_buffer` or `basic_string` member function that resizes or erases the string. 




[endsect]



[section:overload3 dynamic_string_buffer::data (3 of 3 overloads)]


[*DynamicBuffer\_v2:] Get a sequence of buffers that represents the underlying memory. 


  const_buffers_type data(
      std::size_t pos,
      std::size_t n) const;



[heading Parameters]
    

[variablelist
  
[[pos][Position of the first byte to represent in the buffer sequence]]

[[n][The number of bytes to return in the buffer sequence. If the underlying memory is shorter, the buffer sequence represents as many bytes as are available.]]

]


[heading Remarks]
      
The returned object is invalidated by any `dynamic_string_buffer` or `basic_string` member function that resizes or erases the string. 




[endsect]


[endsect]

[section:dynamic_string_buffer dynamic_string_buffer::dynamic_string_buffer]

[indexterm2 asio.indexterm.dynamic_string_buffer.dynamic_string_buffer..dynamic_string_buffer..dynamic_string_buffer] 
Construct a dynamic buffer from a string. 


  explicit ``[link asio.reference.dynamic_string_buffer.dynamic_string_buffer.overload1 dynamic_string_buffer]``(
      std::basic_string< Elem, Traits, Allocator > & s,
      std::size_t maximum_size = (std::numeric_limits< std::size_t >::max)());
  ``  [''''&raquo;''' [link asio.reference.dynamic_string_buffer.dynamic_string_buffer.overload1 more...]]``


[*DynamicBuffer\_v2:] Copy construct a dynamic buffer. 


  ``[link asio.reference.dynamic_string_buffer.dynamic_string_buffer.overload2 dynamic_string_buffer]``(
      const dynamic_string_buffer & other);
  ``  [''''&raquo;''' [link asio.reference.dynamic_string_buffer.dynamic_string_buffer.overload2 more...]]``


Move construct a dynamic buffer. 


  ``[link asio.reference.dynamic_string_buffer.dynamic_string_buffer.overload3 dynamic_string_buffer]``(
      dynamic_string_buffer && other);
  ``  [''''&raquo;''' [link asio.reference.dynamic_string_buffer.dynamic_string_buffer.overload3 more...]]``


[section:overload1 dynamic_string_buffer::dynamic_string_buffer (1 of 3 overloads)]


Construct a dynamic buffer from a string. 


  dynamic_string_buffer(
      std::basic_string< Elem, Traits, Allocator > & s,
      std::size_t maximum_size = (std::numeric_limits< std::size_t >::max)());



[heading Parameters]
    

[variablelist
  
[[s][The string to be used as backing storage for the dynamic buffer. The object stores a reference to the string and the user is responsible for ensuring that the string object remains valid while the [link asio.reference.dynamic_string_buffer `dynamic_string_buffer`] object, and copies of the object, are in use.]]

]

[*DynamicBuffer\_v1:] Any existing data in the string is treated as the dynamic buffer's input sequence.


[heading Parameters]
    

[variablelist
  
[[maximum_size][Specifies a maximum size for the buffer, in bytes. ]]

]




[endsect]



[section:overload2 dynamic_string_buffer::dynamic_string_buffer (2 of 3 overloads)]


[*DynamicBuffer\_v2:] Copy construct a dynamic buffer. 


  dynamic_string_buffer(
      const dynamic_string_buffer & other);



[endsect]



[section:overload3 dynamic_string_buffer::dynamic_string_buffer (3 of 3 overloads)]


Move construct a dynamic buffer. 


  dynamic_string_buffer(
      dynamic_string_buffer && other);



[endsect]


[endsect]


[section:grow dynamic_string_buffer::grow]

[indexterm2 asio.indexterm.dynamic_string_buffer.grow..grow..dynamic_string_buffer] 
[*DynamicBuffer\_v2:] Grow the underlying memory by the specified number of bytes. 


  void grow(
      std::size_t n);


Resizes the string to accommodate an additional `n` bytes at the end.


[heading Exceptions]
    

[variablelist
  
[[std::length_error][If `size() + n > max_size()`. ]]

]




[endsect]



[section:max_size dynamic_string_buffer::max_size]

[indexterm2 asio.indexterm.dynamic_string_buffer.max_size..max_size..dynamic_string_buffer] 
Get the maximum size of the dynamic buffer. 


  std::size_t max_size() const;



[heading Return Value]
      
The allowed maximum size of the underlying memory. 




[endsect]



[section:mutable_buffers_type dynamic_string_buffer::mutable_buffers_type]

[indexterm2 asio.indexterm.dynamic_string_buffer.mutable_buffers_type..mutable_buffers_type..dynamic_string_buffer] 
The type used to represent a sequence of mutable buffers that refers to the underlying memory. 


  typedef mutable_buffer mutable_buffers_type;


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.mutable_buffer.data [*data]]]
    [Get a pointer to the beginning of the memory range. ]
  ]
  
  [
    [[link asio.reference.mutable_buffer.mutable_buffer [*mutable_buffer]] [constructor]]
    [Construct an empty buffer. 
     [hr]
     Construct a buffer to represent a given memory range. ]
  ]
  
  [
    [[link asio.reference.mutable_buffer.operator_plus__eq_ [*operator+=]]]
    [Move the start of the buffer by the specified number of bytes. ]
  ]
  
  [
    [[link asio.reference.mutable_buffer.size [*size]]]
    [Get the size of the memory range. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.mutable_buffer.operator_plus_ [*operator+]]]
    [Create a new modifiable buffer that is offset from the start of another. ]
  ]
  
]

The [link asio.reference.mutable_buffer `mutable_buffer`] class provides a safe representation of a buffer that can be modified. It does not own the underlying data, and so is cheap to copy or assign.


[heading Accessing Buffer Contents]
  


The contents of a buffer may be accessed using the `data()` and `size()` member functions:



   asio::mutable_buffer b1 = ...;
   std::size_t s1 = b1.size();
   unsigned char* p1 = static_cast<unsigned char*>(b1.data());




The `data()` member function permits violations of type safety, so uses of it in application code should be carefully considered. 


[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:prepare dynamic_string_buffer::prepare]

[indexterm2 asio.indexterm.dynamic_string_buffer.prepare..prepare..dynamic_string_buffer] 
[*DynamicBuffer\_v1:] Get a list of buffers that represents the output sequence, with the given size. 


  mutable_buffers_type prepare(
      std::size_t n);


Ensures that the output sequence can accommodate `n` bytes, resizing the basic\_string object as necessary.


[heading Return Value]
      
An object of type `mutable_buffers_type` that satisfies MutableBufferSequence requirements, representing basic\_string memory at the start of the output sequence of size `n`.


[heading Exceptions]
    

[variablelist
  
[[std::length_error][If `size() + n > max_size()`.]]

]


[heading Remarks]
      
The returned object is invalidated by any `dynamic_string_buffer` or `basic_string` member function that modifies the input sequence or output sequence. 




[endsect]



[section:shrink dynamic_string_buffer::shrink]

[indexterm2 asio.indexterm.dynamic_string_buffer.shrink..shrink..dynamic_string_buffer] 
[*DynamicBuffer\_v2:] Shrink the underlying memory by the specified number of bytes. 


  void shrink(
      std::size_t n);


Erases `n` bytes from the end of the string by resizing the basic\_string object. If `n` is greater than the current size of the string, the string is emptied. 


[endsect]



[section:size dynamic_string_buffer::size]

[indexterm2 asio.indexterm.dynamic_string_buffer.size..size..dynamic_string_buffer] 
[*DynamicBuffer\_v1:] Get the size of the input sequence. [*DynamicBuffer\_v2:] Get the current size of the underlying memory. 


  std::size_t size() const;



[heading Return Value]
      
[*DynamicBuffer\_v1] The current size of the input sequence. [*DynamicBuffer\_v2:] The current size of the underlying string if less than `max_size()`. Otherwise returns `max_size()`. 




[endsect]



[endsect]

[section:dynamic_vector_buffer dynamic_vector_buffer]


Adapt a vector to the DynamicBuffer requirements. 


  template<
      typename Elem,
      typename Allocator>
  class dynamic_vector_buffer


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.dynamic_vector_buffer.const_buffers_type [*const_buffers_type]]]
    [The type used to represent a sequence of constant buffers that refers to the underlying memory. ]
  
  ]

  [

    [[link asio.reference.dynamic_vector_buffer.mutable_buffers_type [*mutable_buffers_type]]]
    [The type used to represent a sequence of mutable buffers that refers to the underlying memory. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.dynamic_vector_buffer.capacity [*capacity]]]
    [Get the maximum size that the buffer may grow to without triggering reallocation. ]
  ]
  
  [
    [[link asio.reference.dynamic_vector_buffer.commit [*commit]]]
    [DynamicBuffer_v1: Move bytes from the output sequence to the input sequence. ]
  ]
  
  [
    [[link asio.reference.dynamic_vector_buffer.consume [*consume]]]
    [DynamicBuffer_v1: Remove characters from the input sequence. DynamicBuffer_v2: Consume the specified number of bytes from the beginning of the underlying memory. ]
  ]
  
  [
    [[link asio.reference.dynamic_vector_buffer.data [*data]]]
    [DynamicBuffer_v1: Get a list of buffers that represents the input sequence. 
     [hr]
     DynamicBuffer_v2: Get a sequence of buffers that represents the underlying memory. ]
  ]
  
  [
    [[link asio.reference.dynamic_vector_buffer.dynamic_vector_buffer [*dynamic_vector_buffer]] [constructor]]
    [Construct a dynamic buffer from a vector. 
     [hr]
     DynamicBuffer_v2: Copy construct a dynamic buffer. 
     [hr]
     Move construct a dynamic buffer. ]
  ]
  
  [
    [[link asio.reference.dynamic_vector_buffer.grow [*grow]]]
    [DynamicBuffer_v2: Grow the underlying memory by the specified number of bytes. ]
  ]
  
  [
    [[link asio.reference.dynamic_vector_buffer.max_size [*max_size]]]
    [Get the maximum size of the dynamic buffer. ]
  ]
  
  [
    [[link asio.reference.dynamic_vector_buffer.prepare [*prepare]]]
    [DynamicBuffer_v1: Get a list of buffers that represents the output sequence, with the given size. ]
  ]
  
  [
    [[link asio.reference.dynamic_vector_buffer.shrink [*shrink]]]
    [DynamicBuffer_v2: Shrink the underlying memory by the specified number of bytes. ]
  ]
  
  [
    [[link asio.reference.dynamic_vector_buffer.size [*size]]]
    [DynamicBuffer_v1: Get the size of the input sequence. DynamicBuffer_v2: Get the current size of the underlying memory. ]
  ]
  
]

Requires that `sizeof(Elem) == 1`. 

[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[section:capacity dynamic_vector_buffer::capacity]

[indexterm2 asio.indexterm.dynamic_vector_buffer.capacity..capacity..dynamic_vector_buffer] 
Get the maximum size that the buffer may grow to without triggering reallocation. 


  std::size_t capacity() const;



[heading Return Value]
      
[*DynamicBuffer\_v1:] The current total capacity of the buffer, i.e. for both the input sequence and output sequence. [*DynamicBuffer\_v2:] The current capacity of the underlying vector if less than `max_size()`. Otherwise returns `max_size()`. 




[endsect]



[section:commit dynamic_vector_buffer::commit]

[indexterm2 asio.indexterm.dynamic_vector_buffer.commit..commit..dynamic_vector_buffer] 
[*DynamicBuffer\_v1:] Move bytes from the output sequence to the input sequence. 


  void commit(
      std::size_t n);



[heading Parameters]
    

[variablelist
  
[[n][The number of bytes to append from the start of the output sequence to the end of the input sequence. The remainder of the output sequence is discarded.]]

]

Requires a preceding call `prepare(x)` where `x >= n`, and no intervening operations that modify the input or output sequence.


[heading Remarks]
      
If `n` is greater than the size of the output sequence, the entire output sequence is moved to the input sequence and no error is issued. 




[endsect]



[section:const_buffers_type dynamic_vector_buffer::const_buffers_type]

[indexterm2 asio.indexterm.dynamic_vector_buffer.const_buffers_type..const_buffers_type..dynamic_vector_buffer] 
The type used to represent a sequence of constant buffers that refers to the underlying memory. 


  typedef const_buffer const_buffers_type;


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.const_buffer.const_buffer [*const_buffer]] [constructor]]
    [Construct an empty buffer. 
     [hr]
     Construct a buffer to represent a given memory range. 
     [hr]
     Construct a non-modifiable buffer from a modifiable one. ]
  ]
  
  [
    [[link asio.reference.const_buffer.data [*data]]]
    [Get a pointer to the beginning of the memory range. ]
  ]
  
  [
    [[link asio.reference.const_buffer.operator_plus__eq_ [*operator+=]]]
    [Move the start of the buffer by the specified number of bytes. ]
  ]
  
  [
    [[link asio.reference.const_buffer.size [*size]]]
    [Get the size of the memory range. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.const_buffer.operator_plus_ [*operator+]]]
    [Create a new non-modifiable buffer that is offset from the start of another. ]
  ]
  
]

The [link asio.reference.const_buffer `const_buffer`] class provides a safe representation of a buffer that cannot be modified. It does not own the underlying data, and so is cheap to copy or assign.


[heading Accessing Buffer Contents]
  


The contents of a buffer may be accessed using the `data()` and `size()` member functions:



   asio::const_buffer b1 = ...;
   std::size_t s1 = b1.size();
   const unsigned char* p1 = static_cast<const unsigned char*>(b1.data());




The `data()` member function permits violations of type safety, so uses of it in application code should be carefully considered. 


[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:consume dynamic_vector_buffer::consume]

[indexterm2 asio.indexterm.dynamic_vector_buffer.consume..consume..dynamic_vector_buffer] 
[*DynamicBuffer\_v1:] Remove characters from the input sequence. [*DynamicBuffer\_v2:] Consume the specified number of bytes from the beginning of the underlying memory. 


  void consume(
      std::size_t n);


[*DynamicBuffer\_v1:] Removes `n` characters from the beginning of the input sequence.
[heading Remarks]
      
If `n` is greater than the size of the input sequence, the entire input sequence is consumed and no error is issued.

[*DynamicBuffer\_v2:] Erases `n` bytes from the beginning of the vector. If `n` is greater than the current size of the vector, the vector is emptied. 


[endsect]


[section:data dynamic_vector_buffer::data]

[indexterm2 asio.indexterm.dynamic_vector_buffer.data..data..dynamic_vector_buffer] 
[*DynamicBuffer\_v1:] Get a list of buffers that represents the input sequence. 


  const_buffers_type ``[link asio.reference.dynamic_vector_buffer.data.overload1 data]``() const;
  ``  [''''&raquo;''' [link asio.reference.dynamic_vector_buffer.data.overload1 more...]]``


[*DynamicBuffer\_v2:] Get a sequence of buffers that represents the underlying memory. 


  mutable_buffers_type ``[link asio.reference.dynamic_vector_buffer.data.overload2 data]``(
      std::size_t pos,
      std::size_t n);
  ``  [''''&raquo;''' [link asio.reference.dynamic_vector_buffer.data.overload2 more...]]``

  const_buffers_type ``[link asio.reference.dynamic_vector_buffer.data.overload3 data]``(
      std::size_t pos,
      std::size_t n) const;
  ``  [''''&raquo;''' [link asio.reference.dynamic_vector_buffer.data.overload3 more...]]``


[section:overload1 dynamic_vector_buffer::data (1 of 3 overloads)]


[*DynamicBuffer\_v1:] Get a list of buffers that represents the input sequence. 


  const_buffers_type data() const;



[heading Return Value]
      
An object of type `const_buffers_type` that satisfies ConstBufferSequence requirements, representing the vector memory in the input sequence.


[heading Remarks]
      
The returned object is invalidated by any `dynamic_vector_buffer` or `vector` member function that modifies the input sequence or output sequence. 




[endsect]



[section:overload2 dynamic_vector_buffer::data (2 of 3 overloads)]


[*DynamicBuffer\_v2:] Get a sequence of buffers that represents the underlying memory. 


  mutable_buffers_type data(
      std::size_t pos,
      std::size_t n);



[heading Parameters]
    

[variablelist
  
[[pos][Position of the first byte to represent in the buffer sequence]]

[[n][The number of bytes to return in the buffer sequence. If the underlying memory is shorter, the buffer sequence represents as many bytes as are available.]]

]


[heading Return Value]
      
An object of type `mutable_buffers_type` that satisfies MutableBufferSequence requirements, representing the vector memory.


[heading Remarks]
      
The returned object is invalidated by any `dynamic_vector_buffer` or `vector` member function that resizes or erases the vector. 




[endsect]



[section:overload3 dynamic_vector_buffer::data (3 of 3 overloads)]


[*DynamicBuffer\_v2:] Get a sequence of buffers that represents the underlying memory. 


  const_buffers_type data(
      std::size_t pos,
      std::size_t n) const;



[heading Parameters]
    

[variablelist
  
[[pos][Position of the first byte to represent in the buffer sequence]]

[[n][The number of bytes to return in the buffer sequence. If the underlying memory is shorter, the buffer sequence represents as many bytes as are available.]]

]


[heading Remarks]
      
The returned object is invalidated by any `dynamic_vector_buffer` or `vector` member function that resizes or erases the vector. 




[endsect]


[endsect]

[section:dynamic_vector_buffer dynamic_vector_buffer::dynamic_vector_buffer]

[indexterm2 asio.indexterm.dynamic_vector_buffer.dynamic_vector_buffer..dynamic_vector_buffer..dynamic_vector_buffer] 
Construct a dynamic buffer from a vector. 


  explicit ``[link asio.reference.dynamic_vector_buffer.dynamic_vector_buffer.overload1 dynamic_vector_buffer]``(
      std::vector< Elem, Allocator > & v,
      std::size_t maximum_size = (std::numeric_limits< std::size_t >::max)());
  ``  [''''&raquo;''' [link asio.reference.dynamic_vector_buffer.dynamic_vector_buffer.overload1 more...]]``


[*DynamicBuffer\_v2:] Copy construct a dynamic buffer. 


  ``[link asio.reference.dynamic_vector_buffer.dynamic_vector_buffer.overload2 dynamic_vector_buffer]``(
      const dynamic_vector_buffer & other);
  ``  [''''&raquo;''' [link asio.reference.dynamic_vector_buffer.dynamic_vector_buffer.overload2 more...]]``


Move construct a dynamic buffer. 


  ``[link asio.reference.dynamic_vector_buffer.dynamic_vector_buffer.overload3 dynamic_vector_buffer]``(
      dynamic_vector_buffer && other);
  ``  [''''&raquo;''' [link asio.reference.dynamic_vector_buffer.dynamic_vector_buffer.overload3 more...]]``


[section:overload1 dynamic_vector_buffer::dynamic_vector_buffer (1 of 3 overloads)]


Construct a dynamic buffer from a vector. 


  dynamic_vector_buffer(
      std::vector< Elem, Allocator > & v,
      std::size_t maximum_size = (std::numeric_limits< std::size_t >::max)());



[heading Parameters]
    

[variablelist
  
[[v][The vector to be used as backing storage for the dynamic buffer. The object stores a reference to the vector and the user is responsible for ensuring that the vector object remains valid while the [link asio.reference.dynamic_vector_buffer `dynamic_vector_buffer`] object, and copies of the object, are in use.]]

[[maximum_size][Specifies a maximum size for the buffer, in bytes. ]]

]




[endsect]



[section:overload2 dynamic_vector_buffer::dynamic_vector_buffer (2 of 3 overloads)]


[*DynamicBuffer\_v2:] Copy construct a dynamic buffer. 


  dynamic_vector_buffer(
      const dynamic_vector_buffer & other);



[endsect]



[section:overload3 dynamic_vector_buffer::dynamic_vector_buffer (3 of 3 overloads)]


Move construct a dynamic buffer. 


  dynamic_vector_buffer(
      dynamic_vector_buffer && other);



[endsect]


[endsect]


[section:grow dynamic_vector_buffer::grow]

[indexterm2 asio.indexterm.dynamic_vector_buffer.grow..grow..dynamic_vector_buffer] 
[*DynamicBuffer\_v2:] Grow the underlying memory by the specified number of bytes. 


  void grow(
      std::size_t n);


Resizes the vector to accommodate an additional `n` bytes at the end.


[heading Exceptions]
    

[variablelist
  
[[std::length_error][If `size() + n > max_size()`. ]]

]




[endsect]



[section:max_size dynamic_vector_buffer::max_size]

[indexterm2 asio.indexterm.dynamic_vector_buffer.max_size..max_size..dynamic_vector_buffer] 
Get the maximum size of the dynamic buffer. 


  std::size_t max_size() const;



[heading Return Value]
      
[*DynamicBuffer\_v1:] The allowed maximum of the sum of the sizes of the input sequence and output sequence. [*DynamicBuffer\_v2:] The allowed maximum size of the underlying memory. 




[endsect]



[section:mutable_buffers_type dynamic_vector_buffer::mutable_buffers_type]

[indexterm2 asio.indexterm.dynamic_vector_buffer.mutable_buffers_type..mutable_buffers_type..dynamic_vector_buffer] 
The type used to represent a sequence of mutable buffers that refers to the underlying memory. 


  typedef mutable_buffer mutable_buffers_type;


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.mutable_buffer.data [*data]]]
    [Get a pointer to the beginning of the memory range. ]
  ]
  
  [
    [[link asio.reference.mutable_buffer.mutable_buffer [*mutable_buffer]] [constructor]]
    [Construct an empty buffer. 
     [hr]
     Construct a buffer to represent a given memory range. ]
  ]
  
  [
    [[link asio.reference.mutable_buffer.operator_plus__eq_ [*operator+=]]]
    [Move the start of the buffer by the specified number of bytes. ]
  ]
  
  [
    [[link asio.reference.mutable_buffer.size [*size]]]
    [Get the size of the memory range. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.mutable_buffer.operator_plus_ [*operator+]]]
    [Create a new modifiable buffer that is offset from the start of another. ]
  ]
  
]

The [link asio.reference.mutable_buffer `mutable_buffer`] class provides a safe representation of a buffer that can be modified. It does not own the underlying data, and so is cheap to copy or assign.


[heading Accessing Buffer Contents]
  


The contents of a buffer may be accessed using the `data()` and `size()` member functions:



   asio::mutable_buffer b1 = ...;
   std::size_t s1 = b1.size();
   unsigned char* p1 = static_cast<unsigned char*>(b1.data());




The `data()` member function permits violations of type safety, so uses of it in application code should be carefully considered. 


[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:prepare dynamic_vector_buffer::prepare]

[indexterm2 asio.indexterm.dynamic_vector_buffer.prepare..prepare..dynamic_vector_buffer] 
[*DynamicBuffer\_v1:] Get a list of buffers that represents the output sequence, with the given size. 


  mutable_buffers_type prepare(
      std::size_t n);


Ensures that the output sequence can accommodate `n` bytes, resizing the vector object as necessary.


[heading Return Value]
      
An object of type `mutable_buffers_type` that satisfies MutableBufferSequence requirements, representing vector memory at the start of the output sequence of size `n`.


[heading Exceptions]
    

[variablelist
  
[[std::length_error][If `size() + n > max_size()`.]]

]


[heading Remarks]
      
The returned object is invalidated by any `dynamic_vector_buffer` or `vector` member function that modifies the input sequence or output sequence. 




[endsect]



[section:shrink dynamic_vector_buffer::shrink]

[indexterm2 asio.indexterm.dynamic_vector_buffer.shrink..shrink..dynamic_vector_buffer] 
[*DynamicBuffer\_v2:] Shrink the underlying memory by the specified number of bytes. 


  void shrink(
      std::size_t n);


Erases `n` bytes from the end of the vector by resizing the vector object. If `n` is greater than the current size of the vector, the vector is emptied. 


[endsect]



[section:size dynamic_vector_buffer::size]

[indexterm2 asio.indexterm.dynamic_vector_buffer.size..size..dynamic_vector_buffer] 
[*DynamicBuffer\_v1:] Get the size of the input sequence. [*DynamicBuffer\_v2:] Get the current size of the underlying memory. 


  std::size_t size() const;



[heading Return Value]
      
[*DynamicBuffer\_v1] The current size of the input sequence. [*DynamicBuffer\_v2:] The current size of the underlying vector if less than `max_size()`. Otherwise returns `max_size()`. 




[endsect]



[endsect]


[section:error__addrinfo_category error::addrinfo_category]

[indexterm1 asio.indexterm.error__addrinfo_category..error::addrinfo_category] 

  static const asio::error_category & addrinfo_category = asio::error::get_addrinfo_category();


[heading Requirements]

['Header: ][^asio/error.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:error__addrinfo_errors error::addrinfo_errors]

[indexterm1 asio.indexterm.error__addrinfo_errors..error::addrinfo_errors] 

  enum addrinfo_errors

[indexterm2 asio.indexterm.error__addrinfo_errors.service_not_found..service_not_found..error::addrinfo_errors]
[indexterm2 asio.indexterm.error__addrinfo_errors.socket_type_not_supported..socket_type_not_supported..error::addrinfo_errors]

[heading Values]
[variablelist

  [
    [service_not_found]
    [The service is not supported for the given socket type. ]
  ]

  [
    [socket_type_not_supported]
    [The socket type is not supported. ]
  ]

]


[heading Requirements]

['Header: ][^asio/error.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:error__basic_errors error::basic_errors]

[indexterm1 asio.indexterm.error__basic_errors..error::basic_errors] 

  enum basic_errors

[indexterm2 asio.indexterm.error__basic_errors.access_denied..access_denied..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.address_family_not_supported..address_family_not_supported..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.address_in_use..address_in_use..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.already_connected..already_connected..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.already_started..already_started..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.broken_pipe..broken_pipe..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.connection_aborted..connection_aborted..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.connection_refused..connection_refused..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.connection_reset..connection_reset..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.bad_descriptor..bad_descriptor..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.fault..fault..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.host_unreachable..host_unreachable..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.in_progress..in_progress..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.interrupted..interrupted..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.invalid_argument..invalid_argument..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.message_size..message_size..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.name_too_long..name_too_long..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.network_down..network_down..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.network_reset..network_reset..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.network_unreachable..network_unreachable..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.no_descriptors..no_descriptors..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.no_buffer_space..no_buffer_space..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.no_memory..no_memory..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.no_permission..no_permission..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.no_protocol_option..no_protocol_option..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.no_such_device..no_such_device..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.not_connected..not_connected..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.not_socket..not_socket..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.operation_aborted..operation_aborted..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.operation_not_supported..operation_not_supported..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.shut_down..shut_down..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.timed_out..timed_out..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.try_again..try_again..error::basic_errors]
[indexterm2 asio.indexterm.error__basic_errors.would_block..would_block..error::basic_errors]

[heading Values]
[variablelist

  [
    [access_denied]
    [Permission denied. ]
  ]

  [
    [address_family_not_supported]
    [Address family not supported by protocol. ]
  ]

  [
    [address_in_use]
    [Address already in use. ]
  ]

  [
    [already_connected]
    [Transport endpoint is already connected. ]
  ]

  [
    [already_started]
    [Operation already in progress. ]
  ]

  [
    [broken_pipe]
    [Broken pipe. ]
  ]

  [
    [connection_aborted]
    [A connection has been aborted. ]
  ]

  [
    [connection_refused]
    [Connection refused. ]
  ]

  [
    [connection_reset]
    [Connection reset by peer. ]
  ]

  [
    [bad_descriptor]
    [Bad file descriptor. ]
  ]

  [
    [fault]
    [Bad address. ]
  ]

  [
    [host_unreachable]
    [No route to host. ]
  ]

  [
    [in_progress]
    [Operation now in progress. ]
  ]

  [
    [interrupted]
    [Interrupted system call. ]
  ]

  [
    [invalid_argument]
    [Invalid argument. ]
  ]

  [
    [message_size]
    [Message too long. ]
  ]

  [
    [name_too_long]
    [The name was too long. ]
  ]

  [
    [network_down]
    [Network is down. ]
  ]

  [
    [network_reset]
    [Network dropped connection on reset. ]
  ]

  [
    [network_unreachable]
    [Network is unreachable. ]
  ]

  [
    [no_descriptors]
    [Too many open files. ]
  ]

  [
    [no_buffer_space]
    [No buffer space available. ]
  ]

  [
    [no_memory]
    [Cannot allocate memory. ]
  ]

  [
    [no_permission]
    [Operation not permitted. ]
  ]

  [
    [no_protocol_option]
    [Protocol not available. ]
  ]

  [
    [no_such_device]
    [No such device. ]
  ]

  [
    [not_connected]
    [Transport endpoint is not connected. ]
  ]

  [
    [not_socket]
    [Socket operation on non-socket. ]
  ]

  [
    [operation_aborted]
    [Operation cancelled. ]
  ]

  [
    [operation_not_supported]
    [Operation not supported. ]
  ]

  [
    [shut_down]
    [Cannot send after transport endpoint shutdown. ]
  ]

  [
    [timed_out]
    [Connection timed out. ]
  ]

  [
    [try_again]
    [Resource temporarily unavailable. ]
  ]

  [
    [would_block]
    [The socket is marked non-blocking and the requested operation would block. ]
  ]

]


[heading Requirements]

['Header: ][^asio/error.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:error__get_addrinfo_category error::get_addrinfo_category]

[indexterm1 asio.indexterm.error__get_addrinfo_category..error::get_addrinfo_category] 

  const asio::error_category & get_addrinfo_category();


[heading Requirements]

['Header: ][^asio/error.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:error__get_misc_category error::get_misc_category]

[indexterm1 asio.indexterm.error__get_misc_category..error::get_misc_category] 

  const asio::error_category & get_misc_category();


[heading Requirements]

['Header: ][^asio/error.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:error__get_netdb_category error::get_netdb_category]

[indexterm1 asio.indexterm.error__get_netdb_category..error::get_netdb_category] 

  const asio::error_category & get_netdb_category();


[heading Requirements]

['Header: ][^asio/error.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:error__get_ssl_category error::get_ssl_category]

[indexterm1 asio.indexterm.error__get_ssl_category..error::get_ssl_category] 

  const asio::error_category & get_ssl_category();


[heading Requirements]

['Header: ][^asio/ssl/error.hpp]

['Convenience header: ][^asio/ssl.hpp]


[endsect]



[section:error__get_system_category error::get_system_category]

[indexterm1 asio.indexterm.error__get_system_category..error::get_system_category] 

  const asio::error_category & get_system_category();


[heading Requirements]

['Header: ][^asio/error.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:error__make_error_code error::make_error_code]

[indexterm1 asio.indexterm.error__make_error_code..error::make_error_code] 
  asio::error_code ``[link asio.reference.error__make_error_code.overload1 make_error_code]``(
      basic_errors e);
  ``  [''''&raquo;''' [link asio.reference.error__make_error_code.overload1 more...]]``

  asio::error_code ``[link asio.reference.error__make_error_code.overload2 make_error_code]``(
      netdb_errors e);
  ``  [''''&raquo;''' [link asio.reference.error__make_error_code.overload2 more...]]``

  asio::error_code ``[link asio.reference.error__make_error_code.overload3 make_error_code]``(
      addrinfo_errors e);
  ``  [''''&raquo;''' [link asio.reference.error__make_error_code.overload3 more...]]``

  asio::error_code ``[link asio.reference.error__make_error_code.overload4 make_error_code]``(
      misc_errors e);
  ``  [''''&raquo;''' [link asio.reference.error__make_error_code.overload4 more...]]``

  asio::error_code ``[link asio.reference.error__make_error_code.overload5 make_error_code]``(
      ssl_errors e);
  ``  [''''&raquo;''' [link asio.reference.error__make_error_code.overload5 more...]]``

[heading Requirements]

['Header: ][^asio/error.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 error::make_error_code (1 of 5 overloads)]



  asio::error_code make_error_code(
      basic_errors e);



[endsect]



[section:overload2 error::make_error_code (2 of 5 overloads)]



  asio::error_code make_error_code(
      netdb_errors e);



[endsect]



[section:overload3 error::make_error_code (3 of 5 overloads)]



  asio::error_code make_error_code(
      addrinfo_errors e);



[endsect]



[section:overload4 error::make_error_code (4 of 5 overloads)]



  asio::error_code make_error_code(
      misc_errors e);



[endsect]



[section:overload5 error::make_error_code (5 of 5 overloads)]



  asio::error_code make_error_code(
      ssl_errors e);



[endsect]


[endsect]


[section:error__misc_category error::misc_category]

[indexterm1 asio.indexterm.error__misc_category..error::misc_category] 

  static const asio::error_category & misc_category = asio::error::get_misc_category();


[heading Requirements]

['Header: ][^asio/error.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:error__misc_errors error::misc_errors]

[indexterm1 asio.indexterm.error__misc_errors..error::misc_errors] 

  enum misc_errors

[indexterm2 asio.indexterm.error__misc_errors.already_open..already_open..error::misc_errors]
[indexterm2 asio.indexterm.error__misc_errors.eof..eof..error::misc_errors]
[indexterm2 asio.indexterm.error__misc_errors.not_found..not_found..error::misc_errors]
[indexterm2 asio.indexterm.error__misc_errors.fd_set_failure..fd_set_failure..error::misc_errors]

[heading Values]
[variablelist

  [
    [already_open]
    [Already open. ]
  ]

  [
    [eof]
    [End of file or stream. ]
  ]

  [
    [not_found]
    [Element not found. ]
  ]

  [
    [fd_set_failure]
    [The descriptor cannot fit into the select system call's fd_set. ]
  ]

]


[heading Requirements]

['Header: ][^asio/error.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:error__netdb_category error::netdb_category]

[indexterm1 asio.indexterm.error__netdb_category..error::netdb_category] 

  static const asio::error_category & netdb_category = asio::error::get_netdb_category();


[heading Requirements]

['Header: ][^asio/error.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:error__netdb_errors error::netdb_errors]

[indexterm1 asio.indexterm.error__netdb_errors..error::netdb_errors] 

  enum netdb_errors

[indexterm2 asio.indexterm.error__netdb_errors.host_not_found..host_not_found..error::netdb_errors]
[indexterm2 asio.indexterm.error__netdb_errors.host_not_found_try_again..host_not_found_try_again..error::netdb_errors]
[indexterm2 asio.indexterm.error__netdb_errors.no_data..no_data..error::netdb_errors]
[indexterm2 asio.indexterm.error__netdb_errors.no_recovery..no_recovery..error::netdb_errors]

[heading Values]
[variablelist

  [
    [host_not_found]
    [Host not found (authoritative). ]
  ]

  [
    [host_not_found_try_again]
    [Host not found (non-authoritative). ]
  ]

  [
    [no_data]
    [The query is valid but does not have associated address data. ]
  ]

  [
    [no_recovery]
    [A non-recoverable error occurred. ]
  ]

]


[heading Requirements]

['Header: ][^asio/error.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:error__ssl_category error::ssl_category]

[indexterm1 asio.indexterm.error__ssl_category..error::ssl_category] 

  static const asio::error_category & ssl_category = asio::error::get_ssl_category();


[heading Requirements]

['Header: ][^asio/ssl/error.hpp]

['Convenience header: ][^asio/ssl.hpp]


[endsect]



[section:error__ssl_errors error::ssl_errors]

[indexterm1 asio.indexterm.error__ssl_errors..error::ssl_errors] 

  enum ssl_errors


[heading Requirements]

['Header: ][^asio/ssl/error.hpp]

['Convenience header: ][^asio/ssl.hpp]


[endsect]



[section:error__system_category error::system_category]

[indexterm1 asio.indexterm.error__system_category..error::system_category] 

  static const asio::error_category & system_category = asio::error::get_system_category();


[heading Requirements]

['Header: ][^asio/error.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:error_category error_category]


Base class for all error categories. 


  class error_category :
    noncopyable


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.error_category.message [*message]]]
    [Returns a string describing the error denoted by value. ]
  ]
  
  [
    [[link asio.reference.error_category.name [*name]]]
    [Returns a string naming the error gategory. ]
  ]
  
  [
    [[link asio.reference.error_category.operator_not__eq_ [*operator!=]]]
    [Inequality operator to compare two error categories. ]
  ]
  
  [
    [[link asio.reference.error_category.operator_eq__eq_ [*operator==]]]
    [Equality operator to compare two error categories. ]
  ]
  
  [
    [[link asio.reference.error_category._error_category [*~error_category]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/error_code.hpp]

['Convenience header: ][^asio.hpp]


[section:message error_category::message]

[indexterm2 asio.indexterm.error_category.message..message..error_category] 
Returns a string describing the error denoted by `value`. 


  std::string message(
      int value) const;



[endsect]



[section:name error_category::name]

[indexterm2 asio.indexterm.error_category.name..name..error_category] 
Returns a string naming the error gategory. 


  const char * name() const;



[endsect]



[section:operator_not__eq_ error_category::operator!=]

[indexterm2 asio.indexterm.error_category.operator_not__eq_..operator!=..error_category] 
Inequality operator to compare two error categories. 


  bool operator!=(
      const error_category & rhs) const;



[endsect]



[section:operator_eq__eq_ error_category::operator==]

[indexterm2 asio.indexterm.error_category.operator_eq__eq_..operator==..error_category] 
Equality operator to compare two error categories. 


  bool operator==(
      const error_category & rhs) const;



[endsect]



[section:_error_category error_category::~error_category]

[indexterm2 asio.indexterm.error_category._error_category..~error_category..error_category] 
Destructor. 


  virtual ~error_category();



[endsect]



[endsect]

[section:error_code error_code]


Class to represent an error code value. 


  class error_code


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.error_code__unspecified_bool_type_t [*unspecified_bool_type_t]]]
    []
  
  ]

  [

    [[link asio.reference.error_code.unspecified_bool_type [*unspecified_bool_type]]]
    []
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.error_code.assign [*assign]]]
    [Assign a new error value. ]
  ]
  
  [
    [[link asio.reference.error_code.category [*category]]]
    [Get the error category. ]
  ]
  
  [
    [[link asio.reference.error_code.clear [*clear]]]
    [Clear the error value to the default. ]
  ]
  
  [
    [[link asio.reference.error_code.error_code [*error_code]] [constructor]]
    [Default constructor. 
     [hr]
     Construct with specific error code and category. 
     [hr]
     Construct from an error code enum. ]
  ]
  
  [
    [[link asio.reference.error_code.message [*message]]]
    [Get the message associated with the error. ]
  ]
  
  [
    [[link asio.reference.error_code.operator_unspecified_bool_type [*operator unspecified_bool_type]]]
    [Operator returns non-null if there is a non-success error code. ]
  ]
  
  [
    [[link asio.reference.error_code.operator_not_ [*operator!]]]
    [Operator to test if the error represents success. ]
  ]
  
  [
    [[link asio.reference.error_code.unspecified_bool_true [*unspecified_bool_true]] [static]]
    []
  ]
  
  [
    [[link asio.reference.error_code.value [*value]]]
    [Get the error value. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.error_code.operator_not__eq_ [*operator!=]]]
    [Inequality operator to compare two error objects. ]
  ]
  
  [
    [[link asio.reference.error_code.operator_eq__eq_ [*operator==]]]
    [Equality operator to compare two error objects. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/error_code.hpp]

['Convenience header: ][^asio.hpp]


[section:assign error_code::assign]

[indexterm2 asio.indexterm.error_code.assign..assign..error_code] 
Assign a new error value. 


  void assign(
      int v,
      const error_category & c);



[endsect]



[section:category error_code::category]

[indexterm2 asio.indexterm.error_code.category..category..error_code] 
Get the error category. 


  const error_category & category() const;



[endsect]



[section:clear error_code::clear]

[indexterm2 asio.indexterm.error_code.clear..clear..error_code] 
Clear the error value to the default. 


  void clear();



[endsect]


[section:error_code error_code::error_code]

[indexterm2 asio.indexterm.error_code.error_code..error_code..error_code] 
Default constructor. 


  ``[link asio.reference.error_code.error_code.overload1 error_code]``();
  ``  [''''&raquo;''' [link asio.reference.error_code.error_code.overload1 more...]]``


Construct with specific error code and category. 


  ``[link asio.reference.error_code.error_code.overload2 error_code]``(
      int v,
      const error_category & c);
  ``  [''''&raquo;''' [link asio.reference.error_code.error_code.overload2 more...]]``


Construct from an error code enum. 


  template<
      typename ErrorEnum>
  ``[link asio.reference.error_code.error_code.overload3 error_code]``(
      ErrorEnum e);
  ``  [''''&raquo;''' [link asio.reference.error_code.error_code.overload3 more...]]``


[section:overload1 error_code::error_code (1 of 3 overloads)]


Default constructor. 


  error_code();



[endsect]



[section:overload2 error_code::error_code (2 of 3 overloads)]


Construct with specific error code and category. 


  error_code(
      int v,
      const error_category & c);



[endsect]



[section:overload3 error_code::error_code (3 of 3 overloads)]


Construct from an error code enum. 


  template<
      typename ErrorEnum>
  error_code(
      ErrorEnum e);



[endsect]


[endsect]


[section:message error_code::message]

[indexterm2 asio.indexterm.error_code.message..message..error_code] 
Get the message associated with the error. 


  std::string message() const;



[endsect]



[section:operator_unspecified_bool_type error_code::operator unspecified_bool_type]

[indexterm2 asio.indexterm.error_code.operator_unspecified_bool_type..operator unspecified_bool_type..error_code] 
Operator returns non-null if there is a non-success error code. 


  operator unspecified_bool_type() const;



[endsect]



[section:operator_not_ error_code::operator!]

[indexterm2 asio.indexterm.error_code.operator_not_..operator!..error_code] 
Operator to test if the error represents success. 


  bool operator!() const;



[endsect]



[section:operator_not__eq_ error_code::operator!=]

[indexterm2 asio.indexterm.error_code.operator_not__eq_..operator!=..error_code] 
Inequality operator to compare two error objects. 


  friend bool operator!=(
      const error_code & e1,
      const error_code & e2);


[heading Requirements]

['Header: ][^asio/error_code.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq__eq_ error_code::operator==]

[indexterm2 asio.indexterm.error_code.operator_eq__eq_..operator==..error_code] 
Equality operator to compare two error objects. 


  friend bool operator==(
      const error_code & e1,
      const error_code & e2);


[heading Requirements]

['Header: ][^asio/error_code.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:unspecified_bool_true error_code::unspecified_bool_true]

[indexterm2 asio.indexterm.error_code.unspecified_bool_true..unspecified_bool_true..error_code] 

  static void unspecified_bool_true(
      unspecified_bool_type_t );



[endsect]



[section:unspecified_bool_type error_code::unspecified_bool_type]

[indexterm2 asio.indexterm.error_code.unspecified_bool_type..unspecified_bool_type..error_code] 

  typedef void(*) unspecified_bool_type;



[heading Requirements]

['Header: ][^asio/error_code.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:value error_code::value]

[indexterm2 asio.indexterm.error_code.value..value..error_code] 
Get the error value. 


  int value() const;



[endsect]



[endsect]

[section:error_code__unspecified_bool_type_t error_code::unspecified_bool_type_t]



  struct unspecified_bool_type_t


[heading Requirements]

['Header: ][^asio/error_code.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:execution__allocator execution::allocator]

[indexterm1 asio.indexterm.execution__allocator..execution::allocator] 
A special value used for accessing the [link asio.reference.execution__allocator_t `execution::allocator_t`] property. 


  constexpr allocator_t< void > allocator;


[heading Requirements]

['Header: ][^asio/execution/allocator.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]


[section:execution__allocator_t execution::allocator_t]


A property to describe which allocator an executor will use to allocate the memory required to store a submitted function object. 


  template<
      typename ``[link asio.reference.ProtoAllocator ProtoAllocator]``>
  struct allocator_t


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__allocator_t.allocator_t [*allocator_t]] [constructor]]
    [Default constructor. ]
  ]
  
  [
    [[link asio.reference.execution__allocator_t.value [*value]]]
    [Obtain the allocator stored in the allocator_t property object. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__allocator_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The allocator_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__allocator_t.is_preferable [*is_preferable]] [static]]
    [The allocator_t property can be preferred. ]
  ]

  [
    [[link asio.reference.execution__allocator_t.is_requirable [*is_requirable]] [static]]
    [The allocator_t property can be required. ]
  ]

]

[heading Requirements]

['Header: ][^asio/execution/allocator.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:allocator_t execution::allocator_t::allocator_t]

[indexterm2 asio.indexterm.execution__allocator_t.allocator_t..allocator_t..execution::allocator_t] 
Default constructor. 


  constexpr allocator_t();



[endsect]



[section:is_applicable_property_v execution::allocator_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__allocator_t.is_applicable_property_v..is_applicable_property_v..execution::allocator_t] 
The [link asio.reference.execution__allocator_t `execution::allocator_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
    is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::allocator_t::is_preferable]

[indexterm2 asio.indexterm.execution__allocator_t.is_preferable..is_preferable..execution::allocator_t] 
The [link asio.reference.execution__allocator_t `execution::allocator_t`] property can be preferred. 


  static constexpr bool is_preferable = true;



[endsect]



[section:is_requirable execution::allocator_t::is_requirable]

[indexterm2 asio.indexterm.execution__allocator_t.is_requirable..is_requirable..execution::allocator_t] 
The [link asio.reference.execution__allocator_t `execution::allocator_t`] property can be required. 


  static constexpr bool is_requirable = true;



[endsect]



[section:value execution::allocator_t::value]

[indexterm2 asio.indexterm.execution__allocator_t.value..value..execution::allocator_t] 
Obtain the allocator stored in the [link asio.reference.execution__allocator_t `execution::allocator_t`] property object. 


  constexpr ProtoAllocator value() const;


Present only if `ProtoAllocator` is non-void. 


[endsect]



[endsect]

[section:execution__any_executor execution::any_executor]


Polymorphic executor wrapper. 


  template<
      typename... SupportableProperties>
  class any_executor


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__any_executor.any_executor [*any_executor]] [constructor]]
    [Default constructor. 
     [hr]
     Construct in an empty state. Equivalent effects to default constructor. 
     [hr]
     Copy constructor. 
     [hr]
     Move constructor. 
     [hr]
     Construct to point to the same target as another any_executor. 
     [hr]
     Construct a polymorphic wrapper for the specified executor. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor.execute [*execute]]]
    [Execute the function on the target executor. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor.operator_bool [*operator bool]]]
    [Determine whether the wrapper has a target executor. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor.operator_eq_ [*operator=]]]
    [Assignment operator. 
     [hr]
     Move assignment operator. 
     [hr]
     Assignment operator that sets the polymorphic wrapper to the empty state. 
     [hr]
     Assignment operator to create a polymorphic wrapper for the specified executor. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor.prefer [*prefer]]]
    [Obtain a polymorphic wrapper with the specified property. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor.query [*query]]]
    [Obtain the value associated with the specified property. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor.require [*require]]]
    [Obtain a polymorphic wrapper with the specified property. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor.swap [*swap]]]
    [Swap targets with another polymorphic wrapper. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor.target [*target]]]
    [Get a pointer to the target executor. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor.target_type [*target_type]]]
    [Get the type of the target executor. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor._any_executor [*~any_executor]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__any_executor.operator_not__eq_ [*operator!=]]]
    [Inequality operator. ]
  ]
  
  [
    [[link asio.reference.execution__any_executor.operator_eq__eq_ [*operator==]]]
    [Equality operator. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/execution/any_executor.hpp]

['Convenience header: ][^asio/execution.hpp]

[section:any_executor execution::any_executor::any_executor]

[indexterm2 asio.indexterm.execution__any_executor.any_executor..any_executor..execution::any_executor] 
Default constructor. 


  ``[link asio.reference.execution__any_executor.any_executor.overload1 any_executor]``();
  ``  [''''&raquo;''' [link asio.reference.execution__any_executor.any_executor.overload1 more...]]``


Construct in an empty state. Equivalent effects to default constructor. 


  ``[link asio.reference.execution__any_executor.any_executor.overload2 any_executor]``(
      nullptr_t );
  ``  [''''&raquo;''' [link asio.reference.execution__any_executor.any_executor.overload2 more...]]``


Copy constructor. 


  ``[link asio.reference.execution__any_executor.any_executor.overload3 any_executor]``(
      const any_executor & e);
  ``  [''''&raquo;''' [link asio.reference.execution__any_executor.any_executor.overload3 more...]]``


Move constructor. 


  ``[link asio.reference.execution__any_executor.any_executor.overload4 any_executor]``(
      any_executor && e);
  ``  [''''&raquo;''' [link asio.reference.execution__any_executor.any_executor.overload4 more...]]``


Construct to point to the same target as another [link asio.reference.execution__any_executor `execution::any_executor`]. 


  template<
      class... OtherSupportableProperties>
  ``[link asio.reference.execution__any_executor.any_executor.overload5 any_executor]``(
      any_executor< OtherSupportableProperties...> e);
  ``  [''''&raquo;''' [link asio.reference.execution__any_executor.any_executor.overload5 more...]]``


Construct a polymorphic wrapper for the specified executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``>
  ``[link asio.reference.execution__any_executor.any_executor.overload6 any_executor]``(
      Executor e);
  ``  [''''&raquo;''' [link asio.reference.execution__any_executor.any_executor.overload6 more...]]``


[section:overload1 execution::any_executor::any_executor (1 of 6 overloads)]


Default constructor. 


  any_executor();



[endsect]



[section:overload2 execution::any_executor::any_executor (2 of 6 overloads)]


Construct in an empty state. Equivalent effects to default constructor. 


  any_executor(
      nullptr_t );



[endsect]



[section:overload3 execution::any_executor::any_executor (3 of 6 overloads)]


Copy constructor. 


  any_executor(
      const any_executor & e);



[endsect]



[section:overload4 execution::any_executor::any_executor (4 of 6 overloads)]


Move constructor. 


  any_executor(
      any_executor && e);



[endsect]



[section:overload5 execution::any_executor::any_executor (5 of 6 overloads)]


Construct to point to the same target as another [link asio.reference.execution__any_executor `execution::any_executor`]. 


  template<
      class... OtherSupportableProperties>
  any_executor(
      any_executor< OtherSupportableProperties...> e);



[endsect]



[section:overload6 execution::any_executor::any_executor (6 of 6 overloads)]


Construct a polymorphic wrapper for the specified executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``>
  any_executor(
      Executor e);



[endsect]


[endsect]


[section:context execution::any_executor::context]

[indexterm2 asio.indexterm.execution__any_executor.context..context..execution::any_executor] 
Obtain the underlying execution context. 


  automatically_determined context() const;


This function is provided for backward compatibility. It is automatically defined when the `SupportableProperties`... list includes a property of type `execution::context_as<U>`, for some type `U`. 


[endsect]



[section:execute execution::any_executor::execute]

[indexterm2 asio.indexterm.execution__any_executor.execute..execute..execution::any_executor] 
Execute the function on the target executor. 


  template<
      typename Function>
  void execute(
      Function && f) const;


Do not call this function directly. It is intended for use with the [link asio.reference.execution__execute `execution::execute`] customisation point.

For example: 

   execution::any_executor<> ex = ...;
   execution::execute(ex, my_function_object); 




Throws [link asio.reference.bad_executor `bad_executor`] if the polymorphic wrapper has no target. 


[endsect]



[section:operator_bool execution::any_executor::operator bool]

[indexterm2 asio.indexterm.execution__any_executor.operator_bool..operator bool..execution::any_executor] 
Determine whether the wrapper has a target executor. 


  operator bool() const;



[heading Return Value]
      
`true` if the polymorphic wrapper has a target executor, otherwise false. 




[endsect]


[section:operator_not__eq_ execution::any_executor::operator!=]

[indexterm2 asio.indexterm.execution__any_executor.operator_not__eq_..operator!=..execution::any_executor] 
Inequality operator. 


  bool ``[link asio.reference.execution__any_executor.operator_not__eq_.overload1 operator!=]``(
      const any_executor< SupportableProperties...> & a,
      const any_executor< SupportableProperties...> & b);
  ``  [''''&raquo;''' [link asio.reference.execution__any_executor.operator_not__eq_.overload1 more...]]``

  bool ``[link asio.reference.execution__any_executor.operator_not__eq_.overload2 operator!=]``(
      const any_executor< SupportableProperties...> & a,
      nullptr_t );
  ``  [''''&raquo;''' [link asio.reference.execution__any_executor.operator_not__eq_.overload2 more...]]``

  bool ``[link asio.reference.execution__any_executor.operator_not__eq_.overload3 operator!=]``(
      nullptr_t ,
      const any_executor< SupportableProperties...> & b);
  ``  [''''&raquo;''' [link asio.reference.execution__any_executor.operator_not__eq_.overload3 more...]]``


[section:overload1 execution::any_executor::operator!= (1 of 3 overloads)]


Inequality operator. 


  bool operator!=(
      const any_executor< SupportableProperties...> & a,
      const any_executor< SupportableProperties...> & b);



[endsect]



[section:overload2 execution::any_executor::operator!= (2 of 3 overloads)]


Inequality operator. 


  bool operator!=(
      const any_executor< SupportableProperties...> & a,
      nullptr_t );



[endsect]



[section:overload3 execution::any_executor::operator!= (3 of 3 overloads)]


Inequality operator. 


  bool operator!=(
      nullptr_t ,
      const any_executor< SupportableProperties...> & b);



[endsect]


[endsect]

[section:operator_eq_ execution::any_executor::operator=]

[indexterm2 asio.indexterm.execution__any_executor.operator_eq_..operator=..execution::any_executor] 
Assignment operator. 


  any_executor & ``[link asio.reference.execution__any_executor.operator_eq_.overload1 operator=]``(
      const any_executor & e);
  ``  [''''&raquo;''' [link asio.reference.execution__any_executor.operator_eq_.overload1 more...]]``


Move assignment operator. 


  any_executor & ``[link asio.reference.execution__any_executor.operator_eq_.overload2 operator=]``(
      any_executor && e);
  ``  [''''&raquo;''' [link asio.reference.execution__any_executor.operator_eq_.overload2 more...]]``


Assignment operator that sets the polymorphic wrapper to the empty state. 


  any_executor & ``[link asio.reference.execution__any_executor.operator_eq_.overload3 operator=]``(
      nullptr_t );
  ``  [''''&raquo;''' [link asio.reference.execution__any_executor.operator_eq_.overload3 more...]]``


Assignment operator to create a polymorphic wrapper for the specified executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``>
  any_executor & ``[link asio.reference.execution__any_executor.operator_eq_.overload4 operator=]``(
      Executor e);
  ``  [''''&raquo;''' [link asio.reference.execution__any_executor.operator_eq_.overload4 more...]]``


[section:overload1 execution::any_executor::operator= (1 of 4 overloads)]


Assignment operator. 


  any_executor & operator=(
      const any_executor & e);



[endsect]



[section:overload2 execution::any_executor::operator= (2 of 4 overloads)]


Move assignment operator. 


  any_executor & operator=(
      any_executor && e);



[endsect]



[section:overload3 execution::any_executor::operator= (3 of 4 overloads)]


Assignment operator that sets the polymorphic wrapper to the empty state. 


  any_executor & operator=(
      nullptr_t );



[endsect]



[section:overload4 execution::any_executor::operator= (4 of 4 overloads)]


Assignment operator to create a polymorphic wrapper for the specified executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``>
  any_executor & operator=(
      Executor e);



[endsect]


[endsect]

[section:operator_eq__eq_ execution::any_executor::operator==]

[indexterm2 asio.indexterm.execution__any_executor.operator_eq__eq_..operator==..execution::any_executor] 
Equality operator. 


  bool ``[link asio.reference.execution__any_executor.operator_eq__eq_.overload1 operator==]``(
      const any_executor< SupportableProperties...> & a,
      const any_executor< SupportableProperties...> & b);
  ``  [''''&raquo;''' [link asio.reference.execution__any_executor.operator_eq__eq_.overload1 more...]]``

  bool ``[link asio.reference.execution__any_executor.operator_eq__eq_.overload2 operator==]``(
      const any_executor< SupportableProperties...> & a,
      nullptr_t );
  ``  [''''&raquo;''' [link asio.reference.execution__any_executor.operator_eq__eq_.overload2 more...]]``

  bool ``[link asio.reference.execution__any_executor.operator_eq__eq_.overload3 operator==]``(
      nullptr_t ,
      const any_executor< SupportableProperties...> & b);
  ``  [''''&raquo;''' [link asio.reference.execution__any_executor.operator_eq__eq_.overload3 more...]]``


[section:overload1 execution::any_executor::operator== (1 of 3 overloads)]


Equality operator. 


  bool operator==(
      const any_executor< SupportableProperties...> & a,
      const any_executor< SupportableProperties...> & b);



[endsect]



[section:overload2 execution::any_executor::operator== (2 of 3 overloads)]


Equality operator. 


  bool operator==(
      const any_executor< SupportableProperties...> & a,
      nullptr_t );



[endsect]



[section:overload3 execution::any_executor::operator== (3 of 3 overloads)]


Equality operator. 


  bool operator==(
      nullptr_t ,
      const any_executor< SupportableProperties...> & b);



[endsect]


[endsect]


[section:prefer execution::any_executor::prefer]

[indexterm2 asio.indexterm.execution__any_executor.prefer..prefer..execution::any_executor] 
Obtain a polymorphic wrapper with the specified property. 


  template<
      typename Property>
  any_executor prefer(
      Property ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.prefer `prefer`] customisation point.

For example: 

   execution::any_executor<execution::blocking_t::possibly_t> ex = ...;
   auto ex2 = asio::prefer(ex, execution::blocking.possibly); 





[endsect]



[section:query execution::any_executor::query]

[indexterm2 asio.indexterm.execution__any_executor.query..query..execution::any_executor] 
Obtain the value associated with the specified property. 


  template<
      typename Property>
  Property::polymorphic_query_result_type query(
      Property ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   execution::any_executor<execution::occupancy_t> ex = ...;
   size_t n = asio::query(ex, execution::occupancy); 





[endsect]



[section:require execution::any_executor::require]

[indexterm2 asio.indexterm.execution__any_executor.require..require..execution::any_executor] 
Obtain a polymorphic wrapper with the specified property. 


  template<
      typename Property>
  any_executor require(
      Property ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] and [link asio.reference.prefer `prefer`] customisation points.

For example: 

   execution::any_executor<execution::blocking_t::possibly_t> ex = ...;
   auto ex2 = asio::requre(ex, execution::blocking.possibly); 





[endsect]



[section:swap execution::any_executor::swap]

[indexterm2 asio.indexterm.execution__any_executor.swap..swap..execution::any_executor] 
Swap targets with another polymorphic wrapper. 


  void swap(
      any_executor & other);



[endsect]


[section:target execution::any_executor::target]

[indexterm2 asio.indexterm.execution__any_executor.target..target..execution::any_executor] 
Get a pointer to the target executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``>
  Executor * ``[link asio.reference.execution__any_executor.target.overload1 target]``();
  ``  [''''&raquo;''' [link asio.reference.execution__any_executor.target.overload1 more...]]``

  template<
      typename ``[link asio.reference.Executor1 Executor]``>
  const Executor * ``[link asio.reference.execution__any_executor.target.overload2 target]``() const;
  ``  [''''&raquo;''' [link asio.reference.execution__any_executor.target.overload2 more...]]``


[section:overload1 execution::any_executor::target (1 of 2 overloads)]


Get a pointer to the target executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``>
  Executor * target();



[endsect]



[section:overload2 execution::any_executor::target (2 of 2 overloads)]


Get a pointer to the target executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``>
  const Executor * target() const;



[endsect]


[endsect]


[section:target_type execution::any_executor::target_type]

[indexterm2 asio.indexterm.execution__any_executor.target_type..target_type..execution::any_executor] 
Get the type of the target executor. 


  const type_info & target_type() const;



[endsect]



[section:_any_executor execution::any_executor::~any_executor]

[indexterm2 asio.indexterm.execution__any_executor._any_executor..~any_executor..execution::any_executor] 
Destructor. 


  ~any_executor();



[endsect]



[endsect]

[section:execution__bad_executor execution::bad_executor]


Exception thrown when trying to access an empty polymorphic executor. 


  class bad_executor :
    public std::exception


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__bad_executor.bad_executor [*bad_executor]] [constructor]]
    [Constructor. ]
  ]
  
  [
    [[link asio.reference.execution__bad_executor.what [*what]]]
    [Obtain message associated with exception. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/execution/bad_executor.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:bad_executor execution::bad_executor::bad_executor]

[indexterm2 asio.indexterm.execution__bad_executor.bad_executor..bad_executor..execution::bad_executor] 
Constructor. 


  bad_executor();



[endsect]



[section:what execution::bad_executor::what]

[indexterm2 asio.indexterm.execution__bad_executor.what..what..execution::bad_executor] 
Obtain message associated with exception. 


  virtual const char * what() const;



[endsect]



[endsect]


[section:execution__blocking execution::blocking]

[indexterm1 asio.indexterm.execution__blocking..execution::blocking] 
A special value used for accessing the [link asio.reference.execution__blocking_t `execution::blocking_t`] property. 


  constexpr blocking_t blocking;


[heading Requirements]

['Header: ][^asio/execution/blocking.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:execution__blocking_adaptation execution::blocking_adaptation]

[indexterm1 asio.indexterm.execution__blocking_adaptation..execution::blocking_adaptation] 
A special value used for accessing the [link asio.reference.execution__blocking_adaptation_t `execution::blocking_adaptation_t`] property. 


  constexpr blocking_adaptation_t blocking_adaptation;


[heading Requirements]

['Header: ][^asio/execution/blocking_adaptation.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]


[section:execution__blocking_adaptation_t execution::blocking_adaptation_t]


A property to describe whether automatic adaptation of an executor is allowed in order to apply the [link asio.reference.execution__blocking_adaptation_t__allowed_t `execution::blocking_adaptation_t::allowed_t`] property. 


  struct blocking_adaptation_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__blocking_adaptation_t__allowed_t [*allowed_t]]]
    [A sub-property that indicates that automatic adaptation is allowed. ]
  
  ]

  [

    [[link asio.reference.execution__blocking_adaptation_t__disallowed_t [*disallowed_t]]]
    [A sub-property that indicates that automatic adaptation is not allowed. ]
  
  ]

  [

    [[link asio.reference.execution__blocking_adaptation_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__blocking_adaptation_t.blocking_adaptation_t [*blocking_adaptation_t]] [constructor]]
    [Default constructor. 
     [hr]
     Construct from a sub-property value. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__blocking_adaptation_t.allowed [*allowed]] [static]]
    [A special value used for accessing the blocking_adaptation_t::allowed_t property. ]
  ]

  [
    [[link asio.reference.execution__blocking_adaptation_t.disallowed [*disallowed]] [static]]
    [A special value used for accessing the blocking_adaptation_t::disallowed_t property. ]
  ]

  [
    [[link asio.reference.execution__blocking_adaptation_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The blocking_adaptation_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__blocking_adaptation_t.is_preferable [*is_preferable]] [static]]
    [The top-level blocking_adaptation_t property cannot be preferred. ]
  ]

  [
    [[link asio.reference.execution__blocking_adaptation_t.is_requirable [*is_requirable]] [static]]
    [The top-level blocking_adaptation_t property cannot be required. ]
  ]

]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__blocking_adaptation_t.operator_not__eq_ [*operator!=]]]
    [Compare property values for inequality. ]
  ]
  
  [
    [[link asio.reference.execution__blocking_adaptation_t.operator_eq__eq_ [*operator==]]]
    [Compare property values for equality. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/execution/blocking_adaptation.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:allowed execution::blocking_adaptation_t::allowed]

[indexterm2 asio.indexterm.execution__blocking_adaptation_t.allowed..allowed..execution::blocking_adaptation_t] 
A special value used for accessing the [link asio.reference.execution__blocking_adaptation_t__allowed_t `execution::blocking_adaptation_t::allowed_t`] property. 


  static constexpr allowed_t allowed;



[endsect]


[section:blocking_adaptation_t execution::blocking_adaptation_t::blocking_adaptation_t]

[indexterm2 asio.indexterm.execution__blocking_adaptation_t.blocking_adaptation_t..blocking_adaptation_t..execution::blocking_adaptation_t] 
Default constructor. 


  constexpr ``[link asio.reference.execution__blocking_adaptation_t.blocking_adaptation_t.overload1 blocking_adaptation_t]``();
  ``  [''''&raquo;''' [link asio.reference.execution__blocking_adaptation_t.blocking_adaptation_t.overload1 more...]]``


Construct from a sub-property value. 


  constexpr ``[link asio.reference.execution__blocking_adaptation_t.blocking_adaptation_t.overload2 blocking_adaptation_t]``(
      disallowed_t );
  ``  [''''&raquo;''' [link asio.reference.execution__blocking_adaptation_t.blocking_adaptation_t.overload2 more...]]``

  constexpr ``[link asio.reference.execution__blocking_adaptation_t.blocking_adaptation_t.overload3 blocking_adaptation_t]``(
      allowed_t );
  ``  [''''&raquo;''' [link asio.reference.execution__blocking_adaptation_t.blocking_adaptation_t.overload3 more...]]``


[section:overload1 execution::blocking_adaptation_t::blocking_adaptation_t (1 of 3 overloads)]


Default constructor. 


  constexpr blocking_adaptation_t();



[endsect]



[section:overload2 execution::blocking_adaptation_t::blocking_adaptation_t (2 of 3 overloads)]


Construct from a sub-property value. 


  constexpr blocking_adaptation_t(
      disallowed_t );



[endsect]



[section:overload3 execution::blocking_adaptation_t::blocking_adaptation_t (3 of 3 overloads)]


Construct from a sub-property value. 


  constexpr blocking_adaptation_t(
      allowed_t );



[endsect]


[endsect]


[section:disallowed execution::blocking_adaptation_t::disallowed]

[indexterm2 asio.indexterm.execution__blocking_adaptation_t.disallowed..disallowed..execution::blocking_adaptation_t] 
A special value used for accessing the [link asio.reference.execution__blocking_adaptation_t__disallowed_t `execution::blocking_adaptation_t::disallowed_t`] property. 


  static constexpr disallowed_t disallowed;



[endsect]



[section:is_applicable_property_v execution::blocking_adaptation_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__blocking_adaptation_t.is_applicable_property_v..is_applicable_property_v..execution::blocking_adaptation_t] 
The [link asio.reference.execution__blocking_adaptation_t `execution::blocking_adaptation_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
    is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::blocking_adaptation_t::is_preferable]

[indexterm2 asio.indexterm.execution__blocking_adaptation_t.is_preferable..is_preferable..execution::blocking_adaptation_t] 
The top-level [link asio.reference.execution__blocking_adaptation_t `execution::blocking_adaptation_t`] property cannot be preferred. 


  static constexpr bool is_preferable = false;



[endsect]



[section:is_requirable execution::blocking_adaptation_t::is_requirable]

[indexterm2 asio.indexterm.execution__blocking_adaptation_t.is_requirable..is_requirable..execution::blocking_adaptation_t] 
The top-level [link asio.reference.execution__blocking_adaptation_t `execution::blocking_adaptation_t`] property cannot be required. 


  static constexpr bool is_requirable = false;



[endsect]



[section:operator_not__eq_ execution::blocking_adaptation_t::operator!=]

[indexterm2 asio.indexterm.execution__blocking_adaptation_t.operator_not__eq_..operator!=..execution::blocking_adaptation_t] 
Compare property values for inequality. 


  friend constexpr bool operator!=(
      const blocking_adaptation_t & a,
      const blocking_adaptation_t & b);


[heading Requirements]

['Header: ][^asio/execution/blocking_adaptation.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:operator_eq__eq_ execution::blocking_adaptation_t::operator==]

[indexterm2 asio.indexterm.execution__blocking_adaptation_t.operator_eq__eq_..operator==..execution::blocking_adaptation_t] 
Compare property values for equality. 


  friend constexpr bool operator==(
      const blocking_adaptation_t & a,
      const blocking_adaptation_t & b);


[heading Requirements]

['Header: ][^asio/execution/blocking_adaptation.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:polymorphic_query_result_type execution::blocking_adaptation_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__blocking_adaptation_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::blocking_adaptation_t] 
The type returned by queries against an `any_executor`. 


  typedef blocking_adaptation_t polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/blocking_adaptation.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[endsect]

[section:execution__blocking_adaptation_t__allowed_t execution::blocking_adaptation_t::allowed_t]


A sub-property that indicates that automatic adaptation is allowed. 


  struct allowed_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__blocking_adaptation_t__allowed_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__blocking_adaptation_t__allowed_t.allowed_t [*allowed_t]] [constructor]]
    [Default constructor. ]
  ]
  
  [
    [[link asio.reference.execution__blocking_adaptation_t__allowed_t.value [*value]] [static]]
    [Get the value associated with a property object. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__blocking_adaptation_t__allowed_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The blocking_adaptation_t::allowed_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__blocking_adaptation_t__allowed_t.is_preferable [*is_preferable]] [static]]
    [The blocking_adaptation_t::allowed_t property can be preferred. ]
  ]

  [
    [[link asio.reference.execution__blocking_adaptation_t__allowed_t.is_requirable [*is_requirable]] [static]]
    [The blocking_adaptation_t::allowed_t property can be required. ]
  ]

]

[heading Requirements]

['Header: ][^asio/execution/blocking_adaptation.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:allowed_t execution::blocking_adaptation_t::allowed_t::allowed_t]

[indexterm2 asio.indexterm.execution__blocking_adaptation_t__allowed_t.allowed_t..allowed_t..execution::blocking_adaptation_t::allowed_t] 
Default constructor. 


  constexpr allowed_t();



[endsect]



[section:is_applicable_property_v execution::blocking_adaptation_t::allowed_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__blocking_adaptation_t__allowed_t.is_applicable_property_v..is_applicable_property_v..execution::blocking_adaptation_t::allowed_t] 
The [link asio.reference.execution__blocking_adaptation_t__allowed_t `execution::blocking_adaptation_t::allowed_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
      is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::blocking_adaptation_t::allowed_t::is_preferable]

[indexterm2 asio.indexterm.execution__blocking_adaptation_t__allowed_t.is_preferable..is_preferable..execution::blocking_adaptation_t::allowed_t] 
The [link asio.reference.execution__blocking_adaptation_t__allowed_t `execution::blocking_adaptation_t::allowed_t`] property can be preferred. 


  static constexpr bool is_preferable = false;



[endsect]



[section:is_requirable execution::blocking_adaptation_t::allowed_t::is_requirable]

[indexterm2 asio.indexterm.execution__blocking_adaptation_t__allowed_t.is_requirable..is_requirable..execution::blocking_adaptation_t::allowed_t] 
The [link asio.reference.execution__blocking_adaptation_t__allowed_t `execution::blocking_adaptation_t::allowed_t`] property can be required. 


  static constexpr bool is_requirable = true;



[endsect]



[section:polymorphic_query_result_type execution::blocking_adaptation_t::allowed_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__blocking_adaptation_t__allowed_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::blocking_adaptation_t::allowed_t] 
The type returned by queries against an `any_executor`. 


  typedef blocking_adaptation_t polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/blocking_adaptation.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:value execution::blocking_adaptation_t::allowed_t::value]

[indexterm2 asio.indexterm.execution__blocking_adaptation_t__allowed_t.value..value..execution::blocking_adaptation_t::allowed_t] 
Get the value associated with a property object. 


  static constexpr blocking_adaptation_t value();



[heading Return Value]
      
`allowed_t()`; 




[endsect]



[endsect]

[section:execution__blocking_adaptation_t__disallowed_t execution::blocking_adaptation_t::disallowed_t]


A sub-property that indicates that automatic adaptation is not allowed. 


  struct disallowed_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__blocking_adaptation_t__disallowed_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__blocking_adaptation_t__disallowed_t.disallowed_t [*disallowed_t]] [constructor]]
    [Default constructor. ]
  ]
  
  [
    [[link asio.reference.execution__blocking_adaptation_t__disallowed_t.value [*value]] [static]]
    [Get the value associated with a property object. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__blocking_adaptation_t__disallowed_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The blocking_adaptation_t::disallowed_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__blocking_adaptation_t__disallowed_t.is_preferable [*is_preferable]] [static]]
    [The blocking_adaptation_t::disallowed_t property can be preferred. ]
  ]

  [
    [[link asio.reference.execution__blocking_adaptation_t__disallowed_t.is_requirable [*is_requirable]] [static]]
    [The blocking_adaptation_t::disallowed_t property can be required. ]
  ]

]

[heading Requirements]

['Header: ][^asio/execution/blocking_adaptation.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:disallowed_t execution::blocking_adaptation_t::disallowed_t::disallowed_t]

[indexterm2 asio.indexterm.execution__blocking_adaptation_t__disallowed_t.disallowed_t..disallowed_t..execution::blocking_adaptation_t::disallowed_t] 
Default constructor. 


  constexpr disallowed_t();



[endsect]



[section:is_applicable_property_v execution::blocking_adaptation_t::disallowed_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__blocking_adaptation_t__disallowed_t.is_applicable_property_v..is_applicable_property_v..execution::blocking_adaptation_t::disallowed_t] 
The [link asio.reference.execution__blocking_adaptation_t__disallowed_t `execution::blocking_adaptation_t::disallowed_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
      is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::blocking_adaptation_t::disallowed_t::is_preferable]

[indexterm2 asio.indexterm.execution__blocking_adaptation_t__disallowed_t.is_preferable..is_preferable..execution::blocking_adaptation_t::disallowed_t] 
The [link asio.reference.execution__blocking_adaptation_t__disallowed_t `execution::blocking_adaptation_t::disallowed_t`] property can be preferred. 


  static constexpr bool is_preferable = true;



[endsect]



[section:is_requirable execution::blocking_adaptation_t::disallowed_t::is_requirable]

[indexterm2 asio.indexterm.execution__blocking_adaptation_t__disallowed_t.is_requirable..is_requirable..execution::blocking_adaptation_t::disallowed_t] 
The [link asio.reference.execution__blocking_adaptation_t__disallowed_t `execution::blocking_adaptation_t::disallowed_t`] property can be required. 


  static constexpr bool is_requirable = true;



[endsect]



[section:polymorphic_query_result_type execution::blocking_adaptation_t::disallowed_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__blocking_adaptation_t__disallowed_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::blocking_adaptation_t::disallowed_t] 
The type returned by queries against an `any_executor`. 


  typedef blocking_adaptation_t polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/blocking_adaptation.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:value execution::blocking_adaptation_t::disallowed_t::value]

[indexterm2 asio.indexterm.execution__blocking_adaptation_t__disallowed_t.value..value..execution::blocking_adaptation_t::disallowed_t] 
Get the value associated with a property object. 


  static constexpr blocking_adaptation_t value();



[heading Return Value]
      
`disallowed_t()`; 




[endsect]



[endsect]

[section:execution__blocking_t execution::blocking_t]


A property to describe what guarantees an executor makes about the blocking behaviour of their execution functions. 


  struct blocking_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__blocking_t__always_t [*always_t]]]
    [A sub-property that indicates that invocation of an executor's execution function shall block until completion of all invocations of the submitted function object. ]
  
  ]

  [

    [[link asio.reference.execution__blocking_t__never_t [*never_t]]]
    [A sub-property that indicates that invocation of an executor's execution function shall not block pending completion of the invocations of the submitted function object. ]
  
  ]

  [

    [[link asio.reference.execution__blocking_t__possibly_t [*possibly_t]]]
    [A sub-property that indicates that invocation of an executor's execution function may block pending completion of one or more invocations of the submitted function object. ]
  
  ]

  [

    [[link asio.reference.execution__blocking_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__blocking_t.blocking_t [*blocking_t]] [constructor]]
    [Default constructor. 
     [hr]
     Construct from a sub-property value. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__blocking_t.always [*always]] [static]]
    [A special value used for accessing the blocking_t::always_t property. ]
  ]

  [
    [[link asio.reference.execution__blocking_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The blocking_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__blocking_t.is_preferable [*is_preferable]] [static]]
    [The top-level blocking_t property cannot be preferred. ]
  ]

  [
    [[link asio.reference.execution__blocking_t.is_requirable [*is_requirable]] [static]]
    [The top-level blocking_t property cannot be required. ]
  ]

  [
    [[link asio.reference.execution__blocking_t.never [*never]] [static]]
    [A special value used for accessing the blocking_t::never_t property. ]
  ]

  [
    [[link asio.reference.execution__blocking_t.possibly [*possibly]] [static]]
    [A special value used for accessing the blocking_t::possibly_t property. ]
  ]

]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__blocking_t.operator_not__eq_ [*operator!=]]]
    [Compare property values for inequality. ]
  ]
  
  [
    [[link asio.reference.execution__blocking_t.operator_eq__eq_ [*operator==]]]
    [Compare property values for equality. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/execution/blocking.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:always execution::blocking_t::always]

[indexterm2 asio.indexterm.execution__blocking_t.always..always..execution::blocking_t] 
A special value used for accessing the [link asio.reference.execution__blocking_t__always_t `execution::blocking_t::always_t`] property. 


  static constexpr always_t always;



[endsect]


[section:blocking_t execution::blocking_t::blocking_t]

[indexterm2 asio.indexterm.execution__blocking_t.blocking_t..blocking_t..execution::blocking_t] 
Default constructor. 


  constexpr ``[link asio.reference.execution__blocking_t.blocking_t.overload1 blocking_t]``();
  ``  [''''&raquo;''' [link asio.reference.execution__blocking_t.blocking_t.overload1 more...]]``


Construct from a sub-property value. 


  constexpr ``[link asio.reference.execution__blocking_t.blocking_t.overload2 blocking_t]``(
      possibly_t );
  ``  [''''&raquo;''' [link asio.reference.execution__blocking_t.blocking_t.overload2 more...]]``

  constexpr ``[link asio.reference.execution__blocking_t.blocking_t.overload3 blocking_t]``(
      always_t );
  ``  [''''&raquo;''' [link asio.reference.execution__blocking_t.blocking_t.overload3 more...]]``

  constexpr ``[link asio.reference.execution__blocking_t.blocking_t.overload4 blocking_t]``(
      never_t );
  ``  [''''&raquo;''' [link asio.reference.execution__blocking_t.blocking_t.overload4 more...]]``


[section:overload1 execution::blocking_t::blocking_t (1 of 4 overloads)]


Default constructor. 


  constexpr blocking_t();



[endsect]



[section:overload2 execution::blocking_t::blocking_t (2 of 4 overloads)]


Construct from a sub-property value. 


  constexpr blocking_t(
      possibly_t );



[endsect]



[section:overload3 execution::blocking_t::blocking_t (3 of 4 overloads)]


Construct from a sub-property value. 


  constexpr blocking_t(
      always_t );



[endsect]



[section:overload4 execution::blocking_t::blocking_t (4 of 4 overloads)]


Construct from a sub-property value. 


  constexpr blocking_t(
      never_t );



[endsect]


[endsect]


[section:is_applicable_property_v execution::blocking_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__blocking_t.is_applicable_property_v..is_applicable_property_v..execution::blocking_t] 
The [link asio.reference.execution__blocking_t `execution::blocking_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
    is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::blocking_t::is_preferable]

[indexterm2 asio.indexterm.execution__blocking_t.is_preferable..is_preferable..execution::blocking_t] 
The top-level [link asio.reference.execution__blocking_t `execution::blocking_t`] property cannot be preferred. 


  static constexpr bool is_preferable = false;



[endsect]



[section:is_requirable execution::blocking_t::is_requirable]

[indexterm2 asio.indexterm.execution__blocking_t.is_requirable..is_requirable..execution::blocking_t] 
The top-level [link asio.reference.execution__blocking_t `execution::blocking_t`] property cannot be required. 


  static constexpr bool is_requirable = false;



[endsect]



[section:never execution::blocking_t::never]

[indexterm2 asio.indexterm.execution__blocking_t.never..never..execution::blocking_t] 
A special value used for accessing the [link asio.reference.execution__blocking_t__never_t `execution::blocking_t::never_t`] property. 


  static constexpr never_t never;



[endsect]



[section:operator_not__eq_ execution::blocking_t::operator!=]

[indexterm2 asio.indexterm.execution__blocking_t.operator_not__eq_..operator!=..execution::blocking_t] 
Compare property values for inequality. 


  friend constexpr bool operator!=(
      const blocking_t & a,
      const blocking_t & b);


[heading Requirements]

['Header: ][^asio/execution/blocking.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:operator_eq__eq_ execution::blocking_t::operator==]

[indexterm2 asio.indexterm.execution__blocking_t.operator_eq__eq_..operator==..execution::blocking_t] 
Compare property values for equality. 


  friend constexpr bool operator==(
      const blocking_t & a,
      const blocking_t & b);


[heading Requirements]

['Header: ][^asio/execution/blocking.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:polymorphic_query_result_type execution::blocking_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__blocking_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::blocking_t] 
The type returned by queries against an `any_executor`. 


  typedef blocking_t polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/blocking.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:possibly execution::blocking_t::possibly]

[indexterm2 asio.indexterm.execution__blocking_t.possibly..possibly..execution::blocking_t] 
A special value used for accessing the [link asio.reference.execution__blocking_t__possibly_t `execution::blocking_t::possibly_t`] property. 


  static constexpr possibly_t possibly;



[endsect]



[endsect]

[section:execution__blocking_t__always_t execution::blocking_t::always_t]


A sub-property that indicates that invocation of an executor's execution function shall block until completion of all invocations of the submitted function object. 


  struct always_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__blocking_t__always_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__blocking_t__always_t.always_t [*always_t]] [constructor]]
    [Default constructor. ]
  ]
  
  [
    [[link asio.reference.execution__blocking_t__always_t.value [*value]] [static]]
    [Get the value associated with a property object. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__blocking_t__always_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The blocking_t::always_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__blocking_t__always_t.is_preferable [*is_preferable]] [static]]
    [The blocking_t::always_t property can be preferred. ]
  ]

  [
    [[link asio.reference.execution__blocking_t__always_t.is_requirable [*is_requirable]] [static]]
    [The blocking_t::always_t property can be required. ]
  ]

]

[heading Requirements]

['Header: ][^asio/execution/blocking.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:always_t execution::blocking_t::always_t::always_t]

[indexterm2 asio.indexterm.execution__blocking_t__always_t.always_t..always_t..execution::blocking_t::always_t] 
Default constructor. 


  constexpr always_t();



[endsect]



[section:is_applicable_property_v execution::blocking_t::always_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__blocking_t__always_t.is_applicable_property_v..is_applicable_property_v..execution::blocking_t::always_t] 
The [link asio.reference.execution__blocking_t__always_t `execution::blocking_t::always_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
      is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::blocking_t::always_t::is_preferable]

[indexterm2 asio.indexterm.execution__blocking_t__always_t.is_preferable..is_preferable..execution::blocking_t::always_t] 
The [link asio.reference.execution__blocking_t__always_t `execution::blocking_t::always_t`] property can be preferred. 


  static constexpr bool is_preferable = false;



[endsect]



[section:is_requirable execution::blocking_t::always_t::is_requirable]

[indexterm2 asio.indexterm.execution__blocking_t__always_t.is_requirable..is_requirable..execution::blocking_t::always_t] 
The [link asio.reference.execution__blocking_t__always_t `execution::blocking_t::always_t`] property can be required. 


  static constexpr bool is_requirable = true;



[endsect]



[section:polymorphic_query_result_type execution::blocking_t::always_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__blocking_t__always_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::blocking_t::always_t] 
The type returned by queries against an `any_executor`. 


  typedef blocking_t polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/blocking.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:value execution::blocking_t::always_t::value]

[indexterm2 asio.indexterm.execution__blocking_t__always_t.value..value..execution::blocking_t::always_t] 
Get the value associated with a property object. 


  static constexpr blocking_t value();



[heading Return Value]
      
`always_t()`; 




[endsect]



[endsect]

[section:execution__blocking_t__never_t execution::blocking_t::never_t]


A sub-property that indicates that invocation of an executor's execution function shall not block pending completion of the invocations of the submitted function object. 


  struct never_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__blocking_t__never_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__blocking_t__never_t.never_t [*never_t]] [constructor]]
    [Default constructor. ]
  ]
  
  [
    [[link asio.reference.execution__blocking_t__never_t.value [*value]] [static]]
    [Get the value associated with a property object. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__blocking_t__never_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The blocking_t::never_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__blocking_t__never_t.is_preferable [*is_preferable]] [static]]
    [The blocking_t::never_t property can be preferred. ]
  ]

  [
    [[link asio.reference.execution__blocking_t__never_t.is_requirable [*is_requirable]] [static]]
    [The blocking_t::never_t property can be required. ]
  ]

]

[heading Requirements]

['Header: ][^asio/execution/blocking.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:is_applicable_property_v execution::blocking_t::never_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__blocking_t__never_t.is_applicable_property_v..is_applicable_property_v..execution::blocking_t::never_t] 
The [link asio.reference.execution__blocking_t__never_t `execution::blocking_t::never_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
      is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::blocking_t::never_t::is_preferable]

[indexterm2 asio.indexterm.execution__blocking_t__never_t.is_preferable..is_preferable..execution::blocking_t::never_t] 
The [link asio.reference.execution__blocking_t__never_t `execution::blocking_t::never_t`] property can be preferred. 


  static constexpr bool is_preferable = true;



[endsect]



[section:is_requirable execution::blocking_t::never_t::is_requirable]

[indexterm2 asio.indexterm.execution__blocking_t__never_t.is_requirable..is_requirable..execution::blocking_t::never_t] 
The [link asio.reference.execution__blocking_t__never_t `execution::blocking_t::never_t`] property can be required. 


  static constexpr bool is_requirable = true;



[endsect]



[section:never_t execution::blocking_t::never_t::never_t]

[indexterm2 asio.indexterm.execution__blocking_t__never_t.never_t..never_t..execution::blocking_t::never_t] 
Default constructor. 


  constexpr never_t();



[endsect]



[section:polymorphic_query_result_type execution::blocking_t::never_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__blocking_t__never_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::blocking_t::never_t] 
The type returned by queries against an `any_executor`. 


  typedef blocking_t polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/blocking.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:value execution::blocking_t::never_t::value]

[indexterm2 asio.indexterm.execution__blocking_t__never_t.value..value..execution::blocking_t::never_t] 
Get the value associated with a property object. 


  static constexpr blocking_t value();



[heading Return Value]
      
`never_t()`; 




[endsect]



[endsect]

[section:execution__blocking_t__possibly_t execution::blocking_t::possibly_t]


A sub-property that indicates that invocation of an executor's execution function may block pending completion of one or more invocations of the submitted function object. 


  struct possibly_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__blocking_t__possibly_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__blocking_t__possibly_t.possibly_t [*possibly_t]] [constructor]]
    [Default constructor. ]
  ]
  
  [
    [[link asio.reference.execution__blocking_t__possibly_t.value [*value]] [static]]
    [Get the value associated with a property object. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__blocking_t__possibly_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The blocking_t::possibly_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__blocking_t__possibly_t.is_preferable [*is_preferable]] [static]]
    [The blocking_t::possibly_t property can be preferred. ]
  ]

  [
    [[link asio.reference.execution__blocking_t__possibly_t.is_requirable [*is_requirable]] [static]]
    [The blocking_t::possibly_t property can be required. ]
  ]

]

[heading Requirements]

['Header: ][^asio/execution/blocking.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:is_applicable_property_v execution::blocking_t::possibly_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__blocking_t__possibly_t.is_applicable_property_v..is_applicable_property_v..execution::blocking_t::possibly_t] 
The [link asio.reference.execution__blocking_t__possibly_t `execution::blocking_t::possibly_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
      is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::blocking_t::possibly_t::is_preferable]

[indexterm2 asio.indexterm.execution__blocking_t__possibly_t.is_preferable..is_preferable..execution::blocking_t::possibly_t] 
The [link asio.reference.execution__blocking_t__possibly_t `execution::blocking_t::possibly_t`] property can be preferred. 


  static constexpr bool is_preferable = true;



[endsect]



[section:is_requirable execution::blocking_t::possibly_t::is_requirable]

[indexterm2 asio.indexterm.execution__blocking_t__possibly_t.is_requirable..is_requirable..execution::blocking_t::possibly_t] 
The [link asio.reference.execution__blocking_t__possibly_t `execution::blocking_t::possibly_t`] property can be required. 


  static constexpr bool is_requirable = true;



[endsect]



[section:polymorphic_query_result_type execution::blocking_t::possibly_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__blocking_t__possibly_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::blocking_t::possibly_t] 
The type returned by queries against an `any_executor`. 


  typedef blocking_t polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/blocking.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:possibly_t execution::blocking_t::possibly_t::possibly_t]

[indexterm2 asio.indexterm.execution__blocking_t__possibly_t.possibly_t..possibly_t..execution::blocking_t::possibly_t] 
Default constructor. 


  constexpr possibly_t();



[endsect]



[section:value execution::blocking_t::possibly_t::value]

[indexterm2 asio.indexterm.execution__blocking_t__possibly_t.value..value..execution::blocking_t::possibly_t] 
Get the value associated with a property object. 


  static constexpr blocking_t value();



[heading Return Value]
      
`possibly_t()`; 




[endsect]



[endsect]


[section:execution__bulk_execute execution::bulk_execute]

[indexterm1 asio.indexterm.execution__bulk_execute..execution::bulk_execute] 
A customisation point that creates a bulk sender. 


  constexpr unspecified bulk_execute = unspecified;


The name `execution::bulk_execute` denotes a customisation point object. If `is_convertible_v<N, size_t>` is true, then the expression `execution::bulk_execute(S, F, N)` for some subexpressions `S`, `F`, and `N` is expression-equivalent to:


* `S.bulk_execute(F, N)`, if that expression is valid. If the function selected does not execute `N` invocations of the function object `F` on the executor `S` in bulk with forward progress guarantee `asio::query(S, execution::bulk_guarantee)`, and the result of that function does not model `sender<void>`, the program is ill-formed with no diagnostic required.


* Otherwise, `bulk_execute(S, F, N)`, if that expression is valid, with overload resolution performed in a context that includes the declaration `void bulk_execute();` and that does not include a declaration of `execution::bulk_execute`. If the function selected by overload resolution does not execute `N` invocations of the function object `F` on the executor `S` in bulk with forward progress guarantee `asio::query(E, execution::bulk_guarantee)`, and the result of that function does not model `sender<void>`, the program is ill-formed with no diagnostic required.


* Otherwise, if the types `F` and `executor_index_t<remove_cvref_t<S>>` model `invocable` and if `asio::query(S, execution::bulk_guarantee)` equals `execution::bulk_guarantee.unsequenced`, then


* Evaluates `DECAY_COPY(std::forward<decltype(F)>(F))` on the calling thread to create a function object `cf`. [Note: Additional copies of `cf` may subsequently be created. --end note.]




* For each value of `i` in `N`, `cf(i)` (or copy of `cf`)) will be invoked at most once by an execution agent that is unique for each value of `i`.




* May block pending completion of one or more invocations of `cf`.




* Synchronizes with (C++Std [intro.multithread]) the invocations of `cf`.




* Otherwise, `execution::bulk_execute(S, F, N)` is ill-formed. 



[heading Requirements]

['Header: ][^asio/execution/bulk_execute.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:execution__bulk_guarantee execution::bulk_guarantee]

[indexterm1 asio.indexterm.execution__bulk_guarantee..execution::bulk_guarantee] 
A special value used for accessing the [link asio.reference.execution__bulk_guarantee_t `execution::bulk_guarantee_t`] property. 


  constexpr bulk_guarantee_t bulk_guarantee;


[heading Requirements]

['Header: ][^asio/execution/bulk_guarantee.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]


[section:execution__bulk_guarantee_t execution::bulk_guarantee_t]


A property to communicate the forward progress and ordering guarantees of execution agents associated with the bulk execution. 


  struct bulk_guarantee_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__bulk_guarantee_t__parallel_t [*parallel_t]]]
    [A sub-property that indicates that execution agents within the same bulk execution may be parallelised. ]
  
  ]

  [

    [[link asio.reference.execution__bulk_guarantee_t__sequenced_t [*sequenced_t]]]
    [A sub-property that indicates that execution agents within the same bulk execution may not be parallelised and vectorised. ]
  
  ]

  [

    [[link asio.reference.execution__bulk_guarantee_t__unsequenced_t [*unsequenced_t]]]
    [A sub-property that indicates that execution agents within the same bulk execution may be parallelised and vectorised. ]
  
  ]

  [

    [[link asio.reference.execution__bulk_guarantee_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__bulk_guarantee_t.bulk_guarantee_t [*bulk_guarantee_t]] [constructor]]
    [Default constructor. 
     [hr]
     Construct from a sub-property value. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__bulk_guarantee_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The bulk_guarantee_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__bulk_guarantee_t.is_preferable [*is_preferable]] [static]]
    [The top-level bulk_guarantee_t property cannot be preferred. ]
  ]

  [
    [[link asio.reference.execution__bulk_guarantee_t.is_requirable [*is_requirable]] [static]]
    [The top-level bulk_guarantee_t property cannot be required. ]
  ]

  [
    [[link asio.reference.execution__bulk_guarantee_t.parallel [*parallel]] [static]]
    [A special value used for accessing the bulk_guarantee_t::parallel_t property. ]
  ]

  [
    [[link asio.reference.execution__bulk_guarantee_t.sequenced [*sequenced]] [static]]
    [A special value used for accessing the bulk_guarantee_t::sequenced_t property. ]
  ]

  [
    [[link asio.reference.execution__bulk_guarantee_t.unsequenced [*unsequenced]] [static]]
    [A special value used for accessing the bulk_guarantee_t::unsequenced_t property. ]
  ]

]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__bulk_guarantee_t.operator_not__eq_ [*operator!=]]]
    [Compare property values for inequality. ]
  ]
  
  [
    [[link asio.reference.execution__bulk_guarantee_t.operator_eq__eq_ [*operator==]]]
    [Compare property values for equality. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/execution/bulk_guarantee.hpp]

['Convenience header: ][^asio/execution.hpp]

[section:bulk_guarantee_t execution::bulk_guarantee_t::bulk_guarantee_t]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t.bulk_guarantee_t..bulk_guarantee_t..execution::bulk_guarantee_t] 
Default constructor. 


  constexpr ``[link asio.reference.execution__bulk_guarantee_t.bulk_guarantee_t.overload1 bulk_guarantee_t]``();
  ``  [''''&raquo;''' [link asio.reference.execution__bulk_guarantee_t.bulk_guarantee_t.overload1 more...]]``


Construct from a sub-property value. 


  constexpr ``[link asio.reference.execution__bulk_guarantee_t.bulk_guarantee_t.overload2 bulk_guarantee_t]``(
      unsequenced_t );
  ``  [''''&raquo;''' [link asio.reference.execution__bulk_guarantee_t.bulk_guarantee_t.overload2 more...]]``

  constexpr ``[link asio.reference.execution__bulk_guarantee_t.bulk_guarantee_t.overload3 bulk_guarantee_t]``(
      sequenced_t );
  ``  [''''&raquo;''' [link asio.reference.execution__bulk_guarantee_t.bulk_guarantee_t.overload3 more...]]``

  constexpr ``[link asio.reference.execution__bulk_guarantee_t.bulk_guarantee_t.overload4 bulk_guarantee_t]``(
      parallel_t );
  ``  [''''&raquo;''' [link asio.reference.execution__bulk_guarantee_t.bulk_guarantee_t.overload4 more...]]``


[section:overload1 execution::bulk_guarantee_t::bulk_guarantee_t (1 of 4 overloads)]


Default constructor. 


  constexpr bulk_guarantee_t();



[endsect]



[section:overload2 execution::bulk_guarantee_t::bulk_guarantee_t (2 of 4 overloads)]


Construct from a sub-property value. 


  constexpr bulk_guarantee_t(
      unsequenced_t );



[endsect]



[section:overload3 execution::bulk_guarantee_t::bulk_guarantee_t (3 of 4 overloads)]


Construct from a sub-property value. 


  constexpr bulk_guarantee_t(
      sequenced_t );



[endsect]



[section:overload4 execution::bulk_guarantee_t::bulk_guarantee_t (4 of 4 overloads)]


Construct from a sub-property value. 


  constexpr bulk_guarantee_t(
      parallel_t );



[endsect]


[endsect]


[section:is_applicable_property_v execution::bulk_guarantee_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t.is_applicable_property_v..is_applicable_property_v..execution::bulk_guarantee_t] 
The [link asio.reference.execution__bulk_guarantee_t `execution::bulk_guarantee_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
    is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::bulk_guarantee_t::is_preferable]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t.is_preferable..is_preferable..execution::bulk_guarantee_t] 
The top-level [link asio.reference.execution__bulk_guarantee_t `execution::bulk_guarantee_t`] property cannot be preferred. 


  static constexpr bool is_preferable = false;



[endsect]



[section:is_requirable execution::bulk_guarantee_t::is_requirable]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t.is_requirable..is_requirable..execution::bulk_guarantee_t] 
The top-level [link asio.reference.execution__bulk_guarantee_t `execution::bulk_guarantee_t`] property cannot be required. 


  static constexpr bool is_requirable = false;



[endsect]



[section:operator_not__eq_ execution::bulk_guarantee_t::operator!=]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t.operator_not__eq_..operator!=..execution::bulk_guarantee_t] 
Compare property values for inequality. 


  friend constexpr bool operator!=(
      const bulk_guarantee_t & a,
      const bulk_guarantee_t & b);


[heading Requirements]

['Header: ][^asio/execution/bulk_guarantee.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:operator_eq__eq_ execution::bulk_guarantee_t::operator==]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t.operator_eq__eq_..operator==..execution::bulk_guarantee_t] 
Compare property values for equality. 


  friend constexpr bool operator==(
      const bulk_guarantee_t & a,
      const bulk_guarantee_t & b);


[heading Requirements]

['Header: ][^asio/execution/bulk_guarantee.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:parallel execution::bulk_guarantee_t::parallel]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t.parallel..parallel..execution::bulk_guarantee_t] 
A special value used for accessing the [link asio.reference.execution__bulk_guarantee_t__parallel_t `execution::bulk_guarantee_t::parallel_t`] property. 


  static constexpr parallel_t parallel;



[endsect]



[section:polymorphic_query_result_type execution::bulk_guarantee_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::bulk_guarantee_t] 
The type returned by queries against an `any_executor`. 


  typedef bulk_guarantee_t polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/bulk_guarantee.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:sequenced execution::bulk_guarantee_t::sequenced]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t.sequenced..sequenced..execution::bulk_guarantee_t] 
A special value used for accessing the [link asio.reference.execution__bulk_guarantee_t__sequenced_t `execution::bulk_guarantee_t::sequenced_t`] property. 


  static constexpr sequenced_t sequenced;



[endsect]



[section:unsequenced execution::bulk_guarantee_t::unsequenced]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t.unsequenced..unsequenced..execution::bulk_guarantee_t] 
A special value used for accessing the [link asio.reference.execution__bulk_guarantee_t__unsequenced_t `execution::bulk_guarantee_t::unsequenced_t`] property. 


  static constexpr unsequenced_t unsequenced;



[endsect]



[endsect]

[section:execution__bulk_guarantee_t__parallel_t execution::bulk_guarantee_t::parallel_t]


A sub-property that indicates that execution agents within the same bulk execution may be parallelised. 


  struct parallel_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__bulk_guarantee_t__parallel_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__bulk_guarantee_t__parallel_t.parallel_t [*parallel_t]] [constructor]]
    [Default constructor. ]
  ]
  
  [
    [[link asio.reference.execution__bulk_guarantee_t__parallel_t.value [*value]] [static]]
    [Get the value associated with a property object. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__bulk_guarantee_t__parallel_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The bulk_guarantee_t::parallel_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__bulk_guarantee_t__parallel_t.is_preferable [*is_preferable]] [static]]
    [The bulk_guarantee_t::parallel_t property can be preferred. ]
  ]

  [
    [[link asio.reference.execution__bulk_guarantee_t__parallel_t.is_requirable [*is_requirable]] [static]]
    [The bulk_guarantee_t::parallel_t property can be required. ]
  ]

]

[heading Requirements]

['Header: ][^asio/execution/bulk_guarantee.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:is_applicable_property_v execution::bulk_guarantee_t::parallel_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t__parallel_t.is_applicable_property_v..is_applicable_property_v..execution::bulk_guarantee_t::parallel_t] 
The [link asio.reference.execution__bulk_guarantee_t__parallel_t `execution::bulk_guarantee_t::parallel_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
      is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::bulk_guarantee_t::parallel_t::is_preferable]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t__parallel_t.is_preferable..is_preferable..execution::bulk_guarantee_t::parallel_t] 
The [link asio.reference.execution__bulk_guarantee_t__parallel_t `execution::bulk_guarantee_t::parallel_t`] property can be preferred. 


  static constexpr bool is_preferable = true;



[endsect]



[section:is_requirable execution::bulk_guarantee_t::parallel_t::is_requirable]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t__parallel_t.is_requirable..is_requirable..execution::bulk_guarantee_t::parallel_t] 
The [link asio.reference.execution__bulk_guarantee_t__parallel_t `execution::bulk_guarantee_t::parallel_t`] property can be required. 


  static constexpr bool is_requirable = true;



[endsect]



[section:parallel_t execution::bulk_guarantee_t::parallel_t::parallel_t]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t__parallel_t.parallel_t..parallel_t..execution::bulk_guarantee_t::parallel_t] 
Default constructor. 


  constexpr parallel_t();



[endsect]



[section:polymorphic_query_result_type execution::bulk_guarantee_t::parallel_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t__parallel_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::bulk_guarantee_t::parallel_t] 
The type returned by queries against an `any_executor`. 


  typedef bulk_guarantee_t polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/bulk_guarantee.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:value execution::bulk_guarantee_t::parallel_t::value]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t__parallel_t.value..value..execution::bulk_guarantee_t::parallel_t] 
Get the value associated with a property object. 


  static constexpr bulk_guarantee_t value();



[heading Return Value]
      
`parallel_t()`; 




[endsect]



[endsect]

[section:execution__bulk_guarantee_t__sequenced_t execution::bulk_guarantee_t::sequenced_t]


A sub-property that indicates that execution agents within the same bulk execution may not be parallelised and vectorised. 


  struct sequenced_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__bulk_guarantee_t__sequenced_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__bulk_guarantee_t__sequenced_t.sequenced_t [*sequenced_t]] [constructor]]
    [Default constructor. ]
  ]
  
  [
    [[link asio.reference.execution__bulk_guarantee_t__sequenced_t.value [*value]] [static]]
    [Get the value associated with a property object. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__bulk_guarantee_t__sequenced_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The bulk_guarantee_t::sequenced_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__bulk_guarantee_t__sequenced_t.is_preferable [*is_preferable]] [static]]
    [The bulk_guarantee_t::sequenced_t property can be preferred. ]
  ]

  [
    [[link asio.reference.execution__bulk_guarantee_t__sequenced_t.is_requirable [*is_requirable]] [static]]
    [The bulk_guarantee_t::sequenced_t property can be required. ]
  ]

]

[heading Requirements]

['Header: ][^asio/execution/bulk_guarantee.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:is_applicable_property_v execution::bulk_guarantee_t::sequenced_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t__sequenced_t.is_applicable_property_v..is_applicable_property_v..execution::bulk_guarantee_t::sequenced_t] 
The [link asio.reference.execution__bulk_guarantee_t__sequenced_t `execution::bulk_guarantee_t::sequenced_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
      is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::bulk_guarantee_t::sequenced_t::is_preferable]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t__sequenced_t.is_preferable..is_preferable..execution::bulk_guarantee_t::sequenced_t] 
The [link asio.reference.execution__bulk_guarantee_t__sequenced_t `execution::bulk_guarantee_t::sequenced_t`] property can be preferred. 


  static constexpr bool is_preferable = true;



[endsect]



[section:is_requirable execution::bulk_guarantee_t::sequenced_t::is_requirable]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t__sequenced_t.is_requirable..is_requirable..execution::bulk_guarantee_t::sequenced_t] 
The [link asio.reference.execution__bulk_guarantee_t__sequenced_t `execution::bulk_guarantee_t::sequenced_t`] property can be required. 


  static constexpr bool is_requirable = true;



[endsect]



[section:polymorphic_query_result_type execution::bulk_guarantee_t::sequenced_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t__sequenced_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::bulk_guarantee_t::sequenced_t] 
The type returned by queries against an `any_executor`. 


  typedef bulk_guarantee_t polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/bulk_guarantee.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:sequenced_t execution::bulk_guarantee_t::sequenced_t::sequenced_t]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t__sequenced_t.sequenced_t..sequenced_t..execution::bulk_guarantee_t::sequenced_t] 
Default constructor. 


  constexpr sequenced_t();



[endsect]



[section:value execution::bulk_guarantee_t::sequenced_t::value]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t__sequenced_t.value..value..execution::bulk_guarantee_t::sequenced_t] 
Get the value associated with a property object. 


  static constexpr bulk_guarantee_t value();



[heading Return Value]
      
`sequenced_t()`; 




[endsect]



[endsect]

[section:execution__bulk_guarantee_t__unsequenced_t execution::bulk_guarantee_t::unsequenced_t]


A sub-property that indicates that execution agents within the same bulk execution may be parallelised and vectorised. 


  struct unsequenced_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__bulk_guarantee_t__unsequenced_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__bulk_guarantee_t__unsequenced_t.unsequenced_t [*unsequenced_t]] [constructor]]
    [Default constructor. ]
  ]
  
  [
    [[link asio.reference.execution__bulk_guarantee_t__unsequenced_t.value [*value]] [static]]
    [Get the value associated with a property object. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__bulk_guarantee_t__unsequenced_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The bulk_guarantee_t::unsequenced_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__bulk_guarantee_t__unsequenced_t.is_preferable [*is_preferable]] [static]]
    [The bulk_guarantee_t::unsequenced_t property can be preferred. ]
  ]

  [
    [[link asio.reference.execution__bulk_guarantee_t__unsequenced_t.is_requirable [*is_requirable]] [static]]
    [The bulk_guarantee_t::unsequenced_t property can be required. ]
  ]

]

[heading Requirements]

['Header: ][^asio/execution/bulk_guarantee.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:is_applicable_property_v execution::bulk_guarantee_t::unsequenced_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t__unsequenced_t.is_applicable_property_v..is_applicable_property_v..execution::bulk_guarantee_t::unsequenced_t] 
The [link asio.reference.execution__bulk_guarantee_t__unsequenced_t `execution::bulk_guarantee_t::unsequenced_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
      is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::bulk_guarantee_t::unsequenced_t::is_preferable]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t__unsequenced_t.is_preferable..is_preferable..execution::bulk_guarantee_t::unsequenced_t] 
The [link asio.reference.execution__bulk_guarantee_t__unsequenced_t `execution::bulk_guarantee_t::unsequenced_t`] property can be preferred. 


  static constexpr bool is_preferable = true;



[endsect]



[section:is_requirable execution::bulk_guarantee_t::unsequenced_t::is_requirable]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t__unsequenced_t.is_requirable..is_requirable..execution::bulk_guarantee_t::unsequenced_t] 
The [link asio.reference.execution__bulk_guarantee_t__unsequenced_t `execution::bulk_guarantee_t::unsequenced_t`] property can be required. 


  static constexpr bool is_requirable = true;



[endsect]



[section:polymorphic_query_result_type execution::bulk_guarantee_t::unsequenced_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t__unsequenced_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::bulk_guarantee_t::unsequenced_t] 
The type returned by queries against an `any_executor`. 


  typedef bulk_guarantee_t polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/bulk_guarantee.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:unsequenced_t execution::bulk_guarantee_t::unsequenced_t::unsequenced_t]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t__unsequenced_t.unsequenced_t..unsequenced_t..execution::bulk_guarantee_t::unsequenced_t] 
Default constructor. 


  constexpr unsequenced_t();



[endsect]



[section:value execution::bulk_guarantee_t::unsequenced_t::value]

[indexterm2 asio.indexterm.execution__bulk_guarantee_t__unsequenced_t.value..value..execution::bulk_guarantee_t::unsequenced_t] 
Get the value associated with a property object. 


  static constexpr bulk_guarantee_t value();



[heading Return Value]
      
`unsequenced_t()`; 




[endsect]



[endsect]

[section:execution__can_bulk_execute execution::can_bulk_execute]


A type trait that determines whether a `bulk_execute` expression is well-formed. 


  template<
      typename S,
      typename F,
      typename N>
  struct can_bulk_execute


Class template `can_bulk_execute` is a trait that is derived from `true_type` if the expression `execution::bulk_execute(std::declval<S>(), std::declval<F>(), std::declval<N>)` is well formed; otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/execution/bulk_execute.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]

[section:execution__can_connect execution::can_connect]


A type trait that determines whether a `connect` expression is well-formed. 


  template<
      typename S,
      typename R>
  struct can_connect


Class template `can_connect` is a trait that is derived from `true_type` if the expression `execution::connect(std::declval<S>(), std::declval<R>())` is well formed; otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/execution/connect.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]

[section:execution__can_execute execution::can_execute]


A type trait that determines whether a `execute` expression is well-formed. 


  template<
      typename T,
      typename F>
  struct can_execute


Class template `can_execute` is a trait that is derived from `true_type` if the expression `execution::execute(std::declval<T>(), std::declval<F>())` is well formed; otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/execution/execute.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]

[section:execution__can_schedule execution::can_schedule]


A type trait that determines whether a `schedule` expression is well-formed. 


  template<
      typename S>
  struct can_schedule


Class template `can_schedule` is a trait that is derived from `true_type` if the expression `execution::schedule(std::declval<S>())` is well formed; otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/execution/schedule.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]

[section:execution__can_set_done execution::can_set_done]


A type trait that determines whether a `set_done` expression is well-formed. 


  template<
      typename R>
  struct can_set_done


Class template `can_set_done` is a trait that is derived from `true_type` if the expression `execution::set_done(std::declval<R>(), std::declval<E>())` is well formed; otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/execution/set_done.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]

[section:execution__can_set_error execution::can_set_error]


A type trait that determines whether a `set_error` expression is well-formed. 


  template<
      typename R,
      typename E>
  struct can_set_error


Class template `can_set_error` is a trait that is derived from `true_type` if the expression `execution::set_error(std::declval<R>(), std::declval<E>())` is well formed; otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/execution/set_error.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]

[section:execution__can_set_value execution::can_set_value]


A type trait that determines whether a `set_value` expression is well-formed. 


  template<
      typename R,
      typename... Vs>
  struct can_set_value


Class template `can_set_value` is a trait that is derived from `true_type` if the expression `execution::set_value(std::declval<R>(), std::declval<Vs>()...)` is well formed; otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/execution/set_value.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]

[section:execution__can_start execution::can_start]


A type trait that determines whether a `start` expression is well-formed. 


  template<
      typename R>
  struct can_start


Class template `can_start` is a trait that is derived from `true_type` if the expression `execution::start(std::declval<R>(), std::declval<E>())` is well formed; otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/execution/start.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]

[section:execution__can_submit execution::can_submit]


A type trait that determines whether a `submit` expression is well-formed. 


  template<
      typename S,
      typename R>
  struct can_submit


Class template `can_submit` is a trait that is derived from `true_type` if the expression `execution::submit(std::declval<R>(), std::declval<E>())` is well formed; otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/execution/submit.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]


[section:execution__connect execution::connect]

[indexterm1 asio.indexterm.execution__connect..execution::connect] 
A customisation point that connects a sender to a receiver. 


  constexpr unspecified connect = unspecified;


The name `execution::connect` denotes a customisation point object. For some subexpressions `s` and `r`, let `S` be a type such that `decltype((s))` is `S` and let `R` be a type such that `decltype((r))` is `R`. The expression `execution::connect(s, r)` is expression-equivalent to:


* `s.connect(r)`, if that expression is valid, if its type satisfies `operation_state`, and if `S` satisfies `sender`.


* Otherwise, `connect(s, r)`, if that expression is valid, if its type satisfies `operation_state`, and if `S` satisfies `sender`, with overload resolution performed in a context that includes the declaration `void connect();` and that does not include a declaration of `execution::connect`.


* Otherwise, `as_operation{s, r}`, if `r` is not an instance of `as_receiver<F, S>` for some type `F`, and if `receiver_of<R> && executor_of<remove_cvref_t<S>, as_invocable<remove_cvref_t<R>, S>>` is `true`, where `as_operation` is an implementation-defined class equivalent to 

   template <class S, class R>
    struct as_operation
    {
      remove_cvref_t<S> e_;
      remove_cvref_t<R> r_;
      void start() noexcept try {
        execution::execute(std::move(e_),
            as_invocable<remove_cvref_t<R>, S>{r_});
      } catch(...) {
        execution::set_error(std::move(r_), current_exception());
      }
    }; 


and `as_invocable` is a class template equivalent to the following: 

   template<class R>
    struct as_invocable
    {
      R* r_;
      explicit as_invocable(R& r) noexcept
        : r_(std::addressof(r)) {}
      as_invocable(as_invocable && other) noexcept
        : r_(std::exchange(other.r_, nullptr)) {}
      ~as_invocable() {
        if(r_)
          execution::set_done(std::move(*r_));
      }
      void operator()() & noexcept try {
        execution::set_value(std::move(*r_));
        r_ = nullptr;
      } catch(...) {
        execution::set_error(std::move(*r_), current_exception());
        r_ = nullptr;
      }
    };





* Otherwise, `execution::connect(s, r)` is ill-formed. 



[heading Requirements]

['Header: ][^asio/execution/connect.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]


[section:execution__connect_result execution::connect_result]


A type trait to determine the result of a `connect` expression. 


  template<
      typename S,
      typename R>
  struct connect_result


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__connect_result.type [*type]]]
    [The type of the connect expression. ]
  
  ]

]

[heading Requirements]

['Header: ][^asio/execution/connect.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:type execution::connect_result::type]

[indexterm2 asio.indexterm.execution__connect_result.type..type..execution::connect_result] 
The type of the connect expression. 


  typedef automatically_determined type;



The type of the expression `execution::connect(std::declval<S>(), std::declval<R>())`. 

[heading Requirements]

['Header: ][^asio/execution/connect.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[endsect]


[section:execution__context execution::context]

[indexterm1 asio.indexterm.execution__context..execution::context] 
A special value used for accessing the [link asio.reference.execution__context_t `execution::context_t`] property. 


  constexpr context_t context;


[heading Requirements]

['Header: ][^asio/execution/context.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:execution__context_as execution::context_as]

[indexterm1 asio.indexterm.execution__context_as..execution::context_as] 
A special value used for accessing the [link asio.reference.execution__context_as_t `execution::context_as_t`] property. 


  template <typename U>
  constexpr context_as_t context_as;


[heading Requirements]

['Header: ][^asio/execution/context_as.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]


[section:execution__context_as_t execution::context_as_t]


A property that is used to obtain the execution context that is associated with an executor. 


  template<
      typename U>
  struct context_as_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__context_as_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__context_as_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The context_as_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__context_as_t.is_preferable [*is_preferable]] [static]]
    [The context_t property cannot be preferred. ]
  ]

  [
    [[link asio.reference.execution__context_as_t.is_requirable [*is_requirable]] [static]]
    [The context_t property cannot be required. ]
  ]

]

[heading Requirements]

['Header: ][^asio/execution/context_as.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:is_applicable_property_v execution::context_as_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__context_as_t.is_applicable_property_v..is_applicable_property_v..execution::context_as_t] 
The [link asio.reference.execution__context_as_t `execution::context_as_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
    is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::context_as_t::is_preferable]

[indexterm2 asio.indexterm.execution__context_as_t.is_preferable..is_preferable..execution::context_as_t] 
The [link asio.reference.execution__context_t `execution::context_t`] property cannot be preferred. 


  static constexpr bool is_preferable = false;



[endsect]



[section:is_requirable execution::context_as_t::is_requirable]

[indexterm2 asio.indexterm.execution__context_as_t.is_requirable..is_requirable..execution::context_as_t] 
The [link asio.reference.execution__context_t `execution::context_t`] property cannot be required. 


  static constexpr bool is_requirable = false;



[endsect]



[section:polymorphic_query_result_type execution::context_as_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__context_as_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::context_as_t] 
The type returned by queries against an `any_executor`. 


  typedef T polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/context_as.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[endsect]

[section:execution__context_t execution::context_t]


A property that is used to obtain the execution context that is associated with an executor. 


  struct context_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__context_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__context_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The context_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__context_t.is_preferable [*is_preferable]] [static]]
    [The context_t property cannot be preferred. ]
  ]

  [
    [[link asio.reference.execution__context_t.is_requirable [*is_requirable]] [static]]
    [The context_t property cannot be required. ]
  ]

]

[heading Requirements]

['Header: ][^asio/execution/context.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:is_applicable_property_v execution::context_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__context_t.is_applicable_property_v..is_applicable_property_v..execution::context_t] 
The [link asio.reference.execution__context_t `execution::context_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
    is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::context_t::is_preferable]

[indexterm2 asio.indexterm.execution__context_t.is_preferable..is_preferable..execution::context_t] 
The [link asio.reference.execution__context_t `execution::context_t`] property cannot be preferred. 


  static constexpr bool is_preferable = false;



[endsect]



[section:is_requirable execution::context_t::is_requirable]

[indexterm2 asio.indexterm.execution__context_t.is_requirable..is_requirable..execution::context_t] 
The [link asio.reference.execution__context_t `execution::context_t`] property cannot be required. 


  static constexpr bool is_requirable = false;



[endsect]



[section:polymorphic_query_result_type execution::context_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__context_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::context_t] 
The type returned by queries against an `any_executor`. 


  typedef std::any polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/context.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[endsect]


[section:execution__execute execution::execute]

[indexterm1 asio.indexterm.execution__execute..execution::execute] 
A customisation point that executes a function on an executor. 


  constexpr unspecified execute = unspecified;


The name `execution::execute` denotes a customisation point object.

For some subexpressions `e` and `f`, let `E` be a type such that `decltype((e))` is `E` and let `F` be a type such that `decltype((f))` is `F`. The expression `execution::execute(e, f)` is ill-formed if `F` does not model `invocable`, or if `E` does not model either `executor` or `sender`. Otherwise, it is expression-equivalent to:


* `e.execute(f)`, if that expression is valid. If the function selected does not execute the function object `f` on the executor `e`, the program is ill-formed with no diagnostic required.


* Otherwise, `execute(e, f)`, if that expression is valid, with overload resolution performed in a context that includes the declaration `void execute();` and that does not include a declaration of `execution::execute`. If the function selected by overload resolution does not execute the function object `f` on the executor `e`, the program is ill-formed with no diagnostic required. 



[heading Requirements]

['Header: ][^asio/execution/execute.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]


[section:execution__executor_index execution::executor_index]


The [link asio.reference.execution__executor_index `execution::executor_index`] trait detects the type used by an executor to represent an index within a bulk operation. 


  template<
      typename T>
  struct executor_index


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__executor_index.type [*type]]]
    [T::index_type if T::index_type is valid, otherwise executor_shape_t<T>. ]
  
  ]

]

Class template `executor_index` is a type trait with a nested type alias `type` whose type is `T::index_type` if `T::index_type` is valid, otherwise `executor_shape_t<T>`. 

[heading Requirements]

['Header: ][^asio/execution/executor.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:type execution::executor_index::type]

[indexterm2 asio.indexterm.execution__executor_index.type..type..execution::executor_index] 
`T::index_type` if `T::index_type` is valid, otherwise `executor_shape_t<T>`. 


  typedef automatically_determined type;



[heading Requirements]

['Header: ][^asio/execution/executor.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[endsect]

[section:execution__executor_shape execution::executor_shape]


The [link asio.reference.execution__executor_shape `execution::executor_shape`] trait detects the type used by an executor to represent the shape of a bulk operation. 


  template<
      typename T>
  struct executor_shape


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__executor_shape.type [*type]]]
    [T::shape_type if T::shape_type is valid, otherwise std::size_t. ]
  
  ]

]

Class template `executor_shape` is a type trait with a nested type alias `type` whose type is `T::shape_type` if `T::shape_type` is valid, otherwise `std::size_t`. 

[heading Requirements]

['Header: ][^asio/execution/executor.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:type execution::executor_shape::type]

[indexterm2 asio.indexterm.execution__executor_shape.type..type..execution::executor_shape] 
`T::shape_type` if `T::shape_type` is valid, otherwise `std::size_t`. 


  typedef automatically_determined type;



[heading Requirements]

['Header: ][^asio/execution/executor.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[endsect]

[section:execution__invocable_archetype execution::invocable_archetype]


An archetypal function object used for determining adherence to the execution::executor concept. 


  struct invocable_archetype


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__invocable_archetype.operator_lp__rp_ [*operator()]]]
    [Function call operator. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/execution/invocable_archetype.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:operator_lp__rp_ execution::invocable_archetype::operator()]

[indexterm2 asio.indexterm.execution__invocable_archetype.operator_lp__rp_..operator()..execution::invocable_archetype] 
Function call operator. 


  template<
      typename... Args>
  void operator()(
      Args && ...);



[endsect]



[endsect]

[section:execution__is_executor execution::is_executor]


The [link asio.reference.execution__is_executor `execution::is_executor`] trait detects whether a type T satisfies the execution::executor concept. 


  template<
      typename T>
  struct is_executor


Class template `is_executor` is a UnaryTypeTrait that is derived from `true_type` if the type `T` meets the concept definition for an executor, otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/execution/executor.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]

[section:execution__is_executor_of execution::is_executor_of]


The [link asio.reference.execution__is_executor_of `execution::is_executor_of`] trait detects whether a type T satisfies the execution::executor\_of concept for some set of value arguments. 


  template<
      typename T,
      typename F>
  struct is_executor_of


Class template `is_executor_of` is a type trait that is derived from `true_type` if the type `T` meets the concept definition for an executor that is invocable with a function object of type `F`, otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/execution/executor.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]

[section:execution__is_nothrow_receiver_of execution::is_nothrow_receiver_of]


The [link asio.reference.execution__is_nothrow_receiver_of `execution::is_nothrow_receiver_of`] trait detects whether a type T satisfies the execution::receiver\_of concept for some set of value arguments, with a noexcept `set_value` operation. 


  template<
      typename T,
      typename... Vs>
  struct is_nothrow_receiver_of


Class template `is_nothrow_receiver_of` is a type trait that is derived from `true_type` if the type `T` meets the concept definition for a receiver for value arguments `Vs`, and the expression `execution::set_value(declval<T>(), declval<Ts>()...)` is noexcept, otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/execution/receiver.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]

[section:execution__is_operation_state execution::is_operation_state]


The [link asio.reference.execution__is_operation_state `execution::is_operation_state`] trait detects whether a type T satisfies the execution::operation\_state concept. 


  template<
      typename T>
  struct is_operation_state


Class template `is_operation_state` is a type trait that is derived from `true_type` if the type `T` meets the concept definition for an `operation_state`, otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/execution/operation_state.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]

[section:execution__is_receiver execution::is_receiver]


The [link asio.reference.execution__is_receiver `execution::is_receiver`] trait detects whether a type T satisfies the execution::receiver concept. 


  template<
      typename T,
      typename E = std::exception_ptr>
  struct is_receiver


Class template `is_receiver` is a type trait that is derived from `true_type` if the type `T` meets the concept definition for a receiver for error type `E`, otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/execution/receiver.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]

[section:execution__is_receiver_of execution::is_receiver_of]


The [link asio.reference.execution__is_receiver_of `execution::is_receiver_of`] trait detects whether a type T satisfies the execution::receiver\_of concept for some set of value arguments. 


  template<
      typename T,
      typename... Vs>
  struct is_receiver_of


Class template `is_receiver_of` is a type trait that is derived from `true_type` if the type `T` meets the concept definition for a receiver for value arguments `Vs`, otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/execution/receiver.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]

[section:execution__is_scheduler execution::is_scheduler]


The [link asio.reference.execution__is_scheduler `execution::is_scheduler`] trait detects whether a type T satisfies the execution::scheduler concept. 


  template<
      typename T>
  struct is_scheduler


Class template `is_scheduler` is a type trait that is derived from `true_type` if the type `T` meets the concept definition for a scheduler for error type `E`, otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/execution/scheduler.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]

[section:execution__is_sender execution::is_sender]


The [link asio.reference.execution__is_sender `execution::is_sender`] trait detects whether a type T satisfies the execution::sender concept. 


  template<
      typename T>
  struct is_sender


Class template `is_sender` is a type trait that is derived from `true_type` if the type `T` meets the concept definition for a sender, otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/execution/sender.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]

[section:execution__is_sender_to execution::is_sender_to]


The [link asio.reference.execution__is_sender_to `execution::is_sender_to`] trait detects whether a type T satisfies the execution::sender\_to concept for some receiver. 


  template<
      typename T,
      typename R>
  struct is_sender_to


Class template `is_sender_to` is a type trait that is derived from `true_type` if the type `T` meets the concept definition for a sender for some receiver type R, otherwise `false`. 

[heading Requirements]

['Header: ][^asio/execution/sender.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]

[section:execution__is_typed_sender execution::is_typed_sender]


The [link asio.reference.execution__is_typed_sender `execution::is_typed_sender`] trait detects whether a type T satisfies the execution::typed\_sender concept. 


  template<
      typename T>
  struct is_typed_sender


Class template `is_typed_sender` is a type trait that is derived from `true_type` if the type `T` meets the concept definition for a typed sender, otherwise `false`. 

[heading Requirements]

['Header: ][^asio/execution/sender.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]


[section:execution__mapping execution::mapping]

[indexterm1 asio.indexterm.execution__mapping..execution::mapping] 
A special value used for accessing the [link asio.reference.execution__mapping_t `execution::mapping_t`] property. 


  constexpr mapping_t mapping;


[heading Requirements]

['Header: ][^asio/execution/mapping.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]


[section:execution__mapping_t execution::mapping_t]


A property to describe what guarantees an executor makes about the mapping of execution agents on to threads of execution. 


  struct mapping_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__mapping_t__new_thread_t [*new_thread_t]]]
    [A sub-property that indicates that execution agents are mapped on to new threads of execution. ]
  
  ]

  [

    [[link asio.reference.execution__mapping_t__other_t [*other_t]]]
    [A sub-property that indicates that the mapping of execution agents is implementation-defined. ]
  
  ]

  [

    [[link asio.reference.execution__mapping_t__thread_t [*thread_t]]]
    [A sub-property that indicates that execution agents are mapped on to threads of execution. ]
  
  ]

  [

    [[link asio.reference.execution__mapping_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__mapping_t.mapping_t [*mapping_t]] [constructor]]
    [Default constructor. 
     [hr]
     Construct from a sub-property value. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__mapping_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The mapping_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__mapping_t.is_preferable [*is_preferable]] [static]]
    [The top-level mapping_t property cannot be preferred. ]
  ]

  [
    [[link asio.reference.execution__mapping_t.is_requirable [*is_requirable]] [static]]
    [The top-level mapping_t property cannot be required. ]
  ]

  [
    [[link asio.reference.execution__mapping_t.new_thread [*new_thread]] [static]]
    [A special value used for accessing the mapping_t::new_thread_t property. ]
  ]

  [
    [[link asio.reference.execution__mapping_t.other [*other]] [static]]
    [A special value used for accessing the mapping_t::other_t property. ]
  ]

  [
    [[link asio.reference.execution__mapping_t.thread [*thread]] [static]]
    [A special value used for accessing the mapping_t::thread_t property. ]
  ]

]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__mapping_t.operator_not__eq_ [*operator!=]]]
    [Compare property values for inequality. ]
  ]
  
  [
    [[link asio.reference.execution__mapping_t.operator_eq__eq_ [*operator==]]]
    [Compare property values for equality. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/execution/mapping.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:is_applicable_property_v execution::mapping_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__mapping_t.is_applicable_property_v..is_applicable_property_v..execution::mapping_t] 
The [link asio.reference.execution__mapping_t `execution::mapping_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
    is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::mapping_t::is_preferable]

[indexterm2 asio.indexterm.execution__mapping_t.is_preferable..is_preferable..execution::mapping_t] 
The top-level [link asio.reference.execution__mapping_t `execution::mapping_t`] property cannot be preferred. 


  static constexpr bool is_preferable = false;



[endsect]



[section:is_requirable execution::mapping_t::is_requirable]

[indexterm2 asio.indexterm.execution__mapping_t.is_requirable..is_requirable..execution::mapping_t] 
The top-level [link asio.reference.execution__mapping_t `execution::mapping_t`] property cannot be required. 


  static constexpr bool is_requirable = false;



[endsect]


[section:mapping_t execution::mapping_t::mapping_t]

[indexterm2 asio.indexterm.execution__mapping_t.mapping_t..mapping_t..execution::mapping_t] 
Default constructor. 


  constexpr ``[link asio.reference.execution__mapping_t.mapping_t.overload1 mapping_t]``();
  ``  [''''&raquo;''' [link asio.reference.execution__mapping_t.mapping_t.overload1 more...]]``


Construct from a sub-property value. 


  constexpr ``[link asio.reference.execution__mapping_t.mapping_t.overload2 mapping_t]``(
      thread_t );
  ``  [''''&raquo;''' [link asio.reference.execution__mapping_t.mapping_t.overload2 more...]]``

  constexpr ``[link asio.reference.execution__mapping_t.mapping_t.overload3 mapping_t]``(
      new_thread_t );
  ``  [''''&raquo;''' [link asio.reference.execution__mapping_t.mapping_t.overload3 more...]]``

  constexpr ``[link asio.reference.execution__mapping_t.mapping_t.overload4 mapping_t]``(
      other_t );
  ``  [''''&raquo;''' [link asio.reference.execution__mapping_t.mapping_t.overload4 more...]]``


[section:overload1 execution::mapping_t::mapping_t (1 of 4 overloads)]


Default constructor. 


  constexpr mapping_t();



[endsect]



[section:overload2 execution::mapping_t::mapping_t (2 of 4 overloads)]


Construct from a sub-property value. 


  constexpr mapping_t(
      thread_t );



[endsect]



[section:overload3 execution::mapping_t::mapping_t (3 of 4 overloads)]


Construct from a sub-property value. 


  constexpr mapping_t(
      new_thread_t );



[endsect]



[section:overload4 execution::mapping_t::mapping_t (4 of 4 overloads)]


Construct from a sub-property value. 


  constexpr mapping_t(
      other_t );



[endsect]


[endsect]


[section:new_thread execution::mapping_t::new_thread]

[indexterm2 asio.indexterm.execution__mapping_t.new_thread..new_thread..execution::mapping_t] 
A special value used for accessing the [link asio.reference.execution__mapping_t__new_thread_t `execution::mapping_t::new_thread_t`] property. 


  static constexpr new_thread_t new_thread;



[endsect]



[section:operator_not__eq_ execution::mapping_t::operator!=]

[indexterm2 asio.indexterm.execution__mapping_t.operator_not__eq_..operator!=..execution::mapping_t] 
Compare property values for inequality. 


  friend constexpr bool operator!=(
      const mapping_t & a,
      const mapping_t & b);


[heading Requirements]

['Header: ][^asio/execution/mapping.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:operator_eq__eq_ execution::mapping_t::operator==]

[indexterm2 asio.indexterm.execution__mapping_t.operator_eq__eq_..operator==..execution::mapping_t] 
Compare property values for equality. 


  friend constexpr bool operator==(
      const mapping_t & a,
      const mapping_t & b);


[heading Requirements]

['Header: ][^asio/execution/mapping.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:other execution::mapping_t::other]

[indexterm2 asio.indexterm.execution__mapping_t.other..other..execution::mapping_t] 
A special value used for accessing the [link asio.reference.execution__mapping_t__other_t `execution::mapping_t::other_t`] property. 


  static constexpr other_t other;



[endsect]



[section:polymorphic_query_result_type execution::mapping_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__mapping_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::mapping_t] 
The type returned by queries against an `any_executor`. 


  typedef mapping_t polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/mapping.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:thread execution::mapping_t::thread]

[indexterm2 asio.indexterm.execution__mapping_t.thread..thread..execution::mapping_t] 
A special value used for accessing the [link asio.reference.execution__mapping_t__thread_t `execution::mapping_t::thread_t`] property. 


  static constexpr thread_t thread;



[endsect]



[endsect]

[section:execution__mapping_t__new_thread_t execution::mapping_t::new_thread_t]


A sub-property that indicates that execution agents are mapped on to new threads of execution. 


  struct new_thread_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__mapping_t__new_thread_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__mapping_t__new_thread_t.new_thread_t [*new_thread_t]] [constructor]]
    [Default constructor. ]
  ]
  
  [
    [[link asio.reference.execution__mapping_t__new_thread_t.value [*value]] [static]]
    [Get the value associated with a property object. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__mapping_t__new_thread_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The mapping_t::new_thread_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__mapping_t__new_thread_t.is_preferable [*is_preferable]] [static]]
    [The mapping_t::new_thread_t property can be preferred. ]
  ]

  [
    [[link asio.reference.execution__mapping_t__new_thread_t.is_requirable [*is_requirable]] [static]]
    [The mapping_t::new_thread_t property can be required. ]
  ]

]

[heading Requirements]

['Header: ][^asio/execution/mapping.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:is_applicable_property_v execution::mapping_t::new_thread_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__mapping_t__new_thread_t.is_applicable_property_v..is_applicable_property_v..execution::mapping_t::new_thread_t] 
The [link asio.reference.execution__mapping_t__new_thread_t `execution::mapping_t::new_thread_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
      is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::mapping_t::new_thread_t::is_preferable]

[indexterm2 asio.indexterm.execution__mapping_t__new_thread_t.is_preferable..is_preferable..execution::mapping_t::new_thread_t] 
The [link asio.reference.execution__mapping_t__new_thread_t `execution::mapping_t::new_thread_t`] property can be preferred. 


  static constexpr bool is_preferable = true;



[endsect]



[section:is_requirable execution::mapping_t::new_thread_t::is_requirable]

[indexterm2 asio.indexterm.execution__mapping_t__new_thread_t.is_requirable..is_requirable..execution::mapping_t::new_thread_t] 
The [link asio.reference.execution__mapping_t__new_thread_t `execution::mapping_t::new_thread_t`] property can be required. 


  static constexpr bool is_requirable = true;



[endsect]



[section:new_thread_t execution::mapping_t::new_thread_t::new_thread_t]

[indexterm2 asio.indexterm.execution__mapping_t__new_thread_t.new_thread_t..new_thread_t..execution::mapping_t::new_thread_t] 
Default constructor. 


  constexpr new_thread_t();



[endsect]



[section:polymorphic_query_result_type execution::mapping_t::new_thread_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__mapping_t__new_thread_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::mapping_t::new_thread_t] 
The type returned by queries against an `any_executor`. 


  typedef mapping_t polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/mapping.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:value execution::mapping_t::new_thread_t::value]

[indexterm2 asio.indexterm.execution__mapping_t__new_thread_t.value..value..execution::mapping_t::new_thread_t] 
Get the value associated with a property object. 


  static constexpr mapping_t value();



[heading Return Value]
      
`new_thread_t()`; 




[endsect]



[endsect]

[section:execution__mapping_t__other_t execution::mapping_t::other_t]


A sub-property that indicates that the mapping of execution agents is implementation-defined. 


  struct other_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__mapping_t__other_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__mapping_t__other_t.other_t [*other_t]] [constructor]]
    [Default constructor. ]
  ]
  
  [
    [[link asio.reference.execution__mapping_t__other_t.value [*value]] [static]]
    [Get the value associated with a property object. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__mapping_t__other_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The mapping_t::other_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__mapping_t__other_t.is_preferable [*is_preferable]] [static]]
    [The mapping_t::other_t property can be preferred. ]
  ]

  [
    [[link asio.reference.execution__mapping_t__other_t.is_requirable [*is_requirable]] [static]]
    [The mapping_t::other_t property can be required. ]
  ]

]

[heading Requirements]

['Header: ][^asio/execution/mapping.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:is_applicable_property_v execution::mapping_t::other_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__mapping_t__other_t.is_applicable_property_v..is_applicable_property_v..execution::mapping_t::other_t] 
The [link asio.reference.execution__mapping_t__other_t `execution::mapping_t::other_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
      is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::mapping_t::other_t::is_preferable]

[indexterm2 asio.indexterm.execution__mapping_t__other_t.is_preferable..is_preferable..execution::mapping_t::other_t] 
The [link asio.reference.execution__mapping_t__other_t `execution::mapping_t::other_t`] property can be preferred. 


  static constexpr bool is_preferable = true;



[endsect]



[section:is_requirable execution::mapping_t::other_t::is_requirable]

[indexterm2 asio.indexterm.execution__mapping_t__other_t.is_requirable..is_requirable..execution::mapping_t::other_t] 
The [link asio.reference.execution__mapping_t__other_t `execution::mapping_t::other_t`] property can be required. 


  static constexpr bool is_requirable = true;



[endsect]



[section:other_t execution::mapping_t::other_t::other_t]

[indexterm2 asio.indexterm.execution__mapping_t__other_t.other_t..other_t..execution::mapping_t::other_t] 
Default constructor. 


  constexpr other_t();



[endsect]



[section:polymorphic_query_result_type execution::mapping_t::other_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__mapping_t__other_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::mapping_t::other_t] 
The type returned by queries against an `any_executor`. 


  typedef mapping_t polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/mapping.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:value execution::mapping_t::other_t::value]

[indexterm2 asio.indexterm.execution__mapping_t__other_t.value..value..execution::mapping_t::other_t] 
Get the value associated with a property object. 


  static constexpr mapping_t value();



[heading Return Value]
      
`other_t()`; 




[endsect]



[endsect]

[section:execution__mapping_t__thread_t execution::mapping_t::thread_t]


A sub-property that indicates that execution agents are mapped on to threads of execution. 


  struct thread_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__mapping_t__thread_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__mapping_t__thread_t.thread_t [*thread_t]] [constructor]]
    [Default constructor. ]
  ]
  
  [
    [[link asio.reference.execution__mapping_t__thread_t.value [*value]] [static]]
    [Get the value associated with a property object. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__mapping_t__thread_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The mapping_t::thread_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__mapping_t__thread_t.is_preferable [*is_preferable]] [static]]
    [The mapping_t::thread_t property can be preferred. ]
  ]

  [
    [[link asio.reference.execution__mapping_t__thread_t.is_requirable [*is_requirable]] [static]]
    [The mapping_t::thread_t property can be required. ]
  ]

]

[heading Requirements]

['Header: ][^asio/execution/mapping.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:is_applicable_property_v execution::mapping_t::thread_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__mapping_t__thread_t.is_applicable_property_v..is_applicable_property_v..execution::mapping_t::thread_t] 
The [link asio.reference.execution__mapping_t__thread_t `execution::mapping_t::thread_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
      is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::mapping_t::thread_t::is_preferable]

[indexterm2 asio.indexterm.execution__mapping_t__thread_t.is_preferable..is_preferable..execution::mapping_t::thread_t] 
The [link asio.reference.execution__mapping_t__thread_t `execution::mapping_t::thread_t`] property can be preferred. 


  static constexpr bool is_preferable = true;



[endsect]



[section:is_requirable execution::mapping_t::thread_t::is_requirable]

[indexterm2 asio.indexterm.execution__mapping_t__thread_t.is_requirable..is_requirable..execution::mapping_t::thread_t] 
The [link asio.reference.execution__mapping_t__thread_t `execution::mapping_t::thread_t`] property can be required. 


  static constexpr bool is_requirable = true;



[endsect]



[section:polymorphic_query_result_type execution::mapping_t::thread_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__mapping_t__thread_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::mapping_t::thread_t] 
The type returned by queries against an `any_executor`. 


  typedef mapping_t polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/mapping.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:thread_t execution::mapping_t::thread_t::thread_t]

[indexterm2 asio.indexterm.execution__mapping_t__thread_t.thread_t..thread_t..execution::mapping_t::thread_t] 
Default constructor. 


  constexpr thread_t();



[endsect]



[section:value execution::mapping_t::thread_t::value]

[indexterm2 asio.indexterm.execution__mapping_t__thread_t.value..value..execution::mapping_t::thread_t] 
Get the value associated with a property object. 


  static constexpr mapping_t value();



[heading Return Value]
      
`thread_t()`; 




[endsect]



[endsect]


[section:execution__occupancy execution::occupancy]

[indexterm1 asio.indexterm.execution__occupancy..execution::occupancy] 
A special value used for accessing the [link asio.reference.execution__occupancy_t `execution::occupancy_t`] property. 


  constexpr occupancy_t occupancy;


[heading Requirements]

['Header: ][^asio/execution/occupancy.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]


[section:execution__occupancy_t execution::occupancy_t]


A property that gives an estimate of the number of execution agents that should occupy the associated execution context. 


  struct occupancy_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__occupancy_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__occupancy_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The occupancy_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__occupancy_t.is_preferable [*is_preferable]] [static]]
    [The occupancy_t property cannot be preferred. ]
  ]

  [
    [[link asio.reference.execution__occupancy_t.is_requirable [*is_requirable]] [static]]
    [The occupancy_t property cannot be required. ]
  ]

]

[heading Requirements]

['Header: ][^asio/execution/occupancy.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:is_applicable_property_v execution::occupancy_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__occupancy_t.is_applicable_property_v..is_applicable_property_v..execution::occupancy_t] 
The [link asio.reference.execution__occupancy_t `execution::occupancy_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
    is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::occupancy_t::is_preferable]

[indexterm2 asio.indexterm.execution__occupancy_t.is_preferable..is_preferable..execution::occupancy_t] 
The [link asio.reference.execution__occupancy_t `execution::occupancy_t`] property cannot be preferred. 


  static constexpr bool is_preferable = false;



[endsect]



[section:is_requirable execution::occupancy_t::is_requirable]

[indexterm2 asio.indexterm.execution__occupancy_t.is_requirable..is_requirable..execution::occupancy_t] 
The [link asio.reference.execution__occupancy_t `execution::occupancy_t`] property cannot be required. 


  static constexpr bool is_requirable = false;



[endsect]



[section:polymorphic_query_result_type execution::occupancy_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__occupancy_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::occupancy_t] 
The type returned by queries against an `any_executor`. 


  typedef std::size_t polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/occupancy.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[endsect]


[section:execution__outstanding_work execution::outstanding_work]

[indexterm1 asio.indexterm.execution__outstanding_work..execution::outstanding_work] 
A special value used for accessing the [link asio.reference.execution__outstanding_work_t `execution::outstanding_work_t`] property. 


  constexpr outstanding_work_t outstanding_work;


[heading Requirements]

['Header: ][^asio/execution/outstanding_work.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]


[section:execution__outstanding_work_t execution::outstanding_work_t]


A property to describe whether task submission is likely in the future. 


  struct outstanding_work_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__outstanding_work_t__tracked_t [*tracked_t]]]
    [A sub-property that indicates that the executor represents likely future submission of a function object. ]
  
  ]

  [

    [[link asio.reference.execution__outstanding_work_t__untracked_t [*untracked_t]]]
    [A sub-property that indicates that the executor does not represent likely future submission of a function object. ]
  
  ]

  [

    [[link asio.reference.execution__outstanding_work_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__outstanding_work_t.outstanding_work_t [*outstanding_work_t]] [constructor]]
    [Default constructor. 
     [hr]
     Construct from a sub-property value. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__outstanding_work_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The outstanding_work_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__outstanding_work_t.is_preferable [*is_preferable]] [static]]
    [The top-level outstanding_work_t property cannot be preferred. ]
  ]

  [
    [[link asio.reference.execution__outstanding_work_t.is_requirable [*is_requirable]] [static]]
    [The top-level outstanding_work_t property cannot be required. ]
  ]

  [
    [[link asio.reference.execution__outstanding_work_t.tracked [*tracked]] [static]]
    [A special value used for accessing the outstanding_work_t::tracked_t property. ]
  ]

  [
    [[link asio.reference.execution__outstanding_work_t.untracked [*untracked]] [static]]
    [A special value used for accessing the outstanding_work_t::untracked_t property. ]
  ]

]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__outstanding_work_t.operator_not__eq_ [*operator!=]]]
    [Compare property values for inequality. ]
  ]
  
  [
    [[link asio.reference.execution__outstanding_work_t.operator_eq__eq_ [*operator==]]]
    [Compare property values for equality. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/execution/outstanding_work.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:is_applicable_property_v execution::outstanding_work_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__outstanding_work_t.is_applicable_property_v..is_applicable_property_v..execution::outstanding_work_t] 
The [link asio.reference.execution__outstanding_work_t `execution::outstanding_work_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
    is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::outstanding_work_t::is_preferable]

[indexterm2 asio.indexterm.execution__outstanding_work_t.is_preferable..is_preferable..execution::outstanding_work_t] 
The top-level [link asio.reference.execution__outstanding_work_t `execution::outstanding_work_t`] property cannot be preferred. 


  static constexpr bool is_preferable = false;



[endsect]



[section:is_requirable execution::outstanding_work_t::is_requirable]

[indexterm2 asio.indexterm.execution__outstanding_work_t.is_requirable..is_requirable..execution::outstanding_work_t] 
The top-level [link asio.reference.execution__outstanding_work_t `execution::outstanding_work_t`] property cannot be required. 


  static constexpr bool is_requirable = false;



[endsect]



[section:operator_not__eq_ execution::outstanding_work_t::operator!=]

[indexterm2 asio.indexterm.execution__outstanding_work_t.operator_not__eq_..operator!=..execution::outstanding_work_t] 
Compare property values for inequality. 


  friend constexpr bool operator!=(
      const outstanding_work_t & a,
      const outstanding_work_t & b);


[heading Requirements]

['Header: ][^asio/execution/outstanding_work.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:operator_eq__eq_ execution::outstanding_work_t::operator==]

[indexterm2 asio.indexterm.execution__outstanding_work_t.operator_eq__eq_..operator==..execution::outstanding_work_t] 
Compare property values for equality. 


  friend constexpr bool operator==(
      const outstanding_work_t & a,
      const outstanding_work_t & b);


[heading Requirements]

['Header: ][^asio/execution/outstanding_work.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]


[section:outstanding_work_t execution::outstanding_work_t::outstanding_work_t]

[indexterm2 asio.indexterm.execution__outstanding_work_t.outstanding_work_t..outstanding_work_t..execution::outstanding_work_t] 
Default constructor. 


  constexpr ``[link asio.reference.execution__outstanding_work_t.outstanding_work_t.overload1 outstanding_work_t]``();
  ``  [''''&raquo;''' [link asio.reference.execution__outstanding_work_t.outstanding_work_t.overload1 more...]]``


Construct from a sub-property value. 


  constexpr ``[link asio.reference.execution__outstanding_work_t.outstanding_work_t.overload2 outstanding_work_t]``(
      untracked_t );
  ``  [''''&raquo;''' [link asio.reference.execution__outstanding_work_t.outstanding_work_t.overload2 more...]]``

  constexpr ``[link asio.reference.execution__outstanding_work_t.outstanding_work_t.overload3 outstanding_work_t]``(
      tracked_t );
  ``  [''''&raquo;''' [link asio.reference.execution__outstanding_work_t.outstanding_work_t.overload3 more...]]``


[section:overload1 execution::outstanding_work_t::outstanding_work_t (1 of 3 overloads)]


Default constructor. 


  constexpr outstanding_work_t();



[endsect]



[section:overload2 execution::outstanding_work_t::outstanding_work_t (2 of 3 overloads)]


Construct from a sub-property value. 


  constexpr outstanding_work_t(
      untracked_t );



[endsect]



[section:overload3 execution::outstanding_work_t::outstanding_work_t (3 of 3 overloads)]


Construct from a sub-property value. 


  constexpr outstanding_work_t(
      tracked_t );



[endsect]


[endsect]


[section:polymorphic_query_result_type execution::outstanding_work_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__outstanding_work_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::outstanding_work_t] 
The type returned by queries against an `any_executor`. 


  typedef outstanding_work_t polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/outstanding_work.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:tracked execution::outstanding_work_t::tracked]

[indexterm2 asio.indexterm.execution__outstanding_work_t.tracked..tracked..execution::outstanding_work_t] 
A special value used for accessing the [link asio.reference.execution__outstanding_work_t__tracked_t `execution::outstanding_work_t::tracked_t`] property. 


  static constexpr tracked_t tracked;



[endsect]



[section:untracked execution::outstanding_work_t::untracked]

[indexterm2 asio.indexterm.execution__outstanding_work_t.untracked..untracked..execution::outstanding_work_t] 
A special value used for accessing the [link asio.reference.execution__outstanding_work_t__untracked_t `execution::outstanding_work_t::untracked_t`] property. 


  static constexpr untracked_t untracked;



[endsect]



[endsect]

[section:execution__outstanding_work_t__tracked_t execution::outstanding_work_t::tracked_t]


A sub-property that indicates that the executor represents likely future submission of a function object. 


  struct tracked_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__outstanding_work_t__tracked_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__outstanding_work_t__tracked_t.tracked_t [*tracked_t]] [constructor]]
    [Default constructor. ]
  ]
  
  [
    [[link asio.reference.execution__outstanding_work_t__tracked_t.value [*value]] [static]]
    [Get the value associated with a property object. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__outstanding_work_t__tracked_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The outstanding_work_t::untracked_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__outstanding_work_t__tracked_t.is_preferable [*is_preferable]] [static]]
    [The outstanding_work_t::tracked_t property can be preferred. ]
  ]

  [
    [[link asio.reference.execution__outstanding_work_t__tracked_t.is_requirable [*is_requirable]] [static]]
    [The outstanding_work_t::tracked_t property can be required. ]
  ]

]

[heading Requirements]

['Header: ][^asio/execution/outstanding_work.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:is_applicable_property_v execution::outstanding_work_t::tracked_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__outstanding_work_t__tracked_t.is_applicable_property_v..is_applicable_property_v..execution::outstanding_work_t::tracked_t] 
The [link asio.reference.execution__outstanding_work_t__untracked_t `execution::outstanding_work_t::untracked_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
      is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::outstanding_work_t::tracked_t::is_preferable]

[indexterm2 asio.indexterm.execution__outstanding_work_t__tracked_t.is_preferable..is_preferable..execution::outstanding_work_t::tracked_t] 
The [link asio.reference.execution__outstanding_work_t__tracked_t `execution::outstanding_work_t::tracked_t`] property can be preferred. 


  static constexpr bool is_preferable = true;



[endsect]



[section:is_requirable execution::outstanding_work_t::tracked_t::is_requirable]

[indexterm2 asio.indexterm.execution__outstanding_work_t__tracked_t.is_requirable..is_requirable..execution::outstanding_work_t::tracked_t] 
The [link asio.reference.execution__outstanding_work_t__tracked_t `execution::outstanding_work_t::tracked_t`] property can be required. 


  static constexpr bool is_requirable = true;



[endsect]



[section:polymorphic_query_result_type execution::outstanding_work_t::tracked_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__outstanding_work_t__tracked_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::outstanding_work_t::tracked_t] 
The type returned by queries against an `any_executor`. 


  typedef outstanding_work_t polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/outstanding_work.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:tracked_t execution::outstanding_work_t::tracked_t::tracked_t]

[indexterm2 asio.indexterm.execution__outstanding_work_t__tracked_t.tracked_t..tracked_t..execution::outstanding_work_t::tracked_t] 
Default constructor. 


  constexpr tracked_t();



[endsect]



[section:value execution::outstanding_work_t::tracked_t::value]

[indexterm2 asio.indexterm.execution__outstanding_work_t__tracked_t.value..value..execution::outstanding_work_t::tracked_t] 
Get the value associated with a property object. 


  static constexpr outstanding_work_t value();



[heading Return Value]
      
`tracked_t()`; 




[endsect]



[endsect]

[section:execution__outstanding_work_t__untracked_t execution::outstanding_work_t::untracked_t]


A sub-property that indicates that the executor does not represent likely future submission of a function object. 


  struct untracked_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__outstanding_work_t__untracked_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__outstanding_work_t__untracked_t.untracked_t [*untracked_t]] [constructor]]
    [Default constructor. ]
  ]
  
  [
    [[link asio.reference.execution__outstanding_work_t__untracked_t.value [*value]] [static]]
    [Get the value associated with a property object. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__outstanding_work_t__untracked_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The outstanding_work_t::untracked_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__outstanding_work_t__untracked_t.is_preferable [*is_preferable]] [static]]
    [The outstanding_work_t::untracked_t property can be preferred. ]
  ]

  [
    [[link asio.reference.execution__outstanding_work_t__untracked_t.is_requirable [*is_requirable]] [static]]
    [The outstanding_work_t::untracked_t property can be required. ]
  ]

]

[heading Requirements]

['Header: ][^asio/execution/outstanding_work.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:is_applicable_property_v execution::outstanding_work_t::untracked_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__outstanding_work_t__untracked_t.is_applicable_property_v..is_applicable_property_v..execution::outstanding_work_t::untracked_t] 
The [link asio.reference.execution__outstanding_work_t__untracked_t `execution::outstanding_work_t::untracked_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
      is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::outstanding_work_t::untracked_t::is_preferable]

[indexterm2 asio.indexterm.execution__outstanding_work_t__untracked_t.is_preferable..is_preferable..execution::outstanding_work_t::untracked_t] 
The [link asio.reference.execution__outstanding_work_t__untracked_t `execution::outstanding_work_t::untracked_t`] property can be preferred. 


  static constexpr bool is_preferable = true;



[endsect]



[section:is_requirable execution::outstanding_work_t::untracked_t::is_requirable]

[indexterm2 asio.indexterm.execution__outstanding_work_t__untracked_t.is_requirable..is_requirable..execution::outstanding_work_t::untracked_t] 
The [link asio.reference.execution__outstanding_work_t__untracked_t `execution::outstanding_work_t::untracked_t`] property can be required. 


  static constexpr bool is_requirable = true;



[endsect]



[section:polymorphic_query_result_type execution::outstanding_work_t::untracked_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__outstanding_work_t__untracked_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::outstanding_work_t::untracked_t] 
The type returned by queries against an `any_executor`. 


  typedef outstanding_work_t polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/outstanding_work.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:untracked_t execution::outstanding_work_t::untracked_t::untracked_t]

[indexterm2 asio.indexterm.execution__outstanding_work_t__untracked_t.untracked_t..untracked_t..execution::outstanding_work_t::untracked_t] 
Default constructor. 


  constexpr untracked_t();



[endsect]



[section:value execution::outstanding_work_t::untracked_t::value]

[indexterm2 asio.indexterm.execution__outstanding_work_t__untracked_t.value..value..execution::outstanding_work_t::untracked_t] 
Get the value associated with a property object. 


  static constexpr outstanding_work_t value();



[heading Return Value]
      
`untracked_t()`; 




[endsect]



[endsect]

[section:execution__prefer_only execution::prefer_only]


A property adapter that is used with the polymorphic executor wrapper to mark properties as preferable, but not requirable. 


  template<
      typename Property>
  struct prefer_only


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__prefer_only.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__prefer_only.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The prefer_only adapter applies to the same types as the nested property. ]
  ]

  [
    [[link asio.reference.execution__prefer_only.is_preferable [*is_preferable]] [static]]
    [The context_t property can be preferred, it the underlying property can be preferred. ]
  ]

  [
    [[link asio.reference.execution__prefer_only.is_requirable [*is_requirable]] [static]]
    [The context_t property cannot be required. ]
  ]

]

[heading Requirements]

['Header: ][^asio/execution/prefer_only.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:is_applicable_property_v execution::prefer_only::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__prefer_only.is_applicable_property_v..is_applicable_property_v..execution::prefer_only] 
The [link asio.reference.execution__prefer_only `execution::prefer_only`] adapter applies to the same types as the nested property. 


  template <typename T>
  static constexpr bool is_applicable_property_v =is_applicable_property<T, Property>::value;



[endsect]



[section:is_preferable execution::prefer_only::is_preferable]

[indexterm2 asio.indexterm.execution__prefer_only.is_preferable..is_preferable..execution::prefer_only] 
The [link asio.reference.execution__context_t `execution::context_t`] property can be preferred, it the underlying property can be preferred. 


  static constexpr bool is_preferable = automatically_determined;


`true` if `Property::is_preferable` is `true`, otherwise `false`. 


[endsect]



[section:is_requirable execution::prefer_only::is_requirable]

[indexterm2 asio.indexterm.execution__prefer_only.is_requirable..is_requirable..execution::prefer_only] 
The [link asio.reference.execution__context_t `execution::context_t`] property cannot be required. 


  static constexpr bool is_requirable = false;



[endsect]



[section:polymorphic_query_result_type execution::prefer_only::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__prefer_only.polymorphic_query_result_type..polymorphic_query_result_type..execution::prefer_only] 
The type returned by queries against an `any_executor`. 


  typedef Property::polymorphic_query_result_type polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/prefer_only.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[endsect]

[section:execution__receiver_invocation_error execution::receiver_invocation_error]


Exception reported via `set_error` when an exception escapes from `set_value`. 


  class receiver_invocation_error


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__receiver_invocation_error.receiver_invocation_error [*receiver_invocation_error]] [constructor]]
    [Constructor. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/execution/receiver_invocation_error.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:receiver_invocation_error execution::receiver_invocation_error::receiver_invocation_error]

[indexterm2 asio.indexterm.execution__receiver_invocation_error.receiver_invocation_error..receiver_invocation_error..execution::receiver_invocation_error] 
Constructor. 


  receiver_invocation_error();



[endsect]



[endsect]


[section:execution__relationship execution::relationship]

[indexterm1 asio.indexterm.execution__relationship..execution::relationship] 
A special value used for accessing the [link asio.reference.execution__relationship_t `execution::relationship_t`] property. 


  constexpr relationship_t relationship;


[heading Requirements]

['Header: ][^asio/execution/relationship.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]


[section:execution__relationship_t execution::relationship_t]


A property to describe whether submitted tasks represent continuations of the calling context. 


  struct relationship_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__relationship_t__continuation_t [*continuation_t]]]
    [A sub-property that indicates that the executor represents a continuation of the calling context. ]
  
  ]

  [

    [[link asio.reference.execution__relationship_t__fork_t [*fork_t]]]
    [A sub-property that indicates that the executor does not represent a continuation of the calling context. ]
  
  ]

  [

    [[link asio.reference.execution__relationship_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__relationship_t.relationship_t [*relationship_t]] [constructor]]
    [Default constructor. 
     [hr]
     Construct from a sub-property value. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__relationship_t.continuation [*continuation]] [static]]
    [A special value used for accessing the relationship_t::continuation_t property. ]
  ]

  [
    [[link asio.reference.execution__relationship_t.fork [*fork]] [static]]
    [A special value used for accessing the relationship_t::fork_t property. ]
  ]

  [
    [[link asio.reference.execution__relationship_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The relationship_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__relationship_t.is_preferable [*is_preferable]] [static]]
    [The top-level relationship_t property cannot be preferred. ]
  ]

  [
    [[link asio.reference.execution__relationship_t.is_requirable [*is_requirable]] [static]]
    [The top-level relationship_t property cannot be required. ]
  ]

]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__relationship_t.operator_not__eq_ [*operator!=]]]
    [Compare property values for inequality. ]
  ]
  
  [
    [[link asio.reference.execution__relationship_t.operator_eq__eq_ [*operator==]]]
    [Compare property values for equality. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/execution/relationship.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:continuation execution::relationship_t::continuation]

[indexterm2 asio.indexterm.execution__relationship_t.continuation..continuation..execution::relationship_t] 
A special value used for accessing the [link asio.reference.execution__relationship_t__continuation_t `execution::relationship_t::continuation_t`] property. 


  static constexpr continuation_t continuation;



[endsect]



[section:fork execution::relationship_t::fork]

[indexterm2 asio.indexterm.execution__relationship_t.fork..fork..execution::relationship_t] 
A special value used for accessing the [link asio.reference.execution__relationship_t__fork_t `execution::relationship_t::fork_t`] property. 


  static constexpr fork_t fork;



[endsect]



[section:is_applicable_property_v execution::relationship_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__relationship_t.is_applicable_property_v..is_applicable_property_v..execution::relationship_t] 
The [link asio.reference.execution__relationship_t `execution::relationship_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
    is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::relationship_t::is_preferable]

[indexterm2 asio.indexterm.execution__relationship_t.is_preferable..is_preferable..execution::relationship_t] 
The top-level [link asio.reference.execution__relationship_t `execution::relationship_t`] property cannot be preferred. 


  static constexpr bool is_preferable = false;



[endsect]



[section:is_requirable execution::relationship_t::is_requirable]

[indexterm2 asio.indexterm.execution__relationship_t.is_requirable..is_requirable..execution::relationship_t] 
The top-level [link asio.reference.execution__relationship_t `execution::relationship_t`] property cannot be required. 


  static constexpr bool is_requirable = false;



[endsect]



[section:operator_not__eq_ execution::relationship_t::operator!=]

[indexterm2 asio.indexterm.execution__relationship_t.operator_not__eq_..operator!=..execution::relationship_t] 
Compare property values for inequality. 


  friend constexpr bool operator!=(
      const relationship_t & a,
      const relationship_t & b);


[heading Requirements]

['Header: ][^asio/execution/relationship.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:operator_eq__eq_ execution::relationship_t::operator==]

[indexterm2 asio.indexterm.execution__relationship_t.operator_eq__eq_..operator==..execution::relationship_t] 
Compare property values for equality. 


  friend constexpr bool operator==(
      const relationship_t & a,
      const relationship_t & b);


[heading Requirements]

['Header: ][^asio/execution/relationship.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:polymorphic_query_result_type execution::relationship_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__relationship_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::relationship_t] 
The type returned by queries against an `any_executor`. 


  typedef relationship_t polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/relationship.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]


[section:relationship_t execution::relationship_t::relationship_t]

[indexterm2 asio.indexterm.execution__relationship_t.relationship_t..relationship_t..execution::relationship_t] 
Default constructor. 


  constexpr ``[link asio.reference.execution__relationship_t.relationship_t.overload1 relationship_t]``();
  ``  [''''&raquo;''' [link asio.reference.execution__relationship_t.relationship_t.overload1 more...]]``


Construct from a sub-property value. 


  constexpr ``[link asio.reference.execution__relationship_t.relationship_t.overload2 relationship_t]``(
      fork_t );
  ``  [''''&raquo;''' [link asio.reference.execution__relationship_t.relationship_t.overload2 more...]]``

  constexpr ``[link asio.reference.execution__relationship_t.relationship_t.overload3 relationship_t]``(
      continuation_t );
  ``  [''''&raquo;''' [link asio.reference.execution__relationship_t.relationship_t.overload3 more...]]``


[section:overload1 execution::relationship_t::relationship_t (1 of 3 overloads)]


Default constructor. 


  constexpr relationship_t();



[endsect]



[section:overload2 execution::relationship_t::relationship_t (2 of 3 overloads)]


Construct from a sub-property value. 


  constexpr relationship_t(
      fork_t );



[endsect]



[section:overload3 execution::relationship_t::relationship_t (3 of 3 overloads)]


Construct from a sub-property value. 


  constexpr relationship_t(
      continuation_t );



[endsect]


[endsect]


[endsect]

[section:execution__relationship_t__continuation_t execution::relationship_t::continuation_t]


A sub-property that indicates that the executor represents a continuation of the calling context. 


  struct continuation_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__relationship_t__continuation_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__relationship_t__continuation_t.continuation_t [*continuation_t]] [constructor]]
    [Default constructor. ]
  ]
  
  [
    [[link asio.reference.execution__relationship_t__continuation_t.value [*value]] [static]]
    [Get the value associated with a property object. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__relationship_t__continuation_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The relationship_t::continuation_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__relationship_t__continuation_t.is_preferable [*is_preferable]] [static]]
    [The relationship_t::continuation_t property can be preferred. ]
  ]

  [
    [[link asio.reference.execution__relationship_t__continuation_t.is_requirable [*is_requirable]] [static]]
    [The relationship_t::continuation_t property can be required. ]
  ]

]

[heading Requirements]

['Header: ][^asio/execution/relationship.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:continuation_t execution::relationship_t::continuation_t::continuation_t]

[indexterm2 asio.indexterm.execution__relationship_t__continuation_t.continuation_t..continuation_t..execution::relationship_t::continuation_t] 
Default constructor. 


  constexpr continuation_t();



[endsect]



[section:is_applicable_property_v execution::relationship_t::continuation_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__relationship_t__continuation_t.is_applicable_property_v..is_applicable_property_v..execution::relationship_t::continuation_t] 
The [link asio.reference.execution__relationship_t__continuation_t `execution::relationship_t::continuation_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
      is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::relationship_t::continuation_t::is_preferable]

[indexterm2 asio.indexterm.execution__relationship_t__continuation_t.is_preferable..is_preferable..execution::relationship_t::continuation_t] 
The [link asio.reference.execution__relationship_t__continuation_t `execution::relationship_t::continuation_t`] property can be preferred. 


  static constexpr bool is_preferable = true;



[endsect]



[section:is_requirable execution::relationship_t::continuation_t::is_requirable]

[indexterm2 asio.indexterm.execution__relationship_t__continuation_t.is_requirable..is_requirable..execution::relationship_t::continuation_t] 
The [link asio.reference.execution__relationship_t__continuation_t `execution::relationship_t::continuation_t`] property can be required. 


  static constexpr bool is_requirable = true;



[endsect]



[section:polymorphic_query_result_type execution::relationship_t::continuation_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__relationship_t__continuation_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::relationship_t::continuation_t] 
The type returned by queries against an `any_executor`. 


  typedef relationship_t polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/relationship.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:value execution::relationship_t::continuation_t::value]

[indexterm2 asio.indexterm.execution__relationship_t__continuation_t.value..value..execution::relationship_t::continuation_t] 
Get the value associated with a property object. 


  static constexpr relationship_t value();



[heading Return Value]
      
`continuation_t()`; 




[endsect]



[endsect]

[section:execution__relationship_t__fork_t execution::relationship_t::fork_t]


A sub-property that indicates that the executor does not represent a continuation of the calling context. 


  struct fork_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution__relationship_t__fork_t.polymorphic_query_result_type [*polymorphic_query_result_type]]]
    [The type returned by queries against an any_executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__relationship_t__fork_t.fork_t [*fork_t]] [constructor]]
    [Default constructor. ]
  ]
  
  [
    [[link asio.reference.execution__relationship_t__fork_t.value [*value]] [static]]
    [Get the value associated with a property object. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution__relationship_t__fork_t.is_applicable_property_v [*is_applicable_property_v]] [static]]
    [The relationship_t::fork_t property applies to executors, senders, and schedulers. ]
  ]

  [
    [[link asio.reference.execution__relationship_t__fork_t.is_preferable [*is_preferable]] [static]]
    [The relationship_t::fork_t property can be preferred. ]
  ]

  [
    [[link asio.reference.execution__relationship_t__fork_t.is_requirable [*is_requirable]] [static]]
    [The relationship_t::fork_t property can be required. ]
  ]

]

[heading Requirements]

['Header: ][^asio/execution/relationship.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:fork_t execution::relationship_t::fork_t::fork_t]

[indexterm2 asio.indexterm.execution__relationship_t__fork_t.fork_t..fork_t..execution::relationship_t::fork_t] 
Default constructor. 


  constexpr fork_t();



[endsect]



[section:is_applicable_property_v execution::relationship_t::fork_t::is_applicable_property_v]

[indexterm2 asio.indexterm.execution__relationship_t__fork_t.is_applicable_property_v..is_applicable_property_v..execution::relationship_t::fork_t] 
The [link asio.reference.execution__relationship_t__fork_t `execution::relationship_t::fork_t`] property applies to executors, senders, and schedulers. 


  template <typename T>
  static constexpr bool is_applicable_property_v =
      is_executor_v<T> || is_sender_v<T> || is_scheduler_v<T>;



[endsect]



[section:is_preferable execution::relationship_t::fork_t::is_preferable]

[indexterm2 asio.indexterm.execution__relationship_t__fork_t.is_preferable..is_preferable..execution::relationship_t::fork_t] 
The [link asio.reference.execution__relationship_t__fork_t `execution::relationship_t::fork_t`] property can be preferred. 


  static constexpr bool is_preferable = true;



[endsect]



[section:is_requirable execution::relationship_t::fork_t::is_requirable]

[indexterm2 asio.indexterm.execution__relationship_t__fork_t.is_requirable..is_requirable..execution::relationship_t::fork_t] 
The [link asio.reference.execution__relationship_t__fork_t `execution::relationship_t::fork_t`] property can be required. 


  static constexpr bool is_requirable = true;



[endsect]



[section:polymorphic_query_result_type execution::relationship_t::fork_t::polymorphic_query_result_type]

[indexterm2 asio.indexterm.execution__relationship_t__fork_t.polymorphic_query_result_type..polymorphic_query_result_type..execution::relationship_t::fork_t] 
The type returned by queries against an `any_executor`. 


  typedef relationship_t polymorphic_query_result_type;



[heading Requirements]

['Header: ][^asio/execution/relationship.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:value execution::relationship_t::fork_t::value]

[indexterm2 asio.indexterm.execution__relationship_t__fork_t.value..value..execution::relationship_t::fork_t] 
Get the value associated with a property object. 


  static constexpr relationship_t value();



[heading Return Value]
      
`fork_t()`; 




[endsect]



[endsect]


[section:execution__schedule execution::schedule]

[indexterm1 asio.indexterm.execution__schedule..execution::schedule] 
A customisation point that is used to obtain a sender from a scheduler. 


  constexpr unspecified schedule = unspecified;


The name `execution::schedule` denotes a customisation point object. For some subexpression `s`, let `S` be a type such that `decltype((s))` is `S`. The expression `execution::schedule(s)` is expression-equivalent to:


* `s.schedule()`, if that expression is valid and its type models `sender`.


* Otherwise, `schedule(s)`, if that expression is valid and its type models `sender` with overload resolution performed in a context that includes the declaration `void schedule();` and that does not include a declaration of `execution::schedule`.


* Otherwise, `S` if `S` satisfies `executor`.


* Otherwise, `execution::schedule(s)` is ill-formed. 



[heading Requirements]

['Header: ][^asio/execution/schedule.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:execution__sender_base execution::sender_base]

[indexterm1 asio.indexterm.execution__sender_base..execution::sender_base] 
Base class used for tagging senders. 


  typedef unspecified sender_base;



[heading Requirements]

['Header: ][^asio/execution/sender.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]


[section:execution__sender_traits execution::sender_traits]


Traits for senders. 


  template<
      typename S>
  struct sender_traits


[heading Requirements]

['Header: ][^asio/execution/sender.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]


[section:execution__set_done execution::set_done]

[indexterm1 asio.indexterm.execution__set_done..execution::set_done] 
A customisation point that delivers a done notification to a receiver. 


  constexpr unspecified set_done = unspecified;


The name `execution::set_done` denotes a customisation point object. The expression `execution::set_done(R)` for some subexpression `R` is expression-equivalent to:


* `R.set_done()`, if that expression is valid. If the function selected does not signal the receiver `R`'s done channel, the program is ill-formed with no diagnostic required.


* Otherwise, `set_done(R)`, if that expression is valid, with overload resolution performed in a context that includes the declaration `void set_done();` and that does not include a declaration of `execution::set_done`. If the function selected by overload resolution does not signal the receiver `R`'s done channel, the program is ill-formed with no diagnostic required.


* Otherwise, `execution::set_done(R)` is ill-formed. 



[heading Requirements]

['Header: ][^asio/execution/set_done.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:execution__set_error execution::set_error]

[indexterm1 asio.indexterm.execution__set_error..execution::set_error] 
A customisation point that delivers an error notification to a receiver. 


  constexpr unspecified set_error = unspecified;


The name `execution::set_error` denotes a customisation point object. The expression `execution::set_error(R, E)` for some subexpressions `R` and `E` are expression-equivalent to:


* `R.set_error(E)`, if that expression is valid. If the function selected does not send the error `E` to the receiver `R`'s error channel, the program is ill-formed with no diagnostic required.


* Otherwise, `set_error(R, E)`, if that expression is valid, with overload resolution performed in a context that includes the declaration `void set_error();` and that does not include a declaration of `execution::set_error`. If the function selected by overload resolution does not send the error `E` to the receiver `R`'s error channel, the program is ill-formed with no diagnostic required.


* Otherwise, `execution::set_error(R, E)` is ill-formed. 



[heading Requirements]

['Header: ][^asio/execution/set_error.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:execution__set_value execution::set_value]

[indexterm1 asio.indexterm.execution__set_value..execution::set_value] 
A customisation point that delivers a value to a receiver. 


  constexpr unspecified set_value = unspecified;


The name `execution::set_value` denotes a customisation point object. The expression `execution::set_value(R, Vs...)` for some subexpressions `R` and `Vs...` is expression-equivalent to:


* `R.set_value(Vs...)`, if that expression is valid. If the function selected does not send the value(s) `Vs...` to the receiver `R`'s value channel, the program is ill-formed with no diagnostic required.


* Otherwise, `set_value(R, Vs...)`, if that expression is valid, with overload resolution performed in a context that includes the declaration `void set_value();` and that does not include a declaration of `execution::set_value`. If the function selected by overload resolution does not send the value(s) `Vs...` to the receiver `R`'s value channel, the program is ill-formed with no diagnostic required.


* Otherwise, `execution::set_value(R, Vs...)` is ill-formed. 



[heading Requirements]

['Header: ][^asio/execution/set_value.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:execution__start execution::start]

[indexterm1 asio.indexterm.execution__start..execution::start] 
A customisation point that notifies an operation state object to start its associated operation. 


  constexpr unspecified start = unspecified;


The name `execution::start` denotes a customisation point object. The expression `execution::start(R)` for some subexpression `R` is expression-equivalent to:


* `R.start()`, if that expression is valid.


* Otherwise, `start(R)`, if that expression is valid, with overload resolution performed in a context that includes the declaration `void start();` and that does not include a declaration of `execution::start`.


* Otherwise, `execution::start(R)` is ill-formed. 



[heading Requirements]

['Header: ][^asio/execution/start.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:execution__submit execution::submit]

[indexterm1 asio.indexterm.execution__submit..execution::submit] 
A customisation point that submits a sender to a receiver. 


  constexpr unspecified submit = unspecified;


The name `execution::submit` denotes a customisation point object. For some subexpressions `s` and `r`, let `S` be a type such that `decltype((s))` is `S` and let `R` be a type such that `decltype((r))` is `R`. The expression `execution::submit(s, r)` is ill-formed if `sender_to<S, R>` is not `true`. Otherwise, it is expression-equivalent to:


* `s.submit(r)`, if that expression is valid and `S` models `sender`. If the function selected does not submit the receiver object `r` via the sender `s`, the program is ill-formed with no diagnostic required.


* Otherwise, `submit(s, r)`, if that expression is valid and `S` models `sender`, with overload resolution performed in a context that includes the declaration `void submit();` and that does not include a declaration of `execution::submit`. If the function selected by overload resolution does not submit the receiver object `r` via the sender `s`, the program is ill-formed with no diagnostic required.


* Otherwise, `execution::start((new submit_receiver<S, R>{s,r})->state_)`, where `submit_receiver` is an implementation-defined class template equivalent to: 

   template<class S, class R>
     struct submit_receiver {
       struct wrap {
         submit_receiver * p_;
         template<class...As>
           requires receiver_of<R, As...>
         void set_value(As&&... as) &&
           noexcept(is_nothrow_receiver_of_v<R, As...>) {
           execution::set_value(std::move(p_->r_), (As&&) as...);
           delete p_;
         }
         template<class E>
           requires receiver<R, E>
         void set_error(E&& e) && noexcept {
           execution::set_error(std::move(p_->r_), (E&&) e);
           delete p_;
         }
         void set_done() && noexcept {
           execution::set_done(std::move(p_->r_));
           delete p_;
         }
       };
       remove_cvref_t<R> r_;
       connect_result_t<S, wrap> state_;
       submit_receiver(S&& s, R&& r)
         : r_((R&&) r)
         , state_(execution::connect((S&&) s, wrap{this})) {}
     };






[heading Requirements]

['Header: ][^asio/execution/submit.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]


[section:execution_context execution_context]


A context for function object execution. 


  class execution_context :
    noncopyable


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.execution_context__id [*id]]]
    [Class used to uniquely identify a service. ]
  
  ]

  [

    [[link asio.reference.execution_context__service [*service]]]
    [Base class for all io_context services. ]
  
  ]

  [

    [[link asio.reference.execution_context.fork_event [*fork_event]]]
    [Fork-related event notifications. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution_context.execution_context [*execution_context]] [constructor]]
    [Constructor. ]
  ]
  
  [
    [[link asio.reference.execution_context.notify_fork [*notify_fork]]]
    [Notify the execution_context of a fork-related event. ]
  ]
  
  [
    [[link asio.reference.execution_context._execution_context [*~execution_context]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution_context.destroy [*destroy]]]
    [Destroys all services in the context. ]
  ]
  
  [
    [[link asio.reference.execution_context.shutdown [*shutdown]]]
    [Shuts down all services in the context. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution_context.add_service [*add_service]]]
    [(Deprecated: Use make_service().) Add a service object to the execution_context. ]
  ]
  
  [
    [[link asio.reference.execution_context.has_service [*has_service]]]
    [Determine if an execution_context contains a specified service type. ]
  ]
  
  [
    [[link asio.reference.execution_context.make_service [*make_service]]]
    [Creates a service object and adds it to the execution_context. ]
  ]
  
  [
    [[link asio.reference.execution_context.use_service [*use_service]]]
    [Obtain the service object corresponding to the given type. ]
  ]
  
]

An execution context represents a place where function objects will be executed. An `io_context` is an example of an execution context.


[heading The execution_context class and services]
  


Class [link asio.reference.execution_context `execution_context`] implements an extensible, type-safe, polymorphic set of services, indexed by service type.

Services exist to manage the resources that are shared across an execution context. For example, timers may be implemented in terms of a single timer queue, and this queue would be stored in a service.

Access to the services of an [link asio.reference.execution_context `execution_context`] is via three function templates, `use_service()`, `add_service()` and `has_service()`.

In a call to `use_service<Service>()`, the type argument chooses a service, making available all members of the named type. If `Service` is not present in an [link asio.reference.execution_context `execution_context`], an object of type `Service` is created and added to the [link asio.reference.execution_context `execution_context`]. A C++ program can check if an [link asio.reference.execution_context `execution_context`] implements a particular service with the function template `has_service<Service>()`.

Service objects may be explicitly added to an [link asio.reference.execution_context `execution_context`] using the function template `add_service<Service>()`. If the `Service` is already present, the [link asio.reference.service_already_exists `service_already_exists`] exception is thrown. If the owner of the service is not the same object as the [link asio.reference.execution_context `execution_context`] parameter, the [link asio.reference.invalid_service_owner `invalid_service_owner`] exception is thrown.

Once a service reference is obtained from an [link asio.reference.execution_context `execution_context`] object by calling `use_service()`, that reference remains usable as long as the owning [link asio.reference.execution_context `execution_context`] object exists.

All service implementations have [link asio.reference.execution_context__service `execution_context::service`] as a public base class. Custom services may be implemented by deriving from this class and then added to an [link asio.reference.execution_context `execution_context`] using the facilities described above.


[heading The execution_context as a base class]
  


Class [link asio.reference.execution_context `execution_context`] may be used only as a base class for concrete execution context types. The `io_context` is an example of such a derived type.

On destruction, a class that is derived from [link asio.reference.execution_context `execution_context`] must perform `execution_context::shutdown()` followed by `execution_context::destroy()`.

This destruction sequence permits programs to simplify their resource management by using `shared_ptr<>`. Where an object's lifetime is tied to the lifetime of a connection (or some other sequence of asynchronous operations), a `shared_ptr` to the object would be bound into the handlers for all asynchronous operations associated with it. This works as follows:


* When a single connection ends, all associated asynchronous operations complete. The corresponding handler objects are destroyed, and all `shared_ptr` references to the objects are destroyed.


* To shut down the whole program, the [link asio.reference.io_context `io_context`] function stop() is called to terminate any run() calls as soon as possible. The [link asio.reference.io_context `io_context`] destructor calls `shutdown()` and `destroy()` to destroy all pending handlers, causing all `shared_ptr` references to all connection objects to be destroyed. 



[heading Requirements]

['Header: ][^asio/execution_context.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:add_service execution_context::add_service]

[indexterm2 asio.indexterm.execution_context.add_service..add_service..execution_context] 
(Deprecated: Use `make_service()`.) Add a service object to the [link asio.reference.execution_context `execution_context`]. 


  template<
      typename ``[link asio.reference.Service Service]``>
  friend void add_service(
      execution_context & e,
      Service * svc);


This function is used to add a service to the [link asio.reference.execution_context `execution_context`].


[heading Parameters]
    

[variablelist
  
[[e][The [link asio.reference.execution_context `execution_context`] object that owns the service.]]

[[svc][The service object. On success, ownership of the service object is transferred to the [link asio.reference.execution_context `execution_context`]. When the [link asio.reference.execution_context `execution_context`] object is destroyed, it will destroy the service object by performing:
``
   delete static_cast<execution_context::service*>(svc) 
``
]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::service_already_exists][Thrown if a service of the given type is already present in the [link asio.reference.execution_context `execution_context`].]]

[[asio::invalid_service_owner][Thrown if the service's owning [link asio.reference.execution_context `execution_context`] is not the [link asio.reference.execution_context `execution_context`] object specified by the `e` parameter. ]]

]



[heading Requirements]

['Header: ][^asio/execution_context.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:destroy execution_context::destroy]

[indexterm2 asio.indexterm.execution_context.destroy..destroy..execution_context] 
Destroys all services in the context. 


  void destroy();


This function is implemented as follows:


* For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, in reverse order * of the beginning of service object lifetime, performs `delete static_cast<execution_context::service*>(svc)`. 




[endsect]



[section:execution_context execution_context::execution_context]

[indexterm2 asio.indexterm.execution_context.execution_context..execution_context..execution_context] 
Constructor. 


  execution_context();



[endsect]



[section:fork_event execution_context::fork_event]

[indexterm2 asio.indexterm.execution_context.fork_event..fork_event..execution_context] 
Fork-related event notifications. 


  enum fork_event

[indexterm2 asio.indexterm.execution_context.fork_event.fork_prepare..fork_prepare..execution_context]
[indexterm2 asio.indexterm.execution_context.fork_event.fork_parent..fork_parent..execution_context]
[indexterm2 asio.indexterm.execution_context.fork_event.fork_child..fork_child..execution_context]

[heading Values]
[variablelist

  [
    [fork_prepare]
    [Notify the context that the process is about to fork. ]
  ]

  [
    [fork_parent]
    [Notify the context that the process has forked and is the parent. ]
  ]

  [
    [fork_child]
    [Notify the context that the process has forked and is the child. ]
  ]

]



[endsect]



[section:has_service execution_context::has_service]

[indexterm2 asio.indexterm.execution_context.has_service..has_service..execution_context] 
Determine if an [link asio.reference.execution_context `execution_context`] contains a specified service type. 


  template<
      typename ``[link asio.reference.Service Service]``>
  friend bool has_service(
      execution_context & e);


This function is used to determine whether the [link asio.reference.execution_context `execution_context`] contains a service object corresponding to the given service type.


[heading Parameters]
    

[variablelist
  
[[e][The [link asio.reference.execution_context `execution_context`] object that owns the service.]]

]


[heading Return Value]
      
A boolean indicating whether the [link asio.reference.execution_context `execution_context`] contains the service. 



[heading Requirements]

['Header: ][^asio/execution_context.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:make_service execution_context::make_service]

[indexterm2 asio.indexterm.execution_context.make_service..make_service..execution_context] 
Creates a service object and adds it to the [link asio.reference.execution_context `execution_context`]. 


  template<
      typename ``[link asio.reference.Service Service]``,
      typename... Args>
  friend Service & make_service(
      execution_context & e,
      Args &&... args);


This function is used to add a service to the [link asio.reference.execution_context `execution_context`].


[heading Parameters]
    

[variablelist
  
[[e][The [link asio.reference.execution_context `execution_context`] object that owns the service.]]

[[args][Zero or more arguments to be passed to the service constructor.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::service_already_exists][Thrown if a service of the given type is already present in the [link asio.reference.execution_context `execution_context`]. ]]

]



[heading Requirements]

['Header: ][^asio/execution_context.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:notify_fork execution_context::notify_fork]

[indexterm2 asio.indexterm.execution_context.notify_fork..notify_fork..execution_context] 
Notify the [link asio.reference.execution_context `execution_context`] of a fork-related event. 


  void notify_fork(
      fork_event event);


This function is used to inform the [link asio.reference.execution_context `execution_context`] that the process is about to fork, or has just forked. This allows the [link asio.reference.execution_context `execution_context`], and the services it contains, to perform any necessary housekeeping to ensure correct operation following a fork.

This function must not be called while any other [link asio.reference.execution_context `execution_context`] function, or any function associated with the execution\_context's derived class, is being called in another thread. It is, however, safe to call this function from within a completion handler, provided no other thread is accessing the [link asio.reference.execution_context `execution_context`] or its derived class.


[heading Parameters]
    

[variablelist
  
[[event][A fork-related event.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. If the notification fails the [link asio.reference.execution_context `execution_context`] object should no longer be used and should be destroyed.]]

]


[heading Example]
  
The following code illustrates how to incorporate the `notify_fork()` function: 

   my_execution_context.notify_fork(execution_context::fork_prepare);
   if (fork() == 0)
   {
     // This is the child process.
     my_execution_context.notify_fork(execution_context::fork_child);
   }
   else
   {
     // This is the parent process.
     my_execution_context.notify_fork(execution_context::fork_parent);
   } 





[heading Remarks]
      
For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, performs `svc->notify_fork();`. When processing the fork\_prepare event, services are visited in reverse order of the beginning of service object lifetime. Otherwise, services are visited in order of the beginning of service object lifetime. 




[endsect]



[section:shutdown execution_context::shutdown]

[indexterm2 asio.indexterm.execution_context.shutdown..shutdown..execution_context] 
Shuts down all services in the context. 


  void shutdown();


This function is implemented as follows:


* For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, in reverse order of the beginning of service object lifetime, performs `svc->shutdown()`. 




[endsect]


[section:use_service execution_context::use_service]

[indexterm2 asio.indexterm.execution_context.use_service..use_service..execution_context] 
Obtain the service object corresponding to the given type. 


  template<
      typename ``[link asio.reference.Service Service]``>
  friend Service & ``[link asio.reference.execution_context.use_service.overload1 use_service]``(
      execution_context & e);
  ``  [''''&raquo;''' [link asio.reference.execution_context.use_service.overload1 more...]]``

  template<
      typename ``[link asio.reference.Service Service]``>
  friend Service & ``[link asio.reference.execution_context.use_service.overload2 use_service]``(
      io_context & ioc);
  ``  [''''&raquo;''' [link asio.reference.execution_context.use_service.overload2 more...]]``


[section:overload1 execution_context::use_service (1 of 2 overloads)]


Obtain the service object corresponding to the given type. 


  template<
      typename ``[link asio.reference.Service Service]``>
  friend Service & use_service(
      execution_context & e);


This function is used to locate a service object that corresponds to the given service type. If there is no existing implementation of the service, then the [link asio.reference.execution_context `execution_context`] will create a new instance of the service.


[heading Parameters]
    

[variablelist
  
[[e][The [link asio.reference.execution_context `execution_context`] object that owns the service.]]

]


[heading Return Value]
      
The service interface implementing the specified service type. Ownership of the service interface is not transferred to the caller. 



[heading Requirements]

['Header: ][^asio/execution_context.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]



[section:overload2 execution_context::use_service (2 of 2 overloads)]


Obtain the service object corresponding to the given type. 


  template<
      typename ``[link asio.reference.Service Service]``>
  friend Service & use_service(
      io_context & ioc);


This function is used to locate a service object that corresponds to the given service type. If there is no existing implementation of the service, then the [link asio.reference.io_context `io_context`] will create a new instance of the service.


[heading Parameters]
    

[variablelist
  
[[ioc][The [link asio.reference.io_context `io_context`] object that owns the service.]]

]


[heading Return Value]
      
The service interface implementing the specified service type. Ownership of the service interface is not transferred to the caller.


[heading Remarks]
      
This overload is preserved for backwards compatibility with services that inherit from [link asio.reference.io_context__service `io_context::service`]. 



[heading Requirements]

['Header: ][^asio/execution_context.hpp]

['Convenience header: ][^asio/execution.hpp]


[endsect]


[endsect]


[section:_execution_context execution_context::~execution_context]

[indexterm2 asio.indexterm.execution_context._execution_context..~execution_context..execution_context] 
Destructor. 


  ~execution_context();



[endsect]



[endsect]

[section:execution_context__id execution_context::id]


Class used to uniquely identify a service. 


  class id :
    noncopyable


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution_context__id.id [*id]] [constructor]]
    [Constructor. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/execution_context.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:id execution_context::id::id]

[indexterm2 asio.indexterm.execution_context__id.id..id..execution_context::id] 
Constructor. 


  id();



[endsect]



[endsect]

[section:execution_context__service execution_context::service]


Base class for all [link asio.reference.io_context `io_context`] services. 


  class service :
    noncopyable


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution_context__service.context [*context]]]
    [Get the context object that owns the service. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution_context__service.service [*service]] [constructor]]
    [Constructor. ]
  ]
  
  [
    [[link asio.reference.execution_context__service._service [*~service]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Private Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.execution_context__service.notify_fork [*notify_fork]]]
    [Handle notification of a fork-related event to perform any necessary housekeeping. ]
  ]
  
  [
    [[link asio.reference.execution_context__service.shutdown [*shutdown]]]
    [Destroy all user-defined handler objects owned by the service. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/execution_context.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:context execution_context::service::context]

[indexterm2 asio.indexterm.execution_context__service.context..context..execution_context::service] 
Get the context object that owns the service. 


  execution_context & context();



[endsect]



[section:service execution_context::service::service]

[indexterm2 asio.indexterm.execution_context__service.service..service..execution_context::service] 
Constructor. 


  service(
      execution_context & owner);



[heading Parameters]
    

[variablelist
  
[[owner][The [link asio.reference.execution_context `execution_context`] object that owns the service. ]]

]




[endsect]



[section:_service execution_context::service::~service]

[indexterm2 asio.indexterm.execution_context__service._service..~service..execution_context::service] 
Destructor. 


  virtual ~service();



[endsect]



[section:notify_fork execution_context::service::notify_fork]

[indexterm2 asio.indexterm.execution_context__service.notify_fork..notify_fork..execution_context::service] 
Handle notification of a fork-related event to perform any necessary housekeeping. 


  virtual void notify_fork(
      execution_context::fork_event event);


This function is not a pure virtual so that services only have to implement it if necessary. The default implementation does nothing. 


[endsect]



[section:shutdown execution_context::service::shutdown]

[indexterm2 asio.indexterm.execution_context__service.shutdown..shutdown..execution_context::service] 
Destroy all user-defined handler objects owned by the service. 


  void shutdown();



[endsect]



[endsect]

[section:executor executor]


Polymorphic wrapper for executors. 


  class executor


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.executor__unspecified_bool_type_t [*unspecified_bool_type_t]]]
    []
  
  ]

  [

    [[link asio.reference.executor.unspecified_bool_type [*unspecified_bool_type]]]
    []
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.executor.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.executor.defer [*defer]]]
    [Request the executor to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.executor.dispatch [*dispatch]]]
    [Request the executor to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.executor.executor [*executor]] [constructor]]
    [Default constructor. 
     [hr]
     Construct from nullptr. 
     [hr]
     Copy constructor. 
     [hr]
     Move constructor. 
     [hr]
     Construct a polymorphic wrapper for the specified executor. 
     [hr]
     Allocator-aware constructor to create a polymorphic wrapper for the specified executor. ]
  ]
  
  [
    [[link asio.reference.executor.on_work_finished [*on_work_finished]]]
    [Inform the executor that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.executor.on_work_started [*on_work_started]]]
    [Inform the executor that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.executor.operator_unspecified_bool_type [*operator unspecified_bool_type]]]
    [Operator to test if the executor contains a valid target. ]
  ]
  
  [
    [[link asio.reference.executor.operator_eq_ [*operator=]]]
    [Assignment operator. 
     [hr]
     
     [hr]
     Assignment operator for nullptr_t. 
     [hr]
     Assignment operator to create a polymorphic wrapper for the specified executor. ]
  ]
  
  [
    [[link asio.reference.executor.post [*post]]]
    [Request the executor to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.executor.target [*target]]]
    [Obtain a pointer to the target executor object. ]
  ]
  
  [
    [[link asio.reference.executor.target_type [*target_type]]]
    [Obtain type information for the target executor object. ]
  ]
  
  [
    [[link asio.reference.executor.unspecified_bool_true [*unspecified_bool_true]] [static]]
    []
  ]
  
  [
    [[link asio.reference.executor._executor [*~executor]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.executor.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.executor.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/executor.hpp]

['Convenience header: ][^asio.hpp]


[section:context executor::context]

[indexterm2 asio.indexterm.executor.context..context..executor] 
Obtain the underlying execution context. 


  execution_context & context() const;



[endsect]



[section:defer executor::defer]

[indexterm2 asio.indexterm.executor.defer..defer..executor] 
Request the executor to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void defer(
      Function && f,
      const Allocator & a) const;


This function is used to ask the executor to execute the given function object. The function object is executed according to the rules of the target executor object.


[heading Parameters]
    

[variablelist
  
[[f][The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:
``
   void function(); 
``
]]

[[a][An allocator that may be used by the executor to allocate the internal storage needed for function invocation. ]]

]




[endsect]



[section:dispatch executor::dispatch]

[indexterm2 asio.indexterm.executor.dispatch..dispatch..executor] 
Request the executor to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void dispatch(
      Function && f,
      const Allocator & a) const;


This function is used to ask the executor to execute the given function object. The function object is executed according to the rules of the target executor object.


[heading Parameters]
    

[variablelist
  
[[f][The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:
``
   void function(); 
``
]]

[[a][An allocator that may be used by the executor to allocate the internal storage needed for function invocation. ]]

]




[endsect]


[section:executor executor::executor]

[indexterm2 asio.indexterm.executor.executor..executor..executor] 
Default constructor. 


  ``[link asio.reference.executor.executor.overload1 executor]``();
  ``  [''''&raquo;''' [link asio.reference.executor.executor.overload1 more...]]``


Construct from nullptr. 


  ``[link asio.reference.executor.executor.overload2 executor]``(
      nullptr_t );
  ``  [''''&raquo;''' [link asio.reference.executor.executor.overload2 more...]]``


Copy constructor. 


  ``[link asio.reference.executor.executor.overload3 executor]``(
      const executor & other);
  ``  [''''&raquo;''' [link asio.reference.executor.executor.overload3 more...]]``


Move constructor. 


  ``[link asio.reference.executor.executor.overload4 executor]``(
      executor && other);
  ``  [''''&raquo;''' [link asio.reference.executor.executor.overload4 more...]]``


Construct a polymorphic wrapper for the specified executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``>
  ``[link asio.reference.executor.executor.overload5 executor]``(
      Executor e);
  ``  [''''&raquo;''' [link asio.reference.executor.executor.overload5 more...]]``


Allocator-aware constructor to create a polymorphic wrapper for the specified executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Allocator>
  ``[link asio.reference.executor.executor.overload6 executor]``(
      allocator_arg_t ,
      const Allocator & a,
      Executor e);
  ``  [''''&raquo;''' [link asio.reference.executor.executor.overload6 more...]]``


[section:overload1 executor::executor (1 of 6 overloads)]


Default constructor. 


  executor();



[endsect]



[section:overload2 executor::executor (2 of 6 overloads)]


Construct from nullptr. 


  executor(
      nullptr_t );



[endsect]



[section:overload3 executor::executor (3 of 6 overloads)]


Copy constructor. 


  executor(
      const executor & other);



[endsect]



[section:overload4 executor::executor (4 of 6 overloads)]


Move constructor. 


  executor(
      executor && other);



[endsect]



[section:overload5 executor::executor (5 of 6 overloads)]


Construct a polymorphic wrapper for the specified executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``>
  executor(
      Executor e);



[endsect]



[section:overload6 executor::executor (6 of 6 overloads)]


Allocator-aware constructor to create a polymorphic wrapper for the specified executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``,
      typename Allocator>
  executor(
      allocator_arg_t ,
      const Allocator & a,
      Executor e);



[endsect]


[endsect]


[section:on_work_finished executor::on_work_finished]

[indexterm2 asio.indexterm.executor.on_work_finished..on_work_finished..executor] 
Inform the executor that some work is no longer outstanding. 


  void on_work_finished() const;



[endsect]



[section:on_work_started executor::on_work_started]

[indexterm2 asio.indexterm.executor.on_work_started..on_work_started..executor] 
Inform the executor that it has some outstanding work to do. 


  void on_work_started() const;



[endsect]



[section:operator_unspecified_bool_type executor::operator unspecified_bool_type]

[indexterm2 asio.indexterm.executor.operator_unspecified_bool_type..operator unspecified_bool_type..executor] 
Operator to test if the executor contains a valid target. 


  operator unspecified_bool_type() const;



[endsect]



[section:operator_not__eq_ executor::operator!=]

[indexterm2 asio.indexterm.executor.operator_not__eq_..operator!=..executor] 
Compare two executors for inequality. 


  friend bool operator!=(
      const executor & a,
      const executor & b);


[heading Requirements]

['Header: ][^asio/executor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:operator_eq_ executor::operator=]

[indexterm2 asio.indexterm.executor.operator_eq_..operator=..executor] 
Assignment operator. 


  executor & ``[link asio.reference.executor.operator_eq_.overload1 operator=]``(
      const executor & other);
  ``  [''''&raquo;''' [link asio.reference.executor.operator_eq_.overload1 more...]]``



  executor & ``[link asio.reference.executor.operator_eq_.overload2 operator=]``(
      executor && other);
  ``  [''''&raquo;''' [link asio.reference.executor.operator_eq_.overload2 more...]]``


Assignment operator for nullptr\_t. 


  executor & ``[link asio.reference.executor.operator_eq_.overload3 operator=]``(
      nullptr_t );
  ``  [''''&raquo;''' [link asio.reference.executor.operator_eq_.overload3 more...]]``


Assignment operator to create a polymorphic wrapper for the specified executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``>
  executor & ``[link asio.reference.executor.operator_eq_.overload4 operator=]``(
      Executor && e);
  ``  [''''&raquo;''' [link asio.reference.executor.operator_eq_.overload4 more...]]``


[section:overload1 executor::operator= (1 of 4 overloads)]


Assignment operator. 


  executor & operator=(
      const executor & other);



[endsect]



[section:overload2 executor::operator= (2 of 4 overloads)]



  executor & operator=(
      executor && other);



[endsect]



[section:overload3 executor::operator= (3 of 4 overloads)]


Assignment operator for nullptr\_t. 


  executor & operator=(
      nullptr_t );



[endsect]



[section:overload4 executor::operator= (4 of 4 overloads)]


Assignment operator to create a polymorphic wrapper for the specified executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``>
  executor & operator=(
      Executor && e);



[endsect]


[endsect]


[section:operator_eq__eq_ executor::operator==]

[indexterm2 asio.indexterm.executor.operator_eq__eq_..operator==..executor] 
Compare two executors for equality. 


  friend bool operator==(
      const executor & a,
      const executor & b);


[heading Requirements]

['Header: ][^asio/executor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:post executor::post]

[indexterm2 asio.indexterm.executor.post..post..executor] 
Request the executor to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void post(
      Function && f,
      const Allocator & a) const;


This function is used to ask the executor to execute the given function object. The function object is executed according to the rules of the target executor object.


[heading Parameters]
    

[variablelist
  
[[f][The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:
``
   void function(); 
``
]]

[[a][An allocator that may be used by the executor to allocate the internal storage needed for function invocation. ]]

]




[endsect]


[section:target executor::target]

[indexterm2 asio.indexterm.executor.target..target..executor] 
Obtain a pointer to the target executor object. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``>
  Executor * ``[link asio.reference.executor.target.overload1 target]``();
  ``  [''''&raquo;''' [link asio.reference.executor.target.overload1 more...]]``

  template<
      typename ``[link asio.reference.Executor1 Executor]``>
  const Executor * ``[link asio.reference.executor.target.overload2 target]``() const;
  ``  [''''&raquo;''' [link asio.reference.executor.target.overload2 more...]]``


[section:overload1 executor::target (1 of 2 overloads)]


Obtain a pointer to the target executor object. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``>
  Executor * target();



[heading Return Value]
      
If `target_type() == typeid(T)`, a pointer to the stored executor target; otherwise, a null pointer. 




[endsect]



[section:overload2 executor::target (2 of 2 overloads)]


Obtain a pointer to the target executor object. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``>
  const Executor * target() const;



[heading Return Value]
      
If `target_type() == typeid(T)`, a pointer to the stored executor target; otherwise, a null pointer. 




[endsect]


[endsect]


[section:target_type executor::target_type]

[indexterm2 asio.indexterm.executor.target_type..target_type..executor] 
Obtain type information for the target executor object. 


  const std::type_info & target_type() const;



[heading Return Value]
      
If `*this` has a target type of type `T`, `typeid(T)`; otherwise, `typeid(void)`. 




[endsect]



[section:unspecified_bool_true executor::unspecified_bool_true]

[indexterm2 asio.indexterm.executor.unspecified_bool_true..unspecified_bool_true..executor] 

  static void unspecified_bool_true(
      unspecified_bool_type_t );



[endsect]



[section:unspecified_bool_type executor::unspecified_bool_type]

[indexterm2 asio.indexterm.executor.unspecified_bool_type..unspecified_bool_type..executor] 

  typedef void(*) unspecified_bool_type;



[heading Requirements]

['Header: ][^asio/executor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:_executor executor::~executor]

[indexterm2 asio.indexterm.executor._executor..~executor..executor] 
Destructor. 


  ~executor();



[endsect]



[endsect]

[section:executor__unspecified_bool_type_t executor::unspecified_bool_type_t]



  struct unspecified_bool_type_t


[heading Requirements]

['Header: ][^asio/executor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:executor_arg executor_arg]

[indexterm1 asio.indexterm.executor_arg..executor_arg] 
A special value, similar to std::nothrow, used to disambiguate constructors that accept executor arguments. 


  constexpr executor_arg_t executor_arg;


See [link asio.reference.executor_arg_t `executor_arg_t`] and [link asio.reference.uses_executor `uses_executor`] for more information. 

[heading Requirements]

['Header: ][^asio/uses_executor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:executor_arg_t executor_arg_t]


A special type, similar to std::nothrow\_t, used to disambiguate constructors that accept executor arguments. 


  struct executor_arg_t


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.executor_arg_t.executor_arg_t [*executor_arg_t]] [constructor]]
    [Constructor. ]
  ]
  
]

The [link asio.reference.executor_arg_t `executor_arg_t`] struct is an empty structure type used as a unique type to disambiguate constructor and function overloading. Specifically, some types have constructors with [link asio.reference.executor_arg_t `executor_arg_t`] as the first argument, immediately followed by an argument of a type that satisfies the Executor type requirements. 

[heading Requirements]

['Header: ][^asio/uses_executor.hpp]

['Convenience header: ][^asio.hpp]


[section:executor_arg_t executor_arg_t::executor_arg_t]

[indexterm2 asio.indexterm.executor_arg_t.executor_arg_t..executor_arg_t..executor_arg_t] 
Constructor. 


  constexpr executor_arg_t();



[endsect]



[endsect]

[section:executor_binder executor_binder]


A call wrapper type to bind an executor of type `Executor` to an object of type `T`. 


  template<
      typename T,
      typename ``[link asio.reference.Executor1 Executor]``>
  class executor_binder


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.executor_binder.argument_type [*argument_type]]]
    [The type of the function's argument. ]
  
  ]

  [

    [[link asio.reference.executor_binder.executor_type [*executor_type]]]
    [The type of the associated executor. ]
  
  ]

  [

    [[link asio.reference.executor_binder.first_argument_type [*first_argument_type]]]
    [The type of the function's first argument. ]
  
  ]

  [

    [[link asio.reference.executor_binder.result_type [*result_type]]]
    [The return type if a function. ]
  
  ]

  [

    [[link asio.reference.executor_binder.second_argument_type [*second_argument_type]]]
    [The type of the function's second argument. ]
  
  ]

  [

    [[link asio.reference.executor_binder.target_type [*target_type]]]
    [The type of the target object. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.executor_binder.executor_binder [*executor_binder]] [constructor]]
    [Construct an executor wrapper for the specified object. 
     [hr]
     Copy constructor. 
     [hr]
     Construct a copy, but specify a different executor. 
     [hr]
     Construct a copy of a different executor wrapper type. 
     [hr]
     Construct a copy of a different executor wrapper type, but specify a different executor. 
     [hr]
     Move constructor. 
     [hr]
     Move construct the target object, but specify a different executor. 
     [hr]
     Move construct from a different executor wrapper type. 
     [hr]
     Move construct from a different executor wrapper type, but specify a different executor. ]
  ]
  
  [
    [[link asio.reference.executor_binder.get [*get]]]
    [Obtain a reference to the target object. ]
  ]
  
  [
    [[link asio.reference.executor_binder.get_executor [*get_executor]]]
    [Obtain the associated executor. ]
  ]
  
  [
    [[link asio.reference.executor_binder.operator_lp__rp_ [*operator()]]]
    []
  ]
  
  [
    [[link asio.reference.executor_binder._executor_binder [*~executor_binder]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/bind_executor.hpp]

['Convenience header: ][^asio.hpp]


[section:argument_type executor_binder::argument_type]

[indexterm2 asio.indexterm.executor_binder.argument_type..argument_type..executor_binder] 
The type of the function's argument. 


  typedef see_below argument_type;



The type of `argument_type` is based on the type `T` of the wrapper's target object:


* if `T` is a pointer to a function type accepting a single argument, `argument_type` is a synonym for the return type of `T`;


* if `T` is a class type with a member type `argument_type`, then `argument_type` is a synonym for `T::argument_type`;


* otherwise `argument_type` is not defined. 



[heading Requirements]

['Header: ][^asio/bind_executor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:executor_binder executor_binder::executor_binder]

[indexterm2 asio.indexterm.executor_binder.executor_binder..executor_binder..executor_binder] 
Construct an executor wrapper for the specified object. 


  template<
      typename U>
  ``[link asio.reference.executor_binder.executor_binder.overload1 executor_binder]``(
      executor_arg_t ,
      const executor_type & e,
      U && u);
  ``  [''''&raquo;''' [link asio.reference.executor_binder.executor_binder.overload1 more...]]``


Copy constructor. 


  ``[link asio.reference.executor_binder.executor_binder.overload2 executor_binder]``(
      const executor_binder & other);
  ``  [''''&raquo;''' [link asio.reference.executor_binder.executor_binder.overload2 more...]]``


Construct a copy, but specify a different executor. 


  ``[link asio.reference.executor_binder.executor_binder.overload3 executor_binder]``(
      executor_arg_t ,
      const executor_type & e,
      const executor_binder & other);
  ``  [''''&raquo;''' [link asio.reference.executor_binder.executor_binder.overload3 more...]]``


Construct a copy of a different executor wrapper type. 


  template<
      typename U,
      typename ``[link asio.reference.Executor1 OtherExecutor]``>
  ``[link asio.reference.executor_binder.executor_binder.overload4 executor_binder]``(
      const executor_binder< U, OtherExecutor > & other);
  ``  [''''&raquo;''' [link asio.reference.executor_binder.executor_binder.overload4 more...]]``


Construct a copy of a different executor wrapper type, but specify a different executor. 


  template<
      typename U,
      typename ``[link asio.reference.Executor1 OtherExecutor]``>
  ``[link asio.reference.executor_binder.executor_binder.overload5 executor_binder]``(
      executor_arg_t ,
      const executor_type & e,
      const executor_binder< U, OtherExecutor > & other);
  ``  [''''&raquo;''' [link asio.reference.executor_binder.executor_binder.overload5 more...]]``


Move constructor. 


  ``[link asio.reference.executor_binder.executor_binder.overload6 executor_binder]``(
      executor_binder && other);
  ``  [''''&raquo;''' [link asio.reference.executor_binder.executor_binder.overload6 more...]]``


Move construct the target object, but specify a different executor. 


  ``[link asio.reference.executor_binder.executor_binder.overload7 executor_binder]``(
      executor_arg_t ,
      const executor_type & e,
      executor_binder && other);
  ``  [''''&raquo;''' [link asio.reference.executor_binder.executor_binder.overload7 more...]]``


Move construct from a different executor wrapper type. 


  template<
      typename U,
      typename ``[link asio.reference.Executor1 OtherExecutor]``>
  ``[link asio.reference.executor_binder.executor_binder.overload8 executor_binder]``(
      executor_binder< U, OtherExecutor > && other);
  ``  [''''&raquo;''' [link asio.reference.executor_binder.executor_binder.overload8 more...]]``


Move construct from a different executor wrapper type, but specify a different executor. 


  template<
      typename U,
      typename ``[link asio.reference.Executor1 OtherExecutor]``>
  ``[link asio.reference.executor_binder.executor_binder.overload9 executor_binder]``(
      executor_arg_t ,
      const executor_type & e,
      executor_binder< U, OtherExecutor > && other);
  ``  [''''&raquo;''' [link asio.reference.executor_binder.executor_binder.overload9 more...]]``


[section:overload1 executor_binder::executor_binder (1 of 9 overloads)]


Construct an executor wrapper for the specified object. 


  template<
      typename U>
  executor_binder(
      executor_arg_t ,
      const executor_type & e,
      U && u);


This constructor is only valid if the type `T` is constructible from type `U`. 


[endsect]



[section:overload2 executor_binder::executor_binder (2 of 9 overloads)]


Copy constructor. 


  executor_binder(
      const executor_binder & other);



[endsect]



[section:overload3 executor_binder::executor_binder (3 of 9 overloads)]


Construct a copy, but specify a different executor. 


  executor_binder(
      executor_arg_t ,
      const executor_type & e,
      const executor_binder & other);



[endsect]



[section:overload4 executor_binder::executor_binder (4 of 9 overloads)]


Construct a copy of a different executor wrapper type. 


  template<
      typename U,
      typename ``[link asio.reference.Executor1 OtherExecutor]``>
  executor_binder(
      const executor_binder< U, OtherExecutor > & other);


This constructor is only valid if the `Executor` type is constructible from type `OtherExecutor`, and the type `T` is constructible from type `U`. 


[endsect]



[section:overload5 executor_binder::executor_binder (5 of 9 overloads)]


Construct a copy of a different executor wrapper type, but specify a different executor. 


  template<
      typename U,
      typename ``[link asio.reference.Executor1 OtherExecutor]``>
  executor_binder(
      executor_arg_t ,
      const executor_type & e,
      const executor_binder< U, OtherExecutor > & other);


This constructor is only valid if the type `T` is constructible from type `U`. 


[endsect]



[section:overload6 executor_binder::executor_binder (6 of 9 overloads)]


Move constructor. 


  executor_binder(
      executor_binder && other);



[endsect]



[section:overload7 executor_binder::executor_binder (7 of 9 overloads)]


Move construct the target object, but specify a different executor. 


  executor_binder(
      executor_arg_t ,
      const executor_type & e,
      executor_binder && other);



[endsect]



[section:overload8 executor_binder::executor_binder (8 of 9 overloads)]


Move construct from a different executor wrapper type. 


  template<
      typename U,
      typename ``[link asio.reference.Executor1 OtherExecutor]``>
  executor_binder(
      executor_binder< U, OtherExecutor > && other);



[endsect]



[section:overload9 executor_binder::executor_binder (9 of 9 overloads)]


Move construct from a different executor wrapper type, but specify a different executor. 


  template<
      typename U,
      typename ``[link asio.reference.Executor1 OtherExecutor]``>
  executor_binder(
      executor_arg_t ,
      const executor_type & e,
      executor_binder< U, OtherExecutor > && other);



[endsect]


[endsect]


[section:executor_type executor_binder::executor_type]

[indexterm2 asio.indexterm.executor_binder.executor_type..executor_type..executor_binder] 
The type of the associated executor. 


  typedef Executor executor_type;



[heading Requirements]

['Header: ][^asio/bind_executor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:first_argument_type executor_binder::first_argument_type]

[indexterm2 asio.indexterm.executor_binder.first_argument_type..first_argument_type..executor_binder] 
The type of the function's first argument. 


  typedef see_below first_argument_type;



The type of `first_argument_type` is based on the type `T` of the wrapper's target object:


* if `T` is a pointer to a function type accepting two arguments, `first_argument_type` is a synonym for the return type of `T`;


* if `T` is a class type with a member type `first_argument_type`, then `first_argument_type` is a synonym for `T::first_argument_type`;


* otherwise `first_argument_type` is not defined. 



[heading Requirements]

['Header: ][^asio/bind_executor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:get executor_binder::get]

[indexterm2 asio.indexterm.executor_binder.get..get..executor_binder] 
Obtain a reference to the target object. 


  target_type & ``[link asio.reference.executor_binder.get.overload1 get]``();
  ``  [''''&raquo;''' [link asio.reference.executor_binder.get.overload1 more...]]``

  const target_type & ``[link asio.reference.executor_binder.get.overload2 get]``() const;
  ``  [''''&raquo;''' [link asio.reference.executor_binder.get.overload2 more...]]``


[section:overload1 executor_binder::get (1 of 2 overloads)]


Obtain a reference to the target object. 


  target_type & get();



[endsect]



[section:overload2 executor_binder::get (2 of 2 overloads)]


Obtain a reference to the target object. 


  const target_type & get() const;



[endsect]


[endsect]


[section:get_executor executor_binder::get_executor]

[indexterm2 asio.indexterm.executor_binder.get_executor..get_executor..executor_binder] 
Obtain the associated executor. 


  executor_type get_executor() const;



[endsect]


[section:operator_lp__rp_ executor_binder::operator()]

[indexterm2 asio.indexterm.executor_binder.operator_lp__rp_..operator()..executor_binder] 

  template<
      typename... Args>
  auto ``[link asio.reference.executor_binder.operator_lp__rp_.overload1 operator()]``(
      Args && ...);
  ``  [''''&raquo;''' [link asio.reference.executor_binder.operator_lp__rp_.overload1 more...]]``

  template<
      typename... Args>
  auto ``[link asio.reference.executor_binder.operator_lp__rp_.overload2 operator()]``(
      Args && ...) const;
  ``  [''''&raquo;''' [link asio.reference.executor_binder.operator_lp__rp_.overload2 more...]]``


[section:overload1 executor_binder::operator() (1 of 2 overloads)]



  template<
      typename... Args>
  auto operator()(
      Args && ...);



[endsect]



[section:overload2 executor_binder::operator() (2 of 2 overloads)]



  template<
      typename... Args>
  auto operator()(
      Args && ...) const;



[endsect]


[endsect]


[section:result_type executor_binder::result_type]

[indexterm2 asio.indexterm.executor_binder.result_type..result_type..executor_binder] 
The return type if a function. 


  typedef see_below result_type;



The type of `result_type` is based on the type `T` of the wrapper's target object:


* if `T` is a pointer to function type, `result_type` is a synonym for the return type of `T`;


* if `T` is a class type with a member type `result_type`, then `result_type` is a synonym for `T::result_type`;


* otherwise `result_type` is not defined. 



[heading Requirements]

['Header: ][^asio/bind_executor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:second_argument_type executor_binder::second_argument_type]

[indexterm2 asio.indexterm.executor_binder.second_argument_type..second_argument_type..executor_binder] 
The type of the function's second argument. 


  typedef see_below second_argument_type;



The type of `second_argument_type` is based on the type `T` of the wrapper's target object:


* if `T` is a pointer to a function type accepting two arguments, `second_argument_type` is a synonym for the return type of `T`;


* if `T` is a class type with a member type `first_argument_type`, then `second_argument_type` is a synonym for `T::second_argument_type`;


* otherwise `second_argument_type` is not defined. 



[heading Requirements]

['Header: ][^asio/bind_executor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:target_type executor_binder::target_type]

[indexterm2 asio.indexterm.executor_binder.target_type..target_type..executor_binder] 
The type of the target object. 


  typedef T target_type;



[heading Requirements]

['Header: ][^asio/bind_executor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:_executor_binder executor_binder::~executor_binder]

[indexterm2 asio.indexterm.executor_binder._executor_binder..~executor_binder..executor_binder] 
Destructor. 


  ~executor_binder();



[endsect]



[endsect]

[section:executor_work_guard executor_work_guard]


An object of type `executor_work_guard` controls ownership of executor work within a scope. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``>
  class executor_work_guard


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.executor_work_guard.executor_type [*executor_type]]]
    [The underlying executor type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.executor_work_guard.executor_work_guard [*executor_work_guard]] [constructor]]
    [Constructs a executor_work_guard object for the specified executor. 
     [hr]
     Copy constructor. 
     [hr]
     Move constructor. ]
  ]
  
  [
    [[link asio.reference.executor_work_guard.get_executor [*get_executor]]]
    [Obtain the associated executor. ]
  ]
  
  [
    [[link asio.reference.executor_work_guard.owns_work [*owns_work]]]
    [Whether the executor_work_guard object owns some outstanding work. ]
  ]
  
  [
    [[link asio.reference.executor_work_guard.reset [*reset]]]
    [Indicate that the work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.executor_work_guard._executor_work_guard [*~executor_work_guard]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/executor_work_guard.hpp]

['Convenience header: ][^asio.hpp]


[section:executor_type executor_work_guard::executor_type]

[indexterm2 asio.indexterm.executor_work_guard.executor_type..executor_type..executor_work_guard] 
The underlying executor type. 


  typedef Executor executor_type;



[heading Requirements]

['Header: ][^asio/executor_work_guard.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:executor_work_guard executor_work_guard::executor_work_guard]

[indexterm2 asio.indexterm.executor_work_guard.executor_work_guard..executor_work_guard..executor_work_guard] 
Constructs a `executor_work_guard` object for the specified executor. 


  explicit ``[link asio.reference.executor_work_guard.executor_work_guard.overload1 executor_work_guard]``(
      const executor_type & e);
  ``  [''''&raquo;''' [link asio.reference.executor_work_guard.executor_work_guard.overload1 more...]]``


Copy constructor. 


  ``[link asio.reference.executor_work_guard.executor_work_guard.overload2 executor_work_guard]``(
      const executor_work_guard & other);
  ``  [''''&raquo;''' [link asio.reference.executor_work_guard.executor_work_guard.overload2 more...]]``


Move constructor. 


  ``[link asio.reference.executor_work_guard.executor_work_guard.overload3 executor_work_guard]``(
      executor_work_guard && other);
  ``  [''''&raquo;''' [link asio.reference.executor_work_guard.executor_work_guard.overload3 more...]]``


[section:overload1 executor_work_guard::executor_work_guard (1 of 3 overloads)]


Constructs a `executor_work_guard` object for the specified executor. 


  executor_work_guard(
      const executor_type & e);


Stores a copy of `e` and calls `on_work_started()` on it. 


[endsect]



[section:overload2 executor_work_guard::executor_work_guard (2 of 3 overloads)]


Copy constructor. 


  executor_work_guard(
      const executor_work_guard & other);



[endsect]



[section:overload3 executor_work_guard::executor_work_guard (3 of 3 overloads)]


Move constructor. 


  executor_work_guard(
      executor_work_guard && other);



[endsect]


[endsect]


[section:get_executor executor_work_guard::get_executor]

[indexterm2 asio.indexterm.executor_work_guard.get_executor..get_executor..executor_work_guard] 
Obtain the associated executor. 


  executor_type get_executor() const;



[endsect]



[section:owns_work executor_work_guard::owns_work]

[indexterm2 asio.indexterm.executor_work_guard.owns_work..owns_work..executor_work_guard] 
Whether the [link asio.reference.executor_work_guard `executor_work_guard`] object owns some outstanding work. 


  bool owns_work() const;



[endsect]



[section:reset executor_work_guard::reset]

[indexterm2 asio.indexterm.executor_work_guard.reset..reset..executor_work_guard] 
Indicate that the work is no longer outstanding. 


  void reset();


Unless the object has already been reset, or is in a moved-from state, calls `on_work_finished()` on the stored executor. 


[endsect]



[section:_executor_work_guard executor_work_guard::~executor_work_guard]

[indexterm2 asio.indexterm.executor_work_guard._executor_work_guard..~executor_work_guard..executor_work_guard] 
Destructor. 


  ~executor_work_guard();


Unless the object has already been reset, or is in a moved-from state, calls `on_work_finished()` on the stored executor. 


[endsect]



[endsect]


[section:experimental__as_single experimental::as_single]

[indexterm1 asio.indexterm.experimental__as_single..experimental::as_single] 
Create a completion token to specify that the completion handler arguments should be combined into a single argument. 


  template<
      typename CompletionToken>
  constexpr as_single_t< typename decay< CompletionToken >::type > as_single(
      CompletionToken && completion_token);


[heading Requirements]

['Header: ][^asio/experimental/as_single.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:experimental__as_single_t experimental::as_single_t]


Completion token type used to specify that the completion handler arguments should be combined into a single argument. 


  template<
      typename CompletionToken>
  class as_single_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.experimental__as_single_t__default_constructor_tag [*default_constructor_tag]]]
    [Tag type used to prevent the "default" constructor from being used for conversions. ]
  
  ]

  [

    [[link asio.reference.experimental__as_single_t__executor_with_default [*executor_with_default]]]
    [Adapts an executor to add the as_single_t completion token as the default. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.experimental__as_single_t.as_default_on [*as_default_on]] [static]]
    [Function helper to adapt an I/O object to use as_single_t as its default completion token type. ]
  ]
  
  [
    [[link asio.reference.experimental__as_single_t.as_single_t [*as_single_t]] [constructor]]
    [Default constructor. 
     [hr]
     Constructor. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.experimental__as_single_t.token_ [*token_]]]
    []
  ]

]

The [link asio.reference.experimental__as_single_t `experimental::as_single_t`] class is used to indicate that any arguments to the completion handler should be combined and passed as a single argument. If there is already one argument, that argument is passed as-is. If there is more than argument, the arguments are first moved into a `std::tuple` and that tuple is then passed to the completion handler. 

[heading Requirements]

['Header: ][^asio/experimental/as_single.hpp]

['Convenience header: ][^asio.hpp]


[section:as_default_on experimental::as_single_t::as_default_on]

[indexterm2 asio.indexterm.experimental__as_single_t.as_default_on..as_default_on..experimental::as_single_t] 
Function helper to adapt an I/O object to use `as_single_t` as its default completion token type. 


  template<
      typename T>
  static decay< T >::type::template rebind_executor< executor_with_default< typename decay< T >::type::executor_type > >::other as_default_on(
      T && object);



[endsect]


[section:as_single_t experimental::as_single_t::as_single_t]

[indexterm2 asio.indexterm.experimental__as_single_t.as_single_t..as_single_t..experimental::as_single_t] 
Default constructor. 


  constexpr ``[link asio.reference.experimental__as_single_t.as_single_t.overload1 as_single_t]``(
      default_constructor_tag  = default_constructor_tag(),
      CompletionToken token = CompletionToken());
  ``  [''''&raquo;''' [link asio.reference.experimental__as_single_t.as_single_t.overload1 more...]]``


Constructor. 


  template<
      typename T>
  explicit constexpr ``[link asio.reference.experimental__as_single_t.as_single_t.overload2 as_single_t]``(
      T && completion_token);
  ``  [''''&raquo;''' [link asio.reference.experimental__as_single_t.as_single_t.overload2 more...]]``


[section:overload1 experimental::as_single_t::as_single_t (1 of 2 overloads)]


Default constructor. 


  constexpr as_single_t(
      default_constructor_tag  = default_constructor_tag(),
      CompletionToken token = CompletionToken());


This constructor is only valid if the underlying completion token is default constructible and move constructible. The underlying completion token is itself defaulted as an argument to allow it to capture a source location. 


[endsect]



[section:overload2 experimental::as_single_t::as_single_t (2 of 2 overloads)]


Constructor. 


  template<
      typename T>
  constexpr as_single_t(
      T && completion_token);



[endsect]


[endsect]


[section:token_ experimental::as_single_t::token_]

[indexterm2 asio.indexterm.experimental__as_single_t.token_..token_..experimental::as_single_t] 

  CompletionToken token_;



[endsect]



[endsect]

[section:experimental__as_single_t__default_constructor_tag experimental::as_single_t::default_constructor_tag]


Tag type used to prevent the "default" constructor from being used for conversions. 


  struct default_constructor_tag


[heading Requirements]

['Header: ][^asio/experimental/as_single.hpp]

['Convenience header: ][^asio.hpp]


[endsect]

[section:experimental__as_single_t__executor_with_default experimental::as_single_t::executor_with_default]


Adapts an executor to add the `as_single_t` completion token as the default. 


  template<
      typename ``[link asio.reference.Executor1 InnerExecutor]``>
  struct executor_with_default


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.experimental__as_single_t__executor_with_default.default_completion_token_type [*default_completion_token_type]]]
    [Specify as_single_t as the default completion token type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.experimental__as_single_t__executor_with_default.executor_with_default [*executor_with_default]] [constructor]]
    [Construct the adapted executor from the inner executor type. 
     [hr]
     Convert the specified executor to the inner executor type, then use that to construct the adapted executor. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/experimental/as_single.hpp]

['Convenience header: ][^asio.hpp]


[section:default_completion_token_type experimental::as_single_t::executor_with_default::default_completion_token_type]

[indexterm2 asio.indexterm.experimental__as_single_t__executor_with_default.default_completion_token_type..default_completion_token_type..experimental::as_single_t::executor_with_default] 
Specify `as_single_t` as the default completion token type. 


  typedef as_single_t default_completion_token_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.experimental__as_single_t__default_constructor_tag [*default_constructor_tag]]]
    [Tag type used to prevent the "default" constructor from being used for conversions. ]
  
  ]

  [

    [[link asio.reference.experimental__as_single_t__executor_with_default [*executor_with_default]]]
    [Adapts an executor to add the as_single_t completion token as the default. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.experimental__as_single_t.as_default_on [*as_default_on]] [static]]
    [Function helper to adapt an I/O object to use as_single_t as its default completion token type. ]
  ]
  
  [
    [[link asio.reference.experimental__as_single_t.as_single_t [*as_single_t]] [constructor]]
    [Default constructor. 
     [hr]
     Constructor. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.experimental__as_single_t.token_ [*token_]]]
    []
  ]

]

The [link asio.reference.experimental__as_single_t `experimental::as_single_t`] class is used to indicate that any arguments to the completion handler should be combined and passed as a single argument. If there is already one argument, that argument is passed as-is. If there is more than argument, the arguments are first moved into a `std::tuple` and that tuple is then passed to the completion handler. 


[heading Requirements]

['Header: ][^asio/experimental/as_single.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:executor_with_default experimental::as_single_t::executor_with_default::executor_with_default]

[indexterm2 asio.indexterm.experimental__as_single_t__executor_with_default.executor_with_default..executor_with_default..experimental::as_single_t::executor_with_default] 
Construct the adapted executor from the inner executor type. 


  ``[link asio.reference.experimental__as_single_t__executor_with_default.executor_with_default.overload1 executor_with_default]``(
      const InnerExecutor & ex);
  ``  [''''&raquo;''' [link asio.reference.experimental__as_single_t__executor_with_default.executor_with_default.overload1 more...]]``


Convert the specified executor to the inner executor type, then use that to construct the adapted executor. 


  template<
      typename ``[link asio.reference.Executor1 OtherExecutor]``>
  ``[link asio.reference.experimental__as_single_t__executor_with_default.executor_with_default.overload2 executor_with_default]``(
      const OtherExecutor & ex,
      typename enable_if< is_convertible< OtherExecutor, InnerExecutor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.experimental__as_single_t__executor_with_default.executor_with_default.overload2 more...]]``


[section:overload1 experimental::as_single_t::executor_with_default::executor_with_default (1 of 2 overloads)]


Construct the adapted executor from the inner executor type. 


  executor_with_default(
      const InnerExecutor & ex);



[endsect]



[section:overload2 experimental::as_single_t::executor_with_default::executor_with_default (2 of 2 overloads)]


Convert the specified executor to the inner executor type, then use that to construct the adapted executor. 


  template<
      typename ``[link asio.reference.Executor1 OtherExecutor]``>
  executor_with_default(
      const OtherExecutor & ex,
      typename enable_if< is_convertible< OtherExecutor, InnerExecutor >::value >::type *  = 0);



[endsect]


[endsect]


[endsect]

[section:generic__basic_endpoint generic::basic_endpoint]


Describes an endpoint for any socket type. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``>
  class basic_endpoint


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.generic__basic_endpoint.data_type [*data_type]]]
    [The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer. ]
  
  ]

  [

    [[link asio.reference.generic__basic_endpoint.protocol_type [*protocol_type]]]
    [The protocol type associated with the endpoint. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.generic__basic_endpoint.basic_endpoint [*basic_endpoint]] [constructor]]
    [Default constructor. 
     [hr]
     Construct an endpoint from the specified socket address. 
     [hr]
     Construct an endpoint from the specific endpoint type. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.capacity [*capacity]]]
    [Get the capacity of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.data [*data]]]
    [Get the underlying endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_eq_ [*operator=]]]
    [Assign from another endpoint. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.protocol [*protocol]]]
    [The protocol associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.resize [*resize]]]
    [Set the underlying size of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.size [*size]]]
    [Get the underlying size of the endpoint in the native type. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.generic__basic_endpoint.operator_not__eq_ [*operator!=]]]
    [Compare two endpoints for inequality. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_lt_ [*operator<]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_lt__eq_ [*operator<=]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_eq__eq_ [*operator==]]]
    [Compare two endpoints for equality. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_gt_ [*operator>]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_gt__eq_ [*operator>=]]]
    [Compare endpoints for ordering. ]
  ]
  
]

The [link asio.reference.generic__basic_endpoint `generic::basic_endpoint`] class template describes an endpoint that may be associated with any socket type.


[heading Remarks]
      
The socket types sockaddr type must be able to fit into a `sockaddr_storage` structure.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.




[heading Requirements]

['Header: ][^asio/generic/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]

[section:basic_endpoint generic::basic_endpoint::basic_endpoint]

[indexterm2 asio.indexterm.generic__basic_endpoint.basic_endpoint..basic_endpoint..generic::basic_endpoint] 
Default constructor. 


  ``[link asio.reference.generic__basic_endpoint.basic_endpoint.overload1 basic_endpoint]``();
  ``  [''''&raquo;''' [link asio.reference.generic__basic_endpoint.basic_endpoint.overload1 more...]]``


Construct an endpoint from the specified socket address. 


  ``[link asio.reference.generic__basic_endpoint.basic_endpoint.overload2 basic_endpoint]``(
      const void * socket_address,
      std::size_t socket_address_size,
      int socket_protocol = 0);
  ``  [''''&raquo;''' [link asio.reference.generic__basic_endpoint.basic_endpoint.overload2 more...]]``


Construct an endpoint from the specific endpoint type. 


  template<
      typename ``[link asio.reference.Endpoint Endpoint]``>
  ``[link asio.reference.generic__basic_endpoint.basic_endpoint.overload3 basic_endpoint]``(
      const Endpoint & endpoint);
  ``  [''''&raquo;''' [link asio.reference.generic__basic_endpoint.basic_endpoint.overload3 more...]]``


Copy constructor. 


  ``[link asio.reference.generic__basic_endpoint.basic_endpoint.overload4 basic_endpoint]``(
      const basic_endpoint & other);
  ``  [''''&raquo;''' [link asio.reference.generic__basic_endpoint.basic_endpoint.overload4 more...]]``


[section:overload1 generic::basic_endpoint::basic_endpoint (1 of 4 overloads)]


Default constructor. 


  basic_endpoint();



[endsect]



[section:overload2 generic::basic_endpoint::basic_endpoint (2 of 4 overloads)]


Construct an endpoint from the specified socket address. 


  basic_endpoint(
      const void * socket_address,
      std::size_t socket_address_size,
      int socket_protocol = 0);



[endsect]



[section:overload3 generic::basic_endpoint::basic_endpoint (3 of 4 overloads)]


Construct an endpoint from the specific endpoint type. 


  template<
      typename ``[link asio.reference.Endpoint Endpoint]``>
  basic_endpoint(
      const Endpoint & endpoint);



[endsect]



[section:overload4 generic::basic_endpoint::basic_endpoint (4 of 4 overloads)]


Copy constructor. 


  basic_endpoint(
      const basic_endpoint & other);



[endsect]


[endsect]


[section:capacity generic::basic_endpoint::capacity]

[indexterm2 asio.indexterm.generic__basic_endpoint.capacity..capacity..generic::basic_endpoint] 
Get the capacity of the endpoint in the native type. 


  std::size_t capacity() const;



[endsect]


[section:data generic::basic_endpoint::data]

[indexterm2 asio.indexterm.generic__basic_endpoint.data..data..generic::basic_endpoint] 
Get the underlying endpoint in the native type. 


  data_type * ``[link asio.reference.generic__basic_endpoint.data.overload1 data]``();
  ``  [''''&raquo;''' [link asio.reference.generic__basic_endpoint.data.overload1 more...]]``

  const data_type * ``[link asio.reference.generic__basic_endpoint.data.overload2 data]``() const;
  ``  [''''&raquo;''' [link asio.reference.generic__basic_endpoint.data.overload2 more...]]``


[section:overload1 generic::basic_endpoint::data (1 of 2 overloads)]


Get the underlying endpoint in the native type. 


  data_type * data();



[endsect]



[section:overload2 generic::basic_endpoint::data (2 of 2 overloads)]


Get the underlying endpoint in the native type. 


  const data_type * data() const;



[endsect]


[endsect]


[section:data_type generic::basic_endpoint::data_type]

[indexterm2 asio.indexterm.generic__basic_endpoint.data_type..data_type..generic::basic_endpoint] 
The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer. 


  typedef implementation_defined data_type;



[heading Requirements]

['Header: ][^asio/generic/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_not__eq_ generic::basic_endpoint::operator!=]

[indexterm2 asio.indexterm.generic__basic_endpoint.operator_not__eq_..operator!=..generic::basic_endpoint] 
Compare two endpoints for inequality. 


  friend bool operator!=(
      const basic_endpoint< Protocol > & e1,
      const basic_endpoint< Protocol > & e2);


[heading Requirements]

['Header: ][^asio/generic/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_lt_ generic::basic_endpoint::operator<]

[indexterm2 asio.indexterm.generic__basic_endpoint.operator_lt_..operator<..generic::basic_endpoint] 
Compare endpoints for ordering. 


  friend bool operator<(
      const basic_endpoint< Protocol > & e1,
      const basic_endpoint< Protocol > & e2);


[heading Requirements]

['Header: ][^asio/generic/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_lt__eq_ generic::basic_endpoint::operator<=]

[indexterm2 asio.indexterm.generic__basic_endpoint.operator_lt__eq_..operator<=..generic::basic_endpoint] 
Compare endpoints for ordering. 


  friend bool operator<=(
      const basic_endpoint< Protocol > & e1,
      const basic_endpoint< Protocol > & e2);


[heading Requirements]

['Header: ][^asio/generic/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq_ generic::basic_endpoint::operator=]

[indexterm2 asio.indexterm.generic__basic_endpoint.operator_eq_..operator=..generic::basic_endpoint] 
Assign from another endpoint. 


  basic_endpoint & operator=(
      const basic_endpoint & other);



[endsect]



[section:operator_eq__eq_ generic::basic_endpoint::operator==]

[indexterm2 asio.indexterm.generic__basic_endpoint.operator_eq__eq_..operator==..generic::basic_endpoint] 
Compare two endpoints for equality. 


  friend bool operator==(
      const basic_endpoint< Protocol > & e1,
      const basic_endpoint< Protocol > & e2);


[heading Requirements]

['Header: ][^asio/generic/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_gt_ generic::basic_endpoint::operator>]

[indexterm2 asio.indexterm.generic__basic_endpoint.operator_gt_..operator>..generic::basic_endpoint] 
Compare endpoints for ordering. 


  friend bool operator>(
      const basic_endpoint< Protocol > & e1,
      const basic_endpoint< Protocol > & e2);


[heading Requirements]

['Header: ][^asio/generic/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_gt__eq_ generic::basic_endpoint::operator>=]

[indexterm2 asio.indexterm.generic__basic_endpoint.operator_gt__eq_..operator>=..generic::basic_endpoint] 
Compare endpoints for ordering. 


  friend bool operator>=(
      const basic_endpoint< Protocol > & e1,
      const basic_endpoint< Protocol > & e2);


[heading Requirements]

['Header: ][^asio/generic/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:protocol generic::basic_endpoint::protocol]

[indexterm2 asio.indexterm.generic__basic_endpoint.protocol..protocol..generic::basic_endpoint] 
The protocol associated with the endpoint. 


  protocol_type protocol() const;



[endsect]



[section:protocol_type generic::basic_endpoint::protocol_type]

[indexterm2 asio.indexterm.generic__basic_endpoint.protocol_type..protocol_type..generic::basic_endpoint] 
The protocol type associated with the endpoint. 


  typedef Protocol protocol_type;



[heading Requirements]

['Header: ][^asio/generic/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:resize generic::basic_endpoint::resize]

[indexterm2 asio.indexterm.generic__basic_endpoint.resize..resize..generic::basic_endpoint] 
Set the underlying size of the endpoint in the native type. 


  void resize(
      std::size_t new_size);



[endsect]



[section:size generic::basic_endpoint::size]

[indexterm2 asio.indexterm.generic__basic_endpoint.size..size..generic::basic_endpoint] 
Get the underlying size of the endpoint in the native type. 


  std::size_t size() const;



[endsect]



[endsect]

[section:generic__datagram_protocol generic::datagram_protocol]


Encapsulates the flags needed for a generic datagram-oriented socket. 


  class datagram_protocol


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.generic__datagram_protocol.endpoint [*endpoint]]]
    [The type of an endpoint. ]
  
  ]

  [

    [[link asio.reference.generic__datagram_protocol.socket [*socket]]]
    [The generic socket type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.generic__datagram_protocol.datagram_protocol [*datagram_protocol]] [constructor]]
    [Construct a protocol object for a specific address family and protocol. 
     [hr]
     Construct a generic protocol object from a specific protocol. ]
  ]
  
  [
    [[link asio.reference.generic__datagram_protocol.family [*family]]]
    [Obtain an identifier for the protocol family. ]
  ]
  
  [
    [[link asio.reference.generic__datagram_protocol.protocol [*protocol]]]
    [Obtain an identifier for the protocol. ]
  ]
  
  [
    [[link asio.reference.generic__datagram_protocol.type [*type]]]
    [Obtain an identifier for the type of the protocol. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.generic__datagram_protocol.operator_not__eq_ [*operator!=]]]
    [Compare two protocols for inequality. ]
  ]
  
  [
    [[link asio.reference.generic__datagram_protocol.operator_eq__eq_ [*operator==]]]
    [Compare two protocols for equality. ]
  ]
  
]

The [link asio.reference.generic__datagram_protocol `generic::datagram_protocol`] class contains flags necessary for datagram-oriented sockets of any address family and protocol.


[heading Examples]
  
Constructing using a native address family and socket protocol: 

   datagram_protocol p(AF_INET, IPPROTO_UDP); 


Constructing from a specific protocol type: 

   datagram_protocol p(asio::ip::udp::v4()); 





[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Safe.




[heading Requirements]

['Header: ][^asio/generic/datagram_protocol.hpp]

['Convenience header: ][^asio.hpp]

[section:datagram_protocol generic::datagram_protocol::datagram_protocol]

[indexterm2 asio.indexterm.generic__datagram_protocol.datagram_protocol..datagram_protocol..generic::datagram_protocol] 
Construct a protocol object for a specific address family and protocol. 


  ``[link asio.reference.generic__datagram_protocol.datagram_protocol.overload1 datagram_protocol]``(
      int address_family,
      int socket_protocol);
  ``  [''''&raquo;''' [link asio.reference.generic__datagram_protocol.datagram_protocol.overload1 more...]]``


Construct a generic protocol object from a specific protocol. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``>
  ``[link asio.reference.generic__datagram_protocol.datagram_protocol.overload2 datagram_protocol]``(
      const Protocol & source_protocol);
  ``  [''''&raquo;''' [link asio.reference.generic__datagram_protocol.datagram_protocol.overload2 more...]]``


[section:overload1 generic::datagram_protocol::datagram_protocol (1 of 2 overloads)]


Construct a protocol object for a specific address family and protocol. 


  datagram_protocol(
      int address_family,
      int socket_protocol);



[endsect]



[section:overload2 generic::datagram_protocol::datagram_protocol (2 of 2 overloads)]


Construct a generic protocol object from a specific protocol. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``>
  datagram_protocol(
      const Protocol & source_protocol);



[heading Exceptions]
    

[variablelist
  
[[@c][bad\_cast Thrown if the source protocol is not datagram-oriented. ]]

]




[endsect]


[endsect]


[section:endpoint generic::datagram_protocol::endpoint]

[indexterm2 asio.indexterm.generic__datagram_protocol.endpoint..endpoint..generic::datagram_protocol] 
The type of an endpoint. 


  typedef basic_endpoint< datagram_protocol > endpoint;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.generic__basic_endpoint.data_type [*data_type]]]
    [The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer. ]
  
  ]

  [

    [[link asio.reference.generic__basic_endpoint.protocol_type [*protocol_type]]]
    [The protocol type associated with the endpoint. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.generic__basic_endpoint.basic_endpoint [*basic_endpoint]] [constructor]]
    [Default constructor. 
     [hr]
     Construct an endpoint from the specified socket address. 
     [hr]
     Construct an endpoint from the specific endpoint type. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.capacity [*capacity]]]
    [Get the capacity of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.data [*data]]]
    [Get the underlying endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_eq_ [*operator=]]]
    [Assign from another endpoint. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.protocol [*protocol]]]
    [The protocol associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.resize [*resize]]]
    [Set the underlying size of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.size [*size]]]
    [Get the underlying size of the endpoint in the native type. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.generic__basic_endpoint.operator_not__eq_ [*operator!=]]]
    [Compare two endpoints for inequality. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_lt_ [*operator<]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_lt__eq_ [*operator<=]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_eq__eq_ [*operator==]]]
    [Compare two endpoints for equality. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_gt_ [*operator>]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_gt__eq_ [*operator>=]]]
    [Compare endpoints for ordering. ]
  ]
  
]

The [link asio.reference.generic__basic_endpoint `generic::basic_endpoint`] class template describes an endpoint that may be associated with any socket type.


[heading Remarks]
      
The socket types sockaddr type must be able to fit into a `sockaddr_storage` structure.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.





[heading Requirements]

['Header: ][^asio/generic/datagram_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:family generic::datagram_protocol::family]

[indexterm2 asio.indexterm.generic__datagram_protocol.family..family..generic::datagram_protocol] 
Obtain an identifier for the protocol family. 


  int family() const;



[endsect]



[section:operator_not__eq_ generic::datagram_protocol::operator!=]

[indexterm2 asio.indexterm.generic__datagram_protocol.operator_not__eq_..operator!=..generic::datagram_protocol] 
Compare two protocols for inequality. 


  friend bool operator!=(
      const datagram_protocol & p1,
      const datagram_protocol & p2);


[heading Requirements]

['Header: ][^asio/generic/datagram_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq__eq_ generic::datagram_protocol::operator==]

[indexterm2 asio.indexterm.generic__datagram_protocol.operator_eq__eq_..operator==..generic::datagram_protocol] 
Compare two protocols for equality. 


  friend bool operator==(
      const datagram_protocol & p1,
      const datagram_protocol & p2);


[heading Requirements]

['Header: ][^asio/generic/datagram_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:protocol generic::datagram_protocol::protocol]

[indexterm2 asio.indexterm.generic__datagram_protocol.protocol..protocol..generic::datagram_protocol] 
Obtain an identifier for the protocol. 


  int protocol() const;



[endsect]



[section:socket generic::datagram_protocol::socket]

[indexterm2 asio.indexterm.generic__datagram_protocol.socket..socket..generic::datagram_protocol] 
The generic socket type. 


  typedef basic_datagram_socket< datagram_protocol > socket;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_datagram_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_datagram_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_receive [*async_receive]]]
    [Start an asynchronous receive on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_receive_from [*async_receive_from]]]
    [Start an asynchronous receive. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_send [*async_send]]]
    [Start an asynchronous send on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_send_to [*async_send_to]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.basic_datagram_socket [*basic_datagram_socket]] [constructor]]
    [Construct a basic_datagram_socket without opening it. 
     [hr]
     Construct and open a basic_datagram_socket. 
     [hr]
     Construct a basic_datagram_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_datagram_socket on an existing native socket. 
     [hr]
     Move-construct a basic_datagram_socket from another. 
     [hr]
     Move-construct a basic_datagram_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_datagram_socket from another. 
     [hr]
     Move-assign a basic_datagram_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.receive [*receive]]]
    [Receive some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.receive_from [*receive_from]]]
    [Receive a datagram with the endpoint of the sender. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.send [*send]]]
    [Send some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.send_to [*send_to]]]
    [Send a datagram to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket._basic_datagram_socket [*~basic_datagram_socket]] [destructor]]
    [Destroys the socket. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_datagram_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_datagram_socket `basic_datagram_socket`] class template provides asynchronous and blocking datagram-oriented socket functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/generic/datagram_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:type generic::datagram_protocol::type]

[indexterm2 asio.indexterm.generic__datagram_protocol.type..type..generic::datagram_protocol] 
Obtain an identifier for the type of the protocol. 


  int type() const;



[endsect]



[endsect]

[section:generic__raw_protocol generic::raw_protocol]


Encapsulates the flags needed for a generic raw socket. 


  class raw_protocol


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.generic__raw_protocol.endpoint [*endpoint]]]
    [The type of an endpoint. ]
  
  ]

  [

    [[link asio.reference.generic__raw_protocol.socket [*socket]]]
    [The generic socket type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.generic__raw_protocol.family [*family]]]
    [Obtain an identifier for the protocol family. ]
  ]
  
  [
    [[link asio.reference.generic__raw_protocol.protocol [*protocol]]]
    [Obtain an identifier for the protocol. ]
  ]
  
  [
    [[link asio.reference.generic__raw_protocol.raw_protocol [*raw_protocol]] [constructor]]
    [Construct a protocol object for a specific address family and protocol. 
     [hr]
     Construct a generic protocol object from a specific protocol. ]
  ]
  
  [
    [[link asio.reference.generic__raw_protocol.type [*type]]]
    [Obtain an identifier for the type of the protocol. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.generic__raw_protocol.operator_not__eq_ [*operator!=]]]
    [Compare two protocols for inequality. ]
  ]
  
  [
    [[link asio.reference.generic__raw_protocol.operator_eq__eq_ [*operator==]]]
    [Compare two protocols for equality. ]
  ]
  
]

The [link asio.reference.generic__raw_protocol `generic::raw_protocol`] class contains flags necessary for raw sockets of any address family and protocol.


[heading Examples]
  
Constructing using a native address family and socket protocol: 

   raw_protocol p(AF_INET, IPPROTO_ICMP); 


Constructing from a specific protocol type: 

   raw_protocol p(asio::ip::icmp::v4()); 





[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Safe.




[heading Requirements]

['Header: ][^asio/generic/raw_protocol.hpp]

['Convenience header: ][^asio.hpp]


[section:endpoint generic::raw_protocol::endpoint]

[indexterm2 asio.indexterm.generic__raw_protocol.endpoint..endpoint..generic::raw_protocol] 
The type of an endpoint. 


  typedef basic_endpoint< raw_protocol > endpoint;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.generic__basic_endpoint.data_type [*data_type]]]
    [The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer. ]
  
  ]

  [

    [[link asio.reference.generic__basic_endpoint.protocol_type [*protocol_type]]]
    [The protocol type associated with the endpoint. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.generic__basic_endpoint.basic_endpoint [*basic_endpoint]] [constructor]]
    [Default constructor. 
     [hr]
     Construct an endpoint from the specified socket address. 
     [hr]
     Construct an endpoint from the specific endpoint type. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.capacity [*capacity]]]
    [Get the capacity of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.data [*data]]]
    [Get the underlying endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_eq_ [*operator=]]]
    [Assign from another endpoint. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.protocol [*protocol]]]
    [The protocol associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.resize [*resize]]]
    [Set the underlying size of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.size [*size]]]
    [Get the underlying size of the endpoint in the native type. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.generic__basic_endpoint.operator_not__eq_ [*operator!=]]]
    [Compare two endpoints for inequality. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_lt_ [*operator<]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_lt__eq_ [*operator<=]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_eq__eq_ [*operator==]]]
    [Compare two endpoints for equality. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_gt_ [*operator>]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_gt__eq_ [*operator>=]]]
    [Compare endpoints for ordering. ]
  ]
  
]

The [link asio.reference.generic__basic_endpoint `generic::basic_endpoint`] class template describes an endpoint that may be associated with any socket type.


[heading Remarks]
      
The socket types sockaddr type must be able to fit into a `sockaddr_storage` structure.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.





[heading Requirements]

['Header: ][^asio/generic/raw_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:family generic::raw_protocol::family]

[indexterm2 asio.indexterm.generic__raw_protocol.family..family..generic::raw_protocol] 
Obtain an identifier for the protocol family. 


  int family() const;



[endsect]



[section:operator_not__eq_ generic::raw_protocol::operator!=]

[indexterm2 asio.indexterm.generic__raw_protocol.operator_not__eq_..operator!=..generic::raw_protocol] 
Compare two protocols for inequality. 


  friend bool operator!=(
      const raw_protocol & p1,
      const raw_protocol & p2);


[heading Requirements]

['Header: ][^asio/generic/raw_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq__eq_ generic::raw_protocol::operator==]

[indexterm2 asio.indexterm.generic__raw_protocol.operator_eq__eq_..operator==..generic::raw_protocol] 
Compare two protocols for equality. 


  friend bool operator==(
      const raw_protocol & p1,
      const raw_protocol & p2);


[heading Requirements]

['Header: ][^asio/generic/raw_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:protocol generic::raw_protocol::protocol]

[indexterm2 asio.indexterm.generic__raw_protocol.protocol..protocol..generic::raw_protocol] 
Obtain an identifier for the protocol. 


  int protocol() const;



[endsect]


[section:raw_protocol generic::raw_protocol::raw_protocol]

[indexterm2 asio.indexterm.generic__raw_protocol.raw_protocol..raw_protocol..generic::raw_protocol] 
Construct a protocol object for a specific address family and protocol. 


  ``[link asio.reference.generic__raw_protocol.raw_protocol.overload1 raw_protocol]``(
      int address_family,
      int socket_protocol);
  ``  [''''&raquo;''' [link asio.reference.generic__raw_protocol.raw_protocol.overload1 more...]]``


Construct a generic protocol object from a specific protocol. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``>
  ``[link asio.reference.generic__raw_protocol.raw_protocol.overload2 raw_protocol]``(
      const Protocol & source_protocol);
  ``  [''''&raquo;''' [link asio.reference.generic__raw_protocol.raw_protocol.overload2 more...]]``


[section:overload1 generic::raw_protocol::raw_protocol (1 of 2 overloads)]


Construct a protocol object for a specific address family and protocol. 


  raw_protocol(
      int address_family,
      int socket_protocol);



[endsect]



[section:overload2 generic::raw_protocol::raw_protocol (2 of 2 overloads)]


Construct a generic protocol object from a specific protocol. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``>
  raw_protocol(
      const Protocol & source_protocol);



[heading Exceptions]
    

[variablelist
  
[[@c][bad\_cast Thrown if the source protocol is not raw-oriented. ]]

]




[endsect]


[endsect]


[section:socket generic::raw_protocol::socket]

[indexterm2 asio.indexterm.generic__raw_protocol.socket..socket..generic::raw_protocol] 
The generic socket type. 


  typedef basic_raw_socket< raw_protocol > socket;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_raw_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_raw_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_receive [*async_receive]]]
    [Start an asynchronous receive on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_receive_from [*async_receive_from]]]
    [Start an asynchronous receive. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_send [*async_send]]]
    [Start an asynchronous send on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_send_to [*async_send_to]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.basic_raw_socket [*basic_raw_socket]] [constructor]]
    [Construct a basic_raw_socket without opening it. 
     [hr]
     Construct and open a basic_raw_socket. 
     [hr]
     Construct a basic_raw_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_raw_socket on an existing native socket. 
     [hr]
     Move-construct a basic_raw_socket from another. 
     [hr]
     Move-construct a basic_raw_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_raw_socket from another. 
     [hr]
     Move-assign a basic_raw_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.receive [*receive]]]
    [Receive some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.receive_from [*receive_from]]]
    [Receive raw data with the endpoint of the sender. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.send [*send]]]
    [Send some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.send_to [*send_to]]]
    [Send raw data to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket._basic_raw_socket [*~basic_raw_socket]] [destructor]]
    [Destroys the socket. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_raw_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_raw_socket `basic_raw_socket`] class template provides asynchronous and blocking raw-oriented socket functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/generic/raw_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:type generic::raw_protocol::type]

[indexterm2 asio.indexterm.generic__raw_protocol.type..type..generic::raw_protocol] 
Obtain an identifier for the type of the protocol. 


  int type() const;



[endsect]



[endsect]

[section:generic__seq_packet_protocol generic::seq_packet_protocol]


Encapsulates the flags needed for a generic sequenced packet socket. 


  class seq_packet_protocol


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.generic__seq_packet_protocol.endpoint [*endpoint]]]
    [The type of an endpoint. ]
  
  ]

  [

    [[link asio.reference.generic__seq_packet_protocol.socket [*socket]]]
    [The generic socket type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.generic__seq_packet_protocol.family [*family]]]
    [Obtain an identifier for the protocol family. ]
  ]
  
  [
    [[link asio.reference.generic__seq_packet_protocol.protocol [*protocol]]]
    [Obtain an identifier for the protocol. ]
  ]
  
  [
    [[link asio.reference.generic__seq_packet_protocol.seq_packet_protocol [*seq_packet_protocol]] [constructor]]
    [Construct a protocol object for a specific address family and protocol. 
     [hr]
     Construct a generic protocol object from a specific protocol. ]
  ]
  
  [
    [[link asio.reference.generic__seq_packet_protocol.type [*type]]]
    [Obtain an identifier for the type of the protocol. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.generic__seq_packet_protocol.operator_not__eq_ [*operator!=]]]
    [Compare two protocols for inequality. ]
  ]
  
  [
    [[link asio.reference.generic__seq_packet_protocol.operator_eq__eq_ [*operator==]]]
    [Compare two protocols for equality. ]
  ]
  
]

The [link asio.reference.generic__seq_packet_protocol `generic::seq_packet_protocol`] class contains flags necessary for seq\_packet-oriented sockets of any address family and protocol.


[heading Examples]
  
Constructing using a native address family and socket protocol: 

   seq_packet_protocol p(AF_INET, IPPROTO_SCTP); 





[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Safe.




[heading Requirements]

['Header: ][^asio/generic/seq_packet_protocol.hpp]

['Convenience header: ][^asio.hpp]


[section:endpoint generic::seq_packet_protocol::endpoint]

[indexterm2 asio.indexterm.generic__seq_packet_protocol.endpoint..endpoint..generic::seq_packet_protocol] 
The type of an endpoint. 


  typedef basic_endpoint< seq_packet_protocol > endpoint;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.generic__basic_endpoint.data_type [*data_type]]]
    [The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer. ]
  
  ]

  [

    [[link asio.reference.generic__basic_endpoint.protocol_type [*protocol_type]]]
    [The protocol type associated with the endpoint. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.generic__basic_endpoint.basic_endpoint [*basic_endpoint]] [constructor]]
    [Default constructor. 
     [hr]
     Construct an endpoint from the specified socket address. 
     [hr]
     Construct an endpoint from the specific endpoint type. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.capacity [*capacity]]]
    [Get the capacity of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.data [*data]]]
    [Get the underlying endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_eq_ [*operator=]]]
    [Assign from another endpoint. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.protocol [*protocol]]]
    [The protocol associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.resize [*resize]]]
    [Set the underlying size of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.size [*size]]]
    [Get the underlying size of the endpoint in the native type. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.generic__basic_endpoint.operator_not__eq_ [*operator!=]]]
    [Compare two endpoints for inequality. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_lt_ [*operator<]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_lt__eq_ [*operator<=]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_eq__eq_ [*operator==]]]
    [Compare two endpoints for equality. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_gt_ [*operator>]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_gt__eq_ [*operator>=]]]
    [Compare endpoints for ordering. ]
  ]
  
]

The [link asio.reference.generic__basic_endpoint `generic::basic_endpoint`] class template describes an endpoint that may be associated with any socket type.


[heading Remarks]
      
The socket types sockaddr type must be able to fit into a `sockaddr_storage` structure.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.





[heading Requirements]

['Header: ][^asio/generic/seq_packet_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:family generic::seq_packet_protocol::family]

[indexterm2 asio.indexterm.generic__seq_packet_protocol.family..family..generic::seq_packet_protocol] 
Obtain an identifier for the protocol family. 


  int family() const;



[endsect]



[section:operator_not__eq_ generic::seq_packet_protocol::operator!=]

[indexterm2 asio.indexterm.generic__seq_packet_protocol.operator_not__eq_..operator!=..generic::seq_packet_protocol] 
Compare two protocols for inequality. 


  friend bool operator!=(
      const seq_packet_protocol & p1,
      const seq_packet_protocol & p2);


[heading Requirements]

['Header: ][^asio/generic/seq_packet_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq__eq_ generic::seq_packet_protocol::operator==]

[indexterm2 asio.indexterm.generic__seq_packet_protocol.operator_eq__eq_..operator==..generic::seq_packet_protocol] 
Compare two protocols for equality. 


  friend bool operator==(
      const seq_packet_protocol & p1,
      const seq_packet_protocol & p2);


[heading Requirements]

['Header: ][^asio/generic/seq_packet_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:protocol generic::seq_packet_protocol::protocol]

[indexterm2 asio.indexterm.generic__seq_packet_protocol.protocol..protocol..generic::seq_packet_protocol] 
Obtain an identifier for the protocol. 


  int protocol() const;



[endsect]


[section:seq_packet_protocol generic::seq_packet_protocol::seq_packet_protocol]

[indexterm2 asio.indexterm.generic__seq_packet_protocol.seq_packet_protocol..seq_packet_protocol..generic::seq_packet_protocol] 
Construct a protocol object for a specific address family and protocol. 


  ``[link asio.reference.generic__seq_packet_protocol.seq_packet_protocol.overload1 seq_packet_protocol]``(
      int address_family,
      int socket_protocol);
  ``  [''''&raquo;''' [link asio.reference.generic__seq_packet_protocol.seq_packet_protocol.overload1 more...]]``


Construct a generic protocol object from a specific protocol. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``>
  ``[link asio.reference.generic__seq_packet_protocol.seq_packet_protocol.overload2 seq_packet_protocol]``(
      const Protocol & source_protocol);
  ``  [''''&raquo;''' [link asio.reference.generic__seq_packet_protocol.seq_packet_protocol.overload2 more...]]``


[section:overload1 generic::seq_packet_protocol::seq_packet_protocol (1 of 2 overloads)]


Construct a protocol object for a specific address family and protocol. 


  seq_packet_protocol(
      int address_family,
      int socket_protocol);



[endsect]



[section:overload2 generic::seq_packet_protocol::seq_packet_protocol (2 of 2 overloads)]


Construct a generic protocol object from a specific protocol. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``>
  seq_packet_protocol(
      const Protocol & source_protocol);



[heading Exceptions]
    

[variablelist
  
[[@c][bad\_cast Thrown if the source protocol is not based around sequenced packets. ]]

]




[endsect]


[endsect]


[section:socket generic::seq_packet_protocol::socket]

[indexterm2 asio.indexterm.generic__seq_packet_protocol.socket..socket..generic::seq_packet_protocol] 
The generic socket type. 


  typedef basic_seq_packet_socket< seq_packet_protocol > socket;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_seq_packet_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_seq_packet_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_seq_packet_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.async_receive [*async_receive]]]
    [Start an asynchronous receive. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.async_send [*async_send]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket [*basic_seq_packet_socket]] [constructor]]
    [Construct a basic_seq_packet_socket without opening it. 
     [hr]
     Construct and open a basic_seq_packet_socket. 
     [hr]
     Construct a basic_seq_packet_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_seq_packet_socket on an existing native socket. 
     [hr]
     Move-construct a basic_seq_packet_socket from another. 
     [hr]
     Move-construct a basic_seq_packet_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_seq_packet_socket from another. 
     [hr]
     Move-assign a basic_seq_packet_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.receive [*receive]]]
    [Receive some data on the socket. 
     [hr]
     Receive some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.send [*send]]]
    [Send some data on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket._basic_seq_packet_socket [*~basic_seq_packet_socket]] [destructor]]
    [Destroys the socket. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_seq_packet_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_seq_packet_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_seq_packet_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_seq_packet_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_seq_packet_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_seq_packet_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] class template provides asynchronous and blocking sequenced packet socket functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/generic/seq_packet_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:type generic::seq_packet_protocol::type]

[indexterm2 asio.indexterm.generic__seq_packet_protocol.type..type..generic::seq_packet_protocol] 
Obtain an identifier for the type of the protocol. 


  int type() const;



[endsect]



[endsect]

[section:generic__stream_protocol generic::stream_protocol]


Encapsulates the flags needed for a generic stream-oriented socket. 


  class stream_protocol


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.generic__stream_protocol.endpoint [*endpoint]]]
    [The type of an endpoint. ]
  
  ]

  [

    [[link asio.reference.generic__stream_protocol.iostream [*iostream]]]
    [The generic socket iostream type. ]
  
  ]

  [

    [[link asio.reference.generic__stream_protocol.socket [*socket]]]
    [The generic socket type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.generic__stream_protocol.family [*family]]]
    [Obtain an identifier for the protocol family. ]
  ]
  
  [
    [[link asio.reference.generic__stream_protocol.protocol [*protocol]]]
    [Obtain an identifier for the protocol. ]
  ]
  
  [
    [[link asio.reference.generic__stream_protocol.stream_protocol [*stream_protocol]] [constructor]]
    [Construct a protocol object for a specific address family and protocol. 
     [hr]
     Construct a generic protocol object from a specific protocol. ]
  ]
  
  [
    [[link asio.reference.generic__stream_protocol.type [*type]]]
    [Obtain an identifier for the type of the protocol. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.generic__stream_protocol.operator_not__eq_ [*operator!=]]]
    [Compare two protocols for inequality. ]
  ]
  
  [
    [[link asio.reference.generic__stream_protocol.operator_eq__eq_ [*operator==]]]
    [Compare two protocols for equality. ]
  ]
  
]

The [link asio.reference.generic__stream_protocol `generic::stream_protocol`] class contains flags necessary for stream-oriented sockets of any address family and protocol.


[heading Examples]
  
Constructing using a native address family and socket protocol: 

   stream_protocol p(AF_INET, IPPROTO_TCP); 


Constructing from a specific protocol type: 

   stream_protocol p(asio::ip::tcp::v4()); 





[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Safe.




[heading Requirements]

['Header: ][^asio/generic/stream_protocol.hpp]

['Convenience header: ][^asio.hpp]


[section:endpoint generic::stream_protocol::endpoint]

[indexterm2 asio.indexterm.generic__stream_protocol.endpoint..endpoint..generic::stream_protocol] 
The type of an endpoint. 


  typedef basic_endpoint< stream_protocol > endpoint;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.generic__basic_endpoint.data_type [*data_type]]]
    [The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer. ]
  
  ]

  [

    [[link asio.reference.generic__basic_endpoint.protocol_type [*protocol_type]]]
    [The protocol type associated with the endpoint. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.generic__basic_endpoint.basic_endpoint [*basic_endpoint]] [constructor]]
    [Default constructor. 
     [hr]
     Construct an endpoint from the specified socket address. 
     [hr]
     Construct an endpoint from the specific endpoint type. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.capacity [*capacity]]]
    [Get the capacity of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.data [*data]]]
    [Get the underlying endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_eq_ [*operator=]]]
    [Assign from another endpoint. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.protocol [*protocol]]]
    [The protocol associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.resize [*resize]]]
    [Set the underlying size of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.size [*size]]]
    [Get the underlying size of the endpoint in the native type. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.generic__basic_endpoint.operator_not__eq_ [*operator!=]]]
    [Compare two endpoints for inequality. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_lt_ [*operator<]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_lt__eq_ [*operator<=]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_eq__eq_ [*operator==]]]
    [Compare two endpoints for equality. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_gt_ [*operator>]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.generic__basic_endpoint.operator_gt__eq_ [*operator>=]]]
    [Compare endpoints for ordering. ]
  ]
  
]

The [link asio.reference.generic__basic_endpoint `generic::basic_endpoint`] class template describes an endpoint that may be associated with any socket type.


[heading Remarks]
      
The socket types sockaddr type must be able to fit into a `sockaddr_storage` structure.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.





[heading Requirements]

['Header: ][^asio/generic/stream_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:family generic::stream_protocol::family]

[indexterm2 asio.indexterm.generic__stream_protocol.family..family..generic::stream_protocol] 
Obtain an identifier for the protocol family. 


  int family() const;



[endsect]



[section:iostream generic::stream_protocol::iostream]

[indexterm2 asio.indexterm.generic__stream_protocol.iostream..iostream..generic::stream_protocol] 
The generic socket iostream type. 


  typedef basic_socket_iostream< stream_protocol > iostream;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_socket_iostream.clock_type [*clock_type]]]
    [The clock type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.duration [*duration]]]
    [The duration type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.duration_type [*duration_type]]]
    [(Deprecated: Use duration.) The duration type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.time_point [*time_point]]]
    [The time type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.time_type [*time_type]]]
    [(Deprecated: Use time_point.) The time type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket_iostream.basic_socket_iostream [*basic_socket_iostream]] [constructor]]
    [Construct a basic_socket_iostream without establishing a connection. 
     [hr]
     Construct a basic_socket_iostream from the supplied socket. 
     [hr]
     Move-construct a basic_socket_iostream from another. 
     [hr]
     Establish a connection to an endpoint corresponding to a resolver query. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.close [*close]]]
    [Close the connection. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.connect [*connect]]]
    [Establish a connection to an endpoint corresponding to a resolver query. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.error [*error]]]
    [Get the last error associated with the stream. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.expires_after [*expires_after]]]
    [Set the stream's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.expires_at [*expires_at]]]
    [(Deprecated: Use expiry().) Get the stream's expiry time as an absolute time. 
     [hr]
     Set the stream's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.expires_from_now [*expires_from_now]]]
    [(Deprecated: Use expiry().) Get the stream's expiry time relative to now. 
     [hr]
     (Deprecated: Use expires_after().) Set the stream's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.expiry [*expiry]]]
    [Get the stream's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.operator_eq_ [*operator=]]]
    [Move-assign a basic_socket_iostream from another. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.rdbuf [*rdbuf]]]
    [Return a pointer to the underlying streambuf. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.socket [*socket]]]
    [Get a reference to the underlying socket. ]
  ]
  
]


[heading Requirements]

['Header: ][^asio/generic/stream_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_not__eq_ generic::stream_protocol::operator!=]

[indexterm2 asio.indexterm.generic__stream_protocol.operator_not__eq_..operator!=..generic::stream_protocol] 
Compare two protocols for inequality. 


  friend bool operator!=(
      const stream_protocol & p1,
      const stream_protocol & p2);


[heading Requirements]

['Header: ][^asio/generic/stream_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq__eq_ generic::stream_protocol::operator==]

[indexterm2 asio.indexterm.generic__stream_protocol.operator_eq__eq_..operator==..generic::stream_protocol] 
Compare two protocols for equality. 


  friend bool operator==(
      const stream_protocol & p1,
      const stream_protocol & p2);


[heading Requirements]

['Header: ][^asio/generic/stream_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:protocol generic::stream_protocol::protocol]

[indexterm2 asio.indexterm.generic__stream_protocol.protocol..protocol..generic::stream_protocol] 
Obtain an identifier for the protocol. 


  int protocol() const;



[endsect]



[section:socket generic::stream_protocol::socket]

[indexterm2 asio.indexterm.generic__stream_protocol.socket..socket..generic::stream_protocol] 
The generic socket type. 


  typedef basic_stream_socket< stream_protocol > socket;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_stream_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_stream_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_read_some [*async_read_some]]]
    [Start an asynchronous read. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_receive [*async_receive]]]
    [Start an asynchronous receive. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_send [*async_send]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_write_some [*async_write_some]]]
    [Start an asynchronous write. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.basic_stream_socket [*basic_stream_socket]] [constructor]]
    [Construct a basic_stream_socket without opening it. 
     [hr]
     Construct and open a basic_stream_socket. 
     [hr]
     Construct a basic_stream_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_stream_socket on an existing native socket. 
     [hr]
     Move-construct a basic_stream_socket from another. 
     [hr]
     Move-construct a basic_stream_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_stream_socket from another. 
     [hr]
     Move-assign a basic_stream_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.read_some [*read_some]]]
    [Read some data from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.receive [*receive]]]
    [Receive some data on the socket. 
     [hr]
     Receive some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.send [*send]]]
    [Send some data on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.write_some [*write_some]]]
    [Write some data to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket._basic_stream_socket [*~basic_stream_socket]] [destructor]]
    [Destroys the socket. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_stream_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_stream_socket `basic_stream_socket`] class template provides asynchronous and blocking stream-oriented socket functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.





[heading Requirements]

['Header: ][^asio/generic/stream_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:stream_protocol generic::stream_protocol::stream_protocol]

[indexterm2 asio.indexterm.generic__stream_protocol.stream_protocol..stream_protocol..generic::stream_protocol] 
Construct a protocol object for a specific address family and protocol. 


  ``[link asio.reference.generic__stream_protocol.stream_protocol.overload1 stream_protocol]``(
      int address_family,
      int socket_protocol);
  ``  [''''&raquo;''' [link asio.reference.generic__stream_protocol.stream_protocol.overload1 more...]]``


Construct a generic protocol object from a specific protocol. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``>
  ``[link asio.reference.generic__stream_protocol.stream_protocol.overload2 stream_protocol]``(
      const Protocol & source_protocol);
  ``  [''''&raquo;''' [link asio.reference.generic__stream_protocol.stream_protocol.overload2 more...]]``


[section:overload1 generic::stream_protocol::stream_protocol (1 of 2 overloads)]


Construct a protocol object for a specific address family and protocol. 


  stream_protocol(
      int address_family,
      int socket_protocol);



[endsect]



[section:overload2 generic::stream_protocol::stream_protocol (2 of 2 overloads)]


Construct a generic protocol object from a specific protocol. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``>
  stream_protocol(
      const Protocol & source_protocol);



[heading Exceptions]
    

[variablelist
  
[[@c][bad\_cast Thrown if the source protocol is not stream-oriented. ]]

]




[endsect]


[endsect]


[section:type generic::stream_protocol::type]

[indexterm2 asio.indexterm.generic__stream_protocol.type..type..generic::stream_protocol] 
Obtain an identifier for the type of the protocol. 


  int type() const;



[endsect]



[endsect]

[section:get_associated_allocator get_associated_allocator]

[indexterm1 asio.indexterm.get_associated_allocator..get_associated_allocator] 
Helper function to obtain an object's associated allocator. 

  template<
      typename T>
  associated_allocator< T >::type ``[link asio.reference.get_associated_allocator.overload1 get_associated_allocator]``(
      const T & t);
  ``  [''''&raquo;''' [link asio.reference.get_associated_allocator.overload1 more...]]``

  template<
      typename T,
      typename Allocator>
  associated_allocator< T, Allocator >::type ``[link asio.reference.get_associated_allocator.overload2 get_associated_allocator]``(
      const T & t,
      const Allocator & a);
  ``  [''''&raquo;''' [link asio.reference.get_associated_allocator.overload2 more...]]``

[heading Requirements]

['Header: ][^asio/associated_allocator.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 get_associated_allocator (1 of 2 overloads)]


Helper function to obtain an object's associated allocator. 


  template<
      typename T>
  associated_allocator< T >::type get_associated_allocator(
      const T & t);



[heading Return Value]
      
`associated_allocator<T>::get(t)` 




[endsect]



[section:overload2 get_associated_allocator (2 of 2 overloads)]


Helper function to obtain an object's associated allocator. 


  template<
      typename T,
      typename Allocator>
  associated_allocator< T, Allocator >::type get_associated_allocator(
      const T & t,
      const Allocator & a);



[heading Return Value]
      
`associated_allocator<T, Allocator>::get(t, a)` 




[endsect]


[endsect]

[section:get_associated_executor get_associated_executor]

[indexterm1 asio.indexterm.get_associated_executor..get_associated_executor] 
Helper function to obtain an object's associated executor. 

  template<
      typename T>
  associated_executor< T >::type ``[link asio.reference.get_associated_executor.overload1 get_associated_executor]``(
      const T & t);
  ``  [''''&raquo;''' [link asio.reference.get_associated_executor.overload1 more...]]``

  template<
      typename T,
      typename ``[link asio.reference.Executor1 Executor]``>
  associated_executor< T, Executor >::type ``[link asio.reference.get_associated_executor.overload2 get_associated_executor]``(
      const T & t,
      const Executor & ex,
      typename enable_if< is_executor< Executor >::value||execution::is_executor< Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.get_associated_executor.overload2 more...]]``

  template<
      typename T,
      typename ExecutionContext>
  associated_executor< T, typename ExecutionContext::executor_type >::type ``[link asio.reference.get_associated_executor.overload3 get_associated_executor]``(
      const T & t,
      ExecutionContext & ctx,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.get_associated_executor.overload3 more...]]``

[heading Requirements]

['Header: ][^asio/associated_executor.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 get_associated_executor (1 of 3 overloads)]


Helper function to obtain an object's associated executor. 


  template<
      typename T>
  associated_executor< T >::type get_associated_executor(
      const T & t);



[heading Return Value]
      
`associated_executor<T>::get(t)` 




[endsect]



[section:overload2 get_associated_executor (2 of 3 overloads)]


Helper function to obtain an object's associated executor. 


  template<
      typename T,
      typename ``[link asio.reference.Executor1 Executor]``>
  associated_executor< T, Executor >::type get_associated_executor(
      const T & t,
      const Executor & ex,
      typename enable_if< is_executor< Executor >::value||execution::is_executor< Executor >::value >::type *  = 0);



[heading Return Value]
      
`associated_executor<T, Executor>::get(t, ex)` 




[endsect]



[section:overload3 get_associated_executor (3 of 3 overloads)]


Helper function to obtain an object's associated executor. 


  template<
      typename T,
      typename ExecutionContext>
  associated_executor< T, typename ExecutionContext::executor_type >::type get_associated_executor(
      const T & t,
      ExecutionContext & ctx,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);



[heading Return Value]
      
`associated_executor<T, typename ExecutionContext::executor_type>get(t, ctx.get_executor())` 




[endsect]


[endsect]


[section:high_resolution_timer high_resolution_timer]

[indexterm1 asio.indexterm.high_resolution_timer..high_resolution_timer] 
Typedef for a timer based on the high resolution clock. 


  typedef basic_waitable_timer< chrono::high_resolution_clock > high_resolution_timer;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_waitable_timer__rebind_executor [*rebind_executor]]]
    [Rebinds the timer type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.clock_type [*clock_type]]]
    [The clock type. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.duration [*duration]]]
    [The duration type of the clock. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.time_point [*time_point]]]
    [The time point type of the clock. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.traits_type [*traits_type]]]
    [The wait traits type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_waitable_timer.async_wait [*async_wait]]]
    [Start an asynchronous wait on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.basic_waitable_timer [*basic_waitable_timer]] [constructor]]
    [Constructor. 
     [hr]
     Constructor to set a particular expiry time as an absolute time. 
     [hr]
     Constructor to set a particular expiry time relative to now. 
     [hr]
     Move-construct a basic_waitable_timer from another. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.cancel [*cancel]]]
    [Cancel any asynchronous operations that are waiting on the timer. 
     [hr]
     (Deprecated: Use non-error_code overload.) Cancel any asynchronous operations that are waiting on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.cancel_one [*cancel_one]]]
    [Cancels one asynchronous operation that is waiting on the timer. 
     [hr]
     (Deprecated: Use non-error_code overload.) Cancels one asynchronous operation that is waiting on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.expires_after [*expires_after]]]
    [Set the timer's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.expires_at [*expires_at]]]
    [(Deprecated: Use expiry().) Get the timer's expiry time as an absolute time. 
     [hr]
     Set the timer's expiry time as an absolute time. 
     [hr]
     (Deprecated: Use non-error_code overload.) Set the timer's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.expires_from_now [*expires_from_now]]]
    [(Deprecated: Use expiry().) Get the timer's expiry time relative to now. 
     [hr]
     (Deprecated: Use expires_after().) Set the timer's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.expiry [*expiry]]]
    [Get the timer's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.operator_eq_ [*operator=]]]
    [Move-assign a basic_waitable_timer from another. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.wait [*wait]]]
    [Perform a blocking wait on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer._basic_waitable_timer [*~basic_waitable_timer]] [destructor]]
    [Destroys the timer. ]
  ]
  
]

The [link asio.reference.basic_waitable_timer `basic_waitable_timer`] class template provides the ability to perform a blocking or asynchronous wait for a timer to expire.

A waitable timer is always in one of two states: "expired" or "not expired". If the `wait()` or `async_wait()` function is called on an expired timer, the wait operation will complete immediately.

Most applications will use one of the [link asio.reference.steady_timer `steady_timer`], [link asio.reference.system_timer `system_timer`] or [link asio.reference.high_resolution_timer `high_resolution_timer`] typedefs.


[heading Remarks]
      
This waitable timer functionality is for use with the C++11 standard library's `<chrono>` facility, or with the Boost.Chrono library.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.


[heading Examples]
  
Performing a blocking wait (C++11): 

   // Construct a timer without setting an expiry time.
   asio::steady_timer timer(my_context);

   // Set an expiry time relative to now.
   timer.expires_after(std::chrono::seconds(5));

   // Wait for the timer to expire.
   timer.wait();





Performing an asynchronous wait (C++11): 

   void handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Timer expired.
     }
   }

   ...

   // Construct a timer with an absolute expiry time.
   asio::steady_timer timer(my_context,
       std::chrono::steady_clock::now() + std::chrono::seconds(60));

   // Start an asynchronous wait.
   timer.async_wait(handler);





[heading Changing an active waitable timer's expiry time]
  


Changing the expiry time of a timer while there are pending asynchronous waits causes those wait operations to be cancelled. To ensure that the action associated with the timer is performed only once, use something like this: used:



   void on_some_event()
   {
     if (my_timer.expires_after(seconds(5)) > 0)
     {
       // We managed to cancel the timer. Start new asynchronous wait.
       my_timer.async_wait(on_timeout);
     }
     else
     {
       // Too late, timer has already expired!
     }
   }

   void on_timeout(const asio::error_code& e)
   {
     if (e != asio::error::operation_aborted)
     {
       // Timer was not cancelled, take necessary action.
     }
   }





* The `asio::basic_waitable_timer::expires_after()` function cancels any pending asynchronous waits, and returns the number of asynchronous waits that were cancelled. If it returns 0 then you were too late and the wait handler has already been executed, or will soon be executed. If it returns 1 then the wait handler was successfully cancelled.


* If a wait handler is cancelled, the [link asio.reference.error_code `error_code`] passed to it contains the value `asio::error::operation_aborted`. 




This typedef uses the C++11 `<chrono>` standard library facility, if available. Otherwise, it may use the Boost.Chrono library. To explicitly utilise Boost.Chrono, use the [link asio.reference.basic_waitable_timer `basic_waitable_timer`] template directly: 

   typedef basic_waitable_timer<boost::chrono::high_resolution_clock> timer;




[heading Requirements]

['Header: ][^asio/high_resolution_timer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:invalid_service_owner invalid_service_owner]


Exception thrown when trying to add a service object to an [link asio.reference.execution_context `execution_context`] where the service has a different owner. 


  class invalid_service_owner


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.invalid_service_owner.invalid_service_owner [*invalid_service_owner]] [constructor]]
    []
  ]
  
]

[heading Requirements]

['Header: ][^asio/execution_context.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:invalid_service_owner invalid_service_owner::invalid_service_owner]

[indexterm2 asio.indexterm.invalid_service_owner.invalid_service_owner..invalid_service_owner..invalid_service_owner] 

  invalid_service_owner();



[endsect]



[endsect]

[section:io_context io_context]


Provides core I/O functionality. 


  class io_context :
    public execution_context


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.io_context__basic_executor_type [*basic_executor_type]]]
    [Executor implementation type used to submit functions to an io_context. ]
  
  ]

  [

    [[link asio.reference.io_context__service [*service]]]
    [Base class for all io_context services. ]
  
  ]

  [

    [[link asio.reference.io_context__strand [*strand]]]
    [Provides serialised handler execution. ]
  
  ]

  [

    [[link asio.reference.io_context__work [*work]]]
    [(Deprecated: Use executor_work_guard.) Class to inform the io_context when it has work to do. ]
  
  ]

  [

    [[link asio.reference.io_context.count_type [*count_type]]]
    [The type used to count the number of handlers executed by the context. ]
  
  ]

  [

    [[link asio.reference.io_context.executor_type [*executor_type]]]
    [Executor used to submit functions to an io_context. ]
  
  ]

  [

    [[link asio.reference.io_context.fork_event [*fork_event]]]
    [Fork-related event notifications. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_context.dispatch [*dispatch]]]
    [(Deprecated: Use asio::dispatch().) Request the io_context to invoke the given handler. ]
  ]
  
  [
    [[link asio.reference.io_context.get_executor [*get_executor]]]
    [Obtains the executor associated with the io_context. ]
  ]
  
  [
    [[link asio.reference.io_context.io_context [*io_context]] [constructor]]
    [Constructor. ]
  ]
  
  [
    [[link asio.reference.io_context.notify_fork [*notify_fork]]]
    [Notify the execution_context of a fork-related event. ]
  ]
  
  [
    [[link asio.reference.io_context.poll [*poll]]]
    [Run the io_context object's event processing loop to execute ready handlers. 
     [hr]
     (Deprecated: Use non-error_code overload.) Run the io_context object's event processing loop to execute ready handlers. ]
  ]
  
  [
    [[link asio.reference.io_context.poll_one [*poll_one]]]
    [Run the io_context object's event processing loop to execute one ready handler. 
     [hr]
     (Deprecated: Use non-error_code overload.) Run the io_context object's event processing loop to execute one ready handler. ]
  ]
  
  [
    [[link asio.reference.io_context.post [*post]]]
    [(Deprecated: Use asio::post().) Request the io_context to invoke the given handler and return immediately. ]
  ]
  
  [
    [[link asio.reference.io_context.reset [*reset]]]
    [(Deprecated: Use restart().) Reset the io_context in preparation for a subsequent run() invocation. ]
  ]
  
  [
    [[link asio.reference.io_context.restart [*restart]]]
    [Restart the io_context in preparation for a subsequent run() invocation. ]
  ]
  
  [
    [[link asio.reference.io_context.run [*run]]]
    [Run the io_context object's event processing loop. 
     [hr]
     (Deprecated: Use non-error_code overload.) Run the io_context object's event processing loop. ]
  ]
  
  [
    [[link asio.reference.io_context.run_for [*run_for]]]
    [Run the io_context object's event processing loop for a specified duration. ]
  ]
  
  [
    [[link asio.reference.io_context.run_one [*run_one]]]
    [Run the io_context object's event processing loop to execute at most one handler. 
     [hr]
     (Deprecated: Use non-error_code overlaod.) Run the io_context object's event processing loop to execute at most one handler. ]
  ]
  
  [
    [[link asio.reference.io_context.run_one_for [*run_one_for]]]
    [Run the io_context object's event processing loop for a specified duration to execute at most one handler. ]
  ]
  
  [
    [[link asio.reference.io_context.run_one_until [*run_one_until]]]
    [Run the io_context object's event processing loop until a specified time to execute at most one handler. ]
  ]
  
  [
    [[link asio.reference.io_context.run_until [*run_until]]]
    [Run the io_context object's event processing loop until a specified time. ]
  ]
  
  [
    [[link asio.reference.io_context.stop [*stop]]]
    [Stop the io_context object's event processing loop. ]
  ]
  
  [
    [[link asio.reference.io_context.stopped [*stopped]]]
    [Determine whether the io_context object has been stopped. ]
  ]
  
  [
    [[link asio.reference.io_context.wrap [*wrap]]]
    [(Deprecated: Use asio::bind_executor().) Create a new handler that automatically dispatches the wrapped handler on the io_context. ]
  ]
  
  [
    [[link asio.reference.io_context._io_context [*~io_context]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_context.destroy [*destroy]]]
    [Destroys all services in the context. ]
  ]
  
  [
    [[link asio.reference.io_context.shutdown [*shutdown]]]
    [Shuts down all services in the context. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_context.add_service [*add_service]]]
    [(Deprecated: Use make_service().) Add a service object to the execution_context. ]
  ]
  
  [
    [[link asio.reference.io_context.has_service [*has_service]]]
    [Determine if an execution_context contains a specified service type. ]
  ]
  
  [
    [[link asio.reference.io_context.make_service [*make_service]]]
    [Creates a service object and adds it to the execution_context. ]
  ]
  
  [
    [[link asio.reference.io_context.use_service [*use_service]]]
    [
     [hr]
     Obtain the service object corresponding to the given type. ]
  ]
  
]

The [link asio.reference.io_context `io_context`] class provides the core I/O functionality for users of the asynchronous I/O objects, including:


* `asio::ip::tcp::socket` 

* `asio::ip::tcp::acceptor` 

* `asio::ip::udp::socket` 

* [link asio.reference.deadline_timer `deadline_timer`].

The [link asio.reference.io_context `io_context`] class also includes facilities intended for developers of custom asynchronous services.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Safe, with the specific exceptions of the `restart()` and `notify_fork()` functions. Calling `restart()` while there are unfinished `run()`, `run_one()`, `run_for()`, `run_until()`, `poll()` or `poll_one()` calls results in undefined behaviour. The `notify_fork()` function should not be called while any [link asio.reference.io_context `io_context`] function, or any function on an I/O object that is associated with the [link asio.reference.io_context `io_context`], is being called in another thread.



[heading Synchronous and asynchronous operations]
  


Synchronous operations on I/O objects implicitly run the [link asio.reference.io_context `io_context`] object for an individual operation. The [link asio.reference.io_context `io_context`] functions `run()`, `run_one()`, `run_for()`, `run_until()`, `poll()` or `poll_one()` must be called for the [link asio.reference.io_context `io_context`] to perform asynchronous operations on behalf of a C++ program. Notification that an asynchronous operation has completed is delivered by invocation of the associated handler. Handlers are invoked only by a thread that is currently calling any overload of `run()`, `run_one()`, `run_for()`, `run_until()`, `poll()` or `poll_one()` for the [link asio.reference.io_context `io_context`].


[heading Effect of exceptions thrown from handlers]
  


If an exception is thrown from a handler, the exception is allowed to propagate through the throwing thread's invocation of `run()`, `run_one()`, `run_for()`, `run_until()`, `poll()` or `poll_one()`. No other threads that are calling any of these functions are affected. It is then the responsibility of the application to catch the exception.

After the exception has been caught, the `run()`, `run_one()`, `run_for()`, `run_until()`, `poll()` or `poll_one()` call may be restarted ['without] the need for an intervening call to `restart()`. This allows the thread to rejoin the [link asio.reference.io_context `io_context`] object's thread pool without impacting any other threads in the pool.

For example:



   asio::io_context io_context;
   ...
   for (;;)
   {
     try
     {
       io_context.run();
       break; // run() exited normally
     }
     catch (my_exception& e)
     {
       // Deal with exception as appropriate.
     }
   }





[heading Submitting arbitrary tasks to the io_context]
  


To submit functions to the [link asio.reference.io_context `io_context`], use the [link asio.reference.dispatch `dispatch`] , [link asio.reference.post `post`]  or [link asio.reference.defer `defer`]  free functions.

For example:



   void my_task()
   {
     ...
   }

   ...

   asio::io_context io_context;

   // Submit a function to the io_context.
   asio::post(io_context, my_task);

   // Submit a lambda object to the io_context.
   asio::post(io_context,
       []()
       {
         ...
       });

   // Run the io_context until it runs out of work.
   io_context.run(); 





[heading Stopping the io_context from running out of work]
  


Some applications may need to prevent an [link asio.reference.io_context `io_context`] object's `run()` call from returning when there is no more work to do. For example, the [link asio.reference.io_context `io_context`] may be being run in a background thread that is launched prior to the application's asynchronous operations. The `run()` call may be kept running by creating an executor that tracks work against the [link asio.reference.io_context `io_context`]:



   asio::io_context io_context;
   auto work = asio::require(io_context.get_executor(),
       asio::execution::outstanding_work.tracked);
   ... 




If using C++03, which lacks automatic variable type deduction, you may compute the return type of the require call:



   asio::io_context io_context;
   typename asio::require_result<
       asio::io_context::executor_type,
       asio::exeution::outstanding_work_t::tracked_t>
     work = asio::require(io_context.get_executor(),
       asio::execution::outstanding_work.tracked);
   ... 




or store the result in the type-erasing executor wrapper, any\_io\_executor:



   asio::io_context io_context;
   asio::any_io_executor work
     = asio::require(io_context.get_executor(),
         asio::execution::outstanding_work.tracked);
   ... 




To effect a shutdown, the application will then need to call the [link asio.reference.io_context `io_context`] object's `stop()` member function. This will cause the [link asio.reference.io_context `io_context`] `run()` call to return as soon as possible, abandoning unfinished operations and without permitting ready handlers to be dispatched.

Alternatively, if the application requires that all operations and handlers be allowed to finish normally, store the work-tracking executor in an any\_io\_executor object, so that it may be explicitly reset.



   asio::io_context io_context;
   asio::any_io_executor work
     = asio::require(io_context.get_executor(),
         asio::execution::outstanding_work.tracked);
   ...
   work = asio::any_io_executor(); // Allow run() to exit. 




[heading Requirements]

['Header: ][^asio/io_context.hpp]

['Convenience header: ][^asio.hpp]


[section:add_service io_context::add_service]


['Inherited from execution_context.]

[indexterm2 asio.indexterm.io_context.add_service..add_service..io_context] 
(Deprecated: Use `make_service()`.) Add a service object to the [link asio.reference.execution_context `execution_context`]. 


  template<
      typename ``[link asio.reference.Service Service]``>
  friend void add_service(
      execution_context & e,
      Service * svc);


This function is used to add a service to the [link asio.reference.execution_context `execution_context`].


[heading Parameters]
    

[variablelist
  
[[e][The [link asio.reference.execution_context `execution_context`] object that owns the service.]]

[[svc][The service object. On success, ownership of the service object is transferred to the [link asio.reference.execution_context `execution_context`]. When the [link asio.reference.execution_context `execution_context`] object is destroyed, it will destroy the service object by performing:
``
   delete static_cast<execution_context::service*>(svc) 
``
]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::service_already_exists][Thrown if a service of the given type is already present in the [link asio.reference.execution_context `execution_context`].]]

[[asio::invalid_service_owner][Thrown if the service's owning [link asio.reference.execution_context `execution_context`] is not the [link asio.reference.execution_context `execution_context`] object specified by the `e` parameter. ]]

]



[heading Requirements]

['Header: ][^asio/io_context.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:count_type io_context::count_type]

[indexterm2 asio.indexterm.io_context.count_type..count_type..io_context] 
The type used to count the number of handlers executed by the context. 


  typedef std::size_t count_type;



[heading Requirements]

['Header: ][^asio/io_context.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:destroy io_context::destroy]


['Inherited from execution_context.]

[indexterm2 asio.indexterm.io_context.destroy..destroy..io_context] 
Destroys all services in the context. 


  void destroy();


This function is implemented as follows:


* For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, in reverse order * of the beginning of service object lifetime, performs `delete static_cast<execution_context::service*>(svc)`. 




[endsect]



[section:dispatch io_context::dispatch]

[indexterm2 asio.indexterm.io_context.dispatch..dispatch..io_context] 
(Deprecated: Use [link asio.reference.dispatch `dispatch`].) Request the [link asio.reference.io_context `io_context`] to invoke the given handler. 


  template<
      typename ``[link asio.reference.LegacyCompletionHandler LegacyCompletionHandler]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` dispatch(
      LegacyCompletionHandler && handler);


This function is used to ask the [link asio.reference.io_context `io_context`] to execute the given handler.

The [link asio.reference.io_context `io_context`] guarantees that the handler will only be called in a thread in which the `run()`, `run_one()`, `poll()` or `poll_one()` member functions is currently being invoked. The handler may be executed inside this function if the guarantee can be met.


[heading Parameters]
    

[variablelist
  
[[handler][The handler to be called. The [link asio.reference.io_context `io_context`] will make a copy of the handler object as required. The function signature of the handler must be:
``
   void handler(); 
``
]]

]


[heading Remarks]
      
This function throws an exception only if:


* the handler's `asio_handler_allocate` function; or


* the handler's copy constructor

throws an exception. 


[endsect]



[section:executor_type io_context::executor_type]

[indexterm2 asio.indexterm.io_context.executor_type..executor_type..io_context] 
Executor used to submit functions to an [link asio.reference.io_context `io_context`]. 


  typedef basic_executor_type< std::allocator< void >, 0 > executor_type;


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_context__basic_executor_type.basic_executor_type [*basic_executor_type]] [constructor]]
    [Copy constructor. 
     [hr]
     Move constructor. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.defer [*defer]]]
    [Request the io_context to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.dispatch [*dispatch]]]
    [Request the io_context to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.execute [*execute]]]
    [Execution function. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.on_work_finished [*on_work_finished]]]
    [Inform the io_context that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.on_work_started [*on_work_started]]]
    [Inform the io_context that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.operator_eq_ [*operator=]]]
    [Assignment operator. 
     [hr]
     Move assignment operator. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.post [*post]]]
    [Request the io_context to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.query [*query]]]
    [Query the current value of the context property. 
     [hr]
     Query the current value of the blocking property. 
     [hr]
     Query the current value of the relationship property. 
     [hr]
     Query the current value of the allocator property. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.query__static [*query]] [static]]
    [Query the current value of the mapping property. 
     [hr]
     Query the current value of the outstanding_work property. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.require [*require]]]
    [Obtain an executor with the blocking.possibly property. 
     [hr]
     Obtain an executor with the blocking.never property. 
     [hr]
     Obtain an executor with the relationship.fork property. 
     [hr]
     Obtain an executor with the relationship.continuation property. 
     [hr]
     Obtain an executor with the outstanding_work.tracked property. 
     [hr]
     Obtain an executor with the outstanding_work.untracked property. 
     [hr]
     Obtain an executor with the specified allocator property. 
     [hr]
     Obtain an executor with the default allocator property. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the io_context is running in the current thread. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type._basic_executor_type [*~basic_executor_type]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_context__basic_executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[heading Requirements]

['Header: ][^asio/io_context.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:fork_event io_context::fork_event]


['Inherited from execution_context.]

[indexterm2 asio.indexterm.io_context.fork_event..fork_event..io_context] 
Fork-related event notifications. 


  enum fork_event

[indexterm2 asio.indexterm.io_context.fork_event.fork_prepare..fork_prepare..io_context]
[indexterm2 asio.indexterm.io_context.fork_event.fork_parent..fork_parent..io_context]
[indexterm2 asio.indexterm.io_context.fork_event.fork_child..fork_child..io_context]

[heading Values]
[variablelist

  [
    [fork_prepare]
    [Notify the context that the process is about to fork. ]
  ]

  [
    [fork_parent]
    [Notify the context that the process has forked and is the parent. ]
  ]

  [
    [fork_child]
    [Notify the context that the process has forked and is the child. ]
  ]

]



[endsect]



[section:get_executor io_context::get_executor]

[indexterm2 asio.indexterm.io_context.get_executor..get_executor..io_context] 
Obtains the executor associated with the [link asio.reference.io_context `io_context`]. 


  executor_type get_executor();



[endsect]



[section:has_service io_context::has_service]


['Inherited from execution_context.]

[indexterm2 asio.indexterm.io_context.has_service..has_service..io_context] 
Determine if an [link asio.reference.execution_context `execution_context`] contains a specified service type. 


  template<
      typename ``[link asio.reference.Service Service]``>
  friend bool has_service(
      execution_context & e);


This function is used to determine whether the [link asio.reference.execution_context `execution_context`] contains a service object corresponding to the given service type.


[heading Parameters]
    

[variablelist
  
[[e][The [link asio.reference.execution_context `execution_context`] object that owns the service.]]

]


[heading Return Value]
      
A boolean indicating whether the [link asio.reference.execution_context `execution_context`] contains the service. 



[heading Requirements]

['Header: ][^asio/io_context.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:io_context io_context::io_context]

[indexterm2 asio.indexterm.io_context.io_context..io_context..io_context] 
Constructor. 


  ``[link asio.reference.io_context.io_context.overload1 io_context]``();
  ``  [''''&raquo;''' [link asio.reference.io_context.io_context.overload1 more...]]``

  explicit ``[link asio.reference.io_context.io_context.overload2 io_context]``(
      int concurrency_hint);
  ``  [''''&raquo;''' [link asio.reference.io_context.io_context.overload2 more...]]``


[section:overload1 io_context::io_context (1 of 2 overloads)]


Constructor. 


  io_context();



[endsect]



[section:overload2 io_context::io_context (2 of 2 overloads)]


Constructor. 


  io_context(
      int concurrency_hint);


Construct with a hint about the required level of concurrency.


[heading Parameters]
    

[variablelist
  
[[concurrency_hint][A suggestion to the implementation on how many threads it should allow to run simultaneously. ]]

]




[endsect]


[endsect]


[section:make_service io_context::make_service]


['Inherited from execution_context.]

[indexterm2 asio.indexterm.io_context.make_service..make_service..io_context] 
Creates a service object and adds it to the [link asio.reference.execution_context `execution_context`]. 


  template<
      typename ``[link asio.reference.Service Service]``,
      typename... Args>
  friend Service & make_service(
      execution_context & e,
      Args &&... args);


This function is used to add a service to the [link asio.reference.execution_context `execution_context`].


[heading Parameters]
    

[variablelist
  
[[e][The [link asio.reference.execution_context `execution_context`] object that owns the service.]]

[[args][Zero or more arguments to be passed to the service constructor.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::service_already_exists][Thrown if a service of the given type is already present in the [link asio.reference.execution_context `execution_context`]. ]]

]



[heading Requirements]

['Header: ][^asio/io_context.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:notify_fork io_context::notify_fork]


['Inherited from execution_context.]

[indexterm2 asio.indexterm.io_context.notify_fork..notify_fork..io_context] 
Notify the [link asio.reference.execution_context `execution_context`] of a fork-related event. 


  void notify_fork(
      fork_event event);


This function is used to inform the [link asio.reference.execution_context `execution_context`] that the process is about to fork, or has just forked. This allows the [link asio.reference.execution_context `execution_context`], and the services it contains, to perform any necessary housekeeping to ensure correct operation following a fork.

This function must not be called while any other [link asio.reference.execution_context `execution_context`] function, or any function associated with the execution\_context's derived class, is being called in another thread. It is, however, safe to call this function from within a completion handler, provided no other thread is accessing the [link asio.reference.execution_context `execution_context`] or its derived class.


[heading Parameters]
    

[variablelist
  
[[event][A fork-related event.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. If the notification fails the [link asio.reference.execution_context `execution_context`] object should no longer be used and should be destroyed.]]

]


[heading Example]
  
The following code illustrates how to incorporate the `notify_fork()` function: 

   my_execution_context.notify_fork(execution_context::fork_prepare);
   if (fork() == 0)
   {
     // This is the child process.
     my_execution_context.notify_fork(execution_context::fork_child);
   }
   else
   {
     // This is the parent process.
     my_execution_context.notify_fork(execution_context::fork_parent);
   } 





[heading Remarks]
      
For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, performs `svc->notify_fork();`. When processing the fork\_prepare event, services are visited in reverse order of the beginning of service object lifetime. Otherwise, services are visited in order of the beginning of service object lifetime. 




[endsect]


[section:poll io_context::poll]

[indexterm2 asio.indexterm.io_context.poll..poll..io_context] 
Run the [link asio.reference.io_context `io_context`] object's event processing loop to execute ready handlers. 


  count_type ``[link asio.reference.io_context.poll.overload1 poll]``();
  ``  [''''&raquo;''' [link asio.reference.io_context.poll.overload1 more...]]``


(Deprecated: Use non-error\_code overload.) Run the [link asio.reference.io_context `io_context`] object's event processing loop to execute ready handlers. 


  count_type ``[link asio.reference.io_context.poll.overload2 poll]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.io_context.poll.overload2 more...]]``


[section:overload1 io_context::poll (1 of 2 overloads)]


Run the [link asio.reference.io_context `io_context`] object's event processing loop to execute ready handlers. 


  count_type poll();


The `poll()` function runs handlers that are ready to run, without blocking, until the [link asio.reference.io_context `io_context`] has been stopped or there are no more ready handlers.


[heading Return Value]
      
The number of handlers that were executed. 




[endsect]



[section:overload2 io_context::poll (2 of 2 overloads)]


(Deprecated: Use non-error\_code overload.) Run the [link asio.reference.io_context `io_context`] object's event processing loop to execute ready handlers. 


  count_type poll(
      asio::error_code & ec);


The `poll()` function runs handlers that are ready to run, without blocking, until the [link asio.reference.io_context `io_context`] has been stopped or there are no more ready handlers.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of handlers that were executed. 




[endsect]


[endsect]

[section:poll_one io_context::poll_one]

[indexterm2 asio.indexterm.io_context.poll_one..poll_one..io_context] 
Run the [link asio.reference.io_context `io_context`] object's event processing loop to execute one ready handler. 


  count_type ``[link asio.reference.io_context.poll_one.overload1 poll_one]``();
  ``  [''''&raquo;''' [link asio.reference.io_context.poll_one.overload1 more...]]``


(Deprecated: Use non-error\_code overload.) Run the [link asio.reference.io_context `io_context`] object's event processing loop to execute one ready handler. 


  count_type ``[link asio.reference.io_context.poll_one.overload2 poll_one]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.io_context.poll_one.overload2 more...]]``


[section:overload1 io_context::poll_one (1 of 2 overloads)]


Run the [link asio.reference.io_context `io_context`] object's event processing loop to execute one ready handler. 


  count_type poll_one();


The `poll_one()` function runs at most one handler that is ready to run, without blocking.


[heading Return Value]
      
The number of handlers that were executed. 




[endsect]



[section:overload2 io_context::poll_one (2 of 2 overloads)]


(Deprecated: Use non-error\_code overload.) Run the [link asio.reference.io_context `io_context`] object's event processing loop to execute one ready handler. 


  count_type poll_one(
      asio::error_code & ec);


The `poll_one()` function runs at most one handler that is ready to run, without blocking.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of handlers that were executed. 




[endsect]


[endsect]


[section:post io_context::post]

[indexterm2 asio.indexterm.io_context.post..post..io_context] 
(Deprecated: Use [link asio.reference.post `post`].) Request the [link asio.reference.io_context `io_context`] to invoke the given handler and return immediately. 


  template<
      typename ``[link asio.reference.LegacyCompletionHandler LegacyCompletionHandler]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` post(
      LegacyCompletionHandler && handler);


This function is used to ask the [link asio.reference.io_context `io_context`] to execute the given handler, but without allowing the [link asio.reference.io_context `io_context`] to call the handler from inside this function.

The [link asio.reference.io_context `io_context`] guarantees that the handler will only be called in a thread in which the `run()`, `run_one()`, `poll()` or `poll_one()` member functions is currently being invoked.


[heading Parameters]
    

[variablelist
  
[[handler][The handler to be called. The [link asio.reference.io_context `io_context`] will make a copy of the handler object as required. The function signature of the handler must be:
``
   void handler(); 
``
]]

]


[heading Remarks]
      
This function throws an exception only if:


* the handler's `asio_handler_allocate` function; or


* the handler's copy constructor

throws an exception. 


[endsect]



[section:reset io_context::reset]

[indexterm2 asio.indexterm.io_context.reset..reset..io_context] 
(Deprecated: Use `restart()`.) Reset the [link asio.reference.io_context `io_context`] in preparation for a subsequent `run()` invocation. 


  void reset();


This function must be called prior to any second or later set of invocations of the `run()`, `run_one()`, `poll()` or `poll_one()` functions when a previous invocation of these functions returned due to the [link asio.reference.io_context `io_context`] being stopped or running out of work. After a call to `restart()`, the [link asio.reference.io_context `io_context`] object's `stopped()` function will return `false`.

This function must not be called while there are any unfinished calls to the `run()`, `run_one()`, `poll()` or `poll_one()` functions. 


[endsect]



[section:restart io_context::restart]

[indexterm2 asio.indexterm.io_context.restart..restart..io_context] 
Restart the [link asio.reference.io_context `io_context`] in preparation for a subsequent `run()` invocation. 


  void restart();


This function must be called prior to any second or later set of invocations of the `run()`, `run_one()`, `poll()` or `poll_one()` functions when a previous invocation of these functions returned due to the [link asio.reference.io_context `io_context`] being stopped or running out of work. After a call to `restart()`, the [link asio.reference.io_context `io_context`] object's `stopped()` function will return `false`.

This function must not be called while there are any unfinished calls to the `run()`, `run_one()`, `poll()` or `poll_one()` functions. 


[endsect]


[section:run io_context::run]

[indexterm2 asio.indexterm.io_context.run..run..io_context] 
Run the [link asio.reference.io_context `io_context`] object's event processing loop. 


  count_type ``[link asio.reference.io_context.run.overload1 run]``();
  ``  [''''&raquo;''' [link asio.reference.io_context.run.overload1 more...]]``


(Deprecated: Use non-error\_code overload.) Run the [link asio.reference.io_context `io_context`] object's event processing loop. 


  count_type ``[link asio.reference.io_context.run.overload2 run]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.io_context.run.overload2 more...]]``


[section:overload1 io_context::run (1 of 2 overloads)]


Run the [link asio.reference.io_context `io_context`] object's event processing loop. 


  count_type run();


The `run()` function blocks until all work has finished and there are no more handlers to be dispatched, or until the [link asio.reference.io_context `io_context`] has been stopped.

Multiple threads may call the `run()` function to set up a pool of threads from which the [link asio.reference.io_context `io_context`] may execute handlers. All threads that are waiting in the pool are equivalent and the [link asio.reference.io_context `io_context`] may choose any one of them to invoke a handler.

A normal exit from the `run()` function implies that the [link asio.reference.io_context `io_context`] object is stopped (the `stopped()` function returns `true`). Subsequent calls to `run()`, `run_one()`, `poll()` or `poll_one()` will return immediately unless there is a prior call to `restart()`.


[heading Return Value]
      
The number of handlers that were executed.


[heading Remarks]
      
Calling the `run()` function from a thread that is currently calling one of `run()`, `run_one()`, `run_for()`, `run_until()`, `poll()` or `poll_one()` on the same [link asio.reference.io_context `io_context`] object may introduce the potential for deadlock. It is the caller's reponsibility to avoid this.

The `poll()` function may also be used to dispatch ready handlers, but without blocking. 


[endsect]



[section:overload2 io_context::run (2 of 2 overloads)]


(Deprecated: Use non-error\_code overload.) Run the [link asio.reference.io_context `io_context`] object's event processing loop. 


  count_type run(
      asio::error_code & ec);


The `run()` function blocks until all work has finished and there are no more handlers to be dispatched, or until the [link asio.reference.io_context `io_context`] has been stopped.

Multiple threads may call the `run()` function to set up a pool of threads from which the [link asio.reference.io_context `io_context`] may execute handlers. All threads that are waiting in the pool are equivalent and the [link asio.reference.io_context `io_context`] may choose any one of them to invoke a handler.

A normal exit from the `run()` function implies that the [link asio.reference.io_context `io_context`] object is stopped (the `stopped()` function returns `true`). Subsequent calls to `run()`, `run_one()`, `poll()` or `poll_one()` will return immediately unless there is a prior call to `restart()`.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of handlers that were executed.


[heading Remarks]
      
Calling the `run()` function from a thread that is currently calling one of `run()`, `run_one()`, `run_for()`, `run_until()`, `poll()` or `poll_one()` on the same [link asio.reference.io_context `io_context`] object may introduce the potential for deadlock. It is the caller's reponsibility to avoid this.

The `poll()` function may also be used to dispatch ready handlers, but without blocking. 


[endsect]


[endsect]


[section:run_for io_context::run_for]

[indexterm2 asio.indexterm.io_context.run_for..run_for..io_context] 
Run the [link asio.reference.io_context `io_context`] object's event processing loop for a specified duration. 


  template<
      typename Rep,
      typename Period>
  std::size_t run_for(
      const chrono::duration< Rep, Period > & rel_time);


The `run_for()` function blocks until all work has finished and there are no more handlers to be dispatched, until the [link asio.reference.io_context `io_context`] has been stopped, or until the specified duration has elapsed.


[heading Parameters]
    

[variablelist
  
[[rel_time][The duration for which the call may block.]]

]


[heading Return Value]
      
The number of handlers that were executed. 




[endsect]


[section:run_one io_context::run_one]

[indexterm2 asio.indexterm.io_context.run_one..run_one..io_context] 
Run the [link asio.reference.io_context `io_context`] object's event processing loop to execute at most one handler. 


  count_type ``[link asio.reference.io_context.run_one.overload1 run_one]``();
  ``  [''''&raquo;''' [link asio.reference.io_context.run_one.overload1 more...]]``


(Deprecated: Use non-error\_code overlaod.) Run the [link asio.reference.io_context `io_context`] object's event processing loop to execute at most one handler. 


  count_type ``[link asio.reference.io_context.run_one.overload2 run_one]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.io_context.run_one.overload2 more...]]``


[section:overload1 io_context::run_one (1 of 2 overloads)]


Run the [link asio.reference.io_context `io_context`] object's event processing loop to execute at most one handler. 


  count_type run_one();


The `run_one()` function blocks until one handler has been dispatched, or until the [link asio.reference.io_context `io_context`] has been stopped.


[heading Return Value]
      
The number of handlers that were executed. A zero return value implies that the [link asio.reference.io_context `io_context`] object is stopped (the `stopped()` function returns `true`). Subsequent calls to `run()`, `run_one()`, `poll()` or `poll_one()` will return immediately unless there is a prior call to `restart()`.


[heading Remarks]
      
Calling the `run_one()` function from a thread that is currently calling one of `run()`, `run_one()`, `run_for()`, `run_until()`, `poll()` or `poll_one()` on the same [link asio.reference.io_context `io_context`] object may introduce the potential for deadlock. It is the caller's reponsibility to avoid this. 




[endsect]



[section:overload2 io_context::run_one (2 of 2 overloads)]


(Deprecated: Use non-error\_code overlaod.) Run the [link asio.reference.io_context `io_context`] object's event processing loop to execute at most one handler. 


  count_type run_one(
      asio::error_code & ec);


The `run_one()` function blocks until one handler has been dispatched, or until the [link asio.reference.io_context `io_context`] has been stopped.


[heading Return Value]
      
The number of handlers that were executed. A zero return value implies that the [link asio.reference.io_context `io_context`] object is stopped (the `stopped()` function returns `true`). Subsequent calls to `run()`, `run_one()`, `poll()` or `poll_one()` will return immediately unless there is a prior call to `restart()`.

The number of handlers that were executed.


[heading Remarks]
      
Calling the `run_one()` function from a thread that is currently calling one of `run()`, `run_one()`, `run_for()`, `run_until()`, `poll()` or `poll_one()` on the same [link asio.reference.io_context `io_context`] object may introduce the potential for deadlock. It is the caller's reponsibility to avoid this. 




[endsect]


[endsect]


[section:run_one_for io_context::run_one_for]

[indexterm2 asio.indexterm.io_context.run_one_for..run_one_for..io_context] 
Run the [link asio.reference.io_context `io_context`] object's event processing loop for a specified duration to execute at most one handler. 


  template<
      typename Rep,
      typename Period>
  std::size_t run_one_for(
      const chrono::duration< Rep, Period > & rel_time);


The `run_one_for()` function blocks until one handler has been dispatched, until the [link asio.reference.io_context `io_context`] has been stopped, or until the specified duration has elapsed.


[heading Parameters]
    

[variablelist
  
[[rel_time][The duration for which the call may block.]]

]


[heading Return Value]
      
The number of handlers that were executed. 




[endsect]



[section:run_one_until io_context::run_one_until]

[indexterm2 asio.indexterm.io_context.run_one_until..run_one_until..io_context] 
Run the [link asio.reference.io_context `io_context`] object's event processing loop until a specified time to execute at most one handler. 


  template<
      typename Clock,
      typename Duration>
  std::size_t run_one_until(
      const chrono::time_point< Clock, Duration > & abs_time);


The `run_one_until()` function blocks until one handler has been dispatched, until the [link asio.reference.io_context `io_context`] has been stopped, or until the specified time has been reached.


[heading Parameters]
    

[variablelist
  
[[abs_time][The time point until which the call may block.]]

]


[heading Return Value]
      
The number of handlers that were executed. 




[endsect]



[section:run_until io_context::run_until]

[indexterm2 asio.indexterm.io_context.run_until..run_until..io_context] 
Run the [link asio.reference.io_context `io_context`] object's event processing loop until a specified time. 


  template<
      typename Clock,
      typename Duration>
  std::size_t run_until(
      const chrono::time_point< Clock, Duration > & abs_time);


The `run_until()` function blocks until all work has finished and there are no more handlers to be dispatched, until the [link asio.reference.io_context `io_context`] has been stopped, or until the specified time has been reached.


[heading Parameters]
    

[variablelist
  
[[abs_time][The time point until which the call may block.]]

]


[heading Return Value]
      
The number of handlers that were executed. 




[endsect]



[section:shutdown io_context::shutdown]


['Inherited from execution_context.]

[indexterm2 asio.indexterm.io_context.shutdown..shutdown..io_context] 
Shuts down all services in the context. 


  void shutdown();


This function is implemented as follows:


* For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, in reverse order of the beginning of service object lifetime, performs `svc->shutdown()`. 




[endsect]



[section:stop io_context::stop]

[indexterm2 asio.indexterm.io_context.stop..stop..io_context] 
Stop the [link asio.reference.io_context `io_context`] object's event processing loop. 


  void stop();


This function does not block, but instead simply signals the [link asio.reference.io_context `io_context`] to stop. All invocations of its `run()` or `run_one()` member functions should return as soon as possible. Subsequent calls to `run()`, `run_one()`, `poll()` or `poll_one()` will return immediately until `restart()` is called. 


[endsect]



[section:stopped io_context::stopped]

[indexterm2 asio.indexterm.io_context.stopped..stopped..io_context] 
Determine whether the [link asio.reference.io_context `io_context`] object has been stopped. 


  bool stopped() const;


This function is used to determine whether an [link asio.reference.io_context `io_context`] object has been stopped, either through an explicit call to `stop()`, or due to running out of work. When an [link asio.reference.io_context `io_context`] object is stopped, calls to `run()`, `run_one()`, `poll()` or `poll_one()` will return immediately without invoking any handlers.


[heading Return Value]
      
`true` if the [link asio.reference.io_context `io_context`] object is stopped, otherwise `false`. 




[endsect]


[section:use_service io_context::use_service]

[indexterm2 asio.indexterm.io_context.use_service..use_service..io_context] 

  template<
      typename ``[link asio.reference.Service Service]``>
  friend Service & ``[link asio.reference.io_context.use_service.overload1 use_service]``(
      io_context & ioc);
  ``  [''''&raquo;''' [link asio.reference.io_context.use_service.overload1 more...]]``


Obtain the service object corresponding to the given type. 


  template<
      typename ``[link asio.reference.Service Service]``>
  friend Service & ``[link asio.reference.io_context.use_service.overload2 use_service]``(
      execution_context & e);
  ``  [''''&raquo;''' [link asio.reference.io_context.use_service.overload2 more...]]``


[section:overload1 io_context::use_service (1 of 2 overloads)]



  template<
      typename ``[link asio.reference.Service Service]``>
  friend Service & use_service(
      io_context & ioc);


[heading Requirements]

['Header: ][^asio/io_context.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:overload2 io_context::use_service (2 of 2 overloads)]


['Inherited from execution_context.]


Obtain the service object corresponding to the given type. 


  template<
      typename ``[link asio.reference.Service Service]``>
  friend Service & use_service(
      execution_context & e);


This function is used to locate a service object that corresponds to the given service type. If there is no existing implementation of the service, then the [link asio.reference.execution_context `execution_context`] will create a new instance of the service.


[heading Parameters]
    

[variablelist
  
[[e][The [link asio.reference.execution_context `execution_context`] object that owns the service.]]

]


[heading Return Value]
      
The service interface implementing the specified service type. Ownership of the service interface is not transferred to the caller. 



[heading Requirements]

['Header: ][^asio/io_context.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[endsect]


[section:wrap io_context::wrap]

[indexterm2 asio.indexterm.io_context.wrap..wrap..io_context] 
(Deprecated: Use [link asio.reference.bind_executor `bind_executor`].) Create a new handler that automatically dispatches the wrapped handler on the [link asio.reference.io_context `io_context`]. 


  template<
      typename ``[link asio.reference.Handler Handler]``>
  unspecified wrap(
      Handler handler);


This function is used to create a new handler function object that, when invoked, will automatically pass the wrapped handler to the [link asio.reference.io_context `io_context`] object's dispatch function.


[heading Parameters]
    

[variablelist
  
[[handler][The handler to be wrapped. The [link asio.reference.io_context `io_context`] will make a copy of the handler object as required. The function signature of the handler must be:
``
   void handler(A1 a1, ... An an); 
``
]]

]


[heading Return Value]
      
A function object that, when invoked, passes the wrapped handler to the [link asio.reference.io_context `io_context`] object's dispatch function. Given a function object with the signature: 

   R f(A1 a1, ... An an); 


If this function object is passed to the wrap function like so: 

   io_context.wrap(f); 


then the return value is a function object with the signature 

   void g(A1 a1, ... An an); 


that, when invoked, executes code equivalent to: 

   io_context.dispatch(boost::bind(f, a1, ... an)); 







[endsect]



[section:_io_context io_context::~io_context]

[indexterm2 asio.indexterm.io_context._io_context..~io_context..io_context] 
Destructor. 


  ~io_context();


On destruction, the [link asio.reference.io_context `io_context`] performs the following sequence of operations:


* For each service object `svc` in the [link asio.reference.io_context `io_context`] set, in reverse order of the beginning of service object lifetime, performs `svc->shutdown()`.


* Uninvoked handler objects that were scheduled for deferred invocation on the [link asio.reference.io_context `io_context`], or any associated strand, are destroyed.


* For each service object `svc` in the [link asio.reference.io_context `io_context`] set, in reverse order of the beginning of service object lifetime, performs `delete static_cast<io_context::service*>(svc)`.


[heading Remarks]
      
The destruction sequence described above permits programs to simplify their resource management by using `shared_ptr<>`. Where an object's lifetime is tied to the lifetime of a connection (or some other sequence of asynchronous operations), a `shared_ptr` to the object would be bound into the handlers for all asynchronous operations associated with it. This works as follows:


* When a single connection ends, all associated asynchronous operations complete. The corresponding handler objects are destroyed, and all `shared_ptr` references to the objects are destroyed.


* To shut down the whole program, the [link asio.reference.io_context `io_context`] function `stop()` is called to terminate any `run()` calls as soon as possible. The [link asio.reference.io_context `io_context`] destructor defined above destroys all handlers, causing all `shared_ptr` references to all connection objects to be destroyed. 




[endsect]



[endsect]

[section:io_context__basic_executor_type io_context::basic_executor_type]


Executor implementation type used to submit functions to an [link asio.reference.io_context `io_context`]. 


  template<
      typename Allocator,
      unsigned int Bits>
  class basic_executor_type


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_context__basic_executor_type.basic_executor_type [*basic_executor_type]] [constructor]]
    [Copy constructor. 
     [hr]
     Move constructor. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.defer [*defer]]]
    [Request the io_context to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.dispatch [*dispatch]]]
    [Request the io_context to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.execute [*execute]]]
    [Execution function. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.on_work_finished [*on_work_finished]]]
    [Inform the io_context that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.on_work_started [*on_work_started]]]
    [Inform the io_context that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.operator_eq_ [*operator=]]]
    [Assignment operator. 
     [hr]
     Move assignment operator. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.post [*post]]]
    [Request the io_context to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.query [*query]]]
    [Query the current value of the context property. 
     [hr]
     Query the current value of the blocking property. 
     [hr]
     Query the current value of the relationship property. 
     [hr]
     Query the current value of the allocator property. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.query__static [*query]] [static]]
    [Query the current value of the mapping property. 
     [hr]
     Query the current value of the outstanding_work property. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.require [*require]]]
    [Obtain an executor with the blocking.possibly property. 
     [hr]
     Obtain an executor with the blocking.never property. 
     [hr]
     Obtain an executor with the relationship.fork property. 
     [hr]
     Obtain an executor with the relationship.continuation property. 
     [hr]
     Obtain an executor with the outstanding_work.tracked property. 
     [hr]
     Obtain an executor with the outstanding_work.untracked property. 
     [hr]
     Obtain an executor with the specified allocator property. 
     [hr]
     Obtain an executor with the default allocator property. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the io_context is running in the current thread. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type._basic_executor_type [*~basic_executor_type]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_context__basic_executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.io_context__basic_executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/io_context.hpp]

['Convenience header: ][^asio.hpp]

[section:basic_executor_type io_context::basic_executor_type::basic_executor_type]

[indexterm2 asio.indexterm.io_context__basic_executor_type.basic_executor_type..basic_executor_type..io_context::basic_executor_type] 
Copy constructor. 


  ``[link asio.reference.io_context__basic_executor_type.basic_executor_type.overload1 basic_executor_type]``(
      const basic_executor_type & other);
  ``  [''''&raquo;''' [link asio.reference.io_context__basic_executor_type.basic_executor_type.overload1 more...]]``


Move constructor. 


  ``[link asio.reference.io_context__basic_executor_type.basic_executor_type.overload2 basic_executor_type]``(
      basic_executor_type && other);
  ``  [''''&raquo;''' [link asio.reference.io_context__basic_executor_type.basic_executor_type.overload2 more...]]``


[section:overload1 io_context::basic_executor_type::basic_executor_type (1 of 2 overloads)]


Copy constructor. 


  basic_executor_type(
      const basic_executor_type & other);



[endsect]



[section:overload2 io_context::basic_executor_type::basic_executor_type (2 of 2 overloads)]


Move constructor. 


  basic_executor_type(
      basic_executor_type && other);



[endsect]


[endsect]


[section:context io_context::basic_executor_type::context]

[indexterm2 asio.indexterm.io_context__basic_executor_type.context..context..io_context::basic_executor_type] 
Obtain the underlying execution context. 


  io_context & context() const;



[endsect]



[section:defer io_context::basic_executor_type::defer]

[indexterm2 asio.indexterm.io_context__basic_executor_type.defer..defer..io_context::basic_executor_type] 
Request the [link asio.reference.io_context `io_context`] to invoke the given function object. 


  template<
      typename Function,
      typename OtherAllocator>
  void defer(
      Function && f,
      const OtherAllocator & a) const;


This function is used to ask the [link asio.reference.io_context `io_context`] to execute the given function object. The function object will never be executed inside `defer()`. Instead, it will be scheduled to run on the [link asio.reference.io_context `io_context`].

If the current thread belongs to the [link asio.reference.io_context `io_context`], `defer()` will delay scheduling the function object until the current thread returns control to the pool.


[heading Parameters]
    

[variablelist
  
[[f][The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:
``
   void function(); 
``
]]

[[a][An allocator that may be used by the executor to allocate the internal storage needed for function invocation. ]]

]




[endsect]



[section:dispatch io_context::basic_executor_type::dispatch]

[indexterm2 asio.indexterm.io_context__basic_executor_type.dispatch..dispatch..io_context::basic_executor_type] 
Request the [link asio.reference.io_context `io_context`] to invoke the given function object. 


  template<
      typename Function,
      typename OtherAllocator>
  void dispatch(
      Function && f,
      const OtherAllocator & a) const;


This function is used to ask the [link asio.reference.io_context `io_context`] to execute the given function object. If the current thread is running the [link asio.reference.io_context `io_context`], `dispatch()` executes the function before returning. Otherwise, the function will be scheduled to run on the [link asio.reference.io_context `io_context`].


[heading Parameters]
    

[variablelist
  
[[f][The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:
``
   void function(); 
``
]]

[[a][An allocator that may be used by the executor to allocate the internal storage needed for function invocation. ]]

]




[endsect]



[section:execute io_context::basic_executor_type::execute]

[indexterm2 asio.indexterm.io_context__basic_executor_type.execute..execute..io_context::basic_executor_type] 
Execution function. 


  template<
      typename Function>
  void execute(
      Function && f) const;


Do not call this function directly. It is intended for use with the [link asio.reference.execution__execute `execution::execute`] customisation point.

For example: 

   auto ex = my_io_context.get_executor();
   execution::execute(ex, my_function_object); 





[endsect]



[section:on_work_finished io_context::basic_executor_type::on_work_finished]

[indexterm2 asio.indexterm.io_context__basic_executor_type.on_work_finished..on_work_finished..io_context::basic_executor_type] 
Inform the [link asio.reference.io_context `io_context`] that some work is no longer outstanding. 


  void on_work_finished() const;


This function is used to inform the [link asio.reference.io_context `io_context`] that some work has finished. Once the count of unfinished work reaches zero, the [link asio.reference.io_context `io_context`] is stopped and the `run()` and `run_one()` functions may exit. 


[endsect]



[section:on_work_started io_context::basic_executor_type::on_work_started]

[indexterm2 asio.indexterm.io_context__basic_executor_type.on_work_started..on_work_started..io_context::basic_executor_type] 
Inform the [link asio.reference.io_context `io_context`] that it has some outstanding work to do. 


  void on_work_started() const;


This function is used to inform the [link asio.reference.io_context `io_context`] that some work has begun. This ensures that the io\_context's `run()` and `run_one()` functions do not exit while the work is underway. 


[endsect]



[section:operator_not__eq_ io_context::basic_executor_type::operator!=]

[indexterm2 asio.indexterm.io_context__basic_executor_type.operator_not__eq_..operator!=..io_context::basic_executor_type] 
Compare two executors for inequality. 


  friend bool operator!=(
      const basic_executor_type & a,
      const basic_executor_type & b);


Two executors are equal if they refer to the same underlying [link asio.reference.io_context `io_context`]. 

[heading Requirements]

['Header: ][^asio/io_context.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:operator_eq_ io_context::basic_executor_type::operator=]

[indexterm2 asio.indexterm.io_context__basic_executor_type.operator_eq_..operator=..io_context::basic_executor_type] 
Assignment operator. 


  basic_executor_type & ``[link asio.reference.io_context__basic_executor_type.operator_eq_.overload1 operator=]``(
      const basic_executor_type & other);
  ``  [''''&raquo;''' [link asio.reference.io_context__basic_executor_type.operator_eq_.overload1 more...]]``


Move assignment operator. 


  basic_executor_type & ``[link asio.reference.io_context__basic_executor_type.operator_eq_.overload2 operator=]``(
      basic_executor_type && other);
  ``  [''''&raquo;''' [link asio.reference.io_context__basic_executor_type.operator_eq_.overload2 more...]]``


[section:overload1 io_context::basic_executor_type::operator= (1 of 2 overloads)]


Assignment operator. 


  basic_executor_type & operator=(
      const basic_executor_type & other);



[endsect]



[section:overload2 io_context::basic_executor_type::operator= (2 of 2 overloads)]


Move assignment operator. 


  basic_executor_type & operator=(
      basic_executor_type && other);



[endsect]


[endsect]


[section:operator_eq__eq_ io_context::basic_executor_type::operator==]

[indexterm2 asio.indexterm.io_context__basic_executor_type.operator_eq__eq_..operator==..io_context::basic_executor_type] 
Compare two executors for equality. 


  friend bool operator==(
      const basic_executor_type & a,
      const basic_executor_type & b);


Two executors are equal if they refer to the same underlying [link asio.reference.io_context `io_context`]. 

[heading Requirements]

['Header: ][^asio/io_context.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:post io_context::basic_executor_type::post]

[indexterm2 asio.indexterm.io_context__basic_executor_type.post..post..io_context::basic_executor_type] 
Request the [link asio.reference.io_context `io_context`] to invoke the given function object. 


  template<
      typename Function,
      typename OtherAllocator>
  void post(
      Function && f,
      const OtherAllocator & a) const;


This function is used to ask the [link asio.reference.io_context `io_context`] to execute the given function object. The function object will never be executed inside `post()`. Instead, it will be scheduled to run on the [link asio.reference.io_context `io_context`].


[heading Parameters]
    

[variablelist
  
[[f][The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:
``
   void function(); 
``
]]

[[a][An allocator that may be used by the executor to allocate the internal storage needed for function invocation. ]]

]




[endsect]


[section:query io_context::basic_executor_type::query]

[indexterm2 asio.indexterm.io_context__basic_executor_type.query..query..io_context::basic_executor_type] 
Query the current value of the `context` property. 


  io_context & ``[link asio.reference.io_context__basic_executor_type.query.overload1 query]``(
      execution::context_t ) const;
  ``  [''''&raquo;''' [link asio.reference.io_context__basic_executor_type.query.overload1 more...]]``


Query the current value of the `blocking` property. 


  constexpr execution::blocking_t ``[link asio.reference.io_context__basic_executor_type.query.overload2 query]``(
      execution::blocking_t ) const;
  ``  [''''&raquo;''' [link asio.reference.io_context__basic_executor_type.query.overload2 more...]]``


Query the current value of the `relationship` property. 


  constexpr execution::relationship_t ``[link asio.reference.io_context__basic_executor_type.query.overload3 query]``(
      execution::relationship_t ) const;
  ``  [''''&raquo;''' [link asio.reference.io_context__basic_executor_type.query.overload3 more...]]``


Query the current value of the `allocator` property. 


  template<
      typename OtherAllocator>
  constexpr Allocator ``[link asio.reference.io_context__basic_executor_type.query.overload4 query]``(
      execution::allocator_t< OtherAllocator > ) const;
  ``  [''''&raquo;''' [link asio.reference.io_context__basic_executor_type.query.overload4 more...]]``

  constexpr Allocator ``[link asio.reference.io_context__basic_executor_type.query.overload5 query]``(
      execution::allocator_t< void > ) const;
  ``  [''''&raquo;''' [link asio.reference.io_context__basic_executor_type.query.overload5 more...]]``


[section:overload1 io_context::basic_executor_type::query (1 of 5 overloads)]


Query the current value of the `context` property. 


  io_context & query(
      execution::context_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   auto ex = my_io_context.get_executor();
   asio::io_context& ctx = asio::query(
       ex, asio::execution::context); 





[endsect]



[section:overload2 io_context::basic_executor_type::query (2 of 5 overloads)]


Query the current value of the `blocking` property. 


  constexpr execution::blocking_t query(
      execution::blocking_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   auto ex = my_io_context.get_executor();
   if (asio::query(ex, asio::execution::blocking)
         == asio::execution::blocking.always)
     ... 





[endsect]



[section:overload3 io_context::basic_executor_type::query (3 of 5 overloads)]


Query the current value of the `relationship` property. 


  constexpr execution::relationship_t query(
      execution::relationship_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   auto ex = my_io_context.get_executor();
   if (asio::query(ex, asio::execution::relationship)
         == asio::execution::relationship.continuation)
     ... 





[endsect]



[section:overload4 io_context::basic_executor_type::query (4 of 5 overloads)]


Query the current value of the `allocator` property. 


  template<
      typename OtherAllocator>
  constexpr Allocator query(
      execution::allocator_t< OtherAllocator > ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   auto ex = my_io_context.get_executor();
   auto alloc = asio::query(ex,
       asio::execution::allocator); 





[endsect]



[section:overload5 io_context::basic_executor_type::query (5 of 5 overloads)]


Query the current value of the `allocator` property. 


  constexpr Allocator query(
      execution::allocator_t< void > ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   auto ex = my_io_context.get_executor();
   auto alloc = asio::query(ex,
       asio::execution::allocator); 





[endsect]


[endsect]

[section:query__static io_context::basic_executor_type::query]

[indexterm2 asio.indexterm.io_context__basic_executor_type.query__static..query..io_context::basic_executor_type] 
Query the current value of the `mapping` property. 


  static constexpr execution::mapping_t ``[link asio.reference.io_context__basic_executor_type.query__static.overload1 query]``(
      execution::mapping_t );
  ``  [''''&raquo;''' [link asio.reference.io_context__basic_executor_type.query__static.overload1 more...]]``


Query the current value of the `outstanding_work` property. 


  static constexpr execution::outstanding_work_t ``[link asio.reference.io_context__basic_executor_type.query__static.overload2 query]``(
      execution::outstanding_work_t );
  ``  [''''&raquo;''' [link asio.reference.io_context__basic_executor_type.query__static.overload2 more...]]``


[section:overload1 io_context::basic_executor_type::query (1 of 2 overloads)]


Query the current value of the `mapping` property. 


  static constexpr execution::mapping_t query(
      execution::mapping_t );


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   auto ex = my_io_context.get_executor();
   if (asio::query(ex, asio::execution::mapping)
         == asio::execution::mapping.thread)
     ... 





[endsect]



[section:overload2 io_context::basic_executor_type::query (2 of 2 overloads)]


Query the current value of the `outstanding_work` property. 


  static constexpr execution::outstanding_work_t query(
      execution::outstanding_work_t );


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   auto ex = my_io_context.get_executor();
   if (asio::query(ex, asio::execution::outstanding_work)
         == asio::execution::outstanding_work.tracked)
     ... 





[endsect]


[endsect]

[section:require io_context::basic_executor_type::require]

[indexterm2 asio.indexterm.io_context__basic_executor_type.require..require..io_context::basic_executor_type] 
Obtain an executor with the `blocking.possibly` property. 


  constexpr basic_executor_type ``[link asio.reference.io_context__basic_executor_type.require.overload1 require]``(
      execution::blocking_t::possibly_t ) const;
  ``  [''''&raquo;''' [link asio.reference.io_context__basic_executor_type.require.overload1 more...]]``


Obtain an executor with the `blocking.never` property. 


  constexpr basic_executor_type ``[link asio.reference.io_context__basic_executor_type.require.overload2 require]``(
      execution::blocking_t::never_t ) const;
  ``  [''''&raquo;''' [link asio.reference.io_context__basic_executor_type.require.overload2 more...]]``


Obtain an executor with the `relationship.fork` property. 


  constexpr basic_executor_type ``[link asio.reference.io_context__basic_executor_type.require.overload3 require]``(
      execution::relationship_t::fork_t ) const;
  ``  [''''&raquo;''' [link asio.reference.io_context__basic_executor_type.require.overload3 more...]]``


Obtain an executor with the `relationship.continuation` property. 


  constexpr basic_executor_type ``[link asio.reference.io_context__basic_executor_type.require.overload4 require]``(
      execution::relationship_t::continuation_t ) const;
  ``  [''''&raquo;''' [link asio.reference.io_context__basic_executor_type.require.overload4 more...]]``


Obtain an executor with the `outstanding_work.tracked` property. 


  constexpr basic_executor_type< Allocator, unspecified > ``[link asio.reference.io_context__basic_executor_type.require.overload5 require]``(
      execution::outstanding_work_t::tracked_t ) const;
  ``  [''''&raquo;''' [link asio.reference.io_context__basic_executor_type.require.overload5 more...]]``


Obtain an executor with the `outstanding_work.untracked` property. 


  constexpr basic_executor_type< Allocator, unspecified > ``[link asio.reference.io_context__basic_executor_type.require.overload6 require]``(
      execution::outstanding_work_t::untracked_t ) const;
  ``  [''''&raquo;''' [link asio.reference.io_context__basic_executor_type.require.overload6 more...]]``


Obtain an executor with the specified `allocator` property. 


  template<
      typename OtherAllocator>
  constexpr basic_executor_type< OtherAllocator, Bits > ``[link asio.reference.io_context__basic_executor_type.require.overload7 require]``(
      execution::allocator_t< OtherAllocator > a) const;
  ``  [''''&raquo;''' [link asio.reference.io_context__basic_executor_type.require.overload7 more...]]``


Obtain an executor with the default `allocator` property. 


  constexpr basic_executor_type< std::allocator< void >, Bits > ``[link asio.reference.io_context__basic_executor_type.require.overload8 require]``(
      execution::allocator_t< void > ) const;
  ``  [''''&raquo;''' [link asio.reference.io_context__basic_executor_type.require.overload8 more...]]``


[section:overload1 io_context::basic_executor_type::require (1 of 8 overloads)]


Obtain an executor with the `blocking.possibly` property. 


  constexpr basic_executor_type require(
      execution::blocking_t::possibly_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   auto ex1 = my_io_context.get_executor();
   auto ex2 = asio::require(ex1,
       asio::execution::blocking.possibly); 





[endsect]



[section:overload2 io_context::basic_executor_type::require (2 of 8 overloads)]


Obtain an executor with the `blocking.never` property. 


  constexpr basic_executor_type require(
      execution::blocking_t::never_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   auto ex1 = my_io_context.get_executor();
   auto ex2 = asio::require(ex1,
       asio::execution::blocking.never); 





[endsect]



[section:overload3 io_context::basic_executor_type::require (3 of 8 overloads)]


Obtain an executor with the `relationship.fork` property. 


  constexpr basic_executor_type require(
      execution::relationship_t::fork_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   auto ex1 = my_io_context.get_executor();
   auto ex2 = asio::require(ex1,
       asio::execution::relationship.fork); 





[endsect]



[section:overload4 io_context::basic_executor_type::require (4 of 8 overloads)]


Obtain an executor with the `relationship.continuation` property. 


  constexpr basic_executor_type require(
      execution::relationship_t::continuation_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   auto ex1 = my_io_context.get_executor();
   auto ex2 = asio::require(ex1,
       asio::execution::relationship.continuation); 





[endsect]



[section:overload5 io_context::basic_executor_type::require (5 of 8 overloads)]


Obtain an executor with the `outstanding_work.tracked` property. 


  constexpr basic_executor_type< Allocator, unspecified > require(
      execution::outstanding_work_t::tracked_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   auto ex1 = my_io_context.get_executor();
   auto ex2 = asio::require(ex1,
       asio::execution::outstanding_work.tracked); 





[endsect]



[section:overload6 io_context::basic_executor_type::require (6 of 8 overloads)]


Obtain an executor with the `outstanding_work.untracked` property. 


  constexpr basic_executor_type< Allocator, unspecified > require(
      execution::outstanding_work_t::untracked_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   auto ex1 = my_io_context.get_executor();
   auto ex2 = asio::require(ex1,
       asio::execution::outstanding_work.untracked); 





[endsect]



[section:overload7 io_context::basic_executor_type::require (7 of 8 overloads)]


Obtain an executor with the specified `allocator` property. 


  template<
      typename OtherAllocator>
  constexpr basic_executor_type< OtherAllocator, Bits > require(
      execution::allocator_t< OtherAllocator > a) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   auto ex1 = my_io_context.get_executor();
   auto ex2 = asio::require(ex1,
       asio::execution::allocator(my_allocator)); 





[endsect]



[section:overload8 io_context::basic_executor_type::require (8 of 8 overloads)]


Obtain an executor with the default `allocator` property. 


  constexpr basic_executor_type< std::allocator< void >, Bits > require(
      execution::allocator_t< void > ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   auto ex1 = my_io_context.get_executor();
   auto ex2 = asio::require(ex1,
       asio::execution::allocator); 





[endsect]


[endsect]


[section:running_in_this_thread io_context::basic_executor_type::running_in_this_thread]

[indexterm2 asio.indexterm.io_context__basic_executor_type.running_in_this_thread..running_in_this_thread..io_context::basic_executor_type] 
Determine whether the [link asio.reference.io_context `io_context`] is running in the current thread. 


  bool running_in_this_thread() const;



[heading Return Value]
      
`true` if the current thread is running the [link asio.reference.io_context `io_context`]. Otherwise returns `false`. 




[endsect]



[section:_basic_executor_type io_context::basic_executor_type::~basic_executor_type]

[indexterm2 asio.indexterm.io_context__basic_executor_type._basic_executor_type..~basic_executor_type..io_context::basic_executor_type] 
Destructor. 


  ~basic_executor_type();



[endsect]



[endsect]

[section:io_context__service io_context::service]


Base class for all [link asio.reference.io_context `io_context`] services. 


  class service


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_context__service.get_io_context [*get_io_context]]]
    [Get the io_context object that owns the service. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_context__service.service [*service]] [constructor]]
    [Constructor. ]
  ]
  
  [
    [[link asio.reference.io_context__service._service [*~service]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/io_context.hpp]

['Convenience header: ][^asio.hpp]


[section:get_io_context io_context::service::get_io_context]

[indexterm2 asio.indexterm.io_context__service.get_io_context..get_io_context..io_context::service] 
Get the [link asio.reference.io_context `io_context`] object that owns the service. 


  asio::io_context & get_io_context();



[endsect]



[section:service io_context::service::service]

[indexterm2 asio.indexterm.io_context__service.service..service..io_context::service] 
Constructor. 


  service(
      asio::io_context & owner);



[heading Parameters]
    

[variablelist
  
[[owner][The [link asio.reference.io_context `io_context`] object that owns the service. ]]

]




[endsect]



[section:_service io_context::service::~service]

[indexterm2 asio.indexterm.io_context__service._service..~service..io_context::service] 
Destructor. 


  virtual ~service();



[endsect]



[endsect]

[section:io_context__strand io_context::strand]


Provides serialised handler execution. 


  class strand


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_context__strand.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_context__strand.defer [*defer]]]
    [Request the strand to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_context__strand.dispatch [*dispatch]]]
    [Request the strand to invoke the given function object. 
     [hr]
     (Deprecated: Use asio::dispatch().) Request the strand to invoke the given handler. ]
  ]
  
  [
    [[link asio.reference.io_context__strand.on_work_finished [*on_work_finished]]]
    [Inform the strand that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_context__strand.on_work_started [*on_work_started]]]
    [Inform the strand that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_context__strand.post [*post]]]
    [Request the strand to invoke the given function object. 
     [hr]
     (Deprecated: Use asio::post().) Request the strand to invoke the given handler and return immediately. ]
  ]
  
  [
    [[link asio.reference.io_context__strand.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the strand is running in the current thread. ]
  ]
  
  [
    [[link asio.reference.io_context__strand.strand [*strand]] [constructor]]
    [Constructor. ]
  ]
  
  [
    [[link asio.reference.io_context__strand.wrap [*wrap]]]
    [(Deprecated: Use asio::bind_executor().) Create a new handler that automatically dispatches the wrapped handler on the strand. ]
  ]
  
  [
    [[link asio.reference.io_context__strand._strand [*~strand]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_context__strand.operator_not__eq_ [*operator!=]]]
    [Compare two strands for inequality. ]
  ]
  
  [
    [[link asio.reference.io_context__strand.operator_eq__eq_ [*operator==]]]
    [Compare two strands for equality. ]
  ]
  
]

The [link asio.reference.io_context__strand `io_context::strand`] class provides the ability to post and dispatch handlers with the guarantee that none of those handlers will execute concurrently.


[heading Order of handler invocation]
  
Given:


* a strand object `s` 


* an object `a` meeting completion handler requirements


* an object `a1` which is an arbitrary copy of `a` made by the implementation


* an object `b` meeting completion handler requirements


* an object `b1` which is an arbitrary copy of `b` made by the implementation

if any of the following conditions are true:


* `s.post(a)` happens-before `s.post(b)` 


* `s.post(a)` happens-before `s.dispatch(b)`, where the latter is performed outside the strand


* `s.dispatch(a)` happens-before `s.post(b)`, where the former is performed outside the strand


* `s.dispatch(a)` happens-before `s.dispatch(b)`, where both are performed outside the strand

then `asio_handler_invoke(a1, &a1)` happens-before `asio_handler_invoke(b1, &b1)`.

Note that in the following case: 

   async_op_1(..., s.wrap(a));
   async_op_2(..., s.wrap(b)); 


the completion of the first async operation will perform `s.dispatch(a)`, and the second will perform `s.dispatch(b)`, but the order in which those are performed is unspecified. That is, you cannot state whether one happens-before the other. Therefore none of the above conditions are met and no ordering guarantee is made.


[heading Remarks]
      
The implementation makes no guarantee that handlers posted or dispatched through different `strand` objects will be invoked concurrently.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Safe.




[heading Requirements]

['Header: ][^asio/io_context_strand.hpp]

['Convenience header: ][^asio.hpp]


[section:context io_context::strand::context]

[indexterm2 asio.indexterm.io_context__strand.context..context..io_context::strand] 
Obtain the underlying execution context. 


  asio::io_context & context() const;



[endsect]



[section:defer io_context::strand::defer]

[indexterm2 asio.indexterm.io_context__strand.defer..defer..io_context::strand] 
Request the strand to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void defer(
      Function && f,
      const Allocator & a) const;


This function is used to ask the executor to execute the given function object. The function object will never be executed inside this function. Instead, it will be scheduled to run by the underlying [link asio.reference.io_context `io_context`].


[heading Parameters]
    

[variablelist
  
[[f][The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:
``
   void function(); 
``
]]

[[a][An allocator that may be used by the executor to allocate the internal storage needed for function invocation. ]]

]




[endsect]


[section:dispatch io_context::strand::dispatch]

[indexterm2 asio.indexterm.io_context__strand.dispatch..dispatch..io_context::strand] 
Request the strand to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void ``[link asio.reference.io_context__strand.dispatch.overload1 dispatch]``(
      Function && f,
      const Allocator & a) const;
  ``  [''''&raquo;''' [link asio.reference.io_context__strand.dispatch.overload1 more...]]``


(Deprecated: Use [link asio.reference.dispatch `dispatch`].) Request the strand to invoke the given handler. 


  template<
      typename ``[link asio.reference.LegacyCompletionHandler LegacyCompletionHandler]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.io_context__strand.dispatch.overload2 dispatch]``(
      LegacyCompletionHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.io_context__strand.dispatch.overload2 more...]]``


[section:overload1 io_context::strand::dispatch (1 of 2 overloads)]


Request the strand to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void dispatch(
      Function && f,
      const Allocator & a) const;


This function is used to ask the strand to execute the given function object on its underlying [link asio.reference.io_context `io_context`]. The function object will be executed inside this function if the strand is not otherwise busy and if the underlying io\_context's executor's `dispatch()` function is also able to execute the function before returning.


[heading Parameters]
    

[variablelist
  
[[f][The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:
``
   void function(); 
``
]]

[[a][An allocator that may be used by the executor to allocate the internal storage needed for function invocation. ]]

]




[endsect]



[section:overload2 io_context::strand::dispatch (2 of 2 overloads)]


(Deprecated: Use [link asio.reference.dispatch `dispatch`].) Request the strand to invoke the given handler. 


  template<
      typename ``[link asio.reference.LegacyCompletionHandler LegacyCompletionHandler]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` dispatch(
      LegacyCompletionHandler && handler);


This function is used to ask the strand to execute the given handler.

The strand object guarantees that handlers posted or dispatched through the strand will not be executed concurrently. The handler may be executed inside this function if the guarantee can be met. If this function is called from within a handler that was posted or dispatched through the same strand, then the new handler will be executed immediately.

The strand's guarantee is in addition to the guarantee provided by the underlying [link asio.reference.io_context `io_context`]. The [link asio.reference.io_context `io_context`] guarantees that the handler will only be called in a thread in which the io\_context's run member function is currently being invoked.


[heading Parameters]
    

[variablelist
  
[[handler][The handler to be called. The strand will make a copy of the handler object as required. The function signature of the handler must be: 
``
   void handler(); 
``
]]

]




[endsect]


[endsect]


[section:on_work_finished io_context::strand::on_work_finished]

[indexterm2 asio.indexterm.io_context__strand.on_work_finished..on_work_finished..io_context::strand] 
Inform the strand that some work is no longer outstanding. 


  void on_work_finished() const;


The strand delegates this call to its underlying [link asio.reference.io_context `io_context`]. 


[endsect]



[section:on_work_started io_context::strand::on_work_started]

[indexterm2 asio.indexterm.io_context__strand.on_work_started..on_work_started..io_context::strand] 
Inform the strand that it has some outstanding work to do. 


  void on_work_started() const;


The strand delegates this call to its underlying [link asio.reference.io_context `io_context`]. 


[endsect]



[section:operator_not__eq_ io_context::strand::operator!=]

[indexterm2 asio.indexterm.io_context__strand.operator_not__eq_..operator!=..io_context::strand] 
Compare two strands for inequality. 


  friend bool operator!=(
      const strand & a,
      const strand & b);


Two strands are equal if they refer to the same ordered, non-concurrent state. 

[heading Requirements]

['Header: ][^asio/io_context_strand.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq__eq_ io_context::strand::operator==]

[indexterm2 asio.indexterm.io_context__strand.operator_eq__eq_..operator==..io_context::strand] 
Compare two strands for equality. 


  friend bool operator==(
      const strand & a,
      const strand & b);


Two strands are equal if they refer to the same ordered, non-concurrent state. 

[heading Requirements]

['Header: ][^asio/io_context_strand.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:post io_context::strand::post]

[indexterm2 asio.indexterm.io_context__strand.post..post..io_context::strand] 
Request the strand to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void ``[link asio.reference.io_context__strand.post.overload1 post]``(
      Function && f,
      const Allocator & a) const;
  ``  [''''&raquo;''' [link asio.reference.io_context__strand.post.overload1 more...]]``


(Deprecated: Use [link asio.reference.post `post`].) Request the strand to invoke the given handler and return immediately. 


  template<
      typename ``[link asio.reference.LegacyCompletionHandler LegacyCompletionHandler]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.io_context__strand.post.overload2 post]``(
      LegacyCompletionHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.io_context__strand.post.overload2 more...]]``


[section:overload1 io_context::strand::post (1 of 2 overloads)]


Request the strand to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void post(
      Function && f,
      const Allocator & a) const;


This function is used to ask the executor to execute the given function object. The function object will never be executed inside this function. Instead, it will be scheduled to run by the underlying [link asio.reference.io_context `io_context`].


[heading Parameters]
    

[variablelist
  
[[f][The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:
``
   void function(); 
``
]]

[[a][An allocator that may be used by the executor to allocate the internal storage needed for function invocation. ]]

]




[endsect]



[section:overload2 io_context::strand::post (2 of 2 overloads)]


(Deprecated: Use [link asio.reference.post `post`].) Request the strand to invoke the given handler and return immediately. 


  template<
      typename ``[link asio.reference.LegacyCompletionHandler LegacyCompletionHandler]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` post(
      LegacyCompletionHandler && handler);


This function is used to ask the strand to execute the given handler, but without allowing the strand to call the handler from inside this function.

The strand object guarantees that handlers posted or dispatched through the strand will not be executed concurrently. The strand's guarantee is in addition to the guarantee provided by the underlying [link asio.reference.io_context `io_context`]. The [link asio.reference.io_context `io_context`] guarantees that the handler will only be called in a thread in which the io\_context's run member function is currently being invoked.


[heading Parameters]
    

[variablelist
  
[[handler][The handler to be called. The strand will make a copy of the handler object as required. The function signature of the handler must be: 
``
   void handler(); 
``
]]

]




[endsect]


[endsect]


[section:running_in_this_thread io_context::strand::running_in_this_thread]

[indexterm2 asio.indexterm.io_context__strand.running_in_this_thread..running_in_this_thread..io_context::strand] 
Determine whether the strand is running in the current thread. 


  bool running_in_this_thread() const;



[heading Return Value]
      
`true` if the current thread is executing a handler that was submitted to the strand using `post()`, `dispatch()` or `wrap()`. Otherwise returns `false`. 




[endsect]



[section:strand io_context::strand::strand]

[indexterm2 asio.indexterm.io_context__strand.strand..strand..io_context::strand] 
Constructor. 


  strand(
      asio::io_context & io_context);


Constructs the strand.


[heading Parameters]
    

[variablelist
  
[[io_context][The [link asio.reference.io_context `io_context`] object that the strand will use to dispatch handlers that are ready to be run. ]]

]




[endsect]



[section:wrap io_context::strand::wrap]

[indexterm2 asio.indexterm.io_context__strand.wrap..wrap..io_context::strand] 
(Deprecated: Use [link asio.reference.bind_executor `bind_executor`].) Create a new handler that automatically dispatches the wrapped handler on the strand. 


  template<
      typename ``[link asio.reference.Handler Handler]``>
  unspecified wrap(
      Handler handler);


This function is used to create a new handler function object that, when invoked, will automatically pass the wrapped handler to the strand's dispatch function.


[heading Parameters]
    

[variablelist
  
[[handler][The handler to be wrapped. The strand will make a copy of the handler object as required. The function signature of the handler must be:
``
   void handler(A1 a1, ... An an); 
``
]]

]


[heading Return Value]
      
A function object that, when invoked, passes the wrapped handler to the strand's dispatch function. Given a function object with the signature: 

   R f(A1 a1, ... An an); 


If this function object is passed to the wrap function like so: 

   strand.wrap(f); 


then the return value is a function object with the signature 

   void g(A1 a1, ... An an); 


that, when invoked, executes code equivalent to: 

   strand.dispatch(boost::bind(f, a1, ... an)); 







[endsect]



[section:_strand io_context::strand::~strand]

[indexterm2 asio.indexterm.io_context__strand._strand..~strand..io_context::strand] 
Destructor. 


  ~strand();


Destroys a strand.

Handlers posted through the strand that have not yet been invoked will still be dispatched in a way that meets the guarantee of non-concurrency. 


[endsect]



[endsect]

[section:io_context__work io_context::work]


(Deprecated: Use [link asio.reference.executor_work_guard `executor_work_guard`].) Class to inform the [link asio.reference.io_context `io_context`] when it has work to do. 


  class work


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_context__work.get_io_context [*get_io_context]]]
    [Get the io_context associated with the work. ]
  ]
  
  [
    [[link asio.reference.io_context__work.work [*work]] [constructor]]
    [Constructor notifies the io_context that work is starting. 
     [hr]
     Copy constructor notifies the io_context that work is starting. ]
  ]
  
  [
    [[link asio.reference.io_context__work._work [*~work]] [destructor]]
    [Destructor notifies the io_context that the work is complete. ]
  ]
  
]

The work class is used to inform the [link asio.reference.io_context `io_context`] when work starts and finishes. This ensures that the [link asio.reference.io_context `io_context`] object's `run()` function will not exit while work is underway, and that it does exit when there is no unfinished work remaining.

The work class is copy-constructible so that it may be used as a data member in a handler class. It is not assignable. 

[heading Requirements]

['Header: ][^asio/io_context.hpp]

['Convenience header: ][^asio.hpp]


[section:get_io_context io_context::work::get_io_context]

[indexterm2 asio.indexterm.io_context__work.get_io_context..get_io_context..io_context::work] 
Get the [link asio.reference.io_context `io_context`] associated with the work. 


  asio::io_context & get_io_context();



[endsect]


[section:work io_context::work::work]

[indexterm2 asio.indexterm.io_context__work.work..work..io_context::work] 
Constructor notifies the [link asio.reference.io_context `io_context`] that work is starting. 


  explicit ``[link asio.reference.io_context__work.work.overload1 work]``(
      asio::io_context & io_context);
  ``  [''''&raquo;''' [link asio.reference.io_context__work.work.overload1 more...]]``


Copy constructor notifies the [link asio.reference.io_context `io_context`] that work is starting. 


  ``[link asio.reference.io_context__work.work.overload2 work]``(
      const work & other);
  ``  [''''&raquo;''' [link asio.reference.io_context__work.work.overload2 more...]]``


[section:overload1 io_context::work::work (1 of 2 overloads)]


Constructor notifies the [link asio.reference.io_context `io_context`] that work is starting. 


  work(
      asio::io_context & io_context);


The constructor is used to inform the [link asio.reference.io_context `io_context`] that some work has begun. This ensures that the [link asio.reference.io_context `io_context`] object's `run()` function will not exit while the work is underway. 


[endsect]



[section:overload2 io_context::work::work (2 of 2 overloads)]


Copy constructor notifies the [link asio.reference.io_context `io_context`] that work is starting. 


  work(
      const work & other);


The constructor is used to inform the [link asio.reference.io_context `io_context`] that some work has begun. This ensures that the [link asio.reference.io_context `io_context`] object's `run()` function will not exit while the work is underway. 


[endsect]


[endsect]


[section:_work io_context::work::~work]

[indexterm2 asio.indexterm.io_context__work._work..~work..io_context::work] 
Destructor notifies the [link asio.reference.io_context `io_context`] that the work is complete. 


  ~work();


The destructor is used to inform the [link asio.reference.io_context `io_context`] that some work has finished. Once the count of unfinished work reaches zero, the [link asio.reference.io_context `io_context`] object's `run()` function is permitted to exit. 


[endsect]



[endsect]


[section:io_service io_service]

[indexterm1 asio.indexterm.io_service..io_service] 
Typedef for backwards compatibility. 


  typedef io_context io_service;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.io_context__basic_executor_type [*basic_executor_type]]]
    [Executor implementation type used to submit functions to an io_context. ]
  
  ]

  [

    [[link asio.reference.io_context__service [*service]]]
    [Base class for all io_context services. ]
  
  ]

  [

    [[link asio.reference.io_context__strand [*strand]]]
    [Provides serialised handler execution. ]
  
  ]

  [

    [[link asio.reference.io_context__work [*work]]]
    [(Deprecated: Use executor_work_guard.) Class to inform the io_context when it has work to do. ]
  
  ]

  [

    [[link asio.reference.io_context.count_type [*count_type]]]
    [The type used to count the number of handlers executed by the context. ]
  
  ]

  [

    [[link asio.reference.io_context.executor_type [*executor_type]]]
    [Executor used to submit functions to an io_context. ]
  
  ]

  [

    [[link asio.reference.io_context.fork_event [*fork_event]]]
    [Fork-related event notifications. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_context.dispatch [*dispatch]]]
    [(Deprecated: Use asio::dispatch().) Request the io_context to invoke the given handler. ]
  ]
  
  [
    [[link asio.reference.io_context.get_executor [*get_executor]]]
    [Obtains the executor associated with the io_context. ]
  ]
  
  [
    [[link asio.reference.io_context.io_context [*io_context]] [constructor]]
    [Constructor. ]
  ]
  
  [
    [[link asio.reference.io_context.notify_fork [*notify_fork]]]
    [Notify the execution_context of a fork-related event. ]
  ]
  
  [
    [[link asio.reference.io_context.poll [*poll]]]
    [Run the io_context object's event processing loop to execute ready handlers. 
     [hr]
     (Deprecated: Use non-error_code overload.) Run the io_context object's event processing loop to execute ready handlers. ]
  ]
  
  [
    [[link asio.reference.io_context.poll_one [*poll_one]]]
    [Run the io_context object's event processing loop to execute one ready handler. 
     [hr]
     (Deprecated: Use non-error_code overload.) Run the io_context object's event processing loop to execute one ready handler. ]
  ]
  
  [
    [[link asio.reference.io_context.post [*post]]]
    [(Deprecated: Use asio::post().) Request the io_context to invoke the given handler and return immediately. ]
  ]
  
  [
    [[link asio.reference.io_context.reset [*reset]]]
    [(Deprecated: Use restart().) Reset the io_context in preparation for a subsequent run() invocation. ]
  ]
  
  [
    [[link asio.reference.io_context.restart [*restart]]]
    [Restart the io_context in preparation for a subsequent run() invocation. ]
  ]
  
  [
    [[link asio.reference.io_context.run [*run]]]
    [Run the io_context object's event processing loop. 
     [hr]
     (Deprecated: Use non-error_code overload.) Run the io_context object's event processing loop. ]
  ]
  
  [
    [[link asio.reference.io_context.run_for [*run_for]]]
    [Run the io_context object's event processing loop for a specified duration. ]
  ]
  
  [
    [[link asio.reference.io_context.run_one [*run_one]]]
    [Run the io_context object's event processing loop to execute at most one handler. 
     [hr]
     (Deprecated: Use non-error_code overlaod.) Run the io_context object's event processing loop to execute at most one handler. ]
  ]
  
  [
    [[link asio.reference.io_context.run_one_for [*run_one_for]]]
    [Run the io_context object's event processing loop for a specified duration to execute at most one handler. ]
  ]
  
  [
    [[link asio.reference.io_context.run_one_until [*run_one_until]]]
    [Run the io_context object's event processing loop until a specified time to execute at most one handler. ]
  ]
  
  [
    [[link asio.reference.io_context.run_until [*run_until]]]
    [Run the io_context object's event processing loop until a specified time. ]
  ]
  
  [
    [[link asio.reference.io_context.stop [*stop]]]
    [Stop the io_context object's event processing loop. ]
  ]
  
  [
    [[link asio.reference.io_context.stopped [*stopped]]]
    [Determine whether the io_context object has been stopped. ]
  ]
  
  [
    [[link asio.reference.io_context.wrap [*wrap]]]
    [(Deprecated: Use asio::bind_executor().) Create a new handler that automatically dispatches the wrapped handler on the io_context. ]
  ]
  
  [
    [[link asio.reference.io_context._io_context [*~io_context]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_context.destroy [*destroy]]]
    [Destroys all services in the context. ]
  ]
  
  [
    [[link asio.reference.io_context.shutdown [*shutdown]]]
    [Shuts down all services in the context. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_context.add_service [*add_service]]]
    [(Deprecated: Use make_service().) Add a service object to the execution_context. ]
  ]
  
  [
    [[link asio.reference.io_context.has_service [*has_service]]]
    [Determine if an execution_context contains a specified service type. ]
  ]
  
  [
    [[link asio.reference.io_context.make_service [*make_service]]]
    [Creates a service object and adds it to the execution_context. ]
  ]
  
  [
    [[link asio.reference.io_context.use_service [*use_service]]]
    [
     [hr]
     Obtain the service object corresponding to the given type. ]
  ]
  
]

The [link asio.reference.io_context `io_context`] class provides the core I/O functionality for users of the asynchronous I/O objects, including:


* `asio::ip::tcp::socket` 

* `asio::ip::tcp::acceptor` 

* `asio::ip::udp::socket` 

* [link asio.reference.deadline_timer `deadline_timer`].

The [link asio.reference.io_context `io_context`] class also includes facilities intended for developers of custom asynchronous services.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Safe, with the specific exceptions of the `restart()` and `notify_fork()` functions. Calling `restart()` while there are unfinished `run()`, `run_one()`, `run_for()`, `run_until()`, `poll()` or `poll_one()` calls results in undefined behaviour. The `notify_fork()` function should not be called while any [link asio.reference.io_context `io_context`] function, or any function on an I/O object that is associated with the [link asio.reference.io_context `io_context`], is being called in another thread.



[heading Synchronous and asynchronous operations]
  


Synchronous operations on I/O objects implicitly run the [link asio.reference.io_context `io_context`] object for an individual operation. The [link asio.reference.io_context `io_context`] functions `run()`, `run_one()`, `run_for()`, `run_until()`, `poll()` or `poll_one()` must be called for the [link asio.reference.io_context `io_context`] to perform asynchronous operations on behalf of a C++ program. Notification that an asynchronous operation has completed is delivered by invocation of the associated handler. Handlers are invoked only by a thread that is currently calling any overload of `run()`, `run_one()`, `run_for()`, `run_until()`, `poll()` or `poll_one()` for the [link asio.reference.io_context `io_context`].


[heading Effect of exceptions thrown from handlers]
  


If an exception is thrown from a handler, the exception is allowed to propagate through the throwing thread's invocation of `run()`, `run_one()`, `run_for()`, `run_until()`, `poll()` or `poll_one()`. No other threads that are calling any of these functions are affected. It is then the responsibility of the application to catch the exception.

After the exception has been caught, the `run()`, `run_one()`, `run_for()`, `run_until()`, `poll()` or `poll_one()` call may be restarted ['without] the need for an intervening call to `restart()`. This allows the thread to rejoin the [link asio.reference.io_context `io_context`] object's thread pool without impacting any other threads in the pool.

For example:



   asio::io_context io_context;
   ...
   for (;;)
   {
     try
     {
       io_context.run();
       break; // run() exited normally
     }
     catch (my_exception& e)
     {
       // Deal with exception as appropriate.
     }
   }





[heading Submitting arbitrary tasks to the io_context]
  


To submit functions to the [link asio.reference.io_context `io_context`], use the [link asio.reference.dispatch `dispatch`] , [link asio.reference.post `post`]  or [link asio.reference.defer `defer`]  free functions.

For example:



   void my_task()
   {
     ...
   }

   ...

   asio::io_context io_context;

   // Submit a function to the io_context.
   asio::post(io_context, my_task);

   // Submit a lambda object to the io_context.
   asio::post(io_context,
       []()
       {
         ...
       });

   // Run the io_context until it runs out of work.
   io_context.run(); 





[heading Stopping the io_context from running out of work]
  


Some applications may need to prevent an [link asio.reference.io_context `io_context`] object's `run()` call from returning when there is no more work to do. For example, the [link asio.reference.io_context `io_context`] may be being run in a background thread that is launched prior to the application's asynchronous operations. The `run()` call may be kept running by creating an executor that tracks work against the [link asio.reference.io_context `io_context`]:



   asio::io_context io_context;
   auto work = asio::require(io_context.get_executor(),
       asio::execution::outstanding_work.tracked);
   ... 




If using C++03, which lacks automatic variable type deduction, you may compute the return type of the require call:



   asio::io_context io_context;
   typename asio::require_result<
       asio::io_context::executor_type,
       asio::exeution::outstanding_work_t::tracked_t>
     work = asio::require(io_context.get_executor(),
       asio::execution::outstanding_work.tracked);
   ... 




or store the result in the type-erasing executor wrapper, any\_io\_executor:



   asio::io_context io_context;
   asio::any_io_executor work
     = asio::require(io_context.get_executor(),
         asio::execution::outstanding_work.tracked);
   ... 




To effect a shutdown, the application will then need to call the [link asio.reference.io_context `io_context`] object's `stop()` member function. This will cause the [link asio.reference.io_context `io_context`] `run()` call to return as soon as possible, abandoning unfinished operations and without permitting ready handlers to be dispatched.

Alternatively, if the application requires that all operations and handlers be allowed to finish normally, store the work-tracking executor in an any\_io\_executor object, so that it may be explicitly reset.



   asio::io_context io_context;
   asio::any_io_executor work
     = asio::require(io_context.get_executor(),
         asio::execution::outstanding_work.tracked);
   ...
   work = asio::any_io_executor(); // Allow run() to exit. 





[heading Requirements]

['Header: ][^asio/io_service.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:ip__address ip::address]


Implements version-independent IP addresses. 


  class address


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address.address [*address]] [constructor]]
    [Default constructor. 
     [hr]
     Construct an address from an IPv4 address. 
     [hr]
     Construct an address from an IPv6 address. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__address.from_string [*from_string]] [static]]
    [(Deprecated: Use make_address().) Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation. ]
  ]
  
  [
    [[link asio.reference.ip__address.is_loopback [*is_loopback]]]
    [Determine whether the address is a loopback address. ]
  ]
  
  [
    [[link asio.reference.ip__address.is_multicast [*is_multicast]]]
    [Determine whether the address is a multicast address. ]
  ]
  
  [
    [[link asio.reference.ip__address.is_unspecified [*is_unspecified]]]
    [Determine whether the address is unspecified. ]
  ]
  
  [
    [[link asio.reference.ip__address.is_v4 [*is_v4]]]
    [Get whether the address is an IP version 4 address. ]
  ]
  
  [
    [[link asio.reference.ip__address.is_v6 [*is_v6]]]
    [Get whether the address is an IP version 6 address. ]
  ]
  
  [
    [[link asio.reference.ip__address.operator_eq_ [*operator=]]]
    [Assign from another address. 
     [hr]
     Assign from an IPv4 address. 
     [hr]
     Assign from an IPv6 address. ]
  ]
  
  [
    [[link asio.reference.ip__address.to_string [*to_string]]]
    [Get the address as a string. 
     [hr]
     (Deprecated: Use other overload.) Get the address as a string. ]
  ]
  
  [
    [[link asio.reference.ip__address.to_v4 [*to_v4]]]
    [Get the address as an IP version 4 address. ]
  ]
  
  [
    [[link asio.reference.ip__address.to_v6 [*to_v6]]]
    [Get the address as an IP version 6 address. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address.operator_not__eq_ [*operator!=]]]
    [Compare two addresses for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__address.operator_lt_ [*operator<]]]
    [Compare addresses for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__address.operator_lt__eq_ [*operator<=]]]
    [Compare addresses for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__address.operator_eq__eq_ [*operator==]]]
    [Compare two addresses for equality. ]
  ]
  
  [
    [[link asio.reference.ip__address.operator_gt_ [*operator>]]]
    [Compare addresses for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__address.operator_gt__eq_ [*operator>=]]]
    [Compare addresses for ordering. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address.make_address [*make_address]]]
    [Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation. ]
  ]
  
  [
    [[link asio.reference.ip__address.operator_lt__lt_ [*operator<<]]]
    [Output an address as a string. ]
  ]
  
]

The [link asio.reference.ip__address `ip::address`] class provides the ability to use either IP version 4 or version 6 addresses.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/ip/address.hpp]

['Convenience header: ][^asio.hpp]

[section:address ip::address::address]

[indexterm2 asio.indexterm.ip__address.address..address..ip::address] 
Default constructor. 


  ``[link asio.reference.ip__address.address.overload1 address]``();
  ``  [''''&raquo;''' [link asio.reference.ip__address.address.overload1 more...]]``


Construct an address from an IPv4 address. 


  ``[link asio.reference.ip__address.address.overload2 address]``(
      const asio::ip::address_v4 & ipv4_address);
  ``  [''''&raquo;''' [link asio.reference.ip__address.address.overload2 more...]]``


Construct an address from an IPv6 address. 


  ``[link asio.reference.ip__address.address.overload3 address]``(
      const asio::ip::address_v6 & ipv6_address);
  ``  [''''&raquo;''' [link asio.reference.ip__address.address.overload3 more...]]``


Copy constructor. 


  ``[link asio.reference.ip__address.address.overload4 address]``(
      const address & other);
  ``  [''''&raquo;''' [link asio.reference.ip__address.address.overload4 more...]]``


[section:overload1 ip::address::address (1 of 4 overloads)]


Default constructor. 


  address();



[endsect]



[section:overload2 ip::address::address (2 of 4 overloads)]


Construct an address from an IPv4 address. 


  address(
      const asio::ip::address_v4 & ipv4_address);



[endsect]



[section:overload3 ip::address::address (3 of 4 overloads)]


Construct an address from an IPv6 address. 


  address(
      const asio::ip::address_v6 & ipv6_address);



[endsect]



[section:overload4 ip::address::address (4 of 4 overloads)]


Copy constructor. 


  address(
      const address & other);



[endsect]


[endsect]

[section:from_string ip::address::from_string]

[indexterm2 asio.indexterm.ip__address.from_string..from_string..ip::address] 
(Deprecated: Use `make_address()`.) Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation. 


  static address ``[link asio.reference.ip__address.from_string.overload1 from_string]``(
      const char * str);
  ``  [''''&raquo;''' [link asio.reference.ip__address.from_string.overload1 more...]]``

  static address ``[link asio.reference.ip__address.from_string.overload2 from_string]``(
      const char * str,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__address.from_string.overload2 more...]]``

  static address ``[link asio.reference.ip__address.from_string.overload3 from_string]``(
      const std::string & str);
  ``  [''''&raquo;''' [link asio.reference.ip__address.from_string.overload3 more...]]``

  static address ``[link asio.reference.ip__address.from_string.overload4 from_string]``(
      const std::string & str,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__address.from_string.overload4 more...]]``


[section:overload1 ip::address::from_string (1 of 4 overloads)]


(Deprecated: Use `make_address()`.) Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation. 


  static address from_string(
      const char * str);



[endsect]



[section:overload2 ip::address::from_string (2 of 4 overloads)]


(Deprecated: Use `make_address()`.) Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation. 


  static address from_string(
      const char * str,
      asio::error_code & ec);



[endsect]



[section:overload3 ip::address::from_string (3 of 4 overloads)]


(Deprecated: Use `make_address()`.) Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation. 


  static address from_string(
      const std::string & str);



[endsect]



[section:overload4 ip::address::from_string (4 of 4 overloads)]


(Deprecated: Use `make_address()`.) Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation. 


  static address from_string(
      const std::string & str,
      asio::error_code & ec);



[endsect]


[endsect]


[section:is_loopback ip::address::is_loopback]

[indexterm2 asio.indexterm.ip__address.is_loopback..is_loopback..ip::address] 
Determine whether the address is a loopback address. 


  bool is_loopback() const;



[endsect]



[section:is_multicast ip::address::is_multicast]

[indexterm2 asio.indexterm.ip__address.is_multicast..is_multicast..ip::address] 
Determine whether the address is a multicast address. 


  bool is_multicast() const;



[endsect]



[section:is_unspecified ip::address::is_unspecified]

[indexterm2 asio.indexterm.ip__address.is_unspecified..is_unspecified..ip::address] 
Determine whether the address is unspecified. 


  bool is_unspecified() const;



[endsect]



[section:is_v4 ip::address::is_v4]

[indexterm2 asio.indexterm.ip__address.is_v4..is_v4..ip::address] 
Get whether the address is an IP version 4 address. 


  bool is_v4() const;



[endsect]



[section:is_v6 ip::address::is_v6]

[indexterm2 asio.indexterm.ip__address.is_v6..is_v6..ip::address] 
Get whether the address is an IP version 6 address. 


  bool is_v6() const;



[endsect]


[section:make_address ip::address::make_address]

[indexterm2 asio.indexterm.ip__address.make_address..make_address..ip::address] 
Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation. 


  address ``[link asio.reference.ip__address.make_address.overload1 make_address]``(
      const char * str);
  ``  [''''&raquo;''' [link asio.reference.ip__address.make_address.overload1 more...]]``

  address ``[link asio.reference.ip__address.make_address.overload2 make_address]``(
      const char * str,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__address.make_address.overload2 more...]]``

  address ``[link asio.reference.ip__address.make_address.overload3 make_address]``(
      const std::string & str);
  ``  [''''&raquo;''' [link asio.reference.ip__address.make_address.overload3 more...]]``

  address ``[link asio.reference.ip__address.make_address.overload4 make_address]``(
      const std::string & str,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__address.make_address.overload4 more...]]``

  address ``[link asio.reference.ip__address.make_address.overload5 make_address]``(
      string_view str);
  ``  [''''&raquo;''' [link asio.reference.ip__address.make_address.overload5 more...]]``

  address ``[link asio.reference.ip__address.make_address.overload6 make_address]``(
      string_view str,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__address.make_address.overload6 more...]]``


[section:overload1 ip::address::make_address (1 of 6 overloads)]


Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation. 


  address make_address(
      const char * str);



[endsect]



[section:overload2 ip::address::make_address (2 of 6 overloads)]


Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation. 


  address make_address(
      const char * str,
      asio::error_code & ec);



[endsect]



[section:overload3 ip::address::make_address (3 of 6 overloads)]


Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation. 


  address make_address(
      const std::string & str);



[endsect]



[section:overload4 ip::address::make_address (4 of 6 overloads)]


Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation. 


  address make_address(
      const std::string & str,
      asio::error_code & ec);



[endsect]



[section:overload5 ip::address::make_address (5 of 6 overloads)]


Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation. 


  address make_address(
      string_view str);



[endsect]



[section:overload6 ip::address::make_address (6 of 6 overloads)]


Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation. 


  address make_address(
      string_view str,
      asio::error_code & ec);



[endsect]


[endsect]


[section:operator_not__eq_ ip::address::operator!=]

[indexterm2 asio.indexterm.ip__address.operator_not__eq_..operator!=..ip::address] 
Compare two addresses for inequality. 


  friend bool operator!=(
      const address & a1,
      const address & a2);


[heading Requirements]

['Header: ][^asio/ip/address.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_lt_ ip::address::operator<]

[indexterm2 asio.indexterm.ip__address.operator_lt_..operator<..ip::address] 
Compare addresses for ordering. 


  friend bool operator<(
      const address & a1,
      const address & a2);


[heading Requirements]

['Header: ][^asio/ip/address.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_lt__lt_ ip::address::operator<<]

[indexterm2 asio.indexterm.ip__address.operator_lt__lt_..operator<<..ip::address] 
Output an address as a string. 


  template<
      typename Elem,
      typename Traits>
  std::basic_ostream< Elem, Traits > & operator<<(
      std::basic_ostream< Elem, Traits > & os,
      const address & addr);


Used to output a human-readable string for a specified address.


[heading Parameters]
    

[variablelist
  
[[os][The output stream to which the string will be written.]]

[[addr][The address to be written.]]

]


[heading Return Value]
      
The output stream. 




[endsect]



[section:operator_lt__eq_ ip::address::operator<=]

[indexterm2 asio.indexterm.ip__address.operator_lt__eq_..operator<=..ip::address] 
Compare addresses for ordering. 


  friend bool operator<=(
      const address & a1,
      const address & a2);


[heading Requirements]

['Header: ][^asio/ip/address.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:operator_eq_ ip::address::operator=]

[indexterm2 asio.indexterm.ip__address.operator_eq_..operator=..ip::address] 
Assign from another address. 


  address & ``[link asio.reference.ip__address.operator_eq_.overload1 operator=]``(
      const address & other);
  ``  [''''&raquo;''' [link asio.reference.ip__address.operator_eq_.overload1 more...]]``


Assign from an IPv4 address. 


  address & ``[link asio.reference.ip__address.operator_eq_.overload2 operator=]``(
      const asio::ip::address_v4 & ipv4_address);
  ``  [''''&raquo;''' [link asio.reference.ip__address.operator_eq_.overload2 more...]]``


Assign from an IPv6 address. 


  address & ``[link asio.reference.ip__address.operator_eq_.overload3 operator=]``(
      const asio::ip::address_v6 & ipv6_address);
  ``  [''''&raquo;''' [link asio.reference.ip__address.operator_eq_.overload3 more...]]``


[section:overload1 ip::address::operator= (1 of 3 overloads)]


Assign from another address. 


  address & operator=(
      const address & other);



[endsect]



[section:overload2 ip::address::operator= (2 of 3 overloads)]


Assign from an IPv4 address. 


  address & operator=(
      const asio::ip::address_v4 & ipv4_address);



[endsect]



[section:overload3 ip::address::operator= (3 of 3 overloads)]


Assign from an IPv6 address. 


  address & operator=(
      const asio::ip::address_v6 & ipv6_address);



[endsect]


[endsect]


[section:operator_eq__eq_ ip::address::operator==]

[indexterm2 asio.indexterm.ip__address.operator_eq__eq_..operator==..ip::address] 
Compare two addresses for equality. 


  friend bool operator==(
      const address & a1,
      const address & a2);


[heading Requirements]

['Header: ][^asio/ip/address.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_gt_ ip::address::operator>]

[indexterm2 asio.indexterm.ip__address.operator_gt_..operator>..ip::address] 
Compare addresses for ordering. 


  friend bool operator>(
      const address & a1,
      const address & a2);


[heading Requirements]

['Header: ][^asio/ip/address.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_gt__eq_ ip::address::operator>=]

[indexterm2 asio.indexterm.ip__address.operator_gt__eq_..operator>=..ip::address] 
Compare addresses for ordering. 


  friend bool operator>=(
      const address & a1,
      const address & a2);


[heading Requirements]

['Header: ][^asio/ip/address.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:to_string ip::address::to_string]

[indexterm2 asio.indexterm.ip__address.to_string..to_string..ip::address] 
Get the address as a string. 


  std::string ``[link asio.reference.ip__address.to_string.overload1 to_string]``() const;
  ``  [''''&raquo;''' [link asio.reference.ip__address.to_string.overload1 more...]]``


(Deprecated: Use other overload.) Get the address as a string. 


  std::string ``[link asio.reference.ip__address.to_string.overload2 to_string]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.ip__address.to_string.overload2 more...]]``


[section:overload1 ip::address::to_string (1 of 2 overloads)]


Get the address as a string. 


  std::string to_string() const;



[endsect]



[section:overload2 ip::address::to_string (2 of 2 overloads)]


(Deprecated: Use other overload.) Get the address as a string. 


  std::string to_string(
      asio::error_code & ec) const;



[endsect]


[endsect]


[section:to_v4 ip::address::to_v4]

[indexterm2 asio.indexterm.ip__address.to_v4..to_v4..ip::address] 
Get the address as an IP version 4 address. 


  asio::ip::address_v4 to_v4() const;



[endsect]



[section:to_v6 ip::address::to_v6]

[indexterm2 asio.indexterm.ip__address.to_v6..to_v6..ip::address] 
Get the address as an IP version 6 address. 


  asio::ip::address_v6 to_v6() const;



[endsect]



[endsect]

[section:ip__address_v4 ip::address_v4]


Implements IP version 4 style addresses. 


  class address_v4


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__address_v4.bytes_type [*bytes_type]]]
    [The type used to represent an address as an array of bytes. ]
  
  ]

  [

    [[link asio.reference.ip__address_v4.uint_type [*uint_type]]]
    [The type used to represent an address as an unsigned integer. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address_v4.address_v4 [*address_v4]] [constructor]]
    [Default constructor. 
     [hr]
     Construct an address from raw bytes. 
     [hr]
     Construct an address from an unsigned integer in host byte order. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.any [*any]] [static]]
    [Obtain an address object that represents any address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.broadcast [*broadcast]] [static]]
    [Obtain an address object that represents the broadcast address. 
     [hr]
     (Deprecated: Use network_v4 class.) Obtain an address object that represents the broadcast address that corresponds to the specified address and netmask. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.from_string [*from_string]] [static]]
    [(Deprecated: Use make_address_v4().) Create an address from an IP address string in dotted decimal form. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_class_a [*is_class_a]]]
    [(Deprecated: Use network_v4 class.) Determine whether the address is a class A address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_class_b [*is_class_b]]]
    [(Deprecated: Use network_v4 class.) Determine whether the address is a class B address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_class_c [*is_class_c]]]
    [(Deprecated: Use network_v4 class.) Determine whether the address is a class C address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_loopback [*is_loopback]]]
    [Determine whether the address is a loopback address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_multicast [*is_multicast]]]
    [Determine whether the address is a multicast address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_unspecified [*is_unspecified]]]
    [Determine whether the address is unspecified. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.loopback [*loopback]] [static]]
    [Obtain an address object that represents the loopback address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.netmask [*netmask]] [static]]
    [(Deprecated: Use network_v4 class.) Obtain the netmask that corresponds to the address, based on its address class. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.operator_eq_ [*operator=]]]
    [Assign from another address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.to_bytes [*to_bytes]]]
    [Get the address in bytes, in network byte order. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.to_string [*to_string]]]
    [Get the address as a string in dotted decimal format. 
     [hr]
     (Deprecated: Use other overload.) Get the address as a string in dotted decimal format. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.to_uint [*to_uint]]]
    [Get the address as an unsigned integer in host byte order. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.to_ulong [*to_ulong]]]
    [Get the address as an unsigned long in host byte order. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address_v4.operator_not__eq_ [*operator!=]]]
    [Compare two addresses for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.operator_lt_ [*operator<]]]
    [Compare addresses for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.operator_lt__eq_ [*operator<=]]]
    [Compare addresses for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.operator_eq__eq_ [*operator==]]]
    [Compare two addresses for equality. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.operator_gt_ [*operator>]]]
    [Compare addresses for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.operator_gt__eq_ [*operator>=]]]
    [Compare addresses for ordering. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address_v4.make_address_v4 [*make_address_v4]]]
    [Create an IPv4 address from raw bytes in network order. 

     Create an IPv4 address from an unsigned integer in host byte order. 

     Create an IPv4 address from an IP address string in dotted decimal form. 

     Create an IPv4 address from a IPv4-mapped IPv6 address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.make_network_v4 [*make_network_v4]]]
    [Create an IPv4 network from an address and prefix length. 

     Create an IPv4 network from an address and netmask. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.operator_lt__lt_ [*operator<<]]]
    [Output an address as a string. 

     Output a network as a string. ]
  ]
  
]

The [link asio.reference.ip__address_v4 `ip::address_v4`] class provides the ability to use and manipulate IP version 4 addresses.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/ip/address_v4.hpp]

['Convenience header: ][^asio.hpp]

[section:address_v4 ip::address_v4::address_v4]

[indexterm2 asio.indexterm.ip__address_v4.address_v4..address_v4..ip::address_v4] 
Default constructor. 


  ``[link asio.reference.ip__address_v4.address_v4.overload1 address_v4]``();
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.address_v4.overload1 more...]]``


Construct an address from raw bytes. 


  explicit ``[link asio.reference.ip__address_v4.address_v4.overload2 address_v4]``(
      const bytes_type & bytes);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.address_v4.overload2 more...]]``


Construct an address from an unsigned integer in host byte order. 


  explicit ``[link asio.reference.ip__address_v4.address_v4.overload3 address_v4]``(
      uint_type addr);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.address_v4.overload3 more...]]``


Copy constructor. 


  ``[link asio.reference.ip__address_v4.address_v4.overload4 address_v4]``(
      const address_v4 & other);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.address_v4.overload4 more...]]``


[section:overload1 ip::address_v4::address_v4 (1 of 4 overloads)]


Default constructor. 


  address_v4();



[endsect]



[section:overload2 ip::address_v4::address_v4 (2 of 4 overloads)]


Construct an address from raw bytes. 


  address_v4(
      const bytes_type & bytes);



[endsect]



[section:overload3 ip::address_v4::address_v4 (3 of 4 overloads)]


Construct an address from an unsigned integer in host byte order. 


  address_v4(
      uint_type addr);



[endsect]



[section:overload4 ip::address_v4::address_v4 (4 of 4 overloads)]


Copy constructor. 


  address_v4(
      const address_v4 & other);



[endsect]


[endsect]


[section:any ip::address_v4::any]

[indexterm2 asio.indexterm.ip__address_v4.any..any..ip::address_v4] 
Obtain an address object that represents any address. 


  static address_v4 any();



[endsect]


[section:broadcast ip::address_v4::broadcast]

[indexterm2 asio.indexterm.ip__address_v4.broadcast..broadcast..ip::address_v4] 
Obtain an address object that represents the broadcast address. 


  static address_v4 ``[link asio.reference.ip__address_v4.broadcast.overload1 broadcast]``();
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.broadcast.overload1 more...]]``


(Deprecated: Use [link asio.reference.ip__network_v4 `ip::network_v4`] class.) Obtain an address object that represents the broadcast address that corresponds to the specified address and netmask. 


  static address_v4 ``[link asio.reference.ip__address_v4.broadcast.overload2 broadcast]``(
      const address_v4 & addr,
      const address_v4 & mask);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.broadcast.overload2 more...]]``


[section:overload1 ip::address_v4::broadcast (1 of 2 overloads)]


Obtain an address object that represents the broadcast address. 


  static address_v4 broadcast();



[endsect]



[section:overload2 ip::address_v4::broadcast (2 of 2 overloads)]


(Deprecated: Use [link asio.reference.ip__network_v4 `ip::network_v4`] class.) Obtain an address object that represents the broadcast address that corresponds to the specified address and netmask. 


  static address_v4 broadcast(
      const address_v4 & addr,
      const address_v4 & mask);



[endsect]


[endsect]


[section:bytes_type ip::address_v4::bytes_type]

[indexterm2 asio.indexterm.ip__address_v4.bytes_type..bytes_type..ip::address_v4] 
The type used to represent an address as an array of bytes. 


  typedef array< unsigned char, 4 > bytes_type;




[heading Remarks]
      
This type is defined in terms of the C++0x template `std::array` when it is available. Otherwise, it uses `boost:array`. 



[heading Requirements]

['Header: ][^asio/ip/address_v4.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:from_string ip::address_v4::from_string]

[indexterm2 asio.indexterm.ip__address_v4.from_string..from_string..ip::address_v4] 
(Deprecated: Use `make_address_v4()`.) Create an address from an IP address string in dotted decimal form. 


  static address_v4 ``[link asio.reference.ip__address_v4.from_string.overload1 from_string]``(
      const char * str);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.from_string.overload1 more...]]``

  static address_v4 ``[link asio.reference.ip__address_v4.from_string.overload2 from_string]``(
      const char * str,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.from_string.overload2 more...]]``

  static address_v4 ``[link asio.reference.ip__address_v4.from_string.overload3 from_string]``(
      const std::string & str);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.from_string.overload3 more...]]``

  static address_v4 ``[link asio.reference.ip__address_v4.from_string.overload4 from_string]``(
      const std::string & str,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.from_string.overload4 more...]]``


[section:overload1 ip::address_v4::from_string (1 of 4 overloads)]


(Deprecated: Use `make_address_v4()`.) Create an address from an IP address string in dotted decimal form. 


  static address_v4 from_string(
      const char * str);



[endsect]



[section:overload2 ip::address_v4::from_string (2 of 4 overloads)]


(Deprecated: Use `make_address_v4()`.) Create an address from an IP address string in dotted decimal form. 


  static address_v4 from_string(
      const char * str,
      asio::error_code & ec);



[endsect]



[section:overload3 ip::address_v4::from_string (3 of 4 overloads)]


(Deprecated: Use `make_address_v4()`.) Create an address from an IP address string in dotted decimal form. 


  static address_v4 from_string(
      const std::string & str);



[endsect]



[section:overload4 ip::address_v4::from_string (4 of 4 overloads)]


(Deprecated: Use `make_address_v4()`.) Create an address from an IP address string in dotted decimal form. 


  static address_v4 from_string(
      const std::string & str,
      asio::error_code & ec);



[endsect]


[endsect]


[section:is_class_a ip::address_v4::is_class_a]

[indexterm2 asio.indexterm.ip__address_v4.is_class_a..is_class_a..ip::address_v4] 
(Deprecated: Use [link asio.reference.ip__network_v4 `ip::network_v4`] class.) Determine whether the address is a class A address. 


  bool is_class_a() const;



[endsect]



[section:is_class_b ip::address_v4::is_class_b]

[indexterm2 asio.indexterm.ip__address_v4.is_class_b..is_class_b..ip::address_v4] 
(Deprecated: Use [link asio.reference.ip__network_v4 `ip::network_v4`] class.) Determine whether the address is a class B address. 


  bool is_class_b() const;



[endsect]



[section:is_class_c ip::address_v4::is_class_c]

[indexterm2 asio.indexterm.ip__address_v4.is_class_c..is_class_c..ip::address_v4] 
(Deprecated: Use [link asio.reference.ip__network_v4 `ip::network_v4`] class.) Determine whether the address is a class C address. 


  bool is_class_c() const;



[endsect]



[section:is_loopback ip::address_v4::is_loopback]

[indexterm2 asio.indexterm.ip__address_v4.is_loopback..is_loopback..ip::address_v4] 
Determine whether the address is a loopback address. 


  bool is_loopback() const;



[endsect]



[section:is_multicast ip::address_v4::is_multicast]

[indexterm2 asio.indexterm.ip__address_v4.is_multicast..is_multicast..ip::address_v4] 
Determine whether the address is a multicast address. 


  bool is_multicast() const;



[endsect]



[section:is_unspecified ip::address_v4::is_unspecified]

[indexterm2 asio.indexterm.ip__address_v4.is_unspecified..is_unspecified..ip::address_v4] 
Determine whether the address is unspecified. 


  bool is_unspecified() const;



[endsect]



[section:loopback ip::address_v4::loopback]

[indexterm2 asio.indexterm.ip__address_v4.loopback..loopback..ip::address_v4] 
Obtain an address object that represents the loopback address. 


  static address_v4 loopback();



[endsect]


[section:make_address_v4 ip::address_v4::make_address_v4]

[indexterm2 asio.indexterm.ip__address_v4.make_address_v4..make_address_v4..ip::address_v4] 
Create an IPv4 address from raw bytes in network order. 


  address_v4 ``[link asio.reference.ip__address_v4.make_address_v4.overload1 make_address_v4]``(
      const address_v4::bytes_type & bytes);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.make_address_v4.overload1 more...]]``


Create an IPv4 address from an unsigned integer in host byte order. 


  address_v4 ``[link asio.reference.ip__address_v4.make_address_v4.overload2 make_address_v4]``(
      address_v4::uint_type addr);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.make_address_v4.overload2 more...]]``


Create an IPv4 address from an IP address string in dotted decimal form. 


  address_v4 ``[link asio.reference.ip__address_v4.make_address_v4.overload3 make_address_v4]``(
      const char * str);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.make_address_v4.overload3 more...]]``

  address_v4 ``[link asio.reference.ip__address_v4.make_address_v4.overload4 make_address_v4]``(
      const char * str,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.make_address_v4.overload4 more...]]``

  address_v4 ``[link asio.reference.ip__address_v4.make_address_v4.overload5 make_address_v4]``(
      const std::string & str);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.make_address_v4.overload5 more...]]``

  address_v4 ``[link asio.reference.ip__address_v4.make_address_v4.overload6 make_address_v4]``(
      const std::string & str,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.make_address_v4.overload6 more...]]``

  address_v4 ``[link asio.reference.ip__address_v4.make_address_v4.overload7 make_address_v4]``(
      string_view str);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.make_address_v4.overload7 more...]]``

  address_v4 ``[link asio.reference.ip__address_v4.make_address_v4.overload8 make_address_v4]``(
      string_view str,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.make_address_v4.overload8 more...]]``


Create an IPv4 address from a IPv4-mapped IPv6 address. 


  address_v4 ``[link asio.reference.ip__address_v4.make_address_v4.overload9 make_address_v4]``(
      v4_mapped_t ,
      const address_v6 & v6_addr);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.make_address_v4.overload9 more...]]``


[section:overload1 ip::address_v4::make_address_v4 (1 of 9 overloads)]


Create an IPv4 address from raw bytes in network order. 


  address_v4 make_address_v4(
      const address_v4::bytes_type & bytes);



[endsect]



[section:overload2 ip::address_v4::make_address_v4 (2 of 9 overloads)]


Create an IPv4 address from an unsigned integer in host byte order. 


  address_v4 make_address_v4(
      address_v4::uint_type addr);



[endsect]



[section:overload3 ip::address_v4::make_address_v4 (3 of 9 overloads)]


Create an IPv4 address from an IP address string in dotted decimal form. 


  address_v4 make_address_v4(
      const char * str);



[endsect]



[section:overload4 ip::address_v4::make_address_v4 (4 of 9 overloads)]


Create an IPv4 address from an IP address string in dotted decimal form. 


  address_v4 make_address_v4(
      const char * str,
      asio::error_code & ec);



[endsect]



[section:overload5 ip::address_v4::make_address_v4 (5 of 9 overloads)]


Create an IPv4 address from an IP address string in dotted decimal form. 


  address_v4 make_address_v4(
      const std::string & str);



[endsect]



[section:overload6 ip::address_v4::make_address_v4 (6 of 9 overloads)]


Create an IPv4 address from an IP address string in dotted decimal form. 


  address_v4 make_address_v4(
      const std::string & str,
      asio::error_code & ec);



[endsect]



[section:overload7 ip::address_v4::make_address_v4 (7 of 9 overloads)]


Create an IPv4 address from an IP address string in dotted decimal form. 


  address_v4 make_address_v4(
      string_view str);



[endsect]



[section:overload8 ip::address_v4::make_address_v4 (8 of 9 overloads)]


Create an IPv4 address from an IP address string in dotted decimal form. 


  address_v4 make_address_v4(
      string_view str,
      asio::error_code & ec);



[endsect]



[section:overload9 ip::address_v4::make_address_v4 (9 of 9 overloads)]


Create an IPv4 address from a IPv4-mapped IPv6 address. 


  address_v4 make_address_v4(
      v4_mapped_t ,
      const address_v6 & v6_addr);



[endsect]


[endsect]

[section:make_network_v4 ip::address_v4::make_network_v4]

[indexterm2 asio.indexterm.ip__address_v4.make_network_v4..make_network_v4..ip::address_v4] 
Create an IPv4 network from an address and prefix length. 


  network_v4 ``[link asio.reference.ip__address_v4.make_network_v4.overload1 make_network_v4]``(
      const address_v4 & addr,
      unsigned short prefix_len);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.make_network_v4.overload1 more...]]``


Create an IPv4 network from an address and netmask. 


  network_v4 ``[link asio.reference.ip__address_v4.make_network_v4.overload2 make_network_v4]``(
      const address_v4 & addr,
      const address_v4 & mask);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.make_network_v4.overload2 more...]]``


[section:overload1 ip::address_v4::make_network_v4 (1 of 2 overloads)]


Create an IPv4 network from an address and prefix length. 


  network_v4 make_network_v4(
      const address_v4 & addr,
      unsigned short prefix_len);



[endsect]



[section:overload2 ip::address_v4::make_network_v4 (2 of 2 overloads)]


Create an IPv4 network from an address and netmask. 


  network_v4 make_network_v4(
      const address_v4 & addr,
      const address_v4 & mask);



[endsect]


[endsect]


[section:netmask ip::address_v4::netmask]

[indexterm2 asio.indexterm.ip__address_v4.netmask..netmask..ip::address_v4] 
(Deprecated: Use [link asio.reference.ip__network_v4 `ip::network_v4`] class.) Obtain the netmask that corresponds to the address, based on its address class. 


  static address_v4 netmask(
      const address_v4 & addr);



[endsect]



[section:operator_not__eq_ ip::address_v4::operator!=]

[indexterm2 asio.indexterm.ip__address_v4.operator_not__eq_..operator!=..ip::address_v4] 
Compare two addresses for inequality. 


  friend bool operator!=(
      const address_v4 & a1,
      const address_v4 & a2);


[heading Requirements]

['Header: ][^asio/ip/address_v4.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_lt_ ip::address_v4::operator<]

[indexterm2 asio.indexterm.ip__address_v4.operator_lt_..operator<..ip::address_v4] 
Compare addresses for ordering. 


  friend bool operator<(
      const address_v4 & a1,
      const address_v4 & a2);


[heading Requirements]

['Header: ][^asio/ip/address_v4.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:operator_lt__lt_ ip::address_v4::operator<<]

[indexterm2 asio.indexterm.ip__address_v4.operator_lt__lt_..operator<<..ip::address_v4] 
Output an address as a string. 


  template<
      typename Elem,
      typename Traits>
  std::basic_ostream< Elem, Traits > & ``[link asio.reference.ip__address_v4.operator_lt__lt_.overload1 operator<<]``(
      std::basic_ostream< Elem, Traits > & os,
      const address_v4 & addr);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.operator_lt__lt_.overload1 more...]]``


Output a network as a string. 


  template<
      typename Elem,
      typename Traits>
  std::basic_ostream< Elem, Traits > & ``[link asio.reference.ip__address_v4.operator_lt__lt_.overload2 operator<<]``(
      std::basic_ostream< Elem, Traits > & os,
      const network_v4 & net);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.operator_lt__lt_.overload2 more...]]``


[section:overload1 ip::address_v4::operator<< (1 of 2 overloads)]


Output an address as a string. 


  template<
      typename Elem,
      typename Traits>
  std::basic_ostream< Elem, Traits > & operator<<(
      std::basic_ostream< Elem, Traits > & os,
      const address_v4 & addr);


Used to output a human-readable string for a specified address.


[heading Parameters]
    

[variablelist
  
[[os][The output stream to which the string will be written.]]

[[addr][The address to be written.]]

]


[heading Return Value]
      
The output stream. 




[endsect]



[section:overload2 ip::address_v4::operator<< (2 of 2 overloads)]


Output a network as a string. 


  template<
      typename Elem,
      typename Traits>
  std::basic_ostream< Elem, Traits > & operator<<(
      std::basic_ostream< Elem, Traits > & os,
      const network_v4 & net);


Used to output a human-readable string for a specified network.


[heading Parameters]
    

[variablelist
  
[[os][The output stream to which the string will be written.]]

[[net][The network to be written.]]

]


[heading Return Value]
      
The output stream. 




[endsect]


[endsect]


[section:operator_lt__eq_ ip::address_v4::operator<=]

[indexterm2 asio.indexterm.ip__address_v4.operator_lt__eq_..operator<=..ip::address_v4] 
Compare addresses for ordering. 


  friend bool operator<=(
      const address_v4 & a1,
      const address_v4 & a2);


[heading Requirements]

['Header: ][^asio/ip/address_v4.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq_ ip::address_v4::operator=]

[indexterm2 asio.indexterm.ip__address_v4.operator_eq_..operator=..ip::address_v4] 
Assign from another address. 


  address_v4 & operator=(
      const address_v4 & other);



[endsect]



[section:operator_eq__eq_ ip::address_v4::operator==]

[indexterm2 asio.indexterm.ip__address_v4.operator_eq__eq_..operator==..ip::address_v4] 
Compare two addresses for equality. 


  friend bool operator==(
      const address_v4 & a1,
      const address_v4 & a2);


[heading Requirements]

['Header: ][^asio/ip/address_v4.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_gt_ ip::address_v4::operator>]

[indexterm2 asio.indexterm.ip__address_v4.operator_gt_..operator>..ip::address_v4] 
Compare addresses for ordering. 


  friend bool operator>(
      const address_v4 & a1,
      const address_v4 & a2);


[heading Requirements]

['Header: ][^asio/ip/address_v4.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_gt__eq_ ip::address_v4::operator>=]

[indexterm2 asio.indexterm.ip__address_v4.operator_gt__eq_..operator>=..ip::address_v4] 
Compare addresses for ordering. 


  friend bool operator>=(
      const address_v4 & a1,
      const address_v4 & a2);


[heading Requirements]

['Header: ][^asio/ip/address_v4.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:to_bytes ip::address_v4::to_bytes]

[indexterm2 asio.indexterm.ip__address_v4.to_bytes..to_bytes..ip::address_v4] 
Get the address in bytes, in network byte order. 


  bytes_type to_bytes() const;



[endsect]


[section:to_string ip::address_v4::to_string]

[indexterm2 asio.indexterm.ip__address_v4.to_string..to_string..ip::address_v4] 
Get the address as a string in dotted decimal format. 


  std::string ``[link asio.reference.ip__address_v4.to_string.overload1 to_string]``() const;
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.to_string.overload1 more...]]``


(Deprecated: Use other overload.) Get the address as a string in dotted decimal format. 


  std::string ``[link asio.reference.ip__address_v4.to_string.overload2 to_string]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.to_string.overload2 more...]]``


[section:overload1 ip::address_v4::to_string (1 of 2 overloads)]


Get the address as a string in dotted decimal format. 


  std::string to_string() const;



[endsect]



[section:overload2 ip::address_v4::to_string (2 of 2 overloads)]


(Deprecated: Use other overload.) Get the address as a string in dotted decimal format. 


  std::string to_string(
      asio::error_code & ec) const;



[endsect]


[endsect]


[section:to_uint ip::address_v4::to_uint]

[indexterm2 asio.indexterm.ip__address_v4.to_uint..to_uint..ip::address_v4] 
Get the address as an unsigned integer in host byte order. 


  uint_type to_uint() const;



[endsect]



[section:to_ulong ip::address_v4::to_ulong]

[indexterm2 asio.indexterm.ip__address_v4.to_ulong..to_ulong..ip::address_v4] 
Get the address as an unsigned long in host byte order. 


  unsigned long to_ulong() const;



[endsect]



[section:uint_type ip::address_v4::uint_type]

[indexterm2 asio.indexterm.ip__address_v4.uint_type..uint_type..ip::address_v4] 
The type used to represent an address as an unsigned integer. 


  typedef uint_least32_t uint_type;



[heading Requirements]

['Header: ][^asio/ip/address_v4.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]


[section:ip__address_v4_iterator ip::address_v4_iterator]

[indexterm1 asio.indexterm.ip__address_v4_iterator..ip::address_v4_iterator] 
An input iterator that can be used for traversing IPv4 addresses. 


  typedef basic_address_iterator< address_v4 > address_v4_iterator;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.difference_type [*difference_type]]]
    [Distance between two iterators. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.iterator_category [*iterator_category]]]
    [Denotes that the iterator satisfies the input iterator requirements. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.pointer [*pointer]]]
    [The type of a pointer to an element pointed to by the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.reference [*reference]]]
    [The type of a reference to an element pointed to by the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.value_type [*value_type]]]
    [The type of the elements pointed to by the iterator. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.basic_address_iterator [*basic_address_iterator]]]
    [Construct an iterator that points to the specified address. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator__star_ [*operator *]]]
    [Dereference the iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_plus__plus_ [*operator++]]]
    [Pre-increment operator. 
     [hr]
     Post-increment operator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_minus__minus_ [*operator--]]]
    [Pre-decrement operator. 
     [hr]
     Post-decrement operator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_arrow_ [*operator->]]]
    [Dereference the iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_eq_ [*operator=]]]
    [Assignment operator. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_not__eq_ [*operator!=]]]
    [Compare two addresses for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_eq__eq_ [*operator==]]]
    [Compare two addresses for equality. ]
  ]
  
]

In addition to satisfying the input iterator requirements, this iterator also supports decrement.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/address_v4_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:ip__address_v4_range ip::address_v4_range]

[indexterm1 asio.indexterm.ip__address_v4_range..ip::address_v4_range] 
Represents a range of IPv4 addresses. 


  typedef basic_address_range< address_v4 > address_v4_range;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_address_range_lt__address_v4__gt_.iterator [*iterator]]]
    [The type of an iterator that points into the range. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_address_range_lt__address_v4__gt_.basic_address_range [*basic_address_range]]]
    [Construct an empty range. 
     [hr]
     Construct an range that represents the given range of addresses. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_range_lt__address_v4__gt_.begin [*begin]]]
    [Obtain an iterator that points to the start of the range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_range_lt__address_v4__gt_.empty [*empty]]]
    [Determine whether the range is empty. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_range_lt__address_v4__gt_.end [*end]]]
    [Obtain an iterator that points to the end of the range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_range_lt__address_v4__gt_.find [*find]]]
    [Find an address in the range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_range_lt__address_v4__gt_.operator_eq_ [*operator=]]]
    [Assignment operator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_range_lt__address_v4__gt_.size [*size]]]
    [Return the size of the range. ]
  ]
  
]


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/address_v4_range.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:ip__address_v6 ip::address_v6]


Implements IP version 6 style addresses. 


  class address_v6


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__address_v6.bytes_type [*bytes_type]]]
    [The type used to represent an address as an array of bytes. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address_v6.address_v6 [*address_v6]] [constructor]]
    [Default constructor. 
     [hr]
     Construct an address from raw bytes and scope ID. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.any [*any]] [static]]
    [Obtain an address object that represents any address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.from_string [*from_string]] [static]]
    [(Deprecated: Use make_address_v6().) Create an IPv6 address from an IP address string. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_link_local [*is_link_local]]]
    [Determine whether the address is link local. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_loopback [*is_loopback]]]
    [Determine whether the address is a loopback address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_multicast [*is_multicast]]]
    [Determine whether the address is a multicast address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_multicast_global [*is_multicast_global]]]
    [Determine whether the address is a global multicast address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_multicast_link_local [*is_multicast_link_local]]]
    [Determine whether the address is a link-local multicast address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_multicast_node_local [*is_multicast_node_local]]]
    [Determine whether the address is a node-local multicast address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_multicast_org_local [*is_multicast_org_local]]]
    [Determine whether the address is a org-local multicast address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_multicast_site_local [*is_multicast_site_local]]]
    [Determine whether the address is a site-local multicast address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_site_local [*is_site_local]]]
    [Determine whether the address is site local. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_unspecified [*is_unspecified]]]
    [Determine whether the address is unspecified. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_v4_compatible [*is_v4_compatible]]]
    [(Deprecated: No replacement.) Determine whether the address is an IPv4-compatible address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_v4_mapped [*is_v4_mapped]]]
    [Determine whether the address is a mapped IPv4 address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.loopback [*loopback]] [static]]
    [Obtain an address object that represents the loopback address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.operator_eq_ [*operator=]]]
    [Assign from another address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.scope_id [*scope_id]]]
    [The scope ID of the address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.to_bytes [*to_bytes]]]
    [Get the address in bytes, in network byte order. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.to_string [*to_string]]]
    [Get the address as a string. 
     [hr]
     (Deprecated: Use other overload.) Get the address as a string. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.to_v4 [*to_v4]]]
    [(Deprecated: Use make_address_v4().) Converts an IPv4-mapped or IPv4-compatible address to an IPv4 address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.v4_compatible [*v4_compatible]] [static]]
    [(Deprecated: No replacement.) Create an IPv4-compatible IPv6 address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.v4_mapped [*v4_mapped]] [static]]
    [(Deprecated: Use make_address_v6().) Create an IPv4-mapped IPv6 address. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address_v6.operator_not__eq_ [*operator!=]]]
    [Compare two addresses for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.operator_lt_ [*operator<]]]
    [Compare addresses for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.operator_lt__eq_ [*operator<=]]]
    [Compare addresses for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.operator_eq__eq_ [*operator==]]]
    [Compare two addresses for equality. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.operator_gt_ [*operator>]]]
    [Compare addresses for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.operator_gt__eq_ [*operator>=]]]
    [Compare addresses for ordering. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address_v6.make_address_v6 [*make_address_v6]]]
    [Create an IPv6 address from raw bytes and scope ID. 

     Create an IPv6 address from an IP address string. 

     Createan IPv6 address from an IP address string. 

     Create an IPv4-mapped IPv6 address from an IPv4 address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.make_network_v6 [*make_network_v6]]]
    [Create an IPv6 network from an address and prefix length. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.operator_lt__lt_ [*operator<<]]]
    [Output an address as a string. 

     Output a network as a string. ]
  ]
  
]

The [link asio.reference.ip__address_v6 `ip::address_v6`] class provides the ability to use and manipulate IP version 6 addresses.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/ip/address_v6.hpp]

['Convenience header: ][^asio.hpp]

[section:address_v6 ip::address_v6::address_v6]

[indexterm2 asio.indexterm.ip__address_v6.address_v6..address_v6..ip::address_v6] 
Default constructor. 


  ``[link asio.reference.ip__address_v6.address_v6.overload1 address_v6]``();
  ``  [''''&raquo;''' [link asio.reference.ip__address_v6.address_v6.overload1 more...]]``


Construct an address from raw bytes and scope ID. 


  explicit ``[link asio.reference.ip__address_v6.address_v6.overload2 address_v6]``(
      const bytes_type & bytes,
      unsigned long scope_id = 0);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v6.address_v6.overload2 more...]]``


Copy constructor. 


  ``[link asio.reference.ip__address_v6.address_v6.overload3 address_v6]``(
      const address_v6 & other);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v6.address_v6.overload3 more...]]``


[section:overload1 ip::address_v6::address_v6 (1 of 3 overloads)]


Default constructor. 


  address_v6();



[endsect]



[section:overload2 ip::address_v6::address_v6 (2 of 3 overloads)]


Construct an address from raw bytes and scope ID. 


  address_v6(
      const bytes_type & bytes,
      unsigned long scope_id = 0);



[endsect]



[section:overload3 ip::address_v6::address_v6 (3 of 3 overloads)]


Copy constructor. 


  address_v6(
      const address_v6 & other);



[endsect]


[endsect]


[section:any ip::address_v6::any]

[indexterm2 asio.indexterm.ip__address_v6.any..any..ip::address_v6] 
Obtain an address object that represents any address. 


  static address_v6 any();



[endsect]



[section:bytes_type ip::address_v6::bytes_type]

[indexterm2 asio.indexterm.ip__address_v6.bytes_type..bytes_type..ip::address_v6] 
The type used to represent an address as an array of bytes. 


  typedef array< unsigned char, 16 > bytes_type;




[heading Remarks]
      
This type is defined in terms of the C++0x template `std::array` when it is available. Otherwise, it uses `boost:array`. 



[heading Requirements]

['Header: ][^asio/ip/address_v6.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:from_string ip::address_v6::from_string]

[indexterm2 asio.indexterm.ip__address_v6.from_string..from_string..ip::address_v6] 
(Deprecated: Use `make_address_v6()`.) Create an IPv6 address from an IP address string. 


  static address_v6 ``[link asio.reference.ip__address_v6.from_string.overload1 from_string]``(
      const char * str);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v6.from_string.overload1 more...]]``

  static address_v6 ``[link asio.reference.ip__address_v6.from_string.overload2 from_string]``(
      const char * str,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v6.from_string.overload2 more...]]``

  static address_v6 ``[link asio.reference.ip__address_v6.from_string.overload3 from_string]``(
      const std::string & str);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v6.from_string.overload3 more...]]``

  static address_v6 ``[link asio.reference.ip__address_v6.from_string.overload4 from_string]``(
      const std::string & str,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v6.from_string.overload4 more...]]``


[section:overload1 ip::address_v6::from_string (1 of 4 overloads)]


(Deprecated: Use `make_address_v6()`.) Create an IPv6 address from an IP address string. 


  static address_v6 from_string(
      const char * str);



[endsect]



[section:overload2 ip::address_v6::from_string (2 of 4 overloads)]


(Deprecated: Use `make_address_v6()`.) Create an IPv6 address from an IP address string. 


  static address_v6 from_string(
      const char * str,
      asio::error_code & ec);



[endsect]



[section:overload3 ip::address_v6::from_string (3 of 4 overloads)]


(Deprecated: Use `make_address_v6()`.) Create an IPv6 address from an IP address string. 


  static address_v6 from_string(
      const std::string & str);



[endsect]



[section:overload4 ip::address_v6::from_string (4 of 4 overloads)]


(Deprecated: Use `make_address_v6()`.) Create an IPv6 address from an IP address string. 


  static address_v6 from_string(
      const std::string & str,
      asio::error_code & ec);



[endsect]


[endsect]


[section:is_link_local ip::address_v6::is_link_local]

[indexterm2 asio.indexterm.ip__address_v6.is_link_local..is_link_local..ip::address_v6] 
Determine whether the address is link local. 


  bool is_link_local() const;



[endsect]



[section:is_loopback ip::address_v6::is_loopback]

[indexterm2 asio.indexterm.ip__address_v6.is_loopback..is_loopback..ip::address_v6] 
Determine whether the address is a loopback address. 


  bool is_loopback() const;



[endsect]



[section:is_multicast ip::address_v6::is_multicast]

[indexterm2 asio.indexterm.ip__address_v6.is_multicast..is_multicast..ip::address_v6] 
Determine whether the address is a multicast address. 


  bool is_multicast() const;



[endsect]



[section:is_multicast_global ip::address_v6::is_multicast_global]

[indexterm2 asio.indexterm.ip__address_v6.is_multicast_global..is_multicast_global..ip::address_v6] 
Determine whether the address is a global multicast address. 


  bool is_multicast_global() const;



[endsect]



[section:is_multicast_link_local ip::address_v6::is_multicast_link_local]

[indexterm2 asio.indexterm.ip__address_v6.is_multicast_link_local..is_multicast_link_local..ip::address_v6] 
Determine whether the address is a link-local multicast address. 


  bool is_multicast_link_local() const;



[endsect]



[section:is_multicast_node_local ip::address_v6::is_multicast_node_local]

[indexterm2 asio.indexterm.ip__address_v6.is_multicast_node_local..is_multicast_node_local..ip::address_v6] 
Determine whether the address is a node-local multicast address. 


  bool is_multicast_node_local() const;



[endsect]



[section:is_multicast_org_local ip::address_v6::is_multicast_org_local]

[indexterm2 asio.indexterm.ip__address_v6.is_multicast_org_local..is_multicast_org_local..ip::address_v6] 
Determine whether the address is a org-local multicast address. 


  bool is_multicast_org_local() const;



[endsect]



[section:is_multicast_site_local ip::address_v6::is_multicast_site_local]

[indexterm2 asio.indexterm.ip__address_v6.is_multicast_site_local..is_multicast_site_local..ip::address_v6] 
Determine whether the address is a site-local multicast address. 


  bool is_multicast_site_local() const;



[endsect]



[section:is_site_local ip::address_v6::is_site_local]

[indexterm2 asio.indexterm.ip__address_v6.is_site_local..is_site_local..ip::address_v6] 
Determine whether the address is site local. 


  bool is_site_local() const;



[endsect]



[section:is_unspecified ip::address_v6::is_unspecified]

[indexterm2 asio.indexterm.ip__address_v6.is_unspecified..is_unspecified..ip::address_v6] 
Determine whether the address is unspecified. 


  bool is_unspecified() const;



[endsect]



[section:is_v4_compatible ip::address_v6::is_v4_compatible]

[indexterm2 asio.indexterm.ip__address_v6.is_v4_compatible..is_v4_compatible..ip::address_v6] 
(Deprecated: No replacement.) Determine whether the address is an IPv4-compatible address. 


  bool is_v4_compatible() const;



[endsect]



[section:is_v4_mapped ip::address_v6::is_v4_mapped]

[indexterm2 asio.indexterm.ip__address_v6.is_v4_mapped..is_v4_mapped..ip::address_v6] 
Determine whether the address is a mapped IPv4 address. 


  bool is_v4_mapped() const;



[endsect]



[section:loopback ip::address_v6::loopback]

[indexterm2 asio.indexterm.ip__address_v6.loopback..loopback..ip::address_v6] 
Obtain an address object that represents the loopback address. 


  static address_v6 loopback();



[endsect]


[section:make_address_v6 ip::address_v6::make_address_v6]

[indexterm2 asio.indexterm.ip__address_v6.make_address_v6..make_address_v6..ip::address_v6] 
Create an IPv6 address from raw bytes and scope ID. 


  address_v6 ``[link asio.reference.ip__address_v6.make_address_v6.overload1 make_address_v6]``(
      const address_v6::bytes_type & bytes,
      unsigned long scope_id = 0);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v6.make_address_v6.overload1 more...]]``


Create an IPv6 address from an IP address string. 


  address_v6 ``[link asio.reference.ip__address_v6.make_address_v6.overload2 make_address_v6]``(
      const char * str);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v6.make_address_v6.overload2 more...]]``

  address_v6 ``[link asio.reference.ip__address_v6.make_address_v6.overload3 make_address_v6]``(
      const char * str,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v6.make_address_v6.overload3 more...]]``


Createan IPv6 address from an IP address string. 


  address_v6 ``[link asio.reference.ip__address_v6.make_address_v6.overload4 make_address_v6]``(
      const std::string & str);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v6.make_address_v6.overload4 more...]]``

  address_v6 ``[link asio.reference.ip__address_v6.make_address_v6.overload5 make_address_v6]``(
      const std::string & str,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v6.make_address_v6.overload5 more...]]``

  address_v6 ``[link asio.reference.ip__address_v6.make_address_v6.overload6 make_address_v6]``(
      string_view str);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v6.make_address_v6.overload6 more...]]``

  address_v6 ``[link asio.reference.ip__address_v6.make_address_v6.overload7 make_address_v6]``(
      string_view str,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v6.make_address_v6.overload7 more...]]``


Create an IPv4-mapped IPv6 address from an IPv4 address. 


  address_v6 ``[link asio.reference.ip__address_v6.make_address_v6.overload8 make_address_v6]``(
      v4_mapped_t ,
      const address_v4 & v4_addr);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v6.make_address_v6.overload8 more...]]``


[section:overload1 ip::address_v6::make_address_v6 (1 of 8 overloads)]


Create an IPv6 address from raw bytes and scope ID. 


  address_v6 make_address_v6(
      const address_v6::bytes_type & bytes,
      unsigned long scope_id = 0);



[endsect]



[section:overload2 ip::address_v6::make_address_v6 (2 of 8 overloads)]


Create an IPv6 address from an IP address string. 


  address_v6 make_address_v6(
      const char * str);



[endsect]



[section:overload3 ip::address_v6::make_address_v6 (3 of 8 overloads)]


Create an IPv6 address from an IP address string. 


  address_v6 make_address_v6(
      const char * str,
      asio::error_code & ec);



[endsect]



[section:overload4 ip::address_v6::make_address_v6 (4 of 8 overloads)]


Createan IPv6 address from an IP address string. 


  address_v6 make_address_v6(
      const std::string & str);



[endsect]



[section:overload5 ip::address_v6::make_address_v6 (5 of 8 overloads)]


Create an IPv6 address from an IP address string. 


  address_v6 make_address_v6(
      const std::string & str,
      asio::error_code & ec);



[endsect]



[section:overload6 ip::address_v6::make_address_v6 (6 of 8 overloads)]


Create an IPv6 address from an IP address string. 


  address_v6 make_address_v6(
      string_view str);



[endsect]



[section:overload7 ip::address_v6::make_address_v6 (7 of 8 overloads)]


Create an IPv6 address from an IP address string. 


  address_v6 make_address_v6(
      string_view str,
      asio::error_code & ec);



[endsect]



[section:overload8 ip::address_v6::make_address_v6 (8 of 8 overloads)]


Create an IPv4-mapped IPv6 address from an IPv4 address. 


  address_v6 make_address_v6(
      v4_mapped_t ,
      const address_v4 & v4_addr);



[endsect]


[endsect]


[section:make_network_v6 ip::address_v6::make_network_v6]

[indexterm2 asio.indexterm.ip__address_v6.make_network_v6..make_network_v6..ip::address_v6] 
Create an IPv6 network from an address and prefix length. 


  network_v6 make_network_v6(
      const address_v6 & addr,
      unsigned short prefix_len);



[endsect]



[section:operator_not__eq_ ip::address_v6::operator!=]

[indexterm2 asio.indexterm.ip__address_v6.operator_not__eq_..operator!=..ip::address_v6] 
Compare two addresses for inequality. 


  friend bool operator!=(
      const address_v6 & a1,
      const address_v6 & a2);


[heading Requirements]

['Header: ][^asio/ip/address_v6.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_lt_ ip::address_v6::operator<]

[indexterm2 asio.indexterm.ip__address_v6.operator_lt_..operator<..ip::address_v6] 
Compare addresses for ordering. 


  friend bool operator<(
      const address_v6 & a1,
      const address_v6 & a2);


[heading Requirements]

['Header: ][^asio/ip/address_v6.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:operator_lt__lt_ ip::address_v6::operator<<]

[indexterm2 asio.indexterm.ip__address_v6.operator_lt__lt_..operator<<..ip::address_v6] 
Output an address as a string. 


  template<
      typename Elem,
      typename Traits>
  std::basic_ostream< Elem, Traits > & ``[link asio.reference.ip__address_v6.operator_lt__lt_.overload1 operator<<]``(
      std::basic_ostream< Elem, Traits > & os,
      const address_v6 & addr);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v6.operator_lt__lt_.overload1 more...]]``


Output a network as a string. 


  template<
      typename Elem,
      typename Traits>
  std::basic_ostream< Elem, Traits > & ``[link asio.reference.ip__address_v6.operator_lt__lt_.overload2 operator<<]``(
      std::basic_ostream< Elem, Traits > & os,
      const network_v6 & net);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v6.operator_lt__lt_.overload2 more...]]``


[section:overload1 ip::address_v6::operator<< (1 of 2 overloads)]


Output an address as a string. 


  template<
      typename Elem,
      typename Traits>
  std::basic_ostream< Elem, Traits > & operator<<(
      std::basic_ostream< Elem, Traits > & os,
      const address_v6 & addr);


Used to output a human-readable string for a specified address.


[heading Parameters]
    

[variablelist
  
[[os][The output stream to which the string will be written.]]

[[addr][The address to be written.]]

]


[heading Return Value]
      
The output stream. 




[endsect]



[section:overload2 ip::address_v6::operator<< (2 of 2 overloads)]


Output a network as a string. 


  template<
      typename Elem,
      typename Traits>
  std::basic_ostream< Elem, Traits > & operator<<(
      std::basic_ostream< Elem, Traits > & os,
      const network_v6 & net);


Used to output a human-readable string for a specified network.


[heading Parameters]
    

[variablelist
  
[[os][The output stream to which the string will be written.]]

[[net][The network to be written.]]

]


[heading Return Value]
      
The output stream. 




[endsect]


[endsect]


[section:operator_lt__eq_ ip::address_v6::operator<=]

[indexterm2 asio.indexterm.ip__address_v6.operator_lt__eq_..operator<=..ip::address_v6] 
Compare addresses for ordering. 


  friend bool operator<=(
      const address_v6 & a1,
      const address_v6 & a2);


[heading Requirements]

['Header: ][^asio/ip/address_v6.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq_ ip::address_v6::operator=]

[indexterm2 asio.indexterm.ip__address_v6.operator_eq_..operator=..ip::address_v6] 
Assign from another address. 


  address_v6 & operator=(
      const address_v6 & other);



[endsect]



[section:operator_eq__eq_ ip::address_v6::operator==]

[indexterm2 asio.indexterm.ip__address_v6.operator_eq__eq_..operator==..ip::address_v6] 
Compare two addresses for equality. 


  friend bool operator==(
      const address_v6 & a1,
      const address_v6 & a2);


[heading Requirements]

['Header: ][^asio/ip/address_v6.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_gt_ ip::address_v6::operator>]

[indexterm2 asio.indexterm.ip__address_v6.operator_gt_..operator>..ip::address_v6] 
Compare addresses for ordering. 


  friend bool operator>(
      const address_v6 & a1,
      const address_v6 & a2);


[heading Requirements]

['Header: ][^asio/ip/address_v6.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_gt__eq_ ip::address_v6::operator>=]

[indexterm2 asio.indexterm.ip__address_v6.operator_gt__eq_..operator>=..ip::address_v6] 
Compare addresses for ordering. 


  friend bool operator>=(
      const address_v6 & a1,
      const address_v6 & a2);


[heading Requirements]

['Header: ][^asio/ip/address_v6.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:scope_id ip::address_v6::scope_id]

[indexterm2 asio.indexterm.ip__address_v6.scope_id..scope_id..ip::address_v6] 
The scope ID of the address. 


  unsigned long ``[link asio.reference.ip__address_v6.scope_id.overload1 scope_id]``() const;
  ``  [''''&raquo;''' [link asio.reference.ip__address_v6.scope_id.overload1 more...]]``

  void ``[link asio.reference.ip__address_v6.scope_id.overload2 scope_id]``(
      unsigned long id);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v6.scope_id.overload2 more...]]``


[section:overload1 ip::address_v6::scope_id (1 of 2 overloads)]


The scope ID of the address. 


  unsigned long scope_id() const;


Returns the scope ID associated with the IPv6 address. 


[endsect]



[section:overload2 ip::address_v6::scope_id (2 of 2 overloads)]


The scope ID of the address. 


  void scope_id(
      unsigned long id);


Modifies the scope ID associated with the IPv6 address. 


[endsect]


[endsect]


[section:to_bytes ip::address_v6::to_bytes]

[indexterm2 asio.indexterm.ip__address_v6.to_bytes..to_bytes..ip::address_v6] 
Get the address in bytes, in network byte order. 


  bytes_type to_bytes() const;



[endsect]


[section:to_string ip::address_v6::to_string]

[indexterm2 asio.indexterm.ip__address_v6.to_string..to_string..ip::address_v6] 
Get the address as a string. 


  std::string ``[link asio.reference.ip__address_v6.to_string.overload1 to_string]``() const;
  ``  [''''&raquo;''' [link asio.reference.ip__address_v6.to_string.overload1 more...]]``


(Deprecated: Use other overload.) Get the address as a string. 


  std::string ``[link asio.reference.ip__address_v6.to_string.overload2 to_string]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.ip__address_v6.to_string.overload2 more...]]``


[section:overload1 ip::address_v6::to_string (1 of 2 overloads)]


Get the address as a string. 


  std::string to_string() const;



[endsect]



[section:overload2 ip::address_v6::to_string (2 of 2 overloads)]


(Deprecated: Use other overload.) Get the address as a string. 


  std::string to_string(
      asio::error_code & ec) const;



[endsect]


[endsect]


[section:to_v4 ip::address_v6::to_v4]

[indexterm2 asio.indexterm.ip__address_v6.to_v4..to_v4..ip::address_v6] 
(Deprecated: Use `make_address_v4()`.) Converts an IPv4-mapped or IPv4-compatible address to an IPv4 address. 


  address_v4 to_v4() const;



[endsect]



[section:v4_compatible ip::address_v6::v4_compatible]

[indexterm2 asio.indexterm.ip__address_v6.v4_compatible..v4_compatible..ip::address_v6] 
(Deprecated: No replacement.) Create an IPv4-compatible IPv6 address. 


  static address_v6 v4_compatible(
      const address_v4 & addr);



[endsect]



[section:v4_mapped ip::address_v6::v4_mapped]

[indexterm2 asio.indexterm.ip__address_v6.v4_mapped..v4_mapped..ip::address_v6] 
(Deprecated: Use `make_address_v6()`.) Create an IPv4-mapped IPv6 address. 


  static address_v6 v4_mapped(
      const address_v4 & addr);



[endsect]



[endsect]


[section:ip__address_v6_iterator ip::address_v6_iterator]

[indexterm1 asio.indexterm.ip__address_v6_iterator..ip::address_v6_iterator] 
An input iterator that can be used for traversing IPv6 addresses. 


  typedef basic_address_iterator< address_v6 > address_v6_iterator;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.difference_type [*difference_type]]]
    [Distance between two iterators. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.iterator_category [*iterator_category]]]
    [Denotes that the iterator satisfies the input iterator requirements. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.pointer [*pointer]]]
    [The type of a pointer to an element pointed to by the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.reference [*reference]]]
    [The type of a reference to an element pointed to by the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.value_type [*value_type]]]
    [The type of the elements pointed to by the iterator. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.basic_address_iterator [*basic_address_iterator]]]
    [Construct an iterator that points to the specified address. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator__star_ [*operator *]]]
    [Dereference the iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_plus__plus_ [*operator++]]]
    [Pre-increment operator. 
     [hr]
     Post-increment operator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_minus__minus_ [*operator--]]]
    [Pre-decrement operator. 
     [hr]
     Post-decrement operator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_arrow_ [*operator->]]]
    [Dereference the iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_eq_ [*operator=]]]
    [Assignment operator. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_not__eq_ [*operator!=]]]
    [Compare two addresses for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_eq__eq_ [*operator==]]]
    [Compare two addresses for equality. ]
  ]
  
]

In addition to satisfying the input iterator requirements, this iterator also supports decrement.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/address_v6_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:ip__address_v6_range ip::address_v6_range]

[indexterm1 asio.indexterm.ip__address_v6_range..ip::address_v6_range] 
Represents a range of IPv6 addresses. 


  typedef basic_address_range< address_v6 > address_v6_range;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_address_range_lt__address_v6__gt_.iterator [*iterator]]]
    [The type of an iterator that points into the range. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_address_range_lt__address_v6__gt_.basic_address_range [*basic_address_range]]]
    [Construct an empty range. 
     [hr]
     Construct an range that represents the given range of addresses. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_range_lt__address_v6__gt_.begin [*begin]]]
    [Obtain an iterator that points to the start of the range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_range_lt__address_v6__gt_.empty [*empty]]]
    [Determine whether the range is empty. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_range_lt__address_v6__gt_.end [*end]]]
    [Obtain an iterator that points to the end of the range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_range_lt__address_v6__gt_.find [*find]]]
    [Find an address in the range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_range_lt__address_v6__gt_.operator_eq_ [*operator=]]]
    [Assignment operator. ]
  ]
  
]


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/address_v6_range.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:ip__bad_address_cast ip::bad_address_cast]


Thrown to indicate a failed address conversion. 


  class bad_address_cast


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__bad_address_cast.bad_address_cast [*bad_address_cast]] [constructor]]
    [Default constructor. ]
  ]
  
  [
    [[link asio.reference.ip__bad_address_cast.what [*what]]]
    [Get the message associated with the exception. ]
  ]
  
  [
    [[link asio.reference.ip__bad_address_cast._bad_address_cast [*~bad_address_cast]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/ip/bad_address_cast.hpp]

['Convenience header: ][^asio.hpp]


[section:bad_address_cast ip::bad_address_cast::bad_address_cast]

[indexterm2 asio.indexterm.ip__bad_address_cast.bad_address_cast..bad_address_cast..ip::bad_address_cast] 
Default constructor. 


  bad_address_cast();



[endsect]



[section:what ip::bad_address_cast::what]

[indexterm2 asio.indexterm.ip__bad_address_cast.what..what..ip::bad_address_cast] 
Get the message associated with the exception. 


  virtual const char * what() const;



[endsect]



[section:_bad_address_cast ip::bad_address_cast::~bad_address_cast]

[indexterm2 asio.indexterm.ip__bad_address_cast._bad_address_cast..~bad_address_cast..ip::bad_address_cast] 
Destructor. 


  virtual ~bad_address_cast();



[endsect]



[endsect]

[section:ip__basic_address_iterator_lt__address_v4__gt_ ip::basic_address_iterator< address_v4 >]


An input iterator that can be used for traversing IPv4 addresses. 


  template<>
  class basic_address_iterator< address_v4 >


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.difference_type [*difference_type]]]
    [Distance between two iterators. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.iterator_category [*iterator_category]]]
    [Denotes that the iterator satisfies the input iterator requirements. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.pointer [*pointer]]]
    [The type of a pointer to an element pointed to by the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.reference [*reference]]]
    [The type of a reference to an element pointed to by the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.value_type [*value_type]]]
    [The type of the elements pointed to by the iterator. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.basic_address_iterator [*basic_address_iterator]]]
    [Construct an iterator that points to the specified address. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator__star_ [*operator *]]]
    [Dereference the iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_plus__plus_ [*operator++]]]
    [Pre-increment operator. 
     [hr]
     Post-increment operator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_minus__minus_ [*operator--]]]
    [Pre-decrement operator. 
     [hr]
     Post-decrement operator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_arrow_ [*operator->]]]
    [Dereference the iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_eq_ [*operator=]]]
    [Assignment operator. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_not__eq_ [*operator!=]]]
    [Compare two addresses for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_eq__eq_ [*operator==]]]
    [Compare two addresses for equality. ]
  ]
  
]

In addition to satisfying the input iterator requirements, this iterator also supports decrement.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/ip/address_v4_iterator.hpp]

['Convenience header: ][^asio.hpp]

[section:basic_address_iterator ip::basic_address_iterator< address_v4 >::basic_address_iterator]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v4__gt_.basic_address_iterator..basic_address_iterator..ip::basic_address_iterator< address_v4 >] 
Construct an iterator that points to the specified address. 


  ``[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.basic_address_iterator.overload1 basic_address_iterator]``(
      const address_v4 & addr);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.basic_address_iterator.overload1 more...]]``


Copy constructor. 


  ``[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.basic_address_iterator.overload2 basic_address_iterator]``(
      const basic_address_iterator & other);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.basic_address_iterator.overload2 more...]]``


[section:overload1 ip::basic_address_iterator< address_v4 >::basic_address_iterator (1 of 2 overloads)]


Construct an iterator that points to the specified address. 


  basic_address_iterator(
      const address_v4 & addr);



[endsect]



[section:overload2 ip::basic_address_iterator< address_v4 >::basic_address_iterator (2 of 2 overloads)]


Copy constructor. 


  basic_address_iterator(
      const basic_address_iterator & other);



[endsect]


[endsect]


[section:difference_type ip::basic_address_iterator< address_v4 >::difference_type]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v4__gt_.difference_type..difference_type..ip::basic_address_iterator< address_v4 >] 
Distance between two iterators. 


  typedef std::ptrdiff_t difference_type;



[heading Requirements]

['Header: ][^asio/ip/address_v4_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:iterator_category ip::basic_address_iterator< address_v4 >::iterator_category]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v4__gt_.iterator_category..iterator_category..ip::basic_address_iterator< address_v4 >] 
Denotes that the iterator satisfies the input iterator requirements. 


  typedef std::input_iterator_tag iterator_category;



[heading Requirements]

['Header: ][^asio/ip/address_v4_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator__star_ ip::basic_address_iterator< address_v4 >::operator *]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v4__gt_.operator__star_..operator *..ip::basic_address_iterator< address_v4 >] 
Dereference the iterator. 


  const address_v4 & operator *() const;



[endsect]



[section:operator_not__eq_ ip::basic_address_iterator< address_v4 >::operator!=]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v4__gt_.operator_not__eq_..operator!=..ip::basic_address_iterator< address_v4 >] 
Compare two addresses for inequality. 


  friend bool operator!=(
      const basic_address_iterator & a,
      const basic_address_iterator & b);


[heading Requirements]

['Header: ][^asio/ip/address_v4_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:operator_plus__plus_ ip::basic_address_iterator< address_v4 >::operator++]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v4__gt_.operator_plus__plus_..operator++..ip::basic_address_iterator< address_v4 >] 
Pre-increment operator. 


  basic_address_iterator & ``[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_plus__plus_.overload1 operator++]``();
  ``  [''''&raquo;''' [link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_plus__plus_.overload1 more...]]``


Post-increment operator. 


  basic_address_iterator ``[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_plus__plus_.overload2 operator++]``(
      int );
  ``  [''''&raquo;''' [link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_plus__plus_.overload2 more...]]``


[section:overload1 ip::basic_address_iterator< address_v4 >::operator++ (1 of 2 overloads)]


Pre-increment operator. 


  basic_address_iterator & operator++();



[endsect]



[section:overload2 ip::basic_address_iterator< address_v4 >::operator++ (2 of 2 overloads)]


Post-increment operator. 


  basic_address_iterator operator++(
      int );



[endsect]


[endsect]

[section:operator_minus__minus_ ip::basic_address_iterator< address_v4 >::operator--]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v4__gt_.operator_minus__minus_..operator--..ip::basic_address_iterator< address_v4 >] 
Pre-decrement operator. 


  basic_address_iterator & ``[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_minus__minus_.overload1 operator--]``();
  ``  [''''&raquo;''' [link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_minus__minus_.overload1 more...]]``


Post-decrement operator. 


  basic_address_iterator ``[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_minus__minus_.overload2 operator--]``(
      int );
  ``  [''''&raquo;''' [link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_minus__minus_.overload2 more...]]``


[section:overload1 ip::basic_address_iterator< address_v4 >::operator-- (1 of 2 overloads)]


Pre-decrement operator. 


  basic_address_iterator & operator--();



[endsect]



[section:overload2 ip::basic_address_iterator< address_v4 >::operator-- (2 of 2 overloads)]


Post-decrement operator. 


  basic_address_iterator operator--(
      int );



[endsect]


[endsect]


[section:operator_arrow_ ip::basic_address_iterator< address_v4 >::operator->]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v4__gt_.operator_arrow_..operator->..ip::basic_address_iterator< address_v4 >] 
Dereference the iterator. 


  const address_v4 * operator->() const;



[endsect]



[section:operator_eq_ ip::basic_address_iterator< address_v4 >::operator=]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v4__gt_.operator_eq_..operator=..ip::basic_address_iterator< address_v4 >] 
Assignment operator. 


  basic_address_iterator & operator=(
      const basic_address_iterator & other);



[endsect]



[section:operator_eq__eq_ ip::basic_address_iterator< address_v4 >::operator==]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v4__gt_.operator_eq__eq_..operator==..ip::basic_address_iterator< address_v4 >] 
Compare two addresses for equality. 


  friend bool operator==(
      const basic_address_iterator & a,
      const basic_address_iterator & b);


[heading Requirements]

['Header: ][^asio/ip/address_v4_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:pointer ip::basic_address_iterator< address_v4 >::pointer]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v4__gt_.pointer..pointer..ip::basic_address_iterator< address_v4 >] 
The type of a pointer to an element pointed to by the iterator. 


  typedef const address_v4 * pointer;



[heading Requirements]

['Header: ][^asio/ip/address_v4_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:reference ip::basic_address_iterator< address_v4 >::reference]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v4__gt_.reference..reference..ip::basic_address_iterator< address_v4 >] 
The type of a reference to an element pointed to by the iterator. 


  typedef const address_v4 & reference;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__address_v4.bytes_type [*bytes_type]]]
    [The type used to represent an address as an array of bytes. ]
  
  ]

  [

    [[link asio.reference.ip__address_v4.uint_type [*uint_type]]]
    [The type used to represent an address as an unsigned integer. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address_v4.address_v4 [*address_v4]] [constructor]]
    [Default constructor. 
     [hr]
     Construct an address from raw bytes. 
     [hr]
     Construct an address from an unsigned integer in host byte order. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.any [*any]] [static]]
    [Obtain an address object that represents any address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.broadcast [*broadcast]] [static]]
    [Obtain an address object that represents the broadcast address. 
     [hr]
     (Deprecated: Use network_v4 class.) Obtain an address object that represents the broadcast address that corresponds to the specified address and netmask. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.from_string [*from_string]] [static]]
    [(Deprecated: Use make_address_v4().) Create an address from an IP address string in dotted decimal form. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_class_a [*is_class_a]]]
    [(Deprecated: Use network_v4 class.) Determine whether the address is a class A address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_class_b [*is_class_b]]]
    [(Deprecated: Use network_v4 class.) Determine whether the address is a class B address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_class_c [*is_class_c]]]
    [(Deprecated: Use network_v4 class.) Determine whether the address is a class C address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_loopback [*is_loopback]]]
    [Determine whether the address is a loopback address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_multicast [*is_multicast]]]
    [Determine whether the address is a multicast address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_unspecified [*is_unspecified]]]
    [Determine whether the address is unspecified. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.loopback [*loopback]] [static]]
    [Obtain an address object that represents the loopback address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.netmask [*netmask]] [static]]
    [(Deprecated: Use network_v4 class.) Obtain the netmask that corresponds to the address, based on its address class. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.operator_eq_ [*operator=]]]
    [Assign from another address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.to_bytes [*to_bytes]]]
    [Get the address in bytes, in network byte order. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.to_string [*to_string]]]
    [Get the address as a string in dotted decimal format. 
     [hr]
     (Deprecated: Use other overload.) Get the address as a string in dotted decimal format. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.to_uint [*to_uint]]]
    [Get the address as an unsigned integer in host byte order. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.to_ulong [*to_ulong]]]
    [Get the address as an unsigned long in host byte order. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address_v4.operator_not__eq_ [*operator!=]]]
    [Compare two addresses for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.operator_lt_ [*operator<]]]
    [Compare addresses for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.operator_lt__eq_ [*operator<=]]]
    [Compare addresses for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.operator_eq__eq_ [*operator==]]]
    [Compare two addresses for equality. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.operator_gt_ [*operator>]]]
    [Compare addresses for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.operator_gt__eq_ [*operator>=]]]
    [Compare addresses for ordering. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address_v4.make_address_v4 [*make_address_v4]]]
    [Create an IPv4 address from raw bytes in network order. 

     Create an IPv4 address from an unsigned integer in host byte order. 

     Create an IPv4 address from an IP address string in dotted decimal form. 

     Create an IPv4 address from a IPv4-mapped IPv6 address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.make_network_v4 [*make_network_v4]]]
    [Create an IPv4 network from an address and prefix length. 

     Create an IPv4 network from an address and netmask. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.operator_lt__lt_ [*operator<<]]]
    [Output an address as a string. 

     Output a network as a string. ]
  ]
  
]

The [link asio.reference.ip__address_v4 `ip::address_v4`] class provides the ability to use and manipulate IP version 4 addresses.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/address_v4_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:value_type ip::basic_address_iterator< address_v4 >::value_type]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v4__gt_.value_type..value_type..ip::basic_address_iterator< address_v4 >] 
The type of the elements pointed to by the iterator. 


  typedef address_v4 value_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__address_v4.bytes_type [*bytes_type]]]
    [The type used to represent an address as an array of bytes. ]
  
  ]

  [

    [[link asio.reference.ip__address_v4.uint_type [*uint_type]]]
    [The type used to represent an address as an unsigned integer. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address_v4.address_v4 [*address_v4]] [constructor]]
    [Default constructor. 
     [hr]
     Construct an address from raw bytes. 
     [hr]
     Construct an address from an unsigned integer in host byte order. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.any [*any]] [static]]
    [Obtain an address object that represents any address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.broadcast [*broadcast]] [static]]
    [Obtain an address object that represents the broadcast address. 
     [hr]
     (Deprecated: Use network_v4 class.) Obtain an address object that represents the broadcast address that corresponds to the specified address and netmask. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.from_string [*from_string]] [static]]
    [(Deprecated: Use make_address_v4().) Create an address from an IP address string in dotted decimal form. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_class_a [*is_class_a]]]
    [(Deprecated: Use network_v4 class.) Determine whether the address is a class A address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_class_b [*is_class_b]]]
    [(Deprecated: Use network_v4 class.) Determine whether the address is a class B address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_class_c [*is_class_c]]]
    [(Deprecated: Use network_v4 class.) Determine whether the address is a class C address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_loopback [*is_loopback]]]
    [Determine whether the address is a loopback address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_multicast [*is_multicast]]]
    [Determine whether the address is a multicast address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_unspecified [*is_unspecified]]]
    [Determine whether the address is unspecified. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.loopback [*loopback]] [static]]
    [Obtain an address object that represents the loopback address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.netmask [*netmask]] [static]]
    [(Deprecated: Use network_v4 class.) Obtain the netmask that corresponds to the address, based on its address class. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.operator_eq_ [*operator=]]]
    [Assign from another address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.to_bytes [*to_bytes]]]
    [Get the address in bytes, in network byte order. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.to_string [*to_string]]]
    [Get the address as a string in dotted decimal format. 
     [hr]
     (Deprecated: Use other overload.) Get the address as a string in dotted decimal format. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.to_uint [*to_uint]]]
    [Get the address as an unsigned integer in host byte order. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.to_ulong [*to_ulong]]]
    [Get the address as an unsigned long in host byte order. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address_v4.operator_not__eq_ [*operator!=]]]
    [Compare two addresses for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.operator_lt_ [*operator<]]]
    [Compare addresses for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.operator_lt__eq_ [*operator<=]]]
    [Compare addresses for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.operator_eq__eq_ [*operator==]]]
    [Compare two addresses for equality. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.operator_gt_ [*operator>]]]
    [Compare addresses for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.operator_gt__eq_ [*operator>=]]]
    [Compare addresses for ordering. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address_v4.make_address_v4 [*make_address_v4]]]
    [Create an IPv4 address from raw bytes in network order. 

     Create an IPv4 address from an unsigned integer in host byte order. 

     Create an IPv4 address from an IP address string in dotted decimal form. 

     Create an IPv4 address from a IPv4-mapped IPv6 address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.make_network_v4 [*make_network_v4]]]
    [Create an IPv4 network from an address and prefix length. 

     Create an IPv4 network from an address and netmask. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.operator_lt__lt_ [*operator<<]]]
    [Output an address as a string. 

     Output a network as a string. ]
  ]
  
]

The [link asio.reference.ip__address_v4 `ip::address_v4`] class provides the ability to use and manipulate IP version 4 addresses.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/address_v4_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:ip__basic_address_iterator_lt__address_v6__gt_ ip::basic_address_iterator< address_v6 >]


An input iterator that can be used for traversing IPv6 addresses. 


  template<>
  class basic_address_iterator< address_v6 >


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.difference_type [*difference_type]]]
    [Distance between two iterators. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.iterator_category [*iterator_category]]]
    [Denotes that the iterator satisfies the input iterator requirements. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.pointer [*pointer]]]
    [The type of a pointer to an element pointed to by the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.reference [*reference]]]
    [The type of a reference to an element pointed to by the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.value_type [*value_type]]]
    [The type of the elements pointed to by the iterator. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.basic_address_iterator [*basic_address_iterator]]]
    [Construct an iterator that points to the specified address. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator__star_ [*operator *]]]
    [Dereference the iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_plus__plus_ [*operator++]]]
    [Pre-increment operator. 
     [hr]
     Post-increment operator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_minus__minus_ [*operator--]]]
    [Pre-decrement operator. 
     [hr]
     Post-decrement operator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_arrow_ [*operator->]]]
    [Dereference the iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_eq_ [*operator=]]]
    [Assignment operator. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_not__eq_ [*operator!=]]]
    [Compare two addresses for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_eq__eq_ [*operator==]]]
    [Compare two addresses for equality. ]
  ]
  
]

In addition to satisfying the input iterator requirements, this iterator also supports decrement.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/ip/address_v6_iterator.hpp]

['Convenience header: ][^asio.hpp]

[section:basic_address_iterator ip::basic_address_iterator< address_v6 >::basic_address_iterator]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v6__gt_.basic_address_iterator..basic_address_iterator..ip::basic_address_iterator< address_v6 >] 
Construct an iterator that points to the specified address. 


  ``[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.basic_address_iterator.overload1 basic_address_iterator]``(
      const address_v6 & addr);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.basic_address_iterator.overload1 more...]]``


Copy constructor. 


  ``[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.basic_address_iterator.overload2 basic_address_iterator]``(
      const basic_address_iterator & other);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.basic_address_iterator.overload2 more...]]``


[section:overload1 ip::basic_address_iterator< address_v6 >::basic_address_iterator (1 of 2 overloads)]


Construct an iterator that points to the specified address. 


  basic_address_iterator(
      const address_v6 & addr);



[endsect]



[section:overload2 ip::basic_address_iterator< address_v6 >::basic_address_iterator (2 of 2 overloads)]


Copy constructor. 


  basic_address_iterator(
      const basic_address_iterator & other);



[endsect]


[endsect]


[section:difference_type ip::basic_address_iterator< address_v6 >::difference_type]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v6__gt_.difference_type..difference_type..ip::basic_address_iterator< address_v6 >] 
Distance between two iterators. 


  typedef std::ptrdiff_t difference_type;



[heading Requirements]

['Header: ][^asio/ip/address_v6_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:iterator_category ip::basic_address_iterator< address_v6 >::iterator_category]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v6__gt_.iterator_category..iterator_category..ip::basic_address_iterator< address_v6 >] 
Denotes that the iterator satisfies the input iterator requirements. 


  typedef std::input_iterator_tag iterator_category;



[heading Requirements]

['Header: ][^asio/ip/address_v6_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator__star_ ip::basic_address_iterator< address_v6 >::operator *]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v6__gt_.operator__star_..operator *..ip::basic_address_iterator< address_v6 >] 
Dereference the iterator. 


  const address_v6 & operator *() const;



[endsect]



[section:operator_not__eq_ ip::basic_address_iterator< address_v6 >::operator!=]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v6__gt_.operator_not__eq_..operator!=..ip::basic_address_iterator< address_v6 >] 
Compare two addresses for inequality. 


  friend bool operator!=(
      const basic_address_iterator & a,
      const basic_address_iterator & b);


[heading Requirements]

['Header: ][^asio/ip/address_v6_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:operator_plus__plus_ ip::basic_address_iterator< address_v6 >::operator++]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v6__gt_.operator_plus__plus_..operator++..ip::basic_address_iterator< address_v6 >] 
Pre-increment operator. 


  basic_address_iterator & ``[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_plus__plus_.overload1 operator++]``();
  ``  [''''&raquo;''' [link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_plus__plus_.overload1 more...]]``


Post-increment operator. 


  basic_address_iterator ``[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_plus__plus_.overload2 operator++]``(
      int );
  ``  [''''&raquo;''' [link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_plus__plus_.overload2 more...]]``


[section:overload1 ip::basic_address_iterator< address_v6 >::operator++ (1 of 2 overloads)]


Pre-increment operator. 


  basic_address_iterator & operator++();



[endsect]



[section:overload2 ip::basic_address_iterator< address_v6 >::operator++ (2 of 2 overloads)]


Post-increment operator. 


  basic_address_iterator operator++(
      int );



[endsect]


[endsect]

[section:operator_minus__minus_ ip::basic_address_iterator< address_v6 >::operator--]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v6__gt_.operator_minus__minus_..operator--..ip::basic_address_iterator< address_v6 >] 
Pre-decrement operator. 


  basic_address_iterator & ``[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_minus__minus_.overload1 operator--]``();
  ``  [''''&raquo;''' [link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_minus__minus_.overload1 more...]]``


Post-decrement operator. 


  basic_address_iterator ``[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_minus__minus_.overload2 operator--]``(
      int );
  ``  [''''&raquo;''' [link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_minus__minus_.overload2 more...]]``


[section:overload1 ip::basic_address_iterator< address_v6 >::operator-- (1 of 2 overloads)]


Pre-decrement operator. 


  basic_address_iterator & operator--();



[endsect]



[section:overload2 ip::basic_address_iterator< address_v6 >::operator-- (2 of 2 overloads)]


Post-decrement operator. 


  basic_address_iterator operator--(
      int );



[endsect]


[endsect]


[section:operator_arrow_ ip::basic_address_iterator< address_v6 >::operator->]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v6__gt_.operator_arrow_..operator->..ip::basic_address_iterator< address_v6 >] 
Dereference the iterator. 


  const address_v6 * operator->() const;



[endsect]



[section:operator_eq_ ip::basic_address_iterator< address_v6 >::operator=]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v6__gt_.operator_eq_..operator=..ip::basic_address_iterator< address_v6 >] 
Assignment operator. 


  basic_address_iterator & operator=(
      const basic_address_iterator & other);



[endsect]



[section:operator_eq__eq_ ip::basic_address_iterator< address_v6 >::operator==]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v6__gt_.operator_eq__eq_..operator==..ip::basic_address_iterator< address_v6 >] 
Compare two addresses for equality. 


  friend bool operator==(
      const basic_address_iterator & a,
      const basic_address_iterator & b);


[heading Requirements]

['Header: ][^asio/ip/address_v6_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:pointer ip::basic_address_iterator< address_v6 >::pointer]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v6__gt_.pointer..pointer..ip::basic_address_iterator< address_v6 >] 
The type of a pointer to an element pointed to by the iterator. 


  typedef const address_v6 * pointer;



[heading Requirements]

['Header: ][^asio/ip/address_v6_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:reference ip::basic_address_iterator< address_v6 >::reference]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v6__gt_.reference..reference..ip::basic_address_iterator< address_v6 >] 
The type of a reference to an element pointed to by the iterator. 


  typedef const address_v6 & reference;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__address_v6.bytes_type [*bytes_type]]]
    [The type used to represent an address as an array of bytes. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address_v6.address_v6 [*address_v6]] [constructor]]
    [Default constructor. 
     [hr]
     Construct an address from raw bytes and scope ID. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.any [*any]] [static]]
    [Obtain an address object that represents any address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.from_string [*from_string]] [static]]
    [(Deprecated: Use make_address_v6().) Create an IPv6 address from an IP address string. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_link_local [*is_link_local]]]
    [Determine whether the address is link local. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_loopback [*is_loopback]]]
    [Determine whether the address is a loopback address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_multicast [*is_multicast]]]
    [Determine whether the address is a multicast address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_multicast_global [*is_multicast_global]]]
    [Determine whether the address is a global multicast address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_multicast_link_local [*is_multicast_link_local]]]
    [Determine whether the address is a link-local multicast address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_multicast_node_local [*is_multicast_node_local]]]
    [Determine whether the address is a node-local multicast address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_multicast_org_local [*is_multicast_org_local]]]
    [Determine whether the address is a org-local multicast address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_multicast_site_local [*is_multicast_site_local]]]
    [Determine whether the address is a site-local multicast address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_site_local [*is_site_local]]]
    [Determine whether the address is site local. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_unspecified [*is_unspecified]]]
    [Determine whether the address is unspecified. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_v4_compatible [*is_v4_compatible]]]
    [(Deprecated: No replacement.) Determine whether the address is an IPv4-compatible address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_v4_mapped [*is_v4_mapped]]]
    [Determine whether the address is a mapped IPv4 address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.loopback [*loopback]] [static]]
    [Obtain an address object that represents the loopback address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.operator_eq_ [*operator=]]]
    [Assign from another address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.scope_id [*scope_id]]]
    [The scope ID of the address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.to_bytes [*to_bytes]]]
    [Get the address in bytes, in network byte order. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.to_string [*to_string]]]
    [Get the address as a string. 
     [hr]
     (Deprecated: Use other overload.) Get the address as a string. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.to_v4 [*to_v4]]]
    [(Deprecated: Use make_address_v4().) Converts an IPv4-mapped or IPv4-compatible address to an IPv4 address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.v4_compatible [*v4_compatible]] [static]]
    [(Deprecated: No replacement.) Create an IPv4-compatible IPv6 address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.v4_mapped [*v4_mapped]] [static]]
    [(Deprecated: Use make_address_v6().) Create an IPv4-mapped IPv6 address. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address_v6.operator_not__eq_ [*operator!=]]]
    [Compare two addresses for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.operator_lt_ [*operator<]]]
    [Compare addresses for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.operator_lt__eq_ [*operator<=]]]
    [Compare addresses for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.operator_eq__eq_ [*operator==]]]
    [Compare two addresses for equality. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.operator_gt_ [*operator>]]]
    [Compare addresses for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.operator_gt__eq_ [*operator>=]]]
    [Compare addresses for ordering. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address_v6.make_address_v6 [*make_address_v6]]]
    [Create an IPv6 address from raw bytes and scope ID. 

     Create an IPv6 address from an IP address string. 

     Createan IPv6 address from an IP address string. 

     Create an IPv4-mapped IPv6 address from an IPv4 address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.make_network_v6 [*make_network_v6]]]
    [Create an IPv6 network from an address and prefix length. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.operator_lt__lt_ [*operator<<]]]
    [Output an address as a string. 

     Output a network as a string. ]
  ]
  
]

The [link asio.reference.ip__address_v6 `ip::address_v6`] class provides the ability to use and manipulate IP version 6 addresses.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/address_v6_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:value_type ip::basic_address_iterator< address_v6 >::value_type]

[indexterm2 asio.indexterm.ip__basic_address_iterator_lt__address_v6__gt_.value_type..value_type..ip::basic_address_iterator< address_v6 >] 
The type of the elements pointed to by the iterator. 


  typedef address_v6 value_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__address_v6.bytes_type [*bytes_type]]]
    [The type used to represent an address as an array of bytes. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address_v6.address_v6 [*address_v6]] [constructor]]
    [Default constructor. 
     [hr]
     Construct an address from raw bytes and scope ID. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.any [*any]] [static]]
    [Obtain an address object that represents any address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.from_string [*from_string]] [static]]
    [(Deprecated: Use make_address_v6().) Create an IPv6 address from an IP address string. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_link_local [*is_link_local]]]
    [Determine whether the address is link local. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_loopback [*is_loopback]]]
    [Determine whether the address is a loopback address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_multicast [*is_multicast]]]
    [Determine whether the address is a multicast address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_multicast_global [*is_multicast_global]]]
    [Determine whether the address is a global multicast address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_multicast_link_local [*is_multicast_link_local]]]
    [Determine whether the address is a link-local multicast address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_multicast_node_local [*is_multicast_node_local]]]
    [Determine whether the address is a node-local multicast address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_multicast_org_local [*is_multicast_org_local]]]
    [Determine whether the address is a org-local multicast address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_multicast_site_local [*is_multicast_site_local]]]
    [Determine whether the address is a site-local multicast address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_site_local [*is_site_local]]]
    [Determine whether the address is site local. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_unspecified [*is_unspecified]]]
    [Determine whether the address is unspecified. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_v4_compatible [*is_v4_compatible]]]
    [(Deprecated: No replacement.) Determine whether the address is an IPv4-compatible address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.is_v4_mapped [*is_v4_mapped]]]
    [Determine whether the address is a mapped IPv4 address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.loopback [*loopback]] [static]]
    [Obtain an address object that represents the loopback address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.operator_eq_ [*operator=]]]
    [Assign from another address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.scope_id [*scope_id]]]
    [The scope ID of the address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.to_bytes [*to_bytes]]]
    [Get the address in bytes, in network byte order. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.to_string [*to_string]]]
    [Get the address as a string. 
     [hr]
     (Deprecated: Use other overload.) Get the address as a string. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.to_v4 [*to_v4]]]
    [(Deprecated: Use make_address_v4().) Converts an IPv4-mapped or IPv4-compatible address to an IPv4 address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.v4_compatible [*v4_compatible]] [static]]
    [(Deprecated: No replacement.) Create an IPv4-compatible IPv6 address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.v4_mapped [*v4_mapped]] [static]]
    [(Deprecated: Use make_address_v6().) Create an IPv4-mapped IPv6 address. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address_v6.operator_not__eq_ [*operator!=]]]
    [Compare two addresses for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.operator_lt_ [*operator<]]]
    [Compare addresses for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.operator_lt__eq_ [*operator<=]]]
    [Compare addresses for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.operator_eq__eq_ [*operator==]]]
    [Compare two addresses for equality. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.operator_gt_ [*operator>]]]
    [Compare addresses for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.operator_gt__eq_ [*operator>=]]]
    [Compare addresses for ordering. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address_v6.make_address_v6 [*make_address_v6]]]
    [Create an IPv6 address from raw bytes and scope ID. 

     Create an IPv6 address from an IP address string. 

     Createan IPv6 address from an IP address string. 

     Create an IPv4-mapped IPv6 address from an IPv4 address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.make_network_v6 [*make_network_v6]]]
    [Create an IPv6 network from an address and prefix length. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.operator_lt__lt_ [*operator<<]]]
    [Output an address as a string. 

     Output a network as a string. ]
  ]
  
]

The [link asio.reference.ip__address_v6 `ip::address_v6`] class provides the ability to use and manipulate IP version 6 addresses.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/address_v6_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:ip__basic_address_range_lt__address_v4__gt_ ip::basic_address_range< address_v4 >]


Represents a range of IPv4 addresses. 


  template<>
  class basic_address_range< address_v4 >


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_address_range_lt__address_v4__gt_.iterator [*iterator]]]
    [The type of an iterator that points into the range. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_address_range_lt__address_v4__gt_.basic_address_range [*basic_address_range]]]
    [Construct an empty range. 
     [hr]
     Construct an range that represents the given range of addresses. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_range_lt__address_v4__gt_.begin [*begin]]]
    [Obtain an iterator that points to the start of the range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_range_lt__address_v4__gt_.empty [*empty]]]
    [Determine whether the range is empty. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_range_lt__address_v4__gt_.end [*end]]]
    [Obtain an iterator that points to the end of the range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_range_lt__address_v4__gt_.find [*find]]]
    [Find an address in the range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_range_lt__address_v4__gt_.operator_eq_ [*operator=]]]
    [Assignment operator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_range_lt__address_v4__gt_.size [*size]]]
    [Return the size of the range. ]
  ]
  
]


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/ip/address_v4_range.hpp]

['Convenience header: ][^asio.hpp]

[section:basic_address_range ip::basic_address_range< address_v4 >::basic_address_range]

[indexterm2 asio.indexterm.ip__basic_address_range_lt__address_v4__gt_.basic_address_range..basic_address_range..ip::basic_address_range< address_v4 >] 
Construct an empty range. 


  ``[link asio.reference.ip__basic_address_range_lt__address_v4__gt_.basic_address_range.overload1 basic_address_range]``();
  ``  [''''&raquo;''' [link asio.reference.ip__basic_address_range_lt__address_v4__gt_.basic_address_range.overload1 more...]]``


Construct an range that represents the given range of addresses. 


  explicit ``[link asio.reference.ip__basic_address_range_lt__address_v4__gt_.basic_address_range.overload2 basic_address_range]``(
      const iterator & first,
      const iterator & last);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_address_range_lt__address_v4__gt_.basic_address_range.overload2 more...]]``


Copy constructor. 


  ``[link asio.reference.ip__basic_address_range_lt__address_v4__gt_.basic_address_range.overload3 basic_address_range]``(
      const basic_address_range & other);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_address_range_lt__address_v4__gt_.basic_address_range.overload3 more...]]``


[section:overload1 ip::basic_address_range< address_v4 >::basic_address_range (1 of 3 overloads)]


Construct an empty range. 


  basic_address_range();



[endsect]



[section:overload2 ip::basic_address_range< address_v4 >::basic_address_range (2 of 3 overloads)]


Construct an range that represents the given range of addresses. 


  basic_address_range(
      const iterator & first,
      const iterator & last);



[endsect]



[section:overload3 ip::basic_address_range< address_v4 >::basic_address_range (3 of 3 overloads)]


Copy constructor. 


  basic_address_range(
      const basic_address_range & other);



[endsect]


[endsect]


[section:begin ip::basic_address_range< address_v4 >::begin]

[indexterm2 asio.indexterm.ip__basic_address_range_lt__address_v4__gt_.begin..begin..ip::basic_address_range< address_v4 >] 
Obtain an iterator that points to the start of the range. 


  iterator begin() const;



[endsect]



[section:empty ip::basic_address_range< address_v4 >::empty]

[indexterm2 asio.indexterm.ip__basic_address_range_lt__address_v4__gt_.empty..empty..ip::basic_address_range< address_v4 >] 
Determine whether the range is empty. 


  bool empty() const;



[endsect]



[section:end ip::basic_address_range< address_v4 >::end]

[indexterm2 asio.indexterm.ip__basic_address_range_lt__address_v4__gt_.end..end..ip::basic_address_range< address_v4 >] 
Obtain an iterator that points to the end of the range. 


  iterator end() const;



[endsect]



[section:find ip::basic_address_range< address_v4 >::find]

[indexterm2 asio.indexterm.ip__basic_address_range_lt__address_v4__gt_.find..find..ip::basic_address_range< address_v4 >] 
Find an address in the range. 


  iterator find(
      const address_v4 & addr) const;



[endsect]



[section:iterator ip::basic_address_range< address_v4 >::iterator]

[indexterm2 asio.indexterm.ip__basic_address_range_lt__address_v4__gt_.iterator..iterator..ip::basic_address_range< address_v4 >] 
The type of an iterator that points into the range. 


  typedef basic_address_iterator< address_v4 > iterator;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.difference_type [*difference_type]]]
    [Distance between two iterators. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.iterator_category [*iterator_category]]]
    [Denotes that the iterator satisfies the input iterator requirements. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.pointer [*pointer]]]
    [The type of a pointer to an element pointed to by the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.reference [*reference]]]
    [The type of a reference to an element pointed to by the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.value_type [*value_type]]]
    [The type of the elements pointed to by the iterator. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.basic_address_iterator [*basic_address_iterator]]]
    [Construct an iterator that points to the specified address. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator__star_ [*operator *]]]
    [Dereference the iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_plus__plus_ [*operator++]]]
    [Pre-increment operator. 
     [hr]
     Post-increment operator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_minus__minus_ [*operator--]]]
    [Pre-decrement operator. 
     [hr]
     Post-decrement operator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_arrow_ [*operator->]]]
    [Dereference the iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_eq_ [*operator=]]]
    [Assignment operator. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_not__eq_ [*operator!=]]]
    [Compare two addresses for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v4__gt_.operator_eq__eq_ [*operator==]]]
    [Compare two addresses for equality. ]
  ]
  
]

In addition to satisfying the input iterator requirements, this iterator also supports decrement.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/address_v4_range.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq_ ip::basic_address_range< address_v4 >::operator=]

[indexterm2 asio.indexterm.ip__basic_address_range_lt__address_v4__gt_.operator_eq_..operator=..ip::basic_address_range< address_v4 >] 
Assignment operator. 


  basic_address_range & operator=(
      const basic_address_range & other);



[endsect]



[section:size ip::basic_address_range< address_v4 >::size]

[indexterm2 asio.indexterm.ip__basic_address_range_lt__address_v4__gt_.size..size..ip::basic_address_range< address_v4 >] 
Return the size of the range. 


  std::size_t size() const;



[endsect]



[endsect]

[section:ip__basic_address_range_lt__address_v6__gt_ ip::basic_address_range< address_v6 >]


Represents a range of IPv6 addresses. 


  template<>
  class basic_address_range< address_v6 >


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_address_range_lt__address_v6__gt_.iterator [*iterator]]]
    [The type of an iterator that points into the range. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_address_range_lt__address_v6__gt_.basic_address_range [*basic_address_range]]]
    [Construct an empty range. 
     [hr]
     Construct an range that represents the given range of addresses. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_range_lt__address_v6__gt_.begin [*begin]]]
    [Obtain an iterator that points to the start of the range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_range_lt__address_v6__gt_.empty [*empty]]]
    [Determine whether the range is empty. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_range_lt__address_v6__gt_.end [*end]]]
    [Obtain an iterator that points to the end of the range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_range_lt__address_v6__gt_.find [*find]]]
    [Find an address in the range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_range_lt__address_v6__gt_.operator_eq_ [*operator=]]]
    [Assignment operator. ]
  ]
  
]


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/ip/address_v6_range.hpp]

['Convenience header: ][^asio.hpp]

[section:basic_address_range ip::basic_address_range< address_v6 >::basic_address_range]

[indexterm2 asio.indexterm.ip__basic_address_range_lt__address_v6__gt_.basic_address_range..basic_address_range..ip::basic_address_range< address_v6 >] 
Construct an empty range. 


  ``[link asio.reference.ip__basic_address_range_lt__address_v6__gt_.basic_address_range.overload1 basic_address_range]``();
  ``  [''''&raquo;''' [link asio.reference.ip__basic_address_range_lt__address_v6__gt_.basic_address_range.overload1 more...]]``


Construct an range that represents the given range of addresses. 


  explicit ``[link asio.reference.ip__basic_address_range_lt__address_v6__gt_.basic_address_range.overload2 basic_address_range]``(
      const iterator & first,
      const iterator & last);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_address_range_lt__address_v6__gt_.basic_address_range.overload2 more...]]``


Copy constructor. 


  ``[link asio.reference.ip__basic_address_range_lt__address_v6__gt_.basic_address_range.overload3 basic_address_range]``(
      const basic_address_range & other);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_address_range_lt__address_v6__gt_.basic_address_range.overload3 more...]]``


[section:overload1 ip::basic_address_range< address_v6 >::basic_address_range (1 of 3 overloads)]


Construct an empty range. 


  basic_address_range();



[endsect]



[section:overload2 ip::basic_address_range< address_v6 >::basic_address_range (2 of 3 overloads)]


Construct an range that represents the given range of addresses. 


  basic_address_range(
      const iterator & first,
      const iterator & last);



[endsect]



[section:overload3 ip::basic_address_range< address_v6 >::basic_address_range (3 of 3 overloads)]


Copy constructor. 


  basic_address_range(
      const basic_address_range & other);



[endsect]


[endsect]


[section:begin ip::basic_address_range< address_v6 >::begin]

[indexterm2 asio.indexterm.ip__basic_address_range_lt__address_v6__gt_.begin..begin..ip::basic_address_range< address_v6 >] 
Obtain an iterator that points to the start of the range. 


  iterator begin() const;



[endsect]



[section:empty ip::basic_address_range< address_v6 >::empty]

[indexterm2 asio.indexterm.ip__basic_address_range_lt__address_v6__gt_.empty..empty..ip::basic_address_range< address_v6 >] 
Determine whether the range is empty. 


  bool empty() const;



[endsect]



[section:end ip::basic_address_range< address_v6 >::end]

[indexterm2 asio.indexterm.ip__basic_address_range_lt__address_v6__gt_.end..end..ip::basic_address_range< address_v6 >] 
Obtain an iterator that points to the end of the range. 


  iterator end() const;



[endsect]



[section:find ip::basic_address_range< address_v6 >::find]

[indexterm2 asio.indexterm.ip__basic_address_range_lt__address_v6__gt_.find..find..ip::basic_address_range< address_v6 >] 
Find an address in the range. 


  iterator find(
      const address_v6 & addr) const;



[endsect]



[section:iterator ip::basic_address_range< address_v6 >::iterator]

[indexterm2 asio.indexterm.ip__basic_address_range_lt__address_v6__gt_.iterator..iterator..ip::basic_address_range< address_v6 >] 
The type of an iterator that points into the range. 


  typedef basic_address_iterator< address_v6 > iterator;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.difference_type [*difference_type]]]
    [Distance between two iterators. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.iterator_category [*iterator_category]]]
    [Denotes that the iterator satisfies the input iterator requirements. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.pointer [*pointer]]]
    [The type of a pointer to an element pointed to by the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.reference [*reference]]]
    [The type of a reference to an element pointed to by the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.value_type [*value_type]]]
    [The type of the elements pointed to by the iterator. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.basic_address_iterator [*basic_address_iterator]]]
    [Construct an iterator that points to the specified address. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator__star_ [*operator *]]]
    [Dereference the iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_plus__plus_ [*operator++]]]
    [Pre-increment operator. 
     [hr]
     Post-increment operator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_minus__minus_ [*operator--]]]
    [Pre-decrement operator. 
     [hr]
     Post-decrement operator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_arrow_ [*operator->]]]
    [Dereference the iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_eq_ [*operator=]]]
    [Assignment operator. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_not__eq_ [*operator!=]]]
    [Compare two addresses for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__basic_address_iterator_lt__address_v6__gt_.operator_eq__eq_ [*operator==]]]
    [Compare two addresses for equality. ]
  ]
  
]

In addition to satisfying the input iterator requirements, this iterator also supports decrement.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/address_v6_range.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq_ ip::basic_address_range< address_v6 >::operator=]

[indexterm2 asio.indexterm.ip__basic_address_range_lt__address_v6__gt_.operator_eq_..operator=..ip::basic_address_range< address_v6 >] 
Assignment operator. 


  basic_address_range & operator=(
      const basic_address_range & other);



[endsect]



[endsect]

[section:ip__basic_endpoint ip::basic_endpoint]


Describes an endpoint for a version-independent IP socket. 


  template<
      typename ``[link asio.reference.InternetProtocol InternetProtocol]``>
  class basic_endpoint


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_endpoint.data_type [*data_type]]]
    [The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer. ]
  
  ]

  [

    [[link asio.reference.ip__basic_endpoint.protocol_type [*protocol_type]]]
    [The protocol type associated with the endpoint. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_endpoint.address [*address]]]
    [Get the IP address associated with the endpoint. 
     [hr]
     Set the IP address associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.basic_endpoint [*basic_endpoint]] [constructor]]
    [Default constructor. 
     [hr]
     Construct an endpoint using a port number, specified in the host's byte order. The IP address will be the any address (i.e. INADDR_ANY or in6addr_any). This constructor would typically be used for accepting new connections. 
     [hr]
     Construct an endpoint using a port number and an IP address. This constructor may be used for accepting connections on a specific interface or for making a connection to a remote endpoint. 
     [hr]
     Copy constructor. 
     [hr]
     Move constructor. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.capacity [*capacity]]]
    [Get the capacity of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.data [*data]]]
    [Get the underlying endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_eq_ [*operator=]]]
    [Assign from another endpoint. 
     [hr]
     Move-assign from another endpoint. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.port [*port]]]
    [Get the port associated with the endpoint. The port number is always in the host's byte order. 
     [hr]
     Set the port associated with the endpoint. The port number is always in the host's byte order. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.protocol [*protocol]]]
    [The protocol associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.resize [*resize]]]
    [Set the underlying size of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.size [*size]]]
    [Get the underlying size of the endpoint in the native type. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_endpoint.operator_not__eq_ [*operator!=]]]
    [Compare two endpoints for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_lt_ [*operator<]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_lt__eq_ [*operator<=]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_eq__eq_ [*operator==]]]
    [Compare two endpoints for equality. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_gt_ [*operator>]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_gt__eq_ [*operator>=]]]
    [Compare endpoints for ordering. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_endpoint.operator_lt__lt_ [*operator<<]]]
    [Output an endpoint as a string. ]
  ]
  
]

The [link asio.reference.ip__basic_endpoint `ip::basic_endpoint`] class template describes an endpoint that may be associated with a particular socket.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.




[heading Requirements]

['Header: ][^asio/ip/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]

[section:address ip::basic_endpoint::address]

[indexterm2 asio.indexterm.ip__basic_endpoint.address..address..ip::basic_endpoint] 
Get the IP address associated with the endpoint. 


  asio::ip::address ``[link asio.reference.ip__basic_endpoint.address.overload1 address]``() const;
  ``  [''''&raquo;''' [link asio.reference.ip__basic_endpoint.address.overload1 more...]]``


Set the IP address associated with the endpoint. 


  void ``[link asio.reference.ip__basic_endpoint.address.overload2 address]``(
      const asio::ip::address & addr);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_endpoint.address.overload2 more...]]``


[section:overload1 ip::basic_endpoint::address (1 of 2 overloads)]


Get the IP address associated with the endpoint. 


  asio::ip::address address() const;



[endsect]



[section:overload2 ip::basic_endpoint::address (2 of 2 overloads)]


Set the IP address associated with the endpoint. 


  void address(
      const asio::ip::address & addr);



[endsect]


[endsect]

[section:basic_endpoint ip::basic_endpoint::basic_endpoint]

[indexterm2 asio.indexterm.ip__basic_endpoint.basic_endpoint..basic_endpoint..ip::basic_endpoint] 
Default constructor. 


  ``[link asio.reference.ip__basic_endpoint.basic_endpoint.overload1 basic_endpoint]``();
  ``  [''''&raquo;''' [link asio.reference.ip__basic_endpoint.basic_endpoint.overload1 more...]]``


Construct an endpoint using a port number, specified in the host's byte order. The IP address will be the any address (i.e. INADDR\_ANY or in6addr\_any). This constructor would typically be used for accepting new connections. 


  ``[link asio.reference.ip__basic_endpoint.basic_endpoint.overload2 basic_endpoint]``(
      const InternetProtocol & internet_protocol,
      unsigned short port_num);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_endpoint.basic_endpoint.overload2 more...]]``


Construct an endpoint using a port number and an IP address. This constructor may be used for accepting connections on a specific interface or for making a connection to a remote endpoint. 


  ``[link asio.reference.ip__basic_endpoint.basic_endpoint.overload3 basic_endpoint]``(
      const asio::ip::address & addr,
      unsigned short port_num);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_endpoint.basic_endpoint.overload3 more...]]``


Copy constructor. 


  ``[link asio.reference.ip__basic_endpoint.basic_endpoint.overload4 basic_endpoint]``(
      const basic_endpoint & other);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_endpoint.basic_endpoint.overload4 more...]]``


Move constructor. 


  ``[link asio.reference.ip__basic_endpoint.basic_endpoint.overload5 basic_endpoint]``(
      basic_endpoint && other);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_endpoint.basic_endpoint.overload5 more...]]``


[section:overload1 ip::basic_endpoint::basic_endpoint (1 of 5 overloads)]


Default constructor. 


  basic_endpoint();



[endsect]



[section:overload2 ip::basic_endpoint::basic_endpoint (2 of 5 overloads)]


Construct an endpoint using a port number, specified in the host's byte order. The IP address will be the any address (i.e. INADDR\_ANY or in6addr\_any). This constructor would typically be used for accepting new connections. 


  basic_endpoint(
      const InternetProtocol & internet_protocol,
      unsigned short port_num);



[heading Examples]
  
To initialise an IPv4 TCP endpoint for port 1234, use: 

   asio::ip::tcp::endpoint ep(asio::ip::tcp::v4(), 1234);




To specify an IPv6 UDP endpoint for port 9876, use: 

   asio::ip::udp::endpoint ep(asio::ip::udp::v6(), 9876);





[endsect]



[section:overload3 ip::basic_endpoint::basic_endpoint (3 of 5 overloads)]


Construct an endpoint using a port number and an IP address. This constructor may be used for accepting connections on a specific interface or for making a connection to a remote endpoint. 


  basic_endpoint(
      const asio::ip::address & addr,
      unsigned short port_num);



[endsect]



[section:overload4 ip::basic_endpoint::basic_endpoint (4 of 5 overloads)]


Copy constructor. 


  basic_endpoint(
      const basic_endpoint & other);



[endsect]



[section:overload5 ip::basic_endpoint::basic_endpoint (5 of 5 overloads)]


Move constructor. 


  basic_endpoint(
      basic_endpoint && other);



[endsect]


[endsect]


[section:capacity ip::basic_endpoint::capacity]

[indexterm2 asio.indexterm.ip__basic_endpoint.capacity..capacity..ip::basic_endpoint] 
Get the capacity of the endpoint in the native type. 


  std::size_t capacity() const;



[endsect]


[section:data ip::basic_endpoint::data]

[indexterm2 asio.indexterm.ip__basic_endpoint.data..data..ip::basic_endpoint] 
Get the underlying endpoint in the native type. 


  data_type * ``[link asio.reference.ip__basic_endpoint.data.overload1 data]``();
  ``  [''''&raquo;''' [link asio.reference.ip__basic_endpoint.data.overload1 more...]]``

  const data_type * ``[link asio.reference.ip__basic_endpoint.data.overload2 data]``() const;
  ``  [''''&raquo;''' [link asio.reference.ip__basic_endpoint.data.overload2 more...]]``


[section:overload1 ip::basic_endpoint::data (1 of 2 overloads)]


Get the underlying endpoint in the native type. 


  data_type * data();



[endsect]



[section:overload2 ip::basic_endpoint::data (2 of 2 overloads)]


Get the underlying endpoint in the native type. 


  const data_type * data() const;



[endsect]


[endsect]


[section:data_type ip::basic_endpoint::data_type]

[indexterm2 asio.indexterm.ip__basic_endpoint.data_type..data_type..ip::basic_endpoint] 
The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer. 


  typedef implementation_defined data_type;



[heading Requirements]

['Header: ][^asio/ip/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_not__eq_ ip::basic_endpoint::operator!=]

[indexterm2 asio.indexterm.ip__basic_endpoint.operator_not__eq_..operator!=..ip::basic_endpoint] 
Compare two endpoints for inequality. 


  friend bool operator!=(
      const basic_endpoint< InternetProtocol > & e1,
      const basic_endpoint< InternetProtocol > & e2);


[heading Requirements]

['Header: ][^asio/ip/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_lt_ ip::basic_endpoint::operator<]

[indexterm2 asio.indexterm.ip__basic_endpoint.operator_lt_..operator<..ip::basic_endpoint] 
Compare endpoints for ordering. 


  friend bool operator<(
      const basic_endpoint< InternetProtocol > & e1,
      const basic_endpoint< InternetProtocol > & e2);


[heading Requirements]

['Header: ][^asio/ip/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_lt__lt_ ip::basic_endpoint::operator<<]

[indexterm2 asio.indexterm.ip__basic_endpoint.operator_lt__lt_..operator<<..ip::basic_endpoint] 
Output an endpoint as a string. 


  std::basic_ostream< Elem, Traits > & operator<<(
      std::basic_ostream< Elem, Traits > & os,
      const basic_endpoint< InternetProtocol > & endpoint);


Used to output a human-readable string for a specified endpoint.


[heading Parameters]
    

[variablelist
  
[[os][The output stream to which the string will be written.]]

[[endpoint][The endpoint to be written.]]

]


[heading Return Value]
      
The output stream. 




[endsect]



[section:operator_lt__eq_ ip::basic_endpoint::operator<=]

[indexterm2 asio.indexterm.ip__basic_endpoint.operator_lt__eq_..operator<=..ip::basic_endpoint] 
Compare endpoints for ordering. 


  friend bool operator<=(
      const basic_endpoint< InternetProtocol > & e1,
      const basic_endpoint< InternetProtocol > & e2);


[heading Requirements]

['Header: ][^asio/ip/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:operator_eq_ ip::basic_endpoint::operator=]

[indexterm2 asio.indexterm.ip__basic_endpoint.operator_eq_..operator=..ip::basic_endpoint] 
Assign from another endpoint. 


  basic_endpoint & ``[link asio.reference.ip__basic_endpoint.operator_eq_.overload1 operator=]``(
      const basic_endpoint & other);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_endpoint.operator_eq_.overload1 more...]]``


Move-assign from another endpoint. 


  basic_endpoint & ``[link asio.reference.ip__basic_endpoint.operator_eq_.overload2 operator=]``(
      basic_endpoint && other);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_endpoint.operator_eq_.overload2 more...]]``


[section:overload1 ip::basic_endpoint::operator= (1 of 2 overloads)]


Assign from another endpoint. 


  basic_endpoint & operator=(
      const basic_endpoint & other);



[endsect]



[section:overload2 ip::basic_endpoint::operator= (2 of 2 overloads)]


Move-assign from another endpoint. 


  basic_endpoint & operator=(
      basic_endpoint && other);



[endsect]


[endsect]


[section:operator_eq__eq_ ip::basic_endpoint::operator==]

[indexterm2 asio.indexterm.ip__basic_endpoint.operator_eq__eq_..operator==..ip::basic_endpoint] 
Compare two endpoints for equality. 


  friend bool operator==(
      const basic_endpoint< InternetProtocol > & e1,
      const basic_endpoint< InternetProtocol > & e2);


[heading Requirements]

['Header: ][^asio/ip/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_gt_ ip::basic_endpoint::operator>]

[indexterm2 asio.indexterm.ip__basic_endpoint.operator_gt_..operator>..ip::basic_endpoint] 
Compare endpoints for ordering. 


  friend bool operator>(
      const basic_endpoint< InternetProtocol > & e1,
      const basic_endpoint< InternetProtocol > & e2);


[heading Requirements]

['Header: ][^asio/ip/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_gt__eq_ ip::basic_endpoint::operator>=]

[indexterm2 asio.indexterm.ip__basic_endpoint.operator_gt__eq_..operator>=..ip::basic_endpoint] 
Compare endpoints for ordering. 


  friend bool operator>=(
      const basic_endpoint< InternetProtocol > & e1,
      const basic_endpoint< InternetProtocol > & e2);


[heading Requirements]

['Header: ][^asio/ip/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:port ip::basic_endpoint::port]

[indexterm2 asio.indexterm.ip__basic_endpoint.port..port..ip::basic_endpoint] 
Get the port associated with the endpoint. The port number is always in the host's byte order. 


  unsigned short ``[link asio.reference.ip__basic_endpoint.port.overload1 port]``() const;
  ``  [''''&raquo;''' [link asio.reference.ip__basic_endpoint.port.overload1 more...]]``


Set the port associated with the endpoint. The port number is always in the host's byte order. 


  void ``[link asio.reference.ip__basic_endpoint.port.overload2 port]``(
      unsigned short port_num);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_endpoint.port.overload2 more...]]``


[section:overload1 ip::basic_endpoint::port (1 of 2 overloads)]


Get the port associated with the endpoint. The port number is always in the host's byte order. 


  unsigned short port() const;



[endsect]



[section:overload2 ip::basic_endpoint::port (2 of 2 overloads)]


Set the port associated with the endpoint. The port number is always in the host's byte order. 


  void port(
      unsigned short port_num);



[endsect]


[endsect]


[section:protocol ip::basic_endpoint::protocol]

[indexterm2 asio.indexterm.ip__basic_endpoint.protocol..protocol..ip::basic_endpoint] 
The protocol associated with the endpoint. 


  protocol_type protocol() const;



[endsect]



[section:protocol_type ip::basic_endpoint::protocol_type]

[indexterm2 asio.indexterm.ip__basic_endpoint.protocol_type..protocol_type..ip::basic_endpoint] 
The protocol type associated with the endpoint. 


  typedef InternetProtocol protocol_type;



[heading Requirements]

['Header: ][^asio/ip/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:resize ip::basic_endpoint::resize]

[indexterm2 asio.indexterm.ip__basic_endpoint.resize..resize..ip::basic_endpoint] 
Set the underlying size of the endpoint in the native type. 


  void resize(
      std::size_t new_size);



[endsect]



[section:size ip::basic_endpoint::size]

[indexterm2 asio.indexterm.ip__basic_endpoint.size..size..ip::basic_endpoint] 
Get the underlying size of the endpoint in the native type. 


  std::size_t size() const;



[endsect]



[endsect]

[section:ip__basic_resolver ip::basic_resolver]


Provides endpoint resolution functionality. 


  template<
      typename ``[link asio.reference.InternetProtocol InternetProtocol]``,
      typename ``[link asio.reference.Executor1 Executor]``>
  class basic_resolver :
    public ip::resolver_base


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_resolver__rebind_executor [*rebind_executor]]]
    [Rebinds the resolver type to another executor. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.flags [*flags]]]
    [A bitmask type (C++ Std \[lib.bitmask.types\]). ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.iterator [*iterator]]]
    [(Deprecated.) The iterator type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.query [*query]]]
    [(Deprecated.) The query type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.results_type [*results_type]]]
    [The results type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver.async_resolve [*async_resolve]]]
    [(Deprecated: Use overload with separate host and service parameters.) Asynchronously perform forward resolution of a query to a list of entries. 
     [hr]
     Asynchronously perform forward resolution of a query to a list of entries. 
     [hr]
     Asynchronously perform reverse resolution of an endpoint to a list of entries. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.basic_resolver [*basic_resolver]] [constructor]]
    [Construct with executor. 
     [hr]
     Construct with execution context. 
     [hr]
     Move-construct a basic_resolver from another. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.cancel [*cancel]]]
    [Cancel any asynchronous operations that are waiting on the resolver. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.operator_eq_ [*operator=]]]
    [Move-assign a basic_resolver from another. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.resolve [*resolve]]]
    [(Deprecated: Use overload with separate host and service parameters.) Perform forward resolution of a query to a list of entries. 
     [hr]
     Perform forward resolution of a query to a list of entries. 
     [hr]
     Perform reverse resolution of an endpoint to a list of entries. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver._basic_resolver [*~basic_resolver]] [destructor]]
    [Destroys the resolver. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver.address_configured [*address_configured]] [static]]
    [Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.all_matching [*all_matching]] [static]]
    [If used with v4_mapped, return all matching IPv6 and IPv4 addresses. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.canonical_name [*canonical_name]] [static]]
    [Determine the canonical name of the host specified in the query. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.numeric_host [*numeric_host]] [static]]
    [Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.numeric_service [*numeric_service]] [static]]
    [Service name should be treated as a numeric string defining a port number and no name resolution should be attempted. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.passive [*passive]] [static]]
    [Indicate that returned endpoint is intended for use as a locally bound socket endpoint. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.v4_mapped [*v4_mapped]] [static]]
    [If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses. ]
  ]

]

The [link asio.reference.ip__basic_resolver `ip::basic_resolver`] class template provides the ability to resolve a query to a list of endpoints.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/ip/basic_resolver.hpp]

['Convenience header: ][^asio.hpp]


[section:address_configured ip::basic_resolver::address_configured]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__basic_resolver.address_configured..address_configured..ip::basic_resolver] 
Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system. 


  static const flags address_configured = implementation_defined;



[endsect]



[section:all_matching ip::basic_resolver::all_matching]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__basic_resolver.all_matching..all_matching..ip::basic_resolver] 
If used with v4\_mapped, return all matching IPv6 and IPv4 addresses. 


  static const flags all_matching = implementation_defined;



[endsect]


[section:async_resolve ip::basic_resolver::async_resolve]

[indexterm2 asio.indexterm.ip__basic_resolver.async_resolve..async_resolve..ip::basic_resolver] 
(Deprecated: Use overload with separate host and service parameters.) Asynchronously perform forward resolution of a query to a list of entries. 


  template<
      typename ``[link asio.reference.ResolveHandler ResolveHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.ip__basic_resolver.async_resolve.overload1 async_resolve]``(
      const query & q,
      ResolveHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.async_resolve.overload1 more...]]``


Asynchronously perform forward resolution of a query to a list of entries. 


  template<
      typename ``[link asio.reference.ResolveHandler ResolveHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.ip__basic_resolver.async_resolve.overload2 async_resolve]``(
      string_view host,
      string_view service,
      ResolveHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.async_resolve.overload2 more...]]``

  template<
      typename ``[link asio.reference.ResolveHandler ResolveHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.ip__basic_resolver.async_resolve.overload3 async_resolve]``(
      string_view host,
      string_view service,
      resolver_base::flags resolve_flags,
      ResolveHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.async_resolve.overload3 more...]]``

  template<
      typename ``[link asio.reference.ResolveHandler ResolveHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.ip__basic_resolver.async_resolve.overload4 async_resolve]``(
      const protocol_type & protocol,
      string_view host,
      string_view service,
      ResolveHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.async_resolve.overload4 more...]]``

  template<
      typename ``[link asio.reference.ResolveHandler ResolveHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.ip__basic_resolver.async_resolve.overload5 async_resolve]``(
      const protocol_type & protocol,
      string_view host,
      string_view service,
      resolver_base::flags resolve_flags,
      ResolveHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.async_resolve.overload5 more...]]``


Asynchronously perform reverse resolution of an endpoint to a list of entries. 


  template<
      typename ``[link asio.reference.ResolveHandler ResolveHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.ip__basic_resolver.async_resolve.overload6 async_resolve]``(
      const endpoint_type & e,
      ResolveHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.async_resolve.overload6 more...]]``


[section:overload1 ip::basic_resolver::async_resolve (1 of 6 overloads)]


(Deprecated: Use overload with separate host and service parameters.) Asynchronously perform forward resolution of a query to a list of entries. 


  template<
      typename ``[link asio.reference.ResolveHandler ResolveHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_resolve(
      const query & q,
      ResolveHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously resolve a query into a list of endpoint entries.


[heading Parameters]
    

[variablelist
  
[[q][A query object that determines what endpoints will be returned.]]

[[handler][The handler to be called when the resolve operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     resolver::results_type results // Resolved endpoints as a range.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]

A successful resolve operation is guaranteed to pass a non-empty range to the handler. 


[endsect]



[section:overload2 ip::basic_resolver::async_resolve (2 of 6 overloads)]


Asynchronously perform forward resolution of a query to a list of entries. 


  template<
      typename ``[link asio.reference.ResolveHandler ResolveHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_resolve(
      string_view host,
      string_view service,
      ResolveHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to resolve host and service names into a list of endpoint entries.


[heading Parameters]
    

[variablelist
  
[[host][A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.]]

[[service][A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.]]

[[handler][The handler to be called when the resolve operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     resolver::results_type results // Resolved endpoints as a range.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]

A successful resolve operation is guaranteed to pass a non-empty range to the handler.


[heading Remarks]
      
On POSIX systems, host names may be locally defined in the file `/etc/hosts`. On Windows, host names may be defined in the file `c:\windows\system32\drivers\etc\hosts`. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file `/etc/services`. On Windows, service names may be found in the file `c:\windows\system32\drivers\etc\services`. Operating systems may use additional locations when resolving service names. 


[endsect]



[section:overload3 ip::basic_resolver::async_resolve (3 of 6 overloads)]


Asynchronously perform forward resolution of a query to a list of entries. 


  template<
      typename ``[link asio.reference.ResolveHandler ResolveHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_resolve(
      string_view host,
      string_view service,
      resolver_base::flags resolve_flags,
      ResolveHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to resolve host and service names into a list of endpoint entries.


[heading Parameters]
    

[variablelist
  
[[host][A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.]]

[[service][A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.]]

[[resolve_flags][A set of flags that determine how name resolution should be performed. The default flags are suitable for communication with remote hosts. See the [link asio.reference.ip__resolver_base `ip::resolver_base`]  documentation for the set of available flags.]]

[[handler][The handler to be called when the resolve operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     resolver::results_type results // Resolved endpoints as a range.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]

A successful resolve operation is guaranteed to pass a non-empty range to the handler.


[heading Remarks]
      
On POSIX systems, host names may be locally defined in the file `/etc/hosts`. On Windows, host names may be defined in the file `c:\windows\system32\drivers\etc\hosts`. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file `/etc/services`. On Windows, service names may be found in the file `c:\windows\system32\drivers\etc\services`. Operating systems may use additional locations when resolving service names. 


[endsect]



[section:overload4 ip::basic_resolver::async_resolve (4 of 6 overloads)]


Asynchronously perform forward resolution of a query to a list of entries. 


  template<
      typename ``[link asio.reference.ResolveHandler ResolveHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_resolve(
      const protocol_type & protocol,
      string_view host,
      string_view service,
      ResolveHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to resolve host and service names into a list of endpoint entries.


[heading Parameters]
    

[variablelist
  
[[protocol][A protocol object, normally representing either the IPv4 or IPv6 version of an internet protocol.]]

[[host][A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.]]

[[service][A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.]]

[[handler][The handler to be called when the resolve operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     resolver::results_type results // Resolved endpoints as a range.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]

A successful resolve operation is guaranteed to pass a non-empty range to the handler.


[heading Remarks]
      
On POSIX systems, host names may be locally defined in the file `/etc/hosts`. On Windows, host names may be defined in the file `c:\windows\system32\drivers\etc\hosts`. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file `/etc/services`. On Windows, service names may be found in the file `c:\windows\system32\drivers\etc\services`. Operating systems may use additional locations when resolving service names. 


[endsect]



[section:overload5 ip::basic_resolver::async_resolve (5 of 6 overloads)]


Asynchronously perform forward resolution of a query to a list of entries. 


  template<
      typename ``[link asio.reference.ResolveHandler ResolveHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_resolve(
      const protocol_type & protocol,
      string_view host,
      string_view service,
      resolver_base::flags resolve_flags,
      ResolveHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to resolve host and service names into a list of endpoint entries.


[heading Parameters]
    

[variablelist
  
[[protocol][A protocol object, normally representing either the IPv4 or IPv6 version of an internet protocol.]]

[[host][A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.]]

[[service][A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.]]

[[resolve_flags][A set of flags that determine how name resolution should be performed. The default flags are suitable for communication with remote hosts. See the [link asio.reference.ip__resolver_base `ip::resolver_base`]  documentation for the set of available flags.]]

[[handler][The handler to be called when the resolve operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     resolver::results_type results // Resolved endpoints as a range.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]

A successful resolve operation is guaranteed to pass a non-empty range to the handler.


[heading Remarks]
      
On POSIX systems, host names may be locally defined in the file `/etc/hosts`. On Windows, host names may be defined in the file `c:\windows\system32\drivers\etc\hosts`. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file `/etc/services`. On Windows, service names may be found in the file `c:\windows\system32\drivers\etc\services`. Operating systems may use additional locations when resolving service names. 


[endsect]



[section:overload6 ip::basic_resolver::async_resolve (6 of 6 overloads)]


Asynchronously perform reverse resolution of an endpoint to a list of entries. 


  template<
      typename ``[link asio.reference.ResolveHandler ResolveHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_resolve(
      const endpoint_type & e,
      ResolveHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously resolve an endpoint into a list of endpoint entries.


[heading Parameters]
    

[variablelist
  
[[e][An endpoint object that determines what endpoints will be returned.]]

[[handler][The handler to be called when the resolve operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     resolver::results_type results // Resolved endpoints as a range.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]

A successful resolve operation is guaranteed to pass a non-empty range to the handler. 


[endsect]


[endsect]

[section:basic_resolver ip::basic_resolver::basic_resolver]

[indexterm2 asio.indexterm.ip__basic_resolver.basic_resolver..basic_resolver..ip::basic_resolver] 
Construct with executor. 


  explicit ``[link asio.reference.ip__basic_resolver.basic_resolver.overload1 basic_resolver]``(
      const executor_type & ex);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.basic_resolver.overload1 more...]]``


Construct with execution context. 


  template<
      typename ExecutionContext>
  explicit ``[link asio.reference.ip__basic_resolver.basic_resolver.overload2 basic_resolver]``(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.basic_resolver.overload2 more...]]``


Move-construct a [link asio.reference.ip__basic_resolver `ip::basic_resolver`] from another. 


  ``[link asio.reference.ip__basic_resolver.basic_resolver.overload3 basic_resolver]``(
      basic_resolver && other);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.basic_resolver.overload3 more...]]``

  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  ``[link asio.reference.ip__basic_resolver.basic_resolver.overload4 basic_resolver]``(
      basic_resolver< InternetProtocol, Executor1 > && other,
      typename enable_if< is_convertible< Executor1, Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.basic_resolver.overload4 more...]]``


[section:overload1 ip::basic_resolver::basic_resolver (1 of 4 overloads)]


Construct with executor. 


  basic_resolver(
      const executor_type & ex);


This constructor creates a [link asio.reference.ip__basic_resolver `ip::basic_resolver`].


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the resolver will use, by default, to dispatch handlers for any asynchronous operations performed on the resolver. ]]

]




[endsect]



[section:overload2 ip::basic_resolver::basic_resolver (2 of 4 overloads)]


Construct with execution context. 


  template<
      typename ExecutionContext>
  basic_resolver(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a [link asio.reference.ip__basic_resolver `ip::basic_resolver`].


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the resolver will use, by default, to dispatch handlers for any asynchronous operations performed on the resolver. ]]

]




[endsect]



[section:overload3 ip::basic_resolver::basic_resolver (3 of 4 overloads)]


Move-construct a [link asio.reference.ip__basic_resolver `ip::basic_resolver`] from another. 


  basic_resolver(
      basic_resolver && other);


This constructor moves a resolver from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.ip__basic_resolver `ip::basic_resolver`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_resolver(const executor_type&) constructor`. 




[endsect]



[section:overload4 ip::basic_resolver::basic_resolver (4 of 4 overloads)]


Move-construct a [link asio.reference.ip__basic_resolver `ip::basic_resolver`] from another. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  basic_resolver(
      basic_resolver< InternetProtocol, Executor1 > && other,
      typename enable_if< is_convertible< Executor1, Executor >::value >::type *  = 0);


This constructor moves a resolver from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.ip__basic_resolver `ip::basic_resolver`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_resolver(const executor_type&) constructor`. 




[endsect]


[endsect]


[section:cancel ip::basic_resolver::cancel]

[indexterm2 asio.indexterm.ip__basic_resolver.cancel..cancel..ip::basic_resolver] 
Cancel any asynchronous operations that are waiting on the resolver. 


  void cancel();


This function forces the completion of any pending asynchronous operations on the host resolver. The handler for each cancelled operation will be invoked with the `asio::error::operation_aborted` error code. 


[endsect]



[section:canonical_name ip::basic_resolver::canonical_name]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__basic_resolver.canonical_name..canonical_name..ip::basic_resolver] 
Determine the canonical name of the host specified in the query. 


  static const flags canonical_name = implementation_defined;



[endsect]



[section:endpoint_type ip::basic_resolver::endpoint_type]

[indexterm2 asio.indexterm.ip__basic_resolver.endpoint_type..endpoint_type..ip::basic_resolver] 
The endpoint type. 


  typedef InternetProtocol::endpoint endpoint_type;



[heading Requirements]

['Header: ][^asio/ip/basic_resolver.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:executor_type ip::basic_resolver::executor_type]

[indexterm2 asio.indexterm.ip__basic_resolver.executor_type..executor_type..ip::basic_resolver] 
The type of the executor associated with the object. 


  typedef Executor executor_type;



[heading Requirements]

['Header: ][^asio/ip/basic_resolver.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:flags ip::basic_resolver::flags]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__basic_resolver.flags..flags..ip::basic_resolver] 
A bitmask type (C++ Std [lib.bitmask.types]). 


  typedef unspecified flags;



[heading Requirements]

['Header: ][^asio/ip/basic_resolver.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:get_executor ip::basic_resolver::get_executor]

[indexterm2 asio.indexterm.ip__basic_resolver.get_executor..get_executor..ip::basic_resolver] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]



[section:iterator ip::basic_resolver::iterator]

[indexterm2 asio.indexterm.ip__basic_resolver.iterator..iterator..ip::basic_resolver] 
(Deprecated.) The iterator type. 


  typedef basic_resolver_iterator< InternetProtocol > iterator;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_resolver_iterator.difference_type [*difference_type]]]
    [The type used for the distance between two iterators. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_iterator.iterator_category [*iterator_category]]]
    [The iterator category. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_iterator.pointer [*pointer]]]
    [The type of the result of applying operator->() to the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_iterator.reference [*reference]]]
    [The type of the result of applying operator*() to the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_iterator.value_type [*value_type]]]
    [The type of the value pointed to by the iterator. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_iterator.basic_resolver_iterator [*basic_resolver_iterator]] [constructor]]
    [Default constructor creates an end iterator. 
     [hr]
     Copy constructor. 
     [hr]
     Move constructor. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator__star_ [*operator *]]]
    [Dereference an iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_plus__plus_ [*operator++]]]
    [Increment operator (prefix). 
     [hr]
     Increment operator (postfix). ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_arrow_ [*operator->]]]
    [Dereference an iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_eq_ [*operator=]]]
    [Assignment operator. 
     [hr]
     Move-assignment operator. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_iterator.dereference [*dereference]]]
    []
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.equal [*equal]]]
    []
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.increment [*increment]]]
    []
  ]
  
]

[heading Protected Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_iterator.index_ [*index_]]]
    []
  ]

  [
    [[link asio.reference.ip__basic_resolver_iterator.values_ [*values_]]]
    []
  ]

]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_not__eq_ [*operator!=]]]
    [Test two iterators for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_eq__eq_ [*operator==]]]
    [Test two iterators for equality. ]
  ]
  
]

The [link asio.reference.ip__basic_resolver_iterator `ip::basic_resolver_iterator`] class template is used to define iterators over the results returned by a resolver.

The iterator's value\_type, obtained when the iterator is dereferenced, is: 

   const basic_resolver_entry<InternetProtocol> 





[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/basic_resolver.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:numeric_host ip::basic_resolver::numeric_host]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__basic_resolver.numeric_host..numeric_host..ip::basic_resolver] 
Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted. 


  static const flags numeric_host = implementation_defined;



[endsect]



[section:numeric_service ip::basic_resolver::numeric_service]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__basic_resolver.numeric_service..numeric_service..ip::basic_resolver] 
Service name should be treated as a numeric string defining a port number and no name resolution should be attempted. 


  static const flags numeric_service = implementation_defined;



[endsect]


[section:operator_eq_ ip::basic_resolver::operator=]

[indexterm2 asio.indexterm.ip__basic_resolver.operator_eq_..operator=..ip::basic_resolver] 
Move-assign a [link asio.reference.ip__basic_resolver `ip::basic_resolver`] from another. 


  basic_resolver & ``[link asio.reference.ip__basic_resolver.operator_eq_.overload1 operator=]``(
      basic_resolver && other);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.operator_eq_.overload1 more...]]``

  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  enable_if< is_convertible< Executor1, Executor >::value, basic_resolver & >::type ``[link asio.reference.ip__basic_resolver.operator_eq_.overload2 operator=]``(
      basic_resolver< InternetProtocol, Executor1 > && other);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.operator_eq_.overload2 more...]]``


[section:overload1 ip::basic_resolver::operator= (1 of 2 overloads)]


Move-assign a [link asio.reference.ip__basic_resolver `ip::basic_resolver`] from another. 


  basic_resolver & operator=(
      basic_resolver && other);


This assignment operator moves a resolver from one object to another. Cancels any outstanding asynchronous operations associated with the target object.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.ip__basic_resolver `ip::basic_resolver`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_resolver(const executor_type&) constructor`. 




[endsect]



[section:overload2 ip::basic_resolver::operator= (2 of 2 overloads)]


Move-assign a [link asio.reference.ip__basic_resolver `ip::basic_resolver`] from another. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  enable_if< is_convertible< Executor1, Executor >::value, basic_resolver & >::type operator=(
      basic_resolver< InternetProtocol, Executor1 > && other);


This assignment operator moves a resolver from one object to another. Cancels any outstanding asynchronous operations associated with the target object.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.ip__basic_resolver `ip::basic_resolver`] object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_resolver(const executor_type&) constructor`. 




[endsect]


[endsect]


[section:passive ip::basic_resolver::passive]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__basic_resolver.passive..passive..ip::basic_resolver] 
Indicate that returned endpoint is intended for use as a locally bound socket endpoint. 


  static const flags passive = implementation_defined;



[endsect]



[section:protocol_type ip::basic_resolver::protocol_type]

[indexterm2 asio.indexterm.ip__basic_resolver.protocol_type..protocol_type..ip::basic_resolver] 
The protocol type. 


  typedef InternetProtocol protocol_type;



[heading Requirements]

['Header: ][^asio/ip/basic_resolver.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:query ip::basic_resolver::query]

[indexterm2 asio.indexterm.ip__basic_resolver.query..query..ip::basic_resolver] 
(Deprecated.) The query type. 


  typedef basic_resolver_query< InternetProtocol > query;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_resolver_query.flags [*flags]]]
    [A bitmask type (C++ Std \[lib.bitmask.types\]). ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_query.protocol_type [*protocol_type]]]
    [The protocol type associated with the endpoint query. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_query.basic_resolver_query [*basic_resolver_query]] [constructor]]
    [Construct with specified service name for any protocol. 
     [hr]
     Construct with specified service name for a given protocol. 
     [hr]
     Construct with specified host name and service name for any protocol. 
     [hr]
     Construct with specified host name and service name for a given protocol. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_query.hints [*hints]]]
    [Get the hints associated with the query. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_query.host_name [*host_name]]]
    [Get the host name associated with the query. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_query.service_name [*service_name]]]
    [Get the service name associated with the query. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_query.address_configured [*address_configured]] [static]]
    [Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver_query.all_matching [*all_matching]] [static]]
    [If used with v4_mapped, return all matching IPv6 and IPv4 addresses. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver_query.canonical_name [*canonical_name]] [static]]
    [Determine the canonical name of the host specified in the query. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver_query.numeric_host [*numeric_host]] [static]]
    [Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver_query.numeric_service [*numeric_service]] [static]]
    [Service name should be treated as a numeric string defining a port number and no name resolution should be attempted. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver_query.passive [*passive]] [static]]
    [Indicate that returned endpoint is intended for use as a locally bound socket endpoint. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver_query.v4_mapped [*v4_mapped]] [static]]
    [If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses. ]
  ]

]

The [link asio.reference.ip__basic_resolver_query `ip::basic_resolver_query`] class template describes a query that can be passed to a resolver.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/basic_resolver.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:resolve ip::basic_resolver::resolve]

[indexterm2 asio.indexterm.ip__basic_resolver.resolve..resolve..ip::basic_resolver] 
(Deprecated: Use overload with separate host and service parameters.) Perform forward resolution of a query to a list of entries. 


  results_type ``[link asio.reference.ip__basic_resolver.resolve.overload1 resolve]``(
      const query & q);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.resolve.overload1 more...]]``

  results_type ``[link asio.reference.ip__basic_resolver.resolve.overload2 resolve]``(
      const query & q,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.resolve.overload2 more...]]``


Perform forward resolution of a query to a list of entries. 


  results_type ``[link asio.reference.ip__basic_resolver.resolve.overload3 resolve]``(
      string_view host,
      string_view service);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.resolve.overload3 more...]]``

  results_type ``[link asio.reference.ip__basic_resolver.resolve.overload4 resolve]``(
      string_view host,
      string_view service,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.resolve.overload4 more...]]``

  results_type ``[link asio.reference.ip__basic_resolver.resolve.overload5 resolve]``(
      string_view host,
      string_view service,
      resolver_base::flags resolve_flags);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.resolve.overload5 more...]]``

  results_type ``[link asio.reference.ip__basic_resolver.resolve.overload6 resolve]``(
      string_view host,
      string_view service,
      resolver_base::flags resolve_flags,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.resolve.overload6 more...]]``

  results_type ``[link asio.reference.ip__basic_resolver.resolve.overload7 resolve]``(
      const protocol_type & protocol,
      string_view host,
      string_view service);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.resolve.overload7 more...]]``

  results_type ``[link asio.reference.ip__basic_resolver.resolve.overload8 resolve]``(
      const protocol_type & protocol,
      string_view host,
      string_view service,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.resolve.overload8 more...]]``

  results_type ``[link asio.reference.ip__basic_resolver.resolve.overload9 resolve]``(
      const protocol_type & protocol,
      string_view host,
      string_view service,
      resolver_base::flags resolve_flags);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.resolve.overload9 more...]]``

  results_type ``[link asio.reference.ip__basic_resolver.resolve.overload10 resolve]``(
      const protocol_type & protocol,
      string_view host,
      string_view service,
      resolver_base::flags resolve_flags,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.resolve.overload10 more...]]``


Perform reverse resolution of an endpoint to a list of entries. 


  results_type ``[link asio.reference.ip__basic_resolver.resolve.overload11 resolve]``(
      const endpoint_type & e);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.resolve.overload11 more...]]``

  results_type ``[link asio.reference.ip__basic_resolver.resolve.overload12 resolve]``(
      const endpoint_type & e,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.resolve.overload12 more...]]``


[section:overload1 ip::basic_resolver::resolve (1 of 12 overloads)]


(Deprecated: Use overload with separate host and service parameters.) Perform forward resolution of a query to a list of entries. 


  results_type resolve(
      const query & q);


This function is used to resolve a query into a list of endpoint entries.


[heading Parameters]
    

[variablelist
  
[[q][A query object that determines what endpoints will be returned.]]

]


[heading Return Value]
      
A range object representing the list of endpoint entries. A successful call to this function is guaranteed to return a non-empty range.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 ip::basic_resolver::resolve (2 of 12 overloads)]


(Deprecated: Use overload with separate host and service parameters.) Perform forward resolution of a query to a list of entries. 


  results_type resolve(
      const query & q,
      asio::error_code & ec);


This function is used to resolve a query into a list of endpoint entries.


[heading Parameters]
    

[variablelist
  
[[q][A query object that determines what endpoints will be returned.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
A range object representing the list of endpoint entries. An empty range is returned if an error occurs. A successful call to this function is guaranteed to return a non-empty range. 




[endsect]



[section:overload3 ip::basic_resolver::resolve (3 of 12 overloads)]


Perform forward resolution of a query to a list of entries. 


  results_type resolve(
      string_view host,
      string_view service);


This function is used to resolve host and service names into a list of endpoint entries.


[heading Parameters]
    

[variablelist
  
[[host][A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.]]

[[service][A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.]]

]


[heading Return Value]
      
A range object representing the list of endpoint entries. A successful call to this function is guaranteed to return a non-empty range.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
On POSIX systems, host names may be locally defined in the file `/etc/hosts`. On Windows, host names may be defined in the file `c:\windows\system32\drivers\etc\hosts`. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file `/etc/services`. On Windows, service names may be found in the file `c:\windows\system32\drivers\etc\services`. Operating systems may use additional locations when resolving service names. 


[endsect]



[section:overload4 ip::basic_resolver::resolve (4 of 12 overloads)]


Perform forward resolution of a query to a list of entries. 


  results_type resolve(
      string_view host,
      string_view service,
      asio::error_code & ec);


This function is used to resolve host and service names into a list of endpoint entries.


[heading Parameters]
    

[variablelist
  
[[host][A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.]]

[[service][A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
A range object representing the list of endpoint entries. An empty range is returned if an error occurs. A successful call to this function is guaranteed to return a non-empty range.


[heading Remarks]
      
On POSIX systems, host names may be locally defined in the file `/etc/hosts`. On Windows, host names may be defined in the file `c:\windows\system32\drivers\etc\hosts`. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file `/etc/services`. On Windows, service names may be found in the file `c:\windows\system32\drivers\etc\services`. Operating systems may use additional locations when resolving service names. 


[endsect]



[section:overload5 ip::basic_resolver::resolve (5 of 12 overloads)]


Perform forward resolution of a query to a list of entries. 


  results_type resolve(
      string_view host,
      string_view service,
      resolver_base::flags resolve_flags);


This function is used to resolve host and service names into a list of endpoint entries.


[heading Parameters]
    

[variablelist
  
[[host][A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.]]

[[service][A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.]]

[[resolve_flags][A set of flags that determine how name resolution should be performed. The default flags are suitable for communication with remote hosts. See the [link asio.reference.ip__resolver_base `ip::resolver_base`]  documentation for the set of available flags.]]

]


[heading Return Value]
      
A range object representing the list of endpoint entries. A successful call to this function is guaranteed to return a non-empty range.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
On POSIX systems, host names may be locally defined in the file `/etc/hosts`. On Windows, host names may be defined in the file `c:\windows\system32\drivers\etc\hosts`. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file `/etc/services`. On Windows, service names may be found in the file `c:\windows\system32\drivers\etc\services`. Operating systems may use additional locations when resolving service names. 


[endsect]



[section:overload6 ip::basic_resolver::resolve (6 of 12 overloads)]


Perform forward resolution of a query to a list of entries. 


  results_type resolve(
      string_view host,
      string_view service,
      resolver_base::flags resolve_flags,
      asio::error_code & ec);


This function is used to resolve host and service names into a list of endpoint entries.


[heading Parameters]
    

[variablelist
  
[[host][A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.]]

[[service][A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.]]

[[resolve_flags][A set of flags that determine how name resolution should be performed. The default flags are suitable for communication with remote hosts. See the [link asio.reference.ip__resolver_base `ip::resolver_base`]  documentation for the set of available flags.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
A range object representing the list of endpoint entries. An empty range is returned if an error occurs. A successful call to this function is guaranteed to return a non-empty range.


[heading Remarks]
      
On POSIX systems, host names may be locally defined in the file `/etc/hosts`. On Windows, host names may be defined in the file `c:\windows\system32\drivers\etc\hosts`. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file `/etc/services`. On Windows, service names may be found in the file `c:\windows\system32\drivers\etc\services`. Operating systems may use additional locations when resolving service names. 


[endsect]



[section:overload7 ip::basic_resolver::resolve (7 of 12 overloads)]


Perform forward resolution of a query to a list of entries. 


  results_type resolve(
      const protocol_type & protocol,
      string_view host,
      string_view service);


This function is used to resolve host and service names into a list of endpoint entries.


[heading Parameters]
    

[variablelist
  
[[protocol][A protocol object, normally representing either the IPv4 or IPv6 version of an internet protocol.]]

[[host][A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.]]

[[service][A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.]]

]


[heading Return Value]
      
A range object representing the list of endpoint entries. A successful call to this function is guaranteed to return a non-empty range.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
On POSIX systems, host names may be locally defined in the file `/etc/hosts`. On Windows, host names may be defined in the file `c:\windows\system32\drivers\etc\hosts`. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file `/etc/services`. On Windows, service names may be found in the file `c:\windows\system32\drivers\etc\services`. Operating systems may use additional locations when resolving service names. 


[endsect]



[section:overload8 ip::basic_resolver::resolve (8 of 12 overloads)]


Perform forward resolution of a query to a list of entries. 


  results_type resolve(
      const protocol_type & protocol,
      string_view host,
      string_view service,
      asio::error_code & ec);


This function is used to resolve host and service names into a list of endpoint entries.


[heading Parameters]
    

[variablelist
  
[[protocol][A protocol object, normally representing either the IPv4 or IPv6 version of an internet protocol.]]

[[host][A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.]]

[[service][A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
A range object representing the list of endpoint entries. An empty range is returned if an error occurs. A successful call to this function is guaranteed to return a non-empty range.


[heading Remarks]
      
On POSIX systems, host names may be locally defined in the file `/etc/hosts`. On Windows, host names may be defined in the file `c:\windows\system32\drivers\etc\hosts`. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file `/etc/services`. On Windows, service names may be found in the file `c:\windows\system32\drivers\etc\services`. Operating systems may use additional locations when resolving service names. 


[endsect]



[section:overload9 ip::basic_resolver::resolve (9 of 12 overloads)]


Perform forward resolution of a query to a list of entries. 


  results_type resolve(
      const protocol_type & protocol,
      string_view host,
      string_view service,
      resolver_base::flags resolve_flags);


This function is used to resolve host and service names into a list of endpoint entries.


[heading Parameters]
    

[variablelist
  
[[protocol][A protocol object, normally representing either the IPv4 or IPv6 version of an internet protocol.]]

[[host][A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.]]

[[service][A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.]]

[[resolve_flags][A set of flags that determine how name resolution should be performed. The default flags are suitable for communication with remote hosts. See the [link asio.reference.ip__resolver_base `ip::resolver_base`]  documentation for the set of available flags.]]

]


[heading Return Value]
      
A range object representing the list of endpoint entries. A successful call to this function is guaranteed to return a non-empty range.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
On POSIX systems, host names may be locally defined in the file `/etc/hosts`. On Windows, host names may be defined in the file `c:\windows\system32\drivers\etc\hosts`. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file `/etc/services`. On Windows, service names may be found in the file `c:\windows\system32\drivers\etc\services`. Operating systems may use additional locations when resolving service names. 


[endsect]



[section:overload10 ip::basic_resolver::resolve (10 of 12 overloads)]


Perform forward resolution of a query to a list of entries. 


  results_type resolve(
      const protocol_type & protocol,
      string_view host,
      string_view service,
      resolver_base::flags resolve_flags,
      asio::error_code & ec);


This function is used to resolve host and service names into a list of endpoint entries.


[heading Parameters]
    

[variablelist
  
[[protocol][A protocol object, normally representing either the IPv4 or IPv6 version of an internet protocol.]]

[[host][A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.]]

[[service][A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.]]

[[resolve_flags][A set of flags that determine how name resolution should be performed. The default flags are suitable for communication with remote hosts. See the [link asio.reference.ip__resolver_base `ip::resolver_base`]  documentation for the set of available flags.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
A range object representing the list of endpoint entries. An empty range is returned if an error occurs. A successful call to this function is guaranteed to return a non-empty range.


[heading Remarks]
      
On POSIX systems, host names may be locally defined in the file `/etc/hosts`. On Windows, host names may be defined in the file `c:\windows\system32\drivers\etc\hosts`. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file `/etc/services`. On Windows, service names may be found in the file `c:\windows\system32\drivers\etc\services`. Operating systems may use additional locations when resolving service names. 


[endsect]



[section:overload11 ip::basic_resolver::resolve (11 of 12 overloads)]


Perform reverse resolution of an endpoint to a list of entries. 


  results_type resolve(
      const endpoint_type & e);


This function is used to resolve an endpoint into a list of endpoint entries.


[heading Parameters]
    

[variablelist
  
[[e][An endpoint object that determines what endpoints will be returned.]]

]


[heading Return Value]
      
A range object representing the list of endpoint entries. A successful call to this function is guaranteed to return a non-empty range.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload12 ip::basic_resolver::resolve (12 of 12 overloads)]


Perform reverse resolution of an endpoint to a list of entries. 


  results_type resolve(
      const endpoint_type & e,
      asio::error_code & ec);


This function is used to resolve an endpoint into a list of endpoint entries.


[heading Parameters]
    

[variablelist
  
[[e][An endpoint object that determines what endpoints will be returned.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
A range object representing the list of endpoint entries. An empty range is returned if an error occurs. A successful call to this function is guaranteed to return a non-empty range. 




[endsect]


[endsect]


[section:results_type ip::basic_resolver::results_type]

[indexterm2 asio.indexterm.ip__basic_resolver.results_type..results_type..ip::basic_resolver] 
The results type. 


  typedef basic_resolver_results< InternetProtocol > results_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_resolver_results.const_iterator [*const_iterator]]]
    [The type of an iterator into the range. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_results.const_reference [*const_reference]]]
    [The type of a const reference to a value in the range. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_results.difference_type [*difference_type]]]
    [Type used to represent the distance between two iterators in the range. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_results.endpoint_type [*endpoint_type]]]
    [The endpoint type associated with the results. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_results.iterator [*iterator]]]
    [The type of an iterator into the range. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_results.iterator_category [*iterator_category]]]
    [The iterator category. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_results.pointer [*pointer]]]
    [The type of the result of applying operator->() to the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_results.protocol_type [*protocol_type]]]
    [The protocol type associated with the results. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_results.reference [*reference]]]
    [The type of a non-const reference to a value in the range. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_results.size_type [*size_type]]]
    [Type used to represent a count of the elements in the range. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_results.value_type [*value_type]]]
    [The type of a value in the results range. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_results.basic_resolver_results [*basic_resolver_results]] [constructor]]
    [Default constructor creates an empty range. 
     [hr]
     Copy constructor. 
     [hr]
     Move constructor. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.begin [*begin]]]
    [Obtain a begin iterator for the results range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.cbegin [*cbegin]]]
    [Obtain a begin iterator for the results range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.cend [*cend]]]
    [Obtain an end iterator for the results range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.empty [*empty]]]
    [Determine whether the results range is empty. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.end [*end]]]
    [Obtain an end iterator for the results range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.max_size [*max_size]]]
    [Get the maximum number of entries permitted in a results range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.operator__star_ [*operator *]]]
    [Dereference an iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.operator_plus__plus_ [*operator++]]]
    [Increment operator (prefix). 
     [hr]
     Increment operator (postfix). ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.operator_arrow_ [*operator->]]]
    [Dereference an iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.operator_eq_ [*operator=]]]
    [Assignment operator. 
     [hr]
     Move-assignment operator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.size [*size]]]
    [Get the number of entries in the results range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.swap [*swap]]]
    [Swap the results range with another. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_results.dereference [*dereference]]]
    []
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.equal [*equal]]]
    []
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.increment [*increment]]]
    []
  ]
  
]

[heading Protected Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_results.index_ [*index_]]]
    []
  ]

  [
    [[link asio.reference.ip__basic_resolver_results.values_ [*values_]]]
    []
  ]

]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_results.operator_not__eq_ [*operator!=]]]
    [Test two iterators for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.operator_eq__eq_ [*operator==]]]
    [Test two iterators for equality. ]
  ]
  
]

The [link asio.reference.ip__basic_resolver_results `ip::basic_resolver_results`] class template is used to define a range over the results returned by a resolver.

The iterator's value\_type, obtained when a results iterator is dereferenced, is:

   const basic_resolver_entry<InternetProtocol> 





[heading Remarks]
      
For backward compatibility, [link asio.reference.ip__basic_resolver_results `ip::basic_resolver_results`] is derived from [link asio.reference.ip__basic_resolver_iterator `ip::basic_resolver_iterator`]. This derivation is deprecated.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/basic_resolver.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:v4_mapped ip::basic_resolver::v4_mapped]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__basic_resolver.v4_mapped..v4_mapped..ip::basic_resolver] 
If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses. 


  static const flags v4_mapped = implementation_defined;



[endsect]



[section:_basic_resolver ip::basic_resolver::~basic_resolver]

[indexterm2 asio.indexterm.ip__basic_resolver._basic_resolver..~basic_resolver..ip::basic_resolver] 
Destroys the resolver. 


  ~basic_resolver();


This function destroys the resolver, cancelling any outstanding asynchronous wait operations associated with the resolver as if by calling `cancel`. 


[endsect]



[endsect]

[section:ip__basic_resolver__rebind_executor ip::basic_resolver::rebind_executor]


Rebinds the resolver type to another executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  struct rebind_executor


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_resolver__rebind_executor.other [*other]]]
    [The resolver type when rebound to the specified executor. ]
  
  ]

]

[heading Requirements]

['Header: ][^asio/ip/basic_resolver.hpp]

['Convenience header: ][^asio.hpp]


[section:other ip::basic_resolver::rebind_executor::other]

[indexterm2 asio.indexterm.ip__basic_resolver__rebind_executor.other..other..ip::basic_resolver::rebind_executor] 
The resolver type when rebound to the specified executor. 


  typedef basic_resolver< InternetProtocol, Executor1 > other;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_resolver__rebind_executor [*rebind_executor]]]
    [Rebinds the resolver type to another executor. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.flags [*flags]]]
    [A bitmask type (C++ Std \[lib.bitmask.types\]). ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.iterator [*iterator]]]
    [(Deprecated.) The iterator type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.query [*query]]]
    [(Deprecated.) The query type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.results_type [*results_type]]]
    [The results type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver.async_resolve [*async_resolve]]]
    [(Deprecated: Use overload with separate host and service parameters.) Asynchronously perform forward resolution of a query to a list of entries. 
     [hr]
     Asynchronously perform forward resolution of a query to a list of entries. 
     [hr]
     Asynchronously perform reverse resolution of an endpoint to a list of entries. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.basic_resolver [*basic_resolver]] [constructor]]
    [Construct with executor. 
     [hr]
     Construct with execution context. 
     [hr]
     Move-construct a basic_resolver from another. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.cancel [*cancel]]]
    [Cancel any asynchronous operations that are waiting on the resolver. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.operator_eq_ [*operator=]]]
    [Move-assign a basic_resolver from another. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.resolve [*resolve]]]
    [(Deprecated: Use overload with separate host and service parameters.) Perform forward resolution of a query to a list of entries. 
     [hr]
     Perform forward resolution of a query to a list of entries. 
     [hr]
     Perform reverse resolution of an endpoint to a list of entries. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver._basic_resolver [*~basic_resolver]] [destructor]]
    [Destroys the resolver. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver.address_configured [*address_configured]] [static]]
    [Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.all_matching [*all_matching]] [static]]
    [If used with v4_mapped, return all matching IPv6 and IPv4 addresses. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.canonical_name [*canonical_name]] [static]]
    [Determine the canonical name of the host specified in the query. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.numeric_host [*numeric_host]] [static]]
    [Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.numeric_service [*numeric_service]] [static]]
    [Service name should be treated as a numeric string defining a port number and no name resolution should be attempted. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.passive [*passive]] [static]]
    [Indicate that returned endpoint is intended for use as a locally bound socket endpoint. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.v4_mapped [*v4_mapped]] [static]]
    [If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses. ]
  ]

]

The [link asio.reference.ip__basic_resolver `ip::basic_resolver`] class template provides the ability to resolve a query to a list of endpoints.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/basic_resolver.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:ip__basic_resolver_entry ip::basic_resolver_entry]


An entry produced by a resolver. 


  template<
      typename ``[link asio.reference.InternetProtocol InternetProtocol]``>
  class basic_resolver_entry


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_resolver_entry.endpoint_type [*endpoint_type]]]
    [The endpoint type associated with the endpoint entry. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_entry.protocol_type [*protocol_type]]]
    [The protocol type associated with the endpoint entry. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_entry.basic_resolver_entry [*basic_resolver_entry]] [constructor]]
    [Default constructor. 
     [hr]
     Construct with specified endpoint, host name and service name. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.endpoint [*endpoint]]]
    [Get the endpoint associated with the entry. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.host_name [*host_name]]]
    [Get the host name associated with the entry. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.operator_endpoint_type [*operator endpoint_type]]]
    [Convert to the endpoint associated with the entry. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.service_name [*service_name]]]
    [Get the service name associated with the entry. ]
  ]
  
]

The [link asio.reference.ip__basic_resolver_entry `ip::basic_resolver_entry`] class template describes an entry as returned by a resolver.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/ip/basic_resolver_entry.hpp]

['Convenience header: ][^asio.hpp]

[section:basic_resolver_entry ip::basic_resolver_entry::basic_resolver_entry]

[indexterm2 asio.indexterm.ip__basic_resolver_entry.basic_resolver_entry..basic_resolver_entry..ip::basic_resolver_entry] 
Default constructor. 


  ``[link asio.reference.ip__basic_resolver_entry.basic_resolver_entry.overload1 basic_resolver_entry]``();
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_entry.basic_resolver_entry.overload1 more...]]``


Construct with specified endpoint, host name and service name. 


  ``[link asio.reference.ip__basic_resolver_entry.basic_resolver_entry.overload2 basic_resolver_entry]``(
      const endpoint_type & ep,
      string_view host,
      string_view service);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_entry.basic_resolver_entry.overload2 more...]]``


[section:overload1 ip::basic_resolver_entry::basic_resolver_entry (1 of 2 overloads)]


Default constructor. 


  basic_resolver_entry();



[endsect]



[section:overload2 ip::basic_resolver_entry::basic_resolver_entry (2 of 2 overloads)]


Construct with specified endpoint, host name and service name. 


  basic_resolver_entry(
      const endpoint_type & ep,
      string_view host,
      string_view service);



[endsect]


[endsect]


[section:endpoint ip::basic_resolver_entry::endpoint]

[indexterm2 asio.indexterm.ip__basic_resolver_entry.endpoint..endpoint..ip::basic_resolver_entry] 
Get the endpoint associated with the entry. 


  endpoint_type endpoint() const;



[endsect]



[section:endpoint_type ip::basic_resolver_entry::endpoint_type]

[indexterm2 asio.indexterm.ip__basic_resolver_entry.endpoint_type..endpoint_type..ip::basic_resolver_entry] 
The endpoint type associated with the endpoint entry. 


  typedef InternetProtocol::endpoint endpoint_type;



[heading Requirements]

['Header: ][^asio/ip/basic_resolver_entry.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:host_name ip::basic_resolver_entry::host_name]

[indexterm2 asio.indexterm.ip__basic_resolver_entry.host_name..host_name..ip::basic_resolver_entry] 
Get the host name associated with the entry. 


  std::string ``[link asio.reference.ip__basic_resolver_entry.host_name.overload1 host_name]``() const;
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_entry.host_name.overload1 more...]]``

  template<
      class Allocator>
  std::basic_string< char, std::char_traits< char >, Allocator > ``[link asio.reference.ip__basic_resolver_entry.host_name.overload2 host_name]``(
      const Allocator & alloc = Allocator()) const;
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_entry.host_name.overload2 more...]]``


[section:overload1 ip::basic_resolver_entry::host_name (1 of 2 overloads)]


Get the host name associated with the entry. 


  std::string host_name() const;



[endsect]



[section:overload2 ip::basic_resolver_entry::host_name (2 of 2 overloads)]


Get the host name associated with the entry. 


  template<
      class Allocator>
  std::basic_string< char, std::char_traits< char >, Allocator > host_name(
      const Allocator & alloc = Allocator()) const;



[endsect]


[endsect]


[section:operator_endpoint_type ip::basic_resolver_entry::operator endpoint_type]

[indexterm2 asio.indexterm.ip__basic_resolver_entry.operator_endpoint_type..operator endpoint_type..ip::basic_resolver_entry] 
Convert to the endpoint associated with the entry. 


  operator endpoint_type() const;



[endsect]



[section:protocol_type ip::basic_resolver_entry::protocol_type]

[indexterm2 asio.indexterm.ip__basic_resolver_entry.protocol_type..protocol_type..ip::basic_resolver_entry] 
The protocol type associated with the endpoint entry. 


  typedef InternetProtocol protocol_type;



[heading Requirements]

['Header: ][^asio/ip/basic_resolver_entry.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:service_name ip::basic_resolver_entry::service_name]

[indexterm2 asio.indexterm.ip__basic_resolver_entry.service_name..service_name..ip::basic_resolver_entry] 
Get the service name associated with the entry. 


  std::string ``[link asio.reference.ip__basic_resolver_entry.service_name.overload1 service_name]``() const;
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_entry.service_name.overload1 more...]]``

  template<
      class Allocator>
  std::basic_string< char, std::char_traits< char >, Allocator > ``[link asio.reference.ip__basic_resolver_entry.service_name.overload2 service_name]``(
      const Allocator & alloc = Allocator()) const;
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_entry.service_name.overload2 more...]]``


[section:overload1 ip::basic_resolver_entry::service_name (1 of 2 overloads)]


Get the service name associated with the entry. 


  std::string service_name() const;



[endsect]



[section:overload2 ip::basic_resolver_entry::service_name (2 of 2 overloads)]


Get the service name associated with the entry. 


  template<
      class Allocator>
  std::basic_string< char, std::char_traits< char >, Allocator > service_name(
      const Allocator & alloc = Allocator()) const;



[endsect]


[endsect]


[endsect]

[section:ip__basic_resolver_iterator ip::basic_resolver_iterator]


An iterator over the entries produced by a resolver. 


  template<
      typename ``[link asio.reference.InternetProtocol InternetProtocol]``>
  class basic_resolver_iterator


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_resolver_iterator.difference_type [*difference_type]]]
    [The type used for the distance between two iterators. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_iterator.iterator_category [*iterator_category]]]
    [The iterator category. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_iterator.pointer [*pointer]]]
    [The type of the result of applying operator->() to the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_iterator.reference [*reference]]]
    [The type of the result of applying operator*() to the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_iterator.value_type [*value_type]]]
    [The type of the value pointed to by the iterator. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_iterator.basic_resolver_iterator [*basic_resolver_iterator]] [constructor]]
    [Default constructor creates an end iterator. 
     [hr]
     Copy constructor. 
     [hr]
     Move constructor. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator__star_ [*operator *]]]
    [Dereference an iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_plus__plus_ [*operator++]]]
    [Increment operator (prefix). 
     [hr]
     Increment operator (postfix). ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_arrow_ [*operator->]]]
    [Dereference an iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_eq_ [*operator=]]]
    [Assignment operator. 
     [hr]
     Move-assignment operator. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_iterator.dereference [*dereference]]]
    []
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.equal [*equal]]]
    []
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.increment [*increment]]]
    []
  ]
  
]

[heading Protected Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_iterator.index_ [*index_]]]
    []
  ]

  [
    [[link asio.reference.ip__basic_resolver_iterator.values_ [*values_]]]
    []
  ]

]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_not__eq_ [*operator!=]]]
    [Test two iterators for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_eq__eq_ [*operator==]]]
    [Test two iterators for equality. ]
  ]
  
]

The [link asio.reference.ip__basic_resolver_iterator `ip::basic_resolver_iterator`] class template is used to define iterators over the results returned by a resolver.

The iterator's value\_type, obtained when the iterator is dereferenced, is: 

   const basic_resolver_entry<InternetProtocol> 





[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/ip/basic_resolver_iterator.hpp]

['Convenience header: ][^asio.hpp]

[section:basic_resolver_iterator ip::basic_resolver_iterator::basic_resolver_iterator]

[indexterm2 asio.indexterm.ip__basic_resolver_iterator.basic_resolver_iterator..basic_resolver_iterator..ip::basic_resolver_iterator] 
Default constructor creates an end iterator. 


  ``[link asio.reference.ip__basic_resolver_iterator.basic_resolver_iterator.overload1 basic_resolver_iterator]``();
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_iterator.basic_resolver_iterator.overload1 more...]]``


Copy constructor. 


  ``[link asio.reference.ip__basic_resolver_iterator.basic_resolver_iterator.overload2 basic_resolver_iterator]``(
      const basic_resolver_iterator & other);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_iterator.basic_resolver_iterator.overload2 more...]]``


Move constructor. 


  ``[link asio.reference.ip__basic_resolver_iterator.basic_resolver_iterator.overload3 basic_resolver_iterator]``(
      basic_resolver_iterator && other);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_iterator.basic_resolver_iterator.overload3 more...]]``


[section:overload1 ip::basic_resolver_iterator::basic_resolver_iterator (1 of 3 overloads)]


Default constructor creates an end iterator. 


  basic_resolver_iterator();



[endsect]



[section:overload2 ip::basic_resolver_iterator::basic_resolver_iterator (2 of 3 overloads)]


Copy constructor. 


  basic_resolver_iterator(
      const basic_resolver_iterator & other);



[endsect]



[section:overload3 ip::basic_resolver_iterator::basic_resolver_iterator (3 of 3 overloads)]


Move constructor. 


  basic_resolver_iterator(
      basic_resolver_iterator && other);



[endsect]


[endsect]


[section:dereference ip::basic_resolver_iterator::dereference]

[indexterm2 asio.indexterm.ip__basic_resolver_iterator.dereference..dereference..ip::basic_resolver_iterator] 

  const basic_resolver_entry< InternetProtocol > & dereference() const;



[endsect]



[section:difference_type ip::basic_resolver_iterator::difference_type]

[indexterm2 asio.indexterm.ip__basic_resolver_iterator.difference_type..difference_type..ip::basic_resolver_iterator] 
The type used for the distance between two iterators. 


  typedef std::ptrdiff_t difference_type;



[heading Requirements]

['Header: ][^asio/ip/basic_resolver_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:equal ip::basic_resolver_iterator::equal]

[indexterm2 asio.indexterm.ip__basic_resolver_iterator.equal..equal..ip::basic_resolver_iterator] 

  bool equal(
      const basic_resolver_iterator & other) const;



[endsect]



[section:increment ip::basic_resolver_iterator::increment]

[indexterm2 asio.indexterm.ip__basic_resolver_iterator.increment..increment..ip::basic_resolver_iterator] 

  void increment();



[endsect]



[section:index_ ip::basic_resolver_iterator::index_]

[indexterm2 asio.indexterm.ip__basic_resolver_iterator.index_..index_..ip::basic_resolver_iterator] 

  std::size_t index_;



[endsect]



[section:iterator_category ip::basic_resolver_iterator::iterator_category]

[indexterm2 asio.indexterm.ip__basic_resolver_iterator.iterator_category..iterator_category..ip::basic_resolver_iterator] 
The iterator category. 


  typedef std::forward_iterator_tag iterator_category;



[heading Requirements]

['Header: ][^asio/ip/basic_resolver_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator__star_ ip::basic_resolver_iterator::operator *]

[indexterm2 asio.indexterm.ip__basic_resolver_iterator.operator__star_..operator *..ip::basic_resolver_iterator] 
Dereference an iterator. 


  const basic_resolver_entry< InternetProtocol > & operator *() const;



[endsect]



[section:operator_not__eq_ ip::basic_resolver_iterator::operator!=]

[indexterm2 asio.indexterm.ip__basic_resolver_iterator.operator_not__eq_..operator!=..ip::basic_resolver_iterator] 
Test two iterators for inequality. 


  friend bool operator!=(
      const basic_resolver_iterator & a,
      const basic_resolver_iterator & b);


[heading Requirements]

['Header: ][^asio/ip/basic_resolver_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:operator_plus__plus_ ip::basic_resolver_iterator::operator++]

[indexterm2 asio.indexterm.ip__basic_resolver_iterator.operator_plus__plus_..operator++..ip::basic_resolver_iterator] 
Increment operator (prefix). 


  basic_resolver_iterator & ``[link asio.reference.ip__basic_resolver_iterator.operator_plus__plus_.overload1 operator++]``();
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_iterator.operator_plus__plus_.overload1 more...]]``


Increment operator (postfix). 


  basic_resolver_iterator ``[link asio.reference.ip__basic_resolver_iterator.operator_plus__plus_.overload2 operator++]``(
      int );
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_iterator.operator_plus__plus_.overload2 more...]]``


[section:overload1 ip::basic_resolver_iterator::operator++ (1 of 2 overloads)]


Increment operator (prefix). 


  basic_resolver_iterator & operator++();



[endsect]



[section:overload2 ip::basic_resolver_iterator::operator++ (2 of 2 overloads)]


Increment operator (postfix). 


  basic_resolver_iterator operator++(
      int );



[endsect]


[endsect]


[section:operator_arrow_ ip::basic_resolver_iterator::operator->]

[indexterm2 asio.indexterm.ip__basic_resolver_iterator.operator_arrow_..operator->..ip::basic_resolver_iterator] 
Dereference an iterator. 


  const basic_resolver_entry< InternetProtocol > * operator->() const;



[endsect]


[section:operator_eq_ ip::basic_resolver_iterator::operator=]

[indexterm2 asio.indexterm.ip__basic_resolver_iterator.operator_eq_..operator=..ip::basic_resolver_iterator] 
Assignment operator. 


  basic_resolver_iterator & ``[link asio.reference.ip__basic_resolver_iterator.operator_eq_.overload1 operator=]``(
      const basic_resolver_iterator & other);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_iterator.operator_eq_.overload1 more...]]``


Move-assignment operator. 


  basic_resolver_iterator & ``[link asio.reference.ip__basic_resolver_iterator.operator_eq_.overload2 operator=]``(
      basic_resolver_iterator && other);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_iterator.operator_eq_.overload2 more...]]``


[section:overload1 ip::basic_resolver_iterator::operator= (1 of 2 overloads)]


Assignment operator. 


  basic_resolver_iterator & operator=(
      const basic_resolver_iterator & other);



[endsect]



[section:overload2 ip::basic_resolver_iterator::operator= (2 of 2 overloads)]


Move-assignment operator. 


  basic_resolver_iterator & operator=(
      basic_resolver_iterator && other);



[endsect]


[endsect]


[section:operator_eq__eq_ ip::basic_resolver_iterator::operator==]

[indexterm2 asio.indexterm.ip__basic_resolver_iterator.operator_eq__eq_..operator==..ip::basic_resolver_iterator] 
Test two iterators for equality. 


  friend bool operator==(
      const basic_resolver_iterator & a,
      const basic_resolver_iterator & b);


[heading Requirements]

['Header: ][^asio/ip/basic_resolver_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:pointer ip::basic_resolver_iterator::pointer]

[indexterm2 asio.indexterm.ip__basic_resolver_iterator.pointer..pointer..ip::basic_resolver_iterator] 
The type of the result of applying `operator->()` to the iterator. 


  typedef const basic_resolver_entry< InternetProtocol > * pointer;



[heading Requirements]

['Header: ][^asio/ip/basic_resolver_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:reference ip::basic_resolver_iterator::reference]

[indexterm2 asio.indexterm.ip__basic_resolver_iterator.reference..reference..ip::basic_resolver_iterator] 
The type of the result of applying `operator*()` to the iterator. 


  typedef const basic_resolver_entry< InternetProtocol > & reference;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_resolver_entry.endpoint_type [*endpoint_type]]]
    [The endpoint type associated with the endpoint entry. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_entry.protocol_type [*protocol_type]]]
    [The protocol type associated with the endpoint entry. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_entry.basic_resolver_entry [*basic_resolver_entry]] [constructor]]
    [Default constructor. 
     [hr]
     Construct with specified endpoint, host name and service name. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.endpoint [*endpoint]]]
    [Get the endpoint associated with the entry. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.host_name [*host_name]]]
    [Get the host name associated with the entry. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.operator_endpoint_type [*operator endpoint_type]]]
    [Convert to the endpoint associated with the entry. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.service_name [*service_name]]]
    [Get the service name associated with the entry. ]
  ]
  
]

The [link asio.reference.ip__basic_resolver_entry `ip::basic_resolver_entry`] class template describes an entry as returned by a resolver.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/basic_resolver_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:value_type ip::basic_resolver_iterator::value_type]

[indexterm2 asio.indexterm.ip__basic_resolver_iterator.value_type..value_type..ip::basic_resolver_iterator] 
The type of the value pointed to by the iterator. 


  typedef basic_resolver_entry< InternetProtocol > value_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_resolver_entry.endpoint_type [*endpoint_type]]]
    [The endpoint type associated with the endpoint entry. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_entry.protocol_type [*protocol_type]]]
    [The protocol type associated with the endpoint entry. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_entry.basic_resolver_entry [*basic_resolver_entry]] [constructor]]
    [Default constructor. 
     [hr]
     Construct with specified endpoint, host name and service name. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.endpoint [*endpoint]]]
    [Get the endpoint associated with the entry. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.host_name [*host_name]]]
    [Get the host name associated with the entry. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.operator_endpoint_type [*operator endpoint_type]]]
    [Convert to the endpoint associated with the entry. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.service_name [*service_name]]]
    [Get the service name associated with the entry. ]
  ]
  
]

The [link asio.reference.ip__basic_resolver_entry `ip::basic_resolver_entry`] class template describes an entry as returned by a resolver.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/basic_resolver_iterator.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:values_ ip::basic_resolver_iterator::values_]

[indexterm2 asio.indexterm.ip__basic_resolver_iterator.values_..values_..ip::basic_resolver_iterator] 

  values_ptr_type values_;



[endsect]



[endsect]

[section:ip__basic_resolver_query ip::basic_resolver_query]


An query to be passed to a resolver. 


  template<
      typename ``[link asio.reference.InternetProtocol InternetProtocol]``>
  class basic_resolver_query :
    public ip::resolver_query_base


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_resolver_query.flags [*flags]]]
    [A bitmask type (C++ Std \[lib.bitmask.types\]). ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_query.protocol_type [*protocol_type]]]
    [The protocol type associated with the endpoint query. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_query.basic_resolver_query [*basic_resolver_query]] [constructor]]
    [Construct with specified service name for any protocol. 
     [hr]
     Construct with specified service name for a given protocol. 
     [hr]
     Construct with specified host name and service name for any protocol. 
     [hr]
     Construct with specified host name and service name for a given protocol. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_query.hints [*hints]]]
    [Get the hints associated with the query. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_query.host_name [*host_name]]]
    [Get the host name associated with the query. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_query.service_name [*service_name]]]
    [Get the service name associated with the query. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_query.address_configured [*address_configured]] [static]]
    [Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver_query.all_matching [*all_matching]] [static]]
    [If used with v4_mapped, return all matching IPv6 and IPv4 addresses. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver_query.canonical_name [*canonical_name]] [static]]
    [Determine the canonical name of the host specified in the query. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver_query.numeric_host [*numeric_host]] [static]]
    [Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver_query.numeric_service [*numeric_service]] [static]]
    [Service name should be treated as a numeric string defining a port number and no name resolution should be attempted. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver_query.passive [*passive]] [static]]
    [Indicate that returned endpoint is intended for use as a locally bound socket endpoint. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver_query.v4_mapped [*v4_mapped]] [static]]
    [If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses. ]
  ]

]

The [link asio.reference.ip__basic_resolver_query `ip::basic_resolver_query`] class template describes a query that can be passed to a resolver.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/ip/basic_resolver_query.hpp]

['Convenience header: ][^asio.hpp]


[section:address_configured ip::basic_resolver_query::address_configured]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__basic_resolver_query.address_configured..address_configured..ip::basic_resolver_query] 
Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system. 


  static const flags address_configured = implementation_defined;



[endsect]



[section:all_matching ip::basic_resolver_query::all_matching]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__basic_resolver_query.all_matching..all_matching..ip::basic_resolver_query] 
If used with v4\_mapped, return all matching IPv6 and IPv4 addresses. 


  static const flags all_matching = implementation_defined;



[endsect]


[section:basic_resolver_query ip::basic_resolver_query::basic_resolver_query]

[indexterm2 asio.indexterm.ip__basic_resolver_query.basic_resolver_query..basic_resolver_query..ip::basic_resolver_query] 
Construct with specified service name for any protocol. 


  ``[link asio.reference.ip__basic_resolver_query.basic_resolver_query.overload1 basic_resolver_query]``(
      const std::string & service,
      resolver_query_base::flags resolve_flags = passive|address_configured);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_query.basic_resolver_query.overload1 more...]]``


Construct with specified service name for a given protocol. 


  ``[link asio.reference.ip__basic_resolver_query.basic_resolver_query.overload2 basic_resolver_query]``(
      const protocol_type & protocol,
      const std::string & service,
      resolver_query_base::flags resolve_flags = passive|address_configured);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_query.basic_resolver_query.overload2 more...]]``


Construct with specified host name and service name for any protocol. 


  ``[link asio.reference.ip__basic_resolver_query.basic_resolver_query.overload3 basic_resolver_query]``(
      const std::string & host,
      const std::string & service,
      resolver_query_base::flags resolve_flags = address_configured);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_query.basic_resolver_query.overload3 more...]]``


Construct with specified host name and service name for a given protocol. 


  ``[link asio.reference.ip__basic_resolver_query.basic_resolver_query.overload4 basic_resolver_query]``(
      const protocol_type & protocol,
      const std::string & host,
      const std::string & service,
      resolver_query_base::flags resolve_flags = address_configured);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_query.basic_resolver_query.overload4 more...]]``


[section:overload1 ip::basic_resolver_query::basic_resolver_query (1 of 4 overloads)]


Construct with specified service name for any protocol. 


  basic_resolver_query(
      const std::string & service,
      resolver_query_base::flags resolve_flags = passive|address_configured);


This constructor is typically used to perform name resolution for local service binding.


[heading Parameters]
    

[variablelist
  
[[service][A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number.]]

[[resolve_flags][A set of flags that determine how name resolution should be performed. The default flags are suitable for local service binding.]]

]


[heading Remarks]
      
On POSIX systems, service names are typically defined in the file `/etc/services`. On Windows, service names may be found in the file `c:\windows\system32\drivers\etc\services`. Operating systems may use additional locations when resolving service names. 




[endsect]



[section:overload2 ip::basic_resolver_query::basic_resolver_query (2 of 4 overloads)]


Construct with specified service name for a given protocol. 


  basic_resolver_query(
      const protocol_type & protocol,
      const std::string & service,
      resolver_query_base::flags resolve_flags = passive|address_configured);


This constructor is typically used to perform name resolution for local service binding with a specific protocol version.


[heading Parameters]
    

[variablelist
  
[[protocol][A protocol object, normally representing either the IPv4 or IPv6 version of an internet protocol.]]

[[service][A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number.]]

[[resolve_flags][A set of flags that determine how name resolution should be performed. The default flags are suitable for local service binding.]]

]


[heading Remarks]
      
On POSIX systems, service names are typically defined in the file `/etc/services`. On Windows, service names may be found in the file `c:\windows\system32\drivers\etc\services`. Operating systems may use additional locations when resolving service names. 




[endsect]



[section:overload3 ip::basic_resolver_query::basic_resolver_query (3 of 4 overloads)]


Construct with specified host name and service name for any protocol. 


  basic_resolver_query(
      const std::string & host,
      const std::string & service,
      resolver_query_base::flags resolve_flags = address_configured);


This constructor is typically used to perform name resolution for communication with remote hosts.


[heading Parameters]
    

[variablelist
  
[[host][A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.]]

[[service][A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.]]

[[resolve_flags][A set of flags that determine how name resolution should be performed. The default flags are suitable for communication with remote hosts.]]

]


[heading Remarks]
      
On POSIX systems, host names may be locally defined in the file `/etc/hosts`. On Windows, host names may be defined in the file `c:\windows\system32\drivers\etc\hosts`. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file `/etc/services`. On Windows, service names may be found in the file `c:\windows\system32\drivers\etc\services`. Operating systems may use additional locations when resolving service names. 


[endsect]



[section:overload4 ip::basic_resolver_query::basic_resolver_query (4 of 4 overloads)]


Construct with specified host name and service name for a given protocol. 


  basic_resolver_query(
      const protocol_type & protocol,
      const std::string & host,
      const std::string & service,
      resolver_query_base::flags resolve_flags = address_configured);


This constructor is typically used to perform name resolution for communication with remote hosts.


[heading Parameters]
    

[variablelist
  
[[protocol][A protocol object, normally representing either the IPv4 or IPv6 version of an internet protocol.]]

[[host][A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.]]

[[service][A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.]]

[[resolve_flags][A set of flags that determine how name resolution should be performed. The default flags are suitable for communication with remote hosts.]]

]


[heading Remarks]
      
On POSIX systems, host names may be locally defined in the file `/etc/hosts`. On Windows, host names may be defined in the file `c:\windows\system32\drivers\etc\hosts`. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file `/etc/services`. On Windows, service names may be found in the file `c:\windows\system32\drivers\etc\services`. Operating systems may use additional locations when resolving service names. 


[endsect]


[endsect]


[section:canonical_name ip::basic_resolver_query::canonical_name]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__basic_resolver_query.canonical_name..canonical_name..ip::basic_resolver_query] 
Determine the canonical name of the host specified in the query. 


  static const flags canonical_name = implementation_defined;



[endsect]



[section:flags ip::basic_resolver_query::flags]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__basic_resolver_query.flags..flags..ip::basic_resolver_query] 
A bitmask type (C++ Std [lib.bitmask.types]). 


  typedef unspecified flags;



[heading Requirements]

['Header: ][^asio/ip/basic_resolver_query.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:hints ip::basic_resolver_query::hints]

[indexterm2 asio.indexterm.ip__basic_resolver_query.hints..hints..ip::basic_resolver_query] 
Get the hints associated with the query. 


  const asio::detail::addrinfo_type & hints() const;



[endsect]



[section:host_name ip::basic_resolver_query::host_name]

[indexterm2 asio.indexterm.ip__basic_resolver_query.host_name..host_name..ip::basic_resolver_query] 
Get the host name associated with the query. 


  std::string host_name() const;



[endsect]



[section:numeric_host ip::basic_resolver_query::numeric_host]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__basic_resolver_query.numeric_host..numeric_host..ip::basic_resolver_query] 
Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted. 


  static const flags numeric_host = implementation_defined;



[endsect]



[section:numeric_service ip::basic_resolver_query::numeric_service]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__basic_resolver_query.numeric_service..numeric_service..ip::basic_resolver_query] 
Service name should be treated as a numeric string defining a port number and no name resolution should be attempted. 


  static const flags numeric_service = implementation_defined;



[endsect]



[section:passive ip::basic_resolver_query::passive]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__basic_resolver_query.passive..passive..ip::basic_resolver_query] 
Indicate that returned endpoint is intended for use as a locally bound socket endpoint. 


  static const flags passive = implementation_defined;



[endsect]



[section:protocol_type ip::basic_resolver_query::protocol_type]

[indexterm2 asio.indexterm.ip__basic_resolver_query.protocol_type..protocol_type..ip::basic_resolver_query] 
The protocol type associated with the endpoint query. 


  typedef InternetProtocol protocol_type;



[heading Requirements]

['Header: ][^asio/ip/basic_resolver_query.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:service_name ip::basic_resolver_query::service_name]

[indexterm2 asio.indexterm.ip__basic_resolver_query.service_name..service_name..ip::basic_resolver_query] 
Get the service name associated with the query. 


  std::string service_name() const;



[endsect]



[section:v4_mapped ip::basic_resolver_query::v4_mapped]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__basic_resolver_query.v4_mapped..v4_mapped..ip::basic_resolver_query] 
If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses. 


  static const flags v4_mapped = implementation_defined;



[endsect]



[endsect]

[section:ip__basic_resolver_results ip::basic_resolver_results]


A range of entries produced by a resolver. 


  template<
      typename ``[link asio.reference.InternetProtocol InternetProtocol]``>
  class basic_resolver_results :
    public ip::basic_resolver_iterator< InternetProtocol >


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_resolver_results.const_iterator [*const_iterator]]]
    [The type of an iterator into the range. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_results.const_reference [*const_reference]]]
    [The type of a const reference to a value in the range. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_results.difference_type [*difference_type]]]
    [Type used to represent the distance between two iterators in the range. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_results.endpoint_type [*endpoint_type]]]
    [The endpoint type associated with the results. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_results.iterator [*iterator]]]
    [The type of an iterator into the range. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_results.iterator_category [*iterator_category]]]
    [The iterator category. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_results.pointer [*pointer]]]
    [The type of the result of applying operator->() to the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_results.protocol_type [*protocol_type]]]
    [The protocol type associated with the results. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_results.reference [*reference]]]
    [The type of a non-const reference to a value in the range. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_results.size_type [*size_type]]]
    [Type used to represent a count of the elements in the range. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_results.value_type [*value_type]]]
    [The type of a value in the results range. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_results.basic_resolver_results [*basic_resolver_results]] [constructor]]
    [Default constructor creates an empty range. 
     [hr]
     Copy constructor. 
     [hr]
     Move constructor. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.begin [*begin]]]
    [Obtain a begin iterator for the results range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.cbegin [*cbegin]]]
    [Obtain a begin iterator for the results range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.cend [*cend]]]
    [Obtain an end iterator for the results range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.empty [*empty]]]
    [Determine whether the results range is empty. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.end [*end]]]
    [Obtain an end iterator for the results range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.max_size [*max_size]]]
    [Get the maximum number of entries permitted in a results range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.operator__star_ [*operator *]]]
    [Dereference an iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.operator_plus__plus_ [*operator++]]]
    [Increment operator (prefix). 
     [hr]
     Increment operator (postfix). ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.operator_arrow_ [*operator->]]]
    [Dereference an iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.operator_eq_ [*operator=]]]
    [Assignment operator. 
     [hr]
     Move-assignment operator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.size [*size]]]
    [Get the number of entries in the results range. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.swap [*swap]]]
    [Swap the results range with another. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_results.dereference [*dereference]]]
    []
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.equal [*equal]]]
    []
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.increment [*increment]]]
    []
  ]
  
]

[heading Protected Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_results.index_ [*index_]]]
    []
  ]

  [
    [[link asio.reference.ip__basic_resolver_results.values_ [*values_]]]
    []
  ]

]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_results.operator_not__eq_ [*operator!=]]]
    [Test two iterators for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_results.operator_eq__eq_ [*operator==]]]
    [Test two iterators for equality. ]
  ]
  
]

The [link asio.reference.ip__basic_resolver_results `ip::basic_resolver_results`] class template is used to define a range over the results returned by a resolver.

The iterator's value\_type, obtained when a results iterator is dereferenced, is:

   const basic_resolver_entry<InternetProtocol> 





[heading Remarks]
      
For backward compatibility, [link asio.reference.ip__basic_resolver_results `ip::basic_resolver_results`] is derived from [link asio.reference.ip__basic_resolver_iterator `ip::basic_resolver_iterator`]. This derivation is deprecated.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/ip/basic_resolver_results.hpp]

['Convenience header: ][^asio.hpp]

[section:basic_resolver_results ip::basic_resolver_results::basic_resolver_results]

[indexterm2 asio.indexterm.ip__basic_resolver_results.basic_resolver_results..basic_resolver_results..ip::basic_resolver_results] 
Default constructor creates an empty range. 


  ``[link asio.reference.ip__basic_resolver_results.basic_resolver_results.overload1 basic_resolver_results]``();
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_results.basic_resolver_results.overload1 more...]]``


Copy constructor. 


  ``[link asio.reference.ip__basic_resolver_results.basic_resolver_results.overload2 basic_resolver_results]``(
      const basic_resolver_results & other);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_results.basic_resolver_results.overload2 more...]]``


Move constructor. 


  ``[link asio.reference.ip__basic_resolver_results.basic_resolver_results.overload3 basic_resolver_results]``(
      basic_resolver_results && other);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_results.basic_resolver_results.overload3 more...]]``


[section:overload1 ip::basic_resolver_results::basic_resolver_results (1 of 3 overloads)]


Default constructor creates an empty range. 


  basic_resolver_results();



[endsect]



[section:overload2 ip::basic_resolver_results::basic_resolver_results (2 of 3 overloads)]


Copy constructor. 


  basic_resolver_results(
      const basic_resolver_results & other);



[endsect]



[section:overload3 ip::basic_resolver_results::basic_resolver_results (3 of 3 overloads)]


Move constructor. 


  basic_resolver_results(
      basic_resolver_results && other);



[endsect]


[endsect]


[section:begin ip::basic_resolver_results::begin]

[indexterm2 asio.indexterm.ip__basic_resolver_results.begin..begin..ip::basic_resolver_results] 
Obtain a begin iterator for the results range. 


  const_iterator begin() const;



[endsect]



[section:cbegin ip::basic_resolver_results::cbegin]

[indexterm2 asio.indexterm.ip__basic_resolver_results.cbegin..cbegin..ip::basic_resolver_results] 
Obtain a begin iterator for the results range. 


  const_iterator cbegin() const;



[endsect]



[section:cend ip::basic_resolver_results::cend]

[indexterm2 asio.indexterm.ip__basic_resolver_results.cend..cend..ip::basic_resolver_results] 
Obtain an end iterator for the results range. 


  const_iterator cend() const;



[endsect]



[section:const_iterator ip::basic_resolver_results::const_iterator]

[indexterm2 asio.indexterm.ip__basic_resolver_results.const_iterator..const_iterator..ip::basic_resolver_results] 
The type of an iterator into the range. 


  typedef basic_resolver_iterator< protocol_type > const_iterator;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_resolver_iterator.difference_type [*difference_type]]]
    [The type used for the distance between two iterators. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_iterator.iterator_category [*iterator_category]]]
    [The iterator category. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_iterator.pointer [*pointer]]]
    [The type of the result of applying operator->() to the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_iterator.reference [*reference]]]
    [The type of the result of applying operator*() to the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_iterator.value_type [*value_type]]]
    [The type of the value pointed to by the iterator. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_iterator.basic_resolver_iterator [*basic_resolver_iterator]] [constructor]]
    [Default constructor creates an end iterator. 
     [hr]
     Copy constructor. 
     [hr]
     Move constructor. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator__star_ [*operator *]]]
    [Dereference an iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_plus__plus_ [*operator++]]]
    [Increment operator (prefix). 
     [hr]
     Increment operator (postfix). ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_arrow_ [*operator->]]]
    [Dereference an iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_eq_ [*operator=]]]
    [Assignment operator. 
     [hr]
     Move-assignment operator. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_iterator.dereference [*dereference]]]
    []
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.equal [*equal]]]
    []
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.increment [*increment]]]
    []
  ]
  
]

[heading Protected Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_iterator.index_ [*index_]]]
    []
  ]

  [
    [[link asio.reference.ip__basic_resolver_iterator.values_ [*values_]]]
    []
  ]

]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_not__eq_ [*operator!=]]]
    [Test two iterators for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_eq__eq_ [*operator==]]]
    [Test two iterators for equality. ]
  ]
  
]

The [link asio.reference.ip__basic_resolver_iterator `ip::basic_resolver_iterator`] class template is used to define iterators over the results returned by a resolver.

The iterator's value\_type, obtained when the iterator is dereferenced, is: 

   const basic_resolver_entry<InternetProtocol> 





[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/basic_resolver_results.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:const_reference ip::basic_resolver_results::const_reference]

[indexterm2 asio.indexterm.ip__basic_resolver_results.const_reference..const_reference..ip::basic_resolver_results] 
The type of a const reference to a value in the range. 


  typedef const value_type & const_reference;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_resolver_entry.endpoint_type [*endpoint_type]]]
    [The endpoint type associated with the endpoint entry. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_entry.protocol_type [*protocol_type]]]
    [The protocol type associated with the endpoint entry. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_entry.basic_resolver_entry [*basic_resolver_entry]] [constructor]]
    [Default constructor. 
     [hr]
     Construct with specified endpoint, host name and service name. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.endpoint [*endpoint]]]
    [Get the endpoint associated with the entry. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.host_name [*host_name]]]
    [Get the host name associated with the entry. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.operator_endpoint_type [*operator endpoint_type]]]
    [Convert to the endpoint associated with the entry. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.service_name [*service_name]]]
    [Get the service name associated with the entry. ]
  ]
  
]

The [link asio.reference.ip__basic_resolver_entry `ip::basic_resolver_entry`] class template describes an entry as returned by a resolver.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/basic_resolver_results.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:dereference ip::basic_resolver_results::dereference]


['Inherited from ip::basic_resolver.]

[indexterm2 asio.indexterm.ip__basic_resolver_results.dereference..dereference..ip::basic_resolver_results] 

  const basic_resolver_entry< InternetProtocol > & dereference() const;



[endsect]



[section:difference_type ip::basic_resolver_results::difference_type]

[indexterm2 asio.indexterm.ip__basic_resolver_results.difference_type..difference_type..ip::basic_resolver_results] 
Type used to represent the distance between two iterators in the range. 


  typedef std::ptrdiff_t difference_type;



[heading Requirements]

['Header: ][^asio/ip/basic_resolver_results.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:empty ip::basic_resolver_results::empty]

[indexterm2 asio.indexterm.ip__basic_resolver_results.empty..empty..ip::basic_resolver_results] 
Determine whether the results range is empty. 


  bool empty() const;



[endsect]



[section:end ip::basic_resolver_results::end]

[indexterm2 asio.indexterm.ip__basic_resolver_results.end..end..ip::basic_resolver_results] 
Obtain an end iterator for the results range. 


  const_iterator end() const;



[endsect]



[section:endpoint_type ip::basic_resolver_results::endpoint_type]

[indexterm2 asio.indexterm.ip__basic_resolver_results.endpoint_type..endpoint_type..ip::basic_resolver_results] 
The endpoint type associated with the results. 


  typedef protocol_type::endpoint endpoint_type;



[heading Requirements]

['Header: ][^asio/ip/basic_resolver_results.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:equal ip::basic_resolver_results::equal]


['Inherited from ip::basic_resolver.]

[indexterm2 asio.indexterm.ip__basic_resolver_results.equal..equal..ip::basic_resolver_results] 

  bool equal(
      const basic_resolver_iterator & other) const;



[endsect]



[section:increment ip::basic_resolver_results::increment]


['Inherited from ip::basic_resolver.]

[indexterm2 asio.indexterm.ip__basic_resolver_results.increment..increment..ip::basic_resolver_results] 

  void increment();



[endsect]



[section:index_ ip::basic_resolver_results::index_]


['Inherited from ip::basic_resolver.]

[indexterm2 asio.indexterm.ip__basic_resolver_results.index_..index_..ip::basic_resolver_results] 

  std::size_t index_;



[endsect]



[section:iterator ip::basic_resolver_results::iterator]

[indexterm2 asio.indexterm.ip__basic_resolver_results.iterator..iterator..ip::basic_resolver_results] 
The type of an iterator into the range. 


  typedef const_iterator iterator;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_resolver_iterator.difference_type [*difference_type]]]
    [The type used for the distance between two iterators. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_iterator.iterator_category [*iterator_category]]]
    [The iterator category. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_iterator.pointer [*pointer]]]
    [The type of the result of applying operator->() to the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_iterator.reference [*reference]]]
    [The type of the result of applying operator*() to the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_iterator.value_type [*value_type]]]
    [The type of the value pointed to by the iterator. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_iterator.basic_resolver_iterator [*basic_resolver_iterator]] [constructor]]
    [Default constructor creates an end iterator. 
     [hr]
     Copy constructor. 
     [hr]
     Move constructor. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator__star_ [*operator *]]]
    [Dereference an iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_plus__plus_ [*operator++]]]
    [Increment operator (prefix). 
     [hr]
     Increment operator (postfix). ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_arrow_ [*operator->]]]
    [Dereference an iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_eq_ [*operator=]]]
    [Assignment operator. 
     [hr]
     Move-assignment operator. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_iterator.dereference [*dereference]]]
    []
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.equal [*equal]]]
    []
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.increment [*increment]]]
    []
  ]
  
]

[heading Protected Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_iterator.index_ [*index_]]]
    []
  ]

  [
    [[link asio.reference.ip__basic_resolver_iterator.values_ [*values_]]]
    []
  ]

]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_not__eq_ [*operator!=]]]
    [Test two iterators for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_eq__eq_ [*operator==]]]
    [Test two iterators for equality. ]
  ]
  
]

The [link asio.reference.ip__basic_resolver_iterator `ip::basic_resolver_iterator`] class template is used to define iterators over the results returned by a resolver.

The iterator's value\_type, obtained when the iterator is dereferenced, is: 

   const basic_resolver_entry<InternetProtocol> 





[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/basic_resolver_results.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:iterator_category ip::basic_resolver_results::iterator_category]


['Inherited from ip::basic_resolver.]

[indexterm2 asio.indexterm.ip__basic_resolver_results.iterator_category..iterator_category..ip::basic_resolver_results] 
The iterator category. 


  typedef std::forward_iterator_tag iterator_category;



[heading Requirements]

['Header: ][^asio/ip/basic_resolver_results.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:max_size ip::basic_resolver_results::max_size]

[indexterm2 asio.indexterm.ip__basic_resolver_results.max_size..max_size..ip::basic_resolver_results] 
Get the maximum number of entries permitted in a results range. 


  size_type max_size() const;



[endsect]



[section:operator__star_ ip::basic_resolver_results::operator *]


['Inherited from ip::basic_resolver.]

[indexterm2 asio.indexterm.ip__basic_resolver_results.operator__star_..operator *..ip::basic_resolver_results] 
Dereference an iterator. 


  const basic_resolver_entry< InternetProtocol > & operator *() const;



[endsect]


[section:operator_not__eq_ ip::basic_resolver_results::operator!=]

[indexterm2 asio.indexterm.ip__basic_resolver_results.operator_not__eq_..operator!=..ip::basic_resolver_results] 
Test two iterators for inequality. 


  friend bool ``[link asio.reference.ip__basic_resolver_results.operator_not__eq_.overload1 operator!=]``(
      const basic_resolver_results & a,
      const basic_resolver_results & b);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_results.operator_not__eq_.overload1 more...]]``

  friend bool ``[link asio.reference.ip__basic_resolver_results.operator_not__eq_.overload2 operator!=]``(
      const basic_resolver_iterator & a,
      const basic_resolver_iterator & b);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_results.operator_not__eq_.overload2 more...]]``


[section:overload1 ip::basic_resolver_results::operator!= (1 of 2 overloads)]


Test two iterators for inequality. 


  friend bool operator!=(
      const basic_resolver_results & a,
      const basic_resolver_results & b);


[heading Requirements]

['Header: ][^asio/ip/basic_resolver_results.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:overload2 ip::basic_resolver_results::operator!= (2 of 2 overloads)]


['Inherited from ip::basic_resolver.]


Test two iterators for inequality. 


  friend bool operator!=(
      const basic_resolver_iterator & a,
      const basic_resolver_iterator & b);


[heading Requirements]

['Header: ][^asio/ip/basic_resolver_results.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[endsect]

[section:operator_plus__plus_ ip::basic_resolver_results::operator++]

[indexterm2 asio.indexterm.ip__basic_resolver_results.operator_plus__plus_..operator++..ip::basic_resolver_results] 
Increment operator (prefix). 


  basic_resolver_iterator & ``[link asio.reference.ip__basic_resolver_results.operator_plus__plus_.overload1 operator++]``();
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_results.operator_plus__plus_.overload1 more...]]``


Increment operator (postfix). 


  basic_resolver_iterator ``[link asio.reference.ip__basic_resolver_results.operator_plus__plus_.overload2 operator++]``(
      int );
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_results.operator_plus__plus_.overload2 more...]]``


[section:overload1 ip::basic_resolver_results::operator++ (1 of 2 overloads)]


['Inherited from ip::basic_resolver.]


Increment operator (prefix). 


  basic_resolver_iterator & operator++();



[endsect]



[section:overload2 ip::basic_resolver_results::operator++ (2 of 2 overloads)]


['Inherited from ip::basic_resolver.]


Increment operator (postfix). 


  basic_resolver_iterator operator++(
      int );



[endsect]


[endsect]


[section:operator_arrow_ ip::basic_resolver_results::operator->]


['Inherited from ip::basic_resolver.]

[indexterm2 asio.indexterm.ip__basic_resolver_results.operator_arrow_..operator->..ip::basic_resolver_results] 
Dereference an iterator. 


  const basic_resolver_entry< InternetProtocol > * operator->() const;



[endsect]


[section:operator_eq_ ip::basic_resolver_results::operator=]

[indexterm2 asio.indexterm.ip__basic_resolver_results.operator_eq_..operator=..ip::basic_resolver_results] 
Assignment operator. 


  basic_resolver_results & ``[link asio.reference.ip__basic_resolver_results.operator_eq_.overload1 operator=]``(
      const basic_resolver_results & other);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_results.operator_eq_.overload1 more...]]``


Move-assignment operator. 


  basic_resolver_results & ``[link asio.reference.ip__basic_resolver_results.operator_eq_.overload2 operator=]``(
      basic_resolver_results && other);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_results.operator_eq_.overload2 more...]]``


[section:overload1 ip::basic_resolver_results::operator= (1 of 2 overloads)]


Assignment operator. 


  basic_resolver_results & operator=(
      const basic_resolver_results & other);



[endsect]



[section:overload2 ip::basic_resolver_results::operator= (2 of 2 overloads)]


Move-assignment operator. 


  basic_resolver_results & operator=(
      basic_resolver_results && other);



[endsect]


[endsect]

[section:operator_eq__eq_ ip::basic_resolver_results::operator==]

[indexterm2 asio.indexterm.ip__basic_resolver_results.operator_eq__eq_..operator==..ip::basic_resolver_results] 
Test two iterators for equality. 


  friend bool ``[link asio.reference.ip__basic_resolver_results.operator_eq__eq_.overload1 operator==]``(
      const basic_resolver_results & a,
      const basic_resolver_results & b);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_results.operator_eq__eq_.overload1 more...]]``

  friend bool ``[link asio.reference.ip__basic_resolver_results.operator_eq__eq_.overload2 operator==]``(
      const basic_resolver_iterator & a,
      const basic_resolver_iterator & b);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_results.operator_eq__eq_.overload2 more...]]``


[section:overload1 ip::basic_resolver_results::operator== (1 of 2 overloads)]


Test two iterators for equality. 


  friend bool operator==(
      const basic_resolver_results & a,
      const basic_resolver_results & b);


[heading Requirements]

['Header: ][^asio/ip/basic_resolver_results.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:overload2 ip::basic_resolver_results::operator== (2 of 2 overloads)]


['Inherited from ip::basic_resolver.]


Test two iterators for equality. 


  friend bool operator==(
      const basic_resolver_iterator & a,
      const basic_resolver_iterator & b);


[heading Requirements]

['Header: ][^asio/ip/basic_resolver_results.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[endsect]


[section:pointer ip::basic_resolver_results::pointer]


['Inherited from ip::basic_resolver.]

[indexterm2 asio.indexterm.ip__basic_resolver_results.pointer..pointer..ip::basic_resolver_results] 
The type of the result of applying `operator->()` to the iterator. 


  typedef const basic_resolver_entry< InternetProtocol > * pointer;



[heading Requirements]

['Header: ][^asio/ip/basic_resolver_results.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:protocol_type ip::basic_resolver_results::protocol_type]

[indexterm2 asio.indexterm.ip__basic_resolver_results.protocol_type..protocol_type..ip::basic_resolver_results] 
The protocol type associated with the results. 


  typedef InternetProtocol protocol_type;



[heading Requirements]

['Header: ][^asio/ip/basic_resolver_results.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:reference ip::basic_resolver_results::reference]

[indexterm2 asio.indexterm.ip__basic_resolver_results.reference..reference..ip::basic_resolver_results] 
The type of a non-const reference to a value in the range. 


  typedef value_type & reference;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_resolver_entry.endpoint_type [*endpoint_type]]]
    [The endpoint type associated with the endpoint entry. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_entry.protocol_type [*protocol_type]]]
    [The protocol type associated with the endpoint entry. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_entry.basic_resolver_entry [*basic_resolver_entry]] [constructor]]
    [Default constructor. 
     [hr]
     Construct with specified endpoint, host name and service name. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.endpoint [*endpoint]]]
    [Get the endpoint associated with the entry. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.host_name [*host_name]]]
    [Get the host name associated with the entry. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.operator_endpoint_type [*operator endpoint_type]]]
    [Convert to the endpoint associated with the entry. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.service_name [*service_name]]]
    [Get the service name associated with the entry. ]
  ]
  
]

The [link asio.reference.ip__basic_resolver_entry `ip::basic_resolver_entry`] class template describes an entry as returned by a resolver.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/basic_resolver_results.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:size ip::basic_resolver_results::size]

[indexterm2 asio.indexterm.ip__basic_resolver_results.size..size..ip::basic_resolver_results] 
Get the number of entries in the results range. 


  size_type size() const;



[endsect]



[section:size_type ip::basic_resolver_results::size_type]

[indexterm2 asio.indexterm.ip__basic_resolver_results.size_type..size_type..ip::basic_resolver_results] 
Type used to represent a count of the elements in the range. 


  typedef std::size_t size_type;



[heading Requirements]

['Header: ][^asio/ip/basic_resolver_results.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:swap ip::basic_resolver_results::swap]

[indexterm2 asio.indexterm.ip__basic_resolver_results.swap..swap..ip::basic_resolver_results] 
Swap the results range with another. 


  void swap(
      basic_resolver_results & that);



[endsect]



[section:value_type ip::basic_resolver_results::value_type]

[indexterm2 asio.indexterm.ip__basic_resolver_results.value_type..value_type..ip::basic_resolver_results] 
The type of a value in the results range. 


  typedef basic_resolver_entry< protocol_type > value_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_resolver_entry.endpoint_type [*endpoint_type]]]
    [The endpoint type associated with the endpoint entry. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver_entry.protocol_type [*protocol_type]]]
    [The protocol type associated with the endpoint entry. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver_entry.basic_resolver_entry [*basic_resolver_entry]] [constructor]]
    [Default constructor. 
     [hr]
     Construct with specified endpoint, host name and service name. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.endpoint [*endpoint]]]
    [Get the endpoint associated with the entry. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.host_name [*host_name]]]
    [Get the host name associated with the entry. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.operator_endpoint_type [*operator endpoint_type]]]
    [Convert to the endpoint associated with the entry. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_entry.service_name [*service_name]]]
    [Get the service name associated with the entry. ]
  ]
  
]

The [link asio.reference.ip__basic_resolver_entry `ip::basic_resolver_entry`] class template describes an entry as returned by a resolver.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/basic_resolver_results.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:values_ ip::basic_resolver_results::values_]


['Inherited from ip::basic_resolver.]

[indexterm2 asio.indexterm.ip__basic_resolver_results.values_..values_..ip::basic_resolver_results] 

  values_ptr_type values_;



[endsect]



[endsect]

[section:ip__host_name ip::host_name]

[indexterm1 asio.indexterm.ip__host_name..ip::host_name] 
Get the current host name. 

  std::string ``[link asio.reference.ip__host_name.overload1 host_name]``();
  ``  [''''&raquo;''' [link asio.reference.ip__host_name.overload1 more...]]``

  std::string ``[link asio.reference.ip__host_name.overload2 host_name]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__host_name.overload2 more...]]``

[heading Requirements]

['Header: ][^asio/ip/host_name.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 ip::host_name (1 of 2 overloads)]


Get the current host name. 


  std::string host_name();



[endsect]



[section:overload2 ip::host_name (2 of 2 overloads)]


Get the current host name. 


  std::string host_name(
      asio::error_code & ec);



[endsect]


[endsect]

[section:ip__icmp ip::icmp]


Encapsulates the flags needed for ICMP. 


  class icmp


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__icmp.endpoint [*endpoint]]]
    [The type of a ICMP endpoint. ]
  
  ]

  [

    [[link asio.reference.ip__icmp.resolver [*resolver]]]
    [The ICMP resolver type. ]
  
  ]

  [

    [[link asio.reference.ip__icmp.socket [*socket]]]
    [The ICMP socket type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__icmp.family [*family]]]
    [Obtain an identifier for the protocol family. ]
  ]
  
  [
    [[link asio.reference.ip__icmp.protocol [*protocol]]]
    [Obtain an identifier for the protocol. ]
  ]
  
  [
    [[link asio.reference.ip__icmp.type [*type]]]
    [Obtain an identifier for the type of the protocol. ]
  ]
  
  [
    [[link asio.reference.ip__icmp.v4 [*v4]] [static]]
    [Construct to represent the IPv4 ICMP protocol. ]
  ]
  
  [
    [[link asio.reference.ip__icmp.v6 [*v6]] [static]]
    [Construct to represent the IPv6 ICMP protocol. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__icmp.operator_not__eq_ [*operator!=]]]
    [Compare two protocols for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__icmp.operator_eq__eq_ [*operator==]]]
    [Compare two protocols for equality. ]
  ]
  
]

The [link asio.reference.ip__icmp `ip::icmp`] class contains flags necessary for ICMP sockets.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Safe.




[heading Requirements]

['Header: ][^asio/ip/icmp.hpp]

['Convenience header: ][^asio.hpp]


[section:endpoint ip::icmp::endpoint]

[indexterm2 asio.indexterm.ip__icmp.endpoint..endpoint..ip::icmp] 
The type of a ICMP endpoint. 


  typedef basic_endpoint< icmp > endpoint;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_endpoint.data_type [*data_type]]]
    [The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer. ]
  
  ]

  [

    [[link asio.reference.ip__basic_endpoint.protocol_type [*protocol_type]]]
    [The protocol type associated with the endpoint. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_endpoint.address [*address]]]
    [Get the IP address associated with the endpoint. 
     [hr]
     Set the IP address associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.basic_endpoint [*basic_endpoint]] [constructor]]
    [Default constructor. 
     [hr]
     Construct an endpoint using a port number, specified in the host's byte order. The IP address will be the any address (i.e. INADDR_ANY or in6addr_any). This constructor would typically be used for accepting new connections. 
     [hr]
     Construct an endpoint using a port number and an IP address. This constructor may be used for accepting connections on a specific interface or for making a connection to a remote endpoint. 
     [hr]
     Copy constructor. 
     [hr]
     Move constructor. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.capacity [*capacity]]]
    [Get the capacity of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.data [*data]]]
    [Get the underlying endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_eq_ [*operator=]]]
    [Assign from another endpoint. 
     [hr]
     Move-assign from another endpoint. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.port [*port]]]
    [Get the port associated with the endpoint. The port number is always in the host's byte order. 
     [hr]
     Set the port associated with the endpoint. The port number is always in the host's byte order. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.protocol [*protocol]]]
    [The protocol associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.resize [*resize]]]
    [Set the underlying size of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.size [*size]]]
    [Get the underlying size of the endpoint in the native type. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_endpoint.operator_not__eq_ [*operator!=]]]
    [Compare two endpoints for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_lt_ [*operator<]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_lt__eq_ [*operator<=]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_eq__eq_ [*operator==]]]
    [Compare two endpoints for equality. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_gt_ [*operator>]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_gt__eq_ [*operator>=]]]
    [Compare endpoints for ordering. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_endpoint.operator_lt__lt_ [*operator<<]]]
    [Output an endpoint as a string. ]
  ]
  
]

The [link asio.reference.ip__basic_endpoint `ip::basic_endpoint`] class template describes an endpoint that may be associated with a particular socket.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.





[heading Requirements]

['Header: ][^asio/ip/icmp.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:family ip::icmp::family]

[indexterm2 asio.indexterm.ip__icmp.family..family..ip::icmp] 
Obtain an identifier for the protocol family. 


  int family() const;



[endsect]



[section:operator_not__eq_ ip::icmp::operator!=]

[indexterm2 asio.indexterm.ip__icmp.operator_not__eq_..operator!=..ip::icmp] 
Compare two protocols for inequality. 


  friend bool operator!=(
      const icmp & p1,
      const icmp & p2);


[heading Requirements]

['Header: ][^asio/ip/icmp.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq__eq_ ip::icmp::operator==]

[indexterm2 asio.indexterm.ip__icmp.operator_eq__eq_..operator==..ip::icmp] 
Compare two protocols for equality. 


  friend bool operator==(
      const icmp & p1,
      const icmp & p2);


[heading Requirements]

['Header: ][^asio/ip/icmp.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:protocol ip::icmp::protocol]

[indexterm2 asio.indexterm.ip__icmp.protocol..protocol..ip::icmp] 
Obtain an identifier for the protocol. 


  int protocol() const;



[endsect]



[section:resolver ip::icmp::resolver]

[indexterm2 asio.indexterm.ip__icmp.resolver..resolver..ip::icmp] 
The ICMP resolver type. 


  typedef basic_resolver< icmp > resolver;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_resolver__rebind_executor [*rebind_executor]]]
    [Rebinds the resolver type to another executor. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.flags [*flags]]]
    [A bitmask type (C++ Std \[lib.bitmask.types\]). ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.iterator [*iterator]]]
    [(Deprecated.) The iterator type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.query [*query]]]
    [(Deprecated.) The query type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.results_type [*results_type]]]
    [The results type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver.async_resolve [*async_resolve]]]
    [(Deprecated: Use overload with separate host and service parameters.) Asynchronously perform forward resolution of a query to a list of entries. 
     [hr]
     Asynchronously perform forward resolution of a query to a list of entries. 
     [hr]
     Asynchronously perform reverse resolution of an endpoint to a list of entries. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.basic_resolver [*basic_resolver]] [constructor]]
    [Construct with executor. 
     [hr]
     Construct with execution context. 
     [hr]
     Move-construct a basic_resolver from another. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.cancel [*cancel]]]
    [Cancel any asynchronous operations that are waiting on the resolver. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.operator_eq_ [*operator=]]]
    [Move-assign a basic_resolver from another. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.resolve [*resolve]]]
    [(Deprecated: Use overload with separate host and service parameters.) Perform forward resolution of a query to a list of entries. 
     [hr]
     Perform forward resolution of a query to a list of entries. 
     [hr]
     Perform reverse resolution of an endpoint to a list of entries. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver._basic_resolver [*~basic_resolver]] [destructor]]
    [Destroys the resolver. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver.address_configured [*address_configured]] [static]]
    [Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.all_matching [*all_matching]] [static]]
    [If used with v4_mapped, return all matching IPv6 and IPv4 addresses. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.canonical_name [*canonical_name]] [static]]
    [Determine the canonical name of the host specified in the query. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.numeric_host [*numeric_host]] [static]]
    [Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.numeric_service [*numeric_service]] [static]]
    [Service name should be treated as a numeric string defining a port number and no name resolution should be attempted. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.passive [*passive]] [static]]
    [Indicate that returned endpoint is intended for use as a locally bound socket endpoint. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.v4_mapped [*v4_mapped]] [static]]
    [If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses. ]
  ]

]

The [link asio.reference.ip__basic_resolver `ip::basic_resolver`] class template provides the ability to resolve a query to a list of endpoints.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/icmp.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:socket ip::icmp::socket]

[indexterm2 asio.indexterm.ip__icmp.socket..socket..ip::icmp] 
The ICMP socket type. 


  typedef basic_raw_socket< icmp > socket;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_raw_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_raw_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_raw_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_receive [*async_receive]]]
    [Start an asynchronous receive on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_receive_from [*async_receive_from]]]
    [Start an asynchronous receive. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_send [*async_send]]]
    [Start an asynchronous send on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_send_to [*async_send_to]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.basic_raw_socket [*basic_raw_socket]] [constructor]]
    [Construct a basic_raw_socket without opening it. 
     [hr]
     Construct and open a basic_raw_socket. 
     [hr]
     Construct a basic_raw_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_raw_socket on an existing native socket. 
     [hr]
     Move-construct a basic_raw_socket from another. 
     [hr]
     Move-construct a basic_raw_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_raw_socket from another. 
     [hr]
     Move-assign a basic_raw_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.receive [*receive]]]
    [Receive some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.receive_from [*receive_from]]]
    [Receive raw data with the endpoint of the sender. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.send [*send]]]
    [Send some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.send_to [*send_to]]]
    [Send raw data to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket._basic_raw_socket [*~basic_raw_socket]] [destructor]]
    [Destroys the socket. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_raw_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_raw_socket `basic_raw_socket`] class template provides asynchronous and blocking raw-oriented socket functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/icmp.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:type ip::icmp::type]

[indexterm2 asio.indexterm.ip__icmp.type..type..ip::icmp] 
Obtain an identifier for the type of the protocol. 


  int type() const;



[endsect]



[section:v4 ip::icmp::v4]

[indexterm2 asio.indexterm.ip__icmp.v4..v4..ip::icmp] 
Construct to represent the IPv4 ICMP protocol. 


  static icmp v4();



[endsect]



[section:v6 ip::icmp::v6]

[indexterm2 asio.indexterm.ip__icmp.v6..v6..ip::icmp] 
Construct to represent the IPv6 ICMP protocol. 


  static icmp v6();



[endsect]



[endsect]


[section:ip__multicast__enable_loopback ip::multicast::enable_loopback]

[indexterm1 asio.indexterm.ip__multicast__enable_loopback..ip::multicast::enable_loopback] 
Socket option determining whether outgoing multicast packets will be received on the same socket if it is a member of the multicast group. 


  typedef implementation_defined enable_loopback;



Implements the IPPROTO\_IP/IP\_MULTICAST\_LOOP socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::ip::multicast::enable_loopback option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::ip::multicast::enable_loopback option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/ip/multicast.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:ip__multicast__hops ip::multicast::hops]

[indexterm1 asio.indexterm.ip__multicast__hops..ip::multicast::hops] 
Socket option for time-to-live associated with outgoing multicast packets. 


  typedef implementation_defined hops;



Implements the IPPROTO\_IP/IP\_MULTICAST\_TTL socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::ip::multicast::hops option(4);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::ip::multicast::hops option;
   socket.get_option(option);
   int ttl = option.value();







[heading Requirements]

['Header: ][^asio/ip/multicast.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:ip__multicast__join_group ip::multicast::join_group]

[indexterm1 asio.indexterm.ip__multicast__join_group..ip::multicast::join_group] 
Socket option to join a multicast group on a specified interface. 


  typedef implementation_defined join_group;



Implements the IPPROTO\_IP/IP\_ADD\_MEMBERSHIP socket option.


[heading Examples]
  
Setting the option to join a multicast group: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::ip::address multicast_address =
     asio::ip::address::from_string("225.0.0.1");
   asio::ip::multicast::join_group option(multicast_address);
   socket.set_option(option);







[heading Requirements]

['Header: ][^asio/ip/multicast.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:ip__multicast__leave_group ip::multicast::leave_group]

[indexterm1 asio.indexterm.ip__multicast__leave_group..ip::multicast::leave_group] 
Socket option to leave a multicast group on a specified interface. 


  typedef implementation_defined leave_group;



Implements the IPPROTO\_IP/IP\_DROP\_MEMBERSHIP socket option.


[heading Examples]
  
Setting the option to leave a multicast group: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::ip::address multicast_address =
     asio::ip::address::from_string("225.0.0.1");
   asio::ip::multicast::leave_group option(multicast_address);
   socket.set_option(option);







[heading Requirements]

['Header: ][^asio/ip/multicast.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:ip__multicast__outbound_interface ip::multicast::outbound_interface]

[indexterm1 asio.indexterm.ip__multicast__outbound_interface..ip::multicast::outbound_interface] 
Socket option for local interface to use for outgoing multicast packets. 


  typedef implementation_defined outbound_interface;



Implements the IPPROTO\_IP/IP\_MULTICAST\_IF socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::ip::address_v4 local_interface =
     asio::ip::address_v4::from_string("1.2.3.4");
   asio::ip::multicast::outbound_interface option(local_interface);
   socket.set_option(option);







[heading Requirements]

['Header: ][^asio/ip/multicast.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:ip__network_v4 ip::network_v4]


Represents an IPv4 network. 


  class network_v4


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__network_v4.address [*address]]]
    [Obtain the address object specified when the network object was created. ]
  ]
  
  [
    [[link asio.reference.ip__network_v4.broadcast [*broadcast]]]
    [Obtain an address object that represents the network's broadcast address. ]
  ]
  
  [
    [[link asio.reference.ip__network_v4.canonical [*canonical]]]
    [Obtain the true network address, omitting any host bits. ]
  ]
  
  [
    [[link asio.reference.ip__network_v4.hosts [*hosts]]]
    [Obtain an address range corresponding to the hosts in the network. ]
  ]
  
  [
    [[link asio.reference.ip__network_v4.is_host [*is_host]]]
    [Test if network is a valid host address. ]
  ]
  
  [
    [[link asio.reference.ip__network_v4.is_subnet_of [*is_subnet_of]]]
    [Test if a network is a real subnet of another network. ]
  ]
  
  [
    [[link asio.reference.ip__network_v4.netmask [*netmask]]]
    [Obtain the netmask that was specified when the network object was created. ]
  ]
  
  [
    [[link asio.reference.ip__network_v4.network [*network]]]
    [Obtain an address object that represents the network address. ]
  ]
  
  [
    [[link asio.reference.ip__network_v4.network_v4 [*network_v4]] [constructor]]
    [Default constructor. 
     [hr]
     Construct a network based on the specified address and prefix length. 
     [hr]
     Construct network based on the specified address and netmask. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__network_v4.operator_eq_ [*operator=]]]
    [Assign from another network. ]
  ]
  
  [
    [[link asio.reference.ip__network_v4.prefix_length [*prefix_length]]]
    [Obtain the prefix length that was specified when the network object was created. ]
  ]
  
  [
    [[link asio.reference.ip__network_v4.to_string [*to_string]]]
    [Get the network as an address in dotted decimal format. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__network_v4.operator_not__eq_ [*operator!=]]]
    [Compare two networks for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__network_v4.operator_eq__eq_ [*operator==]]]
    [Compare two networks for equality. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__network_v4.make_network_v4 [*make_network_v4]]]
    [Create an IPv4 network from a string containing IP address and prefix length. ]
  ]
  
]

The [link asio.reference.ip__network_v4 `ip::network_v4`] class provides the ability to use and manipulate IP version 4 networks.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/ip/network_v4.hpp]

['Convenience header: ][^asio.hpp]


[section:address ip::network_v4::address]

[indexterm2 asio.indexterm.ip__network_v4.address..address..ip::network_v4] 
Obtain the address object specified when the network object was created. 


  address_v4 address() const;



[endsect]



[section:broadcast ip::network_v4::broadcast]

[indexterm2 asio.indexterm.ip__network_v4.broadcast..broadcast..ip::network_v4] 
Obtain an address object that represents the network's broadcast address. 


  address_v4 broadcast() const;



[endsect]



[section:canonical ip::network_v4::canonical]

[indexterm2 asio.indexterm.ip__network_v4.canonical..canonical..ip::network_v4] 
Obtain the true network address, omitting any host bits. 


  network_v4 canonical() const;



[endsect]



[section:hosts ip::network_v4::hosts]

[indexterm2 asio.indexterm.ip__network_v4.hosts..hosts..ip::network_v4] 
Obtain an address range corresponding to the hosts in the network. 


  address_v4_range hosts() const;



[endsect]



[section:is_host ip::network_v4::is_host]

[indexterm2 asio.indexterm.ip__network_v4.is_host..is_host..ip::network_v4] 
Test if network is a valid host address. 


  bool is_host() const;



[endsect]



[section:is_subnet_of ip::network_v4::is_subnet_of]

[indexterm2 asio.indexterm.ip__network_v4.is_subnet_of..is_subnet_of..ip::network_v4] 
Test if a network is a real subnet of another network. 


  bool is_subnet_of(
      const network_v4 & other) const;



[endsect]


[section:make_network_v4 ip::network_v4::make_network_v4]

[indexterm2 asio.indexterm.ip__network_v4.make_network_v4..make_network_v4..ip::network_v4] 
Create an IPv4 network from a string containing IP address and prefix length. 


  network_v4 ``[link asio.reference.ip__network_v4.make_network_v4.overload1 make_network_v4]``(
      const char * str);
  ``  [''''&raquo;''' [link asio.reference.ip__network_v4.make_network_v4.overload1 more...]]``

  network_v4 ``[link asio.reference.ip__network_v4.make_network_v4.overload2 make_network_v4]``(
      const char * str,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__network_v4.make_network_v4.overload2 more...]]``

  network_v4 ``[link asio.reference.ip__network_v4.make_network_v4.overload3 make_network_v4]``(
      const std::string & str);
  ``  [''''&raquo;''' [link asio.reference.ip__network_v4.make_network_v4.overload3 more...]]``

  network_v4 ``[link asio.reference.ip__network_v4.make_network_v4.overload4 make_network_v4]``(
      const std::string & str,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__network_v4.make_network_v4.overload4 more...]]``

  network_v4 ``[link asio.reference.ip__network_v4.make_network_v4.overload5 make_network_v4]``(
      string_view str);
  ``  [''''&raquo;''' [link asio.reference.ip__network_v4.make_network_v4.overload5 more...]]``

  network_v4 ``[link asio.reference.ip__network_v4.make_network_v4.overload6 make_network_v4]``(
      string_view str,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__network_v4.make_network_v4.overload6 more...]]``


[section:overload1 ip::network_v4::make_network_v4 (1 of 6 overloads)]


Create an IPv4 network from a string containing IP address and prefix length. 


  network_v4 make_network_v4(
      const char * str);



[endsect]



[section:overload2 ip::network_v4::make_network_v4 (2 of 6 overloads)]


Create an IPv4 network from a string containing IP address and prefix length. 


  network_v4 make_network_v4(
      const char * str,
      asio::error_code & ec);



[endsect]



[section:overload3 ip::network_v4::make_network_v4 (3 of 6 overloads)]


Create an IPv4 network from a string containing IP address and prefix length. 


  network_v4 make_network_v4(
      const std::string & str);



[endsect]



[section:overload4 ip::network_v4::make_network_v4 (4 of 6 overloads)]


Create an IPv4 network from a string containing IP address and prefix length. 


  network_v4 make_network_v4(
      const std::string & str,
      asio::error_code & ec);



[endsect]



[section:overload5 ip::network_v4::make_network_v4 (5 of 6 overloads)]


Create an IPv4 network from a string containing IP address and prefix length. 


  network_v4 make_network_v4(
      string_view str);



[endsect]



[section:overload6 ip::network_v4::make_network_v4 (6 of 6 overloads)]


Create an IPv4 network from a string containing IP address and prefix length. 


  network_v4 make_network_v4(
      string_view str,
      asio::error_code & ec);



[endsect]


[endsect]


[section:netmask ip::network_v4::netmask]

[indexterm2 asio.indexterm.ip__network_v4.netmask..netmask..ip::network_v4] 
Obtain the netmask that was specified when the network object was created. 


  address_v4 netmask() const;



[endsect]



[section:network ip::network_v4::network]

[indexterm2 asio.indexterm.ip__network_v4.network..network..ip::network_v4] 
Obtain an address object that represents the network address. 


  address_v4 network() const;



[endsect]


[section:network_v4 ip::network_v4::network_v4]

[indexterm2 asio.indexterm.ip__network_v4.network_v4..network_v4..ip::network_v4] 
Default constructor. 


  ``[link asio.reference.ip__network_v4.network_v4.overload1 network_v4]``();
  ``  [''''&raquo;''' [link asio.reference.ip__network_v4.network_v4.overload1 more...]]``


Construct a network based on the specified address and prefix length. 


  ``[link asio.reference.ip__network_v4.network_v4.overload2 network_v4]``(
      const address_v4 & addr,
      unsigned short prefix_len);
  ``  [''''&raquo;''' [link asio.reference.ip__network_v4.network_v4.overload2 more...]]``


Construct network based on the specified address and netmask. 


  ``[link asio.reference.ip__network_v4.network_v4.overload3 network_v4]``(
      const address_v4 & addr,
      const address_v4 & mask);
  ``  [''''&raquo;''' [link asio.reference.ip__network_v4.network_v4.overload3 more...]]``


Copy constructor. 


  ``[link asio.reference.ip__network_v4.network_v4.overload4 network_v4]``(
      const network_v4 & other);
  ``  [''''&raquo;''' [link asio.reference.ip__network_v4.network_v4.overload4 more...]]``


[section:overload1 ip::network_v4::network_v4 (1 of 4 overloads)]


Default constructor. 


  network_v4();



[endsect]



[section:overload2 ip::network_v4::network_v4 (2 of 4 overloads)]


Construct a network based on the specified address and prefix length. 


  network_v4(
      const address_v4 & addr,
      unsigned short prefix_len);



[endsect]



[section:overload3 ip::network_v4::network_v4 (3 of 4 overloads)]


Construct network based on the specified address and netmask. 


  network_v4(
      const address_v4 & addr,
      const address_v4 & mask);



[endsect]



[section:overload4 ip::network_v4::network_v4 (4 of 4 overloads)]


Copy constructor. 


  network_v4(
      const network_v4 & other);



[endsect]


[endsect]


[section:operator_not__eq_ ip::network_v4::operator!=]

[indexterm2 asio.indexterm.ip__network_v4.operator_not__eq_..operator!=..ip::network_v4] 
Compare two networks for inequality. 


  friend bool operator!=(
      const network_v4 & a,
      const network_v4 & b);


[heading Requirements]

['Header: ][^asio/ip/network_v4.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq_ ip::network_v4::operator=]

[indexterm2 asio.indexterm.ip__network_v4.operator_eq_..operator=..ip::network_v4] 
Assign from another network. 


  network_v4 & operator=(
      const network_v4 & other);



[endsect]



[section:operator_eq__eq_ ip::network_v4::operator==]

[indexterm2 asio.indexterm.ip__network_v4.operator_eq__eq_..operator==..ip::network_v4] 
Compare two networks for equality. 


  friend bool operator==(
      const network_v4 & a,
      const network_v4 & b);


[heading Requirements]

['Header: ][^asio/ip/network_v4.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:prefix_length ip::network_v4::prefix_length]

[indexterm2 asio.indexterm.ip__network_v4.prefix_length..prefix_length..ip::network_v4] 
Obtain the prefix length that was specified when the network object was created. 


  unsigned short prefix_length() const;



[endsect]


[section:to_string ip::network_v4::to_string]

[indexterm2 asio.indexterm.ip__network_v4.to_string..to_string..ip::network_v4] 
Get the network as an address in dotted decimal format. 


  std::string ``[link asio.reference.ip__network_v4.to_string.overload1 to_string]``() const;
  ``  [''''&raquo;''' [link asio.reference.ip__network_v4.to_string.overload1 more...]]``

  std::string ``[link asio.reference.ip__network_v4.to_string.overload2 to_string]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.ip__network_v4.to_string.overload2 more...]]``


[section:overload1 ip::network_v4::to_string (1 of 2 overloads)]


Get the network as an address in dotted decimal format. 


  std::string to_string() const;



[endsect]



[section:overload2 ip::network_v4::to_string (2 of 2 overloads)]


Get the network as an address in dotted decimal format. 


  std::string to_string(
      asio::error_code & ec) const;



[endsect]


[endsect]


[endsect]

[section:ip__network_v6 ip::network_v6]


Represents an IPv6 network. 


  class network_v6


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__network_v6.address [*address]]]
    [Obtain the address object specified when the network object was created. ]
  ]
  
  [
    [[link asio.reference.ip__network_v6.canonical [*canonical]]]
    [Obtain the true network address, omitting any host bits. ]
  ]
  
  [
    [[link asio.reference.ip__network_v6.hosts [*hosts]]]
    [Obtain an address range corresponding to the hosts in the network. ]
  ]
  
  [
    [[link asio.reference.ip__network_v6.is_host [*is_host]]]
    [Test if network is a valid host address. ]
  ]
  
  [
    [[link asio.reference.ip__network_v6.is_subnet_of [*is_subnet_of]]]
    [Test if a network is a real subnet of another network. ]
  ]
  
  [
    [[link asio.reference.ip__network_v6.network [*network]]]
    [Obtain an address object that represents the network address. ]
  ]
  
  [
    [[link asio.reference.ip__network_v6.network_v6 [*network_v6]] [constructor]]
    [Default constructor. 
     [hr]
     Construct a network based on the specified address and prefix length. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__network_v6.operator_eq_ [*operator=]]]
    [Assign from another network. ]
  ]
  
  [
    [[link asio.reference.ip__network_v6.prefix_length [*prefix_length]]]
    [Obtain the prefix length that was specified when the network object was created. ]
  ]
  
  [
    [[link asio.reference.ip__network_v6.to_string [*to_string]]]
    [Get the network as an address in dotted decimal format. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__network_v6.operator_not__eq_ [*operator!=]]]
    [Compare two networks for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__network_v6.operator_eq__eq_ [*operator==]]]
    [Compare two networks for equality. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__network_v6.make_network_v6 [*make_network_v6]]]
    [Create an IPv6 network from a string containing IP address and prefix length. ]
  ]
  
]

The [link asio.reference.ip__network_v6 `ip::network_v6`] class provides the ability to use and manipulate IP version 6 networks.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/ip/network_v6.hpp]

['Convenience header: ][^asio.hpp]


[section:address ip::network_v6::address]

[indexterm2 asio.indexterm.ip__network_v6.address..address..ip::network_v6] 
Obtain the address object specified when the network object was created. 


  address_v6 address() const;



[endsect]



[section:canonical ip::network_v6::canonical]

[indexterm2 asio.indexterm.ip__network_v6.canonical..canonical..ip::network_v6] 
Obtain the true network address, omitting any host bits. 


  network_v6 canonical() const;



[endsect]



[section:hosts ip::network_v6::hosts]

[indexterm2 asio.indexterm.ip__network_v6.hosts..hosts..ip::network_v6] 
Obtain an address range corresponding to the hosts in the network. 


  address_v6_range hosts() const;



[endsect]



[section:is_host ip::network_v6::is_host]

[indexterm2 asio.indexterm.ip__network_v6.is_host..is_host..ip::network_v6] 
Test if network is a valid host address. 


  bool is_host() const;



[endsect]



[section:is_subnet_of ip::network_v6::is_subnet_of]

[indexterm2 asio.indexterm.ip__network_v6.is_subnet_of..is_subnet_of..ip::network_v6] 
Test if a network is a real subnet of another network. 


  bool is_subnet_of(
      const network_v6 & other) const;



[endsect]


[section:make_network_v6 ip::network_v6::make_network_v6]

[indexterm2 asio.indexterm.ip__network_v6.make_network_v6..make_network_v6..ip::network_v6] 
Create an IPv6 network from a string containing IP address and prefix length. 


  network_v6 ``[link asio.reference.ip__network_v6.make_network_v6.overload1 make_network_v6]``(
      const char * str);
  ``  [''''&raquo;''' [link asio.reference.ip__network_v6.make_network_v6.overload1 more...]]``

  network_v6 ``[link asio.reference.ip__network_v6.make_network_v6.overload2 make_network_v6]``(
      const char * str,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__network_v6.make_network_v6.overload2 more...]]``

  network_v6 ``[link asio.reference.ip__network_v6.make_network_v6.overload3 make_network_v6]``(
      const std::string & str);
  ``  [''''&raquo;''' [link asio.reference.ip__network_v6.make_network_v6.overload3 more...]]``

  network_v6 ``[link asio.reference.ip__network_v6.make_network_v6.overload4 make_network_v6]``(
      const std::string & str,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__network_v6.make_network_v6.overload4 more...]]``

  network_v6 ``[link asio.reference.ip__network_v6.make_network_v6.overload5 make_network_v6]``(
      string_view str);
  ``  [''''&raquo;''' [link asio.reference.ip__network_v6.make_network_v6.overload5 more...]]``

  network_v6 ``[link asio.reference.ip__network_v6.make_network_v6.overload6 make_network_v6]``(
      string_view str,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__network_v6.make_network_v6.overload6 more...]]``


[section:overload1 ip::network_v6::make_network_v6 (1 of 6 overloads)]


Create an IPv6 network from a string containing IP address and prefix length. 


  network_v6 make_network_v6(
      const char * str);



[endsect]



[section:overload2 ip::network_v6::make_network_v6 (2 of 6 overloads)]


Create an IPv6 network from a string containing IP address and prefix length. 


  network_v6 make_network_v6(
      const char * str,
      asio::error_code & ec);



[endsect]



[section:overload3 ip::network_v6::make_network_v6 (3 of 6 overloads)]


Create an IPv6 network from a string containing IP address and prefix length. 


  network_v6 make_network_v6(
      const std::string & str);



[endsect]



[section:overload4 ip::network_v6::make_network_v6 (4 of 6 overloads)]


Create an IPv6 network from a string containing IP address and prefix length. 


  network_v6 make_network_v6(
      const std::string & str,
      asio::error_code & ec);



[endsect]



[section:overload5 ip::network_v6::make_network_v6 (5 of 6 overloads)]


Create an IPv6 network from a string containing IP address and prefix length. 


  network_v6 make_network_v6(
      string_view str);



[endsect]



[section:overload6 ip::network_v6::make_network_v6 (6 of 6 overloads)]


Create an IPv6 network from a string containing IP address and prefix length. 


  network_v6 make_network_v6(
      string_view str,
      asio::error_code & ec);



[endsect]


[endsect]


[section:network ip::network_v6::network]

[indexterm2 asio.indexterm.ip__network_v6.network..network..ip::network_v6] 
Obtain an address object that represents the network address. 


  address_v6 network() const;



[endsect]


[section:network_v6 ip::network_v6::network_v6]

[indexterm2 asio.indexterm.ip__network_v6.network_v6..network_v6..ip::network_v6] 
Default constructor. 


  ``[link asio.reference.ip__network_v6.network_v6.overload1 network_v6]``();
  ``  [''''&raquo;''' [link asio.reference.ip__network_v6.network_v6.overload1 more...]]``


Construct a network based on the specified address and prefix length. 


  ``[link asio.reference.ip__network_v6.network_v6.overload2 network_v6]``(
      const address_v6 & addr,
      unsigned short prefix_len);
  ``  [''''&raquo;''' [link asio.reference.ip__network_v6.network_v6.overload2 more...]]``


Copy constructor. 


  ``[link asio.reference.ip__network_v6.network_v6.overload3 network_v6]``(
      const network_v6 & other);
  ``  [''''&raquo;''' [link asio.reference.ip__network_v6.network_v6.overload3 more...]]``


[section:overload1 ip::network_v6::network_v6 (1 of 3 overloads)]


Default constructor. 


  network_v6();



[endsect]



[section:overload2 ip::network_v6::network_v6 (2 of 3 overloads)]


Construct a network based on the specified address and prefix length. 


  network_v6(
      const address_v6 & addr,
      unsigned short prefix_len);



[endsect]



[section:overload3 ip::network_v6::network_v6 (3 of 3 overloads)]


Copy constructor. 


  network_v6(
      const network_v6 & other);



[endsect]


[endsect]


[section:operator_not__eq_ ip::network_v6::operator!=]

[indexterm2 asio.indexterm.ip__network_v6.operator_not__eq_..operator!=..ip::network_v6] 
Compare two networks for inequality. 


  friend bool operator!=(
      const network_v6 & a,
      const network_v6 & b);


[heading Requirements]

['Header: ][^asio/ip/network_v6.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq_ ip::network_v6::operator=]

[indexterm2 asio.indexterm.ip__network_v6.operator_eq_..operator=..ip::network_v6] 
Assign from another network. 


  network_v6 & operator=(
      const network_v6 & other);



[endsect]



[section:operator_eq__eq_ ip::network_v6::operator==]

[indexterm2 asio.indexterm.ip__network_v6.operator_eq__eq_..operator==..ip::network_v6] 
Compare two networks for equality. 


  friend bool operator==(
      const network_v6 & a,
      const network_v6 & b);


[heading Requirements]

['Header: ][^asio/ip/network_v6.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:prefix_length ip::network_v6::prefix_length]

[indexterm2 asio.indexterm.ip__network_v6.prefix_length..prefix_length..ip::network_v6] 
Obtain the prefix length that was specified when the network object was created. 


  unsigned short prefix_length() const;



[endsect]


[section:to_string ip::network_v6::to_string]

[indexterm2 asio.indexterm.ip__network_v6.to_string..to_string..ip::network_v6] 
Get the network as an address in dotted decimal format. 


  std::string ``[link asio.reference.ip__network_v6.to_string.overload1 to_string]``() const;
  ``  [''''&raquo;''' [link asio.reference.ip__network_v6.to_string.overload1 more...]]``

  std::string ``[link asio.reference.ip__network_v6.to_string.overload2 to_string]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.ip__network_v6.to_string.overload2 more...]]``


[section:overload1 ip::network_v6::to_string (1 of 2 overloads)]


Get the network as an address in dotted decimal format. 


  std::string to_string() const;



[endsect]



[section:overload2 ip::network_v6::to_string (2 of 2 overloads)]


Get the network as an address in dotted decimal format. 


  std::string to_string(
      asio::error_code & ec) const;



[endsect]


[endsect]


[endsect]

[section:ip__resolver_base ip::resolver_base]


The [link asio.reference.ip__resolver_base `ip::resolver_base`] class is used as a base for the [link asio.reference.ip__basic_resolver `ip::basic_resolver`] class templates to provide a common place to define the flag constants. 


  class resolver_base


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__resolver_base.flags [*flags]]]
    [A bitmask type (C++ Std \[lib.bitmask.types\]). ]
  
  ]

]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__resolver_base._resolver_base [*~resolver_base]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__resolver_base.address_configured [*address_configured]] [static]]
    [Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system. ]
  ]

  [
    [[link asio.reference.ip__resolver_base.all_matching [*all_matching]] [static]]
    [If used with v4_mapped, return all matching IPv6 and IPv4 addresses. ]
  ]

  [
    [[link asio.reference.ip__resolver_base.canonical_name [*canonical_name]] [static]]
    [Determine the canonical name of the host specified in the query. ]
  ]

  [
    [[link asio.reference.ip__resolver_base.numeric_host [*numeric_host]] [static]]
    [Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted. ]
  ]

  [
    [[link asio.reference.ip__resolver_base.numeric_service [*numeric_service]] [static]]
    [Service name should be treated as a numeric string defining a port number and no name resolution should be attempted. ]
  ]

  [
    [[link asio.reference.ip__resolver_base.passive [*passive]] [static]]
    [Indicate that returned endpoint is intended for use as a locally bound socket endpoint. ]
  ]

  [
    [[link asio.reference.ip__resolver_base.v4_mapped [*v4_mapped]] [static]]
    [If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses. ]
  ]

]

[heading Requirements]

['Header: ][^asio/ip/resolver_base.hpp]

['Convenience header: ][^asio.hpp]


[section:address_configured ip::resolver_base::address_configured]

[indexterm2 asio.indexterm.ip__resolver_base.address_configured..address_configured..ip::resolver_base] 
Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system. 


  static const flags address_configured = implementation_defined;



[endsect]



[section:all_matching ip::resolver_base::all_matching]

[indexterm2 asio.indexterm.ip__resolver_base.all_matching..all_matching..ip::resolver_base] 
If used with v4\_mapped, return all matching IPv6 and IPv4 addresses. 


  static const flags all_matching = implementation_defined;



[endsect]



[section:canonical_name ip::resolver_base::canonical_name]

[indexterm2 asio.indexterm.ip__resolver_base.canonical_name..canonical_name..ip::resolver_base] 
Determine the canonical name of the host specified in the query. 


  static const flags canonical_name = implementation_defined;



[endsect]



[section:flags ip::resolver_base::flags]

[indexterm2 asio.indexterm.ip__resolver_base.flags..flags..ip::resolver_base] 
A bitmask type (C++ Std [lib.bitmask.types]). 


  typedef unspecified flags;



[heading Requirements]

['Header: ][^asio/ip/resolver_base.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:numeric_host ip::resolver_base::numeric_host]

[indexterm2 asio.indexterm.ip__resolver_base.numeric_host..numeric_host..ip::resolver_base] 
Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted. 


  static const flags numeric_host = implementation_defined;



[endsect]



[section:numeric_service ip::resolver_base::numeric_service]

[indexterm2 asio.indexterm.ip__resolver_base.numeric_service..numeric_service..ip::resolver_base] 
Service name should be treated as a numeric string defining a port number and no name resolution should be attempted. 


  static const flags numeric_service = implementation_defined;



[endsect]



[section:passive ip::resolver_base::passive]

[indexterm2 asio.indexterm.ip__resolver_base.passive..passive..ip::resolver_base] 
Indicate that returned endpoint is intended for use as a locally bound socket endpoint. 


  static const flags passive = implementation_defined;



[endsect]



[section:v4_mapped ip::resolver_base::v4_mapped]

[indexterm2 asio.indexterm.ip__resolver_base.v4_mapped..v4_mapped..ip::resolver_base] 
If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses. 


  static const flags v4_mapped = implementation_defined;



[endsect]



[section:_resolver_base ip::resolver_base::~resolver_base]

[indexterm2 asio.indexterm.ip__resolver_base._resolver_base..~resolver_base..ip::resolver_base] 
Protected destructor to prevent deletion through this type. 


  ~resolver_base();



[endsect]



[endsect]

[section:ip__resolver_query_base ip::resolver_query_base]


The [link asio.reference.ip__resolver_query_base `ip::resolver_query_base`] class is used as a base for the [link asio.reference.ip__basic_resolver_query `ip::basic_resolver_query`] class templates to provide a common place to define the flag constants. 


  class resolver_query_base :
    public ip::resolver_base


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__resolver_query_base.flags [*flags]]]
    [A bitmask type (C++ Std \[lib.bitmask.types\]). ]
  
  ]

]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__resolver_query_base._resolver_query_base [*~resolver_query_base]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__resolver_query_base.address_configured [*address_configured]] [static]]
    [Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system. ]
  ]

  [
    [[link asio.reference.ip__resolver_query_base.all_matching [*all_matching]] [static]]
    [If used with v4_mapped, return all matching IPv6 and IPv4 addresses. ]
  ]

  [
    [[link asio.reference.ip__resolver_query_base.canonical_name [*canonical_name]] [static]]
    [Determine the canonical name of the host specified in the query. ]
  ]

  [
    [[link asio.reference.ip__resolver_query_base.numeric_host [*numeric_host]] [static]]
    [Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted. ]
  ]

  [
    [[link asio.reference.ip__resolver_query_base.numeric_service [*numeric_service]] [static]]
    [Service name should be treated as a numeric string defining a port number and no name resolution should be attempted. ]
  ]

  [
    [[link asio.reference.ip__resolver_query_base.passive [*passive]] [static]]
    [Indicate that returned endpoint is intended for use as a locally bound socket endpoint. ]
  ]

  [
    [[link asio.reference.ip__resolver_query_base.v4_mapped [*v4_mapped]] [static]]
    [If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses. ]
  ]

]

[heading Requirements]

['Header: ][^asio/ip/resolver_query_base.hpp]

['Convenience header: ][^asio.hpp]


[section:address_configured ip::resolver_query_base::address_configured]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__resolver_query_base.address_configured..address_configured..ip::resolver_query_base] 
Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system. 


  static const flags address_configured = implementation_defined;



[endsect]



[section:all_matching ip::resolver_query_base::all_matching]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__resolver_query_base.all_matching..all_matching..ip::resolver_query_base] 
If used with v4\_mapped, return all matching IPv6 and IPv4 addresses. 


  static const flags all_matching = implementation_defined;



[endsect]



[section:canonical_name ip::resolver_query_base::canonical_name]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__resolver_query_base.canonical_name..canonical_name..ip::resolver_query_base] 
Determine the canonical name of the host specified in the query. 


  static const flags canonical_name = implementation_defined;



[endsect]



[section:flags ip::resolver_query_base::flags]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__resolver_query_base.flags..flags..ip::resolver_query_base] 
A bitmask type (C++ Std [lib.bitmask.types]). 


  typedef unspecified flags;



[heading Requirements]

['Header: ][^asio/ip/resolver_query_base.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:numeric_host ip::resolver_query_base::numeric_host]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__resolver_query_base.numeric_host..numeric_host..ip::resolver_query_base] 
Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted. 


  static const flags numeric_host = implementation_defined;



[endsect]



[section:numeric_service ip::resolver_query_base::numeric_service]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__resolver_query_base.numeric_service..numeric_service..ip::resolver_query_base] 
Service name should be treated as a numeric string defining a port number and no name resolution should be attempted. 


  static const flags numeric_service = implementation_defined;



[endsect]



[section:passive ip::resolver_query_base::passive]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__resolver_query_base.passive..passive..ip::resolver_query_base] 
Indicate that returned endpoint is intended for use as a locally bound socket endpoint. 


  static const flags passive = implementation_defined;



[endsect]



[section:v4_mapped ip::resolver_query_base::v4_mapped]


['Inherited from ip::resolver_base.]

[indexterm2 asio.indexterm.ip__resolver_query_base.v4_mapped..v4_mapped..ip::resolver_query_base] 
If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses. 


  static const flags v4_mapped = implementation_defined;



[endsect]



[section:_resolver_query_base ip::resolver_query_base::~resolver_query_base]

[indexterm2 asio.indexterm.ip__resolver_query_base._resolver_query_base..~resolver_query_base..ip::resolver_query_base] 
Protected destructor to prevent deletion through this type. 


  ~resolver_query_base();



[endsect]



[endsect]

[section:ip__tcp ip::tcp]


Encapsulates the flags needed for TCP. 


  class tcp


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__tcp.acceptor [*acceptor]]]
    [The TCP acceptor type. ]
  
  ]

  [

    [[link asio.reference.ip__tcp.endpoint [*endpoint]]]
    [The type of a TCP endpoint. ]
  
  ]

  [

    [[link asio.reference.ip__tcp.iostream [*iostream]]]
    [The TCP iostream type. ]
  
  ]

  [

    [[link asio.reference.ip__tcp.no_delay [*no_delay]]]
    [Socket option for disabling the Nagle algorithm. ]
  
  ]

  [

    [[link asio.reference.ip__tcp.resolver [*resolver]]]
    [The TCP resolver type. ]
  
  ]

  [

    [[link asio.reference.ip__tcp.socket [*socket]]]
    [The TCP socket type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__tcp.family [*family]]]
    [Obtain an identifier for the protocol family. ]
  ]
  
  [
    [[link asio.reference.ip__tcp.protocol [*protocol]]]
    [Obtain an identifier for the protocol. ]
  ]
  
  [
    [[link asio.reference.ip__tcp.type [*type]]]
    [Obtain an identifier for the type of the protocol. ]
  ]
  
  [
    [[link asio.reference.ip__tcp.v4 [*v4]] [static]]
    [Construct to represent the IPv4 TCP protocol. ]
  ]
  
  [
    [[link asio.reference.ip__tcp.v6 [*v6]] [static]]
    [Construct to represent the IPv6 TCP protocol. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__tcp.operator_not__eq_ [*operator!=]]]
    [Compare two protocols for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__tcp.operator_eq__eq_ [*operator==]]]
    [Compare two protocols for equality. ]
  ]
  
]

The [link asio.reference.ip__tcp `ip::tcp`] class contains flags necessary for TCP sockets.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Safe.




[heading Requirements]

['Header: ][^asio/ip/tcp.hpp]

['Convenience header: ][^asio.hpp]


[section:acceptor ip::tcp::acceptor]

[indexterm2 asio.indexterm.ip__tcp.acceptor..acceptor..ip::tcp] 
The TCP acceptor type. 


  typedef basic_socket_acceptor< tcp > acceptor;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_socket_acceptor__rebind_executor [*rebind_executor]]]
    [Rebinds the acceptor type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.native_handle_type [*native_handle_type]]]
    [The native representation of an acceptor. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket_acceptor.accept [*accept]]]
    [Accept a new connection. 
     [hr]
     Accept a new connection and obtain the endpoint of the peer. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.assign [*assign]]]
    [Assigns an existing native acceptor to the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.async_accept [*async_accept]]]
    [Start an asynchronous accept. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.async_wait [*async_wait]]]
    [Asynchronously wait for the acceptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.basic_socket_acceptor [*basic_socket_acceptor]] [constructor]]
    [Construct an acceptor without opening it. 
     [hr]
     Construct an open acceptor. 
     [hr]
     Construct an acceptor opened on the given endpoint. 
     [hr]
     Construct a basic_socket_acceptor on an existing native acceptor. 
     [hr]
     Move-construct a basic_socket_acceptor from another. 
     [hr]
     Move-construct a basic_socket_acceptor from an acceptor of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.bind [*bind]]]
    [Bind the acceptor to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.close [*close]]]
    [Close the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.get_option [*get_option]]]
    [Get an option from the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.io_control [*io_control]]]
    [Perform an IO control command on the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.is_open [*is_open]]]
    [Determine whether the acceptor is open. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.listen [*listen]]]
    [Place the acceptor into the state where it will listen for new connections. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.native_handle [*native_handle]]]
    [Get the native acceptor representation. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native acceptor implementation. 
     [hr]
     Sets the non-blocking mode of the native acceptor implementation. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the acceptor. 
     [hr]
     Sets the non-blocking mode of the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.open [*open]]]
    [Open the acceptor using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.operator_eq_ [*operator=]]]
    [Move-assign a basic_socket_acceptor from another. 
     [hr]
     Move-assign a basic_socket_acceptor from an acceptor of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.release [*release]]]
    [Release ownership of the underlying native acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.set_option [*set_option]]]
    [Set an option on the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.wait [*wait]]]
    [Wait for the acceptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor._basic_socket_acceptor [*~basic_socket_acceptor]] [destructor]]
    [Destroys the acceptor. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket_acceptor.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_socket_acceptor `basic_socket_acceptor`] class template is used for accepting new socket connections.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.


[heading Example]
  
Opening a socket acceptor with the SO\_REUSEADDR option enabled: 

   asio::ip::tcp::acceptor acceptor(my_context);
   asio::ip::tcp::endpoint endpoint(asio::ip::tcp::v4(), port);
   acceptor.open(endpoint.protocol());
   acceptor.set_option(asio::ip::tcp::acceptor::reuse_address(true));
   acceptor.bind(endpoint);
   acceptor.listen();







[heading Requirements]

['Header: ][^asio/ip/tcp.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:endpoint ip::tcp::endpoint]

[indexterm2 asio.indexterm.ip__tcp.endpoint..endpoint..ip::tcp] 
The type of a TCP endpoint. 


  typedef basic_endpoint< tcp > endpoint;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_endpoint.data_type [*data_type]]]
    [The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer. ]
  
  ]

  [

    [[link asio.reference.ip__basic_endpoint.protocol_type [*protocol_type]]]
    [The protocol type associated with the endpoint. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_endpoint.address [*address]]]
    [Get the IP address associated with the endpoint. 
     [hr]
     Set the IP address associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.basic_endpoint [*basic_endpoint]] [constructor]]
    [Default constructor. 
     [hr]
     Construct an endpoint using a port number, specified in the host's byte order. The IP address will be the any address (i.e. INADDR_ANY or in6addr_any). This constructor would typically be used for accepting new connections. 
     [hr]
     Construct an endpoint using a port number and an IP address. This constructor may be used for accepting connections on a specific interface or for making a connection to a remote endpoint. 
     [hr]
     Copy constructor. 
     [hr]
     Move constructor. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.capacity [*capacity]]]
    [Get the capacity of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.data [*data]]]
    [Get the underlying endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_eq_ [*operator=]]]
    [Assign from another endpoint. 
     [hr]
     Move-assign from another endpoint. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.port [*port]]]
    [Get the port associated with the endpoint. The port number is always in the host's byte order. 
     [hr]
     Set the port associated with the endpoint. The port number is always in the host's byte order. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.protocol [*protocol]]]
    [The protocol associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.resize [*resize]]]
    [Set the underlying size of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.size [*size]]]
    [Get the underlying size of the endpoint in the native type. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_endpoint.operator_not__eq_ [*operator!=]]]
    [Compare two endpoints for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_lt_ [*operator<]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_lt__eq_ [*operator<=]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_eq__eq_ [*operator==]]]
    [Compare two endpoints for equality. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_gt_ [*operator>]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_gt__eq_ [*operator>=]]]
    [Compare endpoints for ordering. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_endpoint.operator_lt__lt_ [*operator<<]]]
    [Output an endpoint as a string. ]
  ]
  
]

The [link asio.reference.ip__basic_endpoint `ip::basic_endpoint`] class template describes an endpoint that may be associated with a particular socket.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.





[heading Requirements]

['Header: ][^asio/ip/tcp.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:family ip::tcp::family]

[indexterm2 asio.indexterm.ip__tcp.family..family..ip::tcp] 
Obtain an identifier for the protocol family. 


  int family() const;



[endsect]



[section:iostream ip::tcp::iostream]

[indexterm2 asio.indexterm.ip__tcp.iostream..iostream..ip::tcp] 
The TCP iostream type. 


  typedef basic_socket_iostream< tcp > iostream;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_socket_iostream.clock_type [*clock_type]]]
    [The clock type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.duration [*duration]]]
    [The duration type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.duration_type [*duration_type]]]
    [(Deprecated: Use duration.) The duration type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.time_point [*time_point]]]
    [The time type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.time_type [*time_type]]]
    [(Deprecated: Use time_point.) The time type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket_iostream.basic_socket_iostream [*basic_socket_iostream]] [constructor]]
    [Construct a basic_socket_iostream without establishing a connection. 
     [hr]
     Construct a basic_socket_iostream from the supplied socket. 
     [hr]
     Move-construct a basic_socket_iostream from another. 
     [hr]
     Establish a connection to an endpoint corresponding to a resolver query. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.close [*close]]]
    [Close the connection. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.connect [*connect]]]
    [Establish a connection to an endpoint corresponding to a resolver query. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.error [*error]]]
    [Get the last error associated with the stream. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.expires_after [*expires_after]]]
    [Set the stream's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.expires_at [*expires_at]]]
    [(Deprecated: Use expiry().) Get the stream's expiry time as an absolute time. 
     [hr]
     Set the stream's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.expires_from_now [*expires_from_now]]]
    [(Deprecated: Use expiry().) Get the stream's expiry time relative to now. 
     [hr]
     (Deprecated: Use expires_after().) Set the stream's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.expiry [*expiry]]]
    [Get the stream's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.operator_eq_ [*operator=]]]
    [Move-assign a basic_socket_iostream from another. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.rdbuf [*rdbuf]]]
    [Return a pointer to the underlying streambuf. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.socket [*socket]]]
    [Get a reference to the underlying socket. ]
  ]
  
]


[heading Requirements]

['Header: ][^asio/ip/tcp.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:no_delay ip::tcp::no_delay]

[indexterm2 asio.indexterm.ip__tcp.no_delay..no_delay..ip::tcp] 
Socket option for disabling the Nagle algorithm. 


  typedef implementation_defined no_delay;



Implements the IPPROTO\_TCP/TCP\_NODELAY socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::no_delay option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::tcp::no_delay option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/ip/tcp.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_not__eq_ ip::tcp::operator!=]

[indexterm2 asio.indexterm.ip__tcp.operator_not__eq_..operator!=..ip::tcp] 
Compare two protocols for inequality. 


  friend bool operator!=(
      const tcp & p1,
      const tcp & p2);


[heading Requirements]

['Header: ][^asio/ip/tcp.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq__eq_ ip::tcp::operator==]

[indexterm2 asio.indexterm.ip__tcp.operator_eq__eq_..operator==..ip::tcp] 
Compare two protocols for equality. 


  friend bool operator==(
      const tcp & p1,
      const tcp & p2);


[heading Requirements]

['Header: ][^asio/ip/tcp.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:protocol ip::tcp::protocol]

[indexterm2 asio.indexterm.ip__tcp.protocol..protocol..ip::tcp] 
Obtain an identifier for the protocol. 


  int protocol() const;



[endsect]



[section:resolver ip::tcp::resolver]

[indexterm2 asio.indexterm.ip__tcp.resolver..resolver..ip::tcp] 
The TCP resolver type. 


  typedef basic_resolver< tcp > resolver;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_resolver__rebind_executor [*rebind_executor]]]
    [Rebinds the resolver type to another executor. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.flags [*flags]]]
    [A bitmask type (C++ Std \[lib.bitmask.types\]). ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.iterator [*iterator]]]
    [(Deprecated.) The iterator type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.query [*query]]]
    [(Deprecated.) The query type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.results_type [*results_type]]]
    [The results type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver.async_resolve [*async_resolve]]]
    [(Deprecated: Use overload with separate host and service parameters.) Asynchronously perform forward resolution of a query to a list of entries. 
     [hr]
     Asynchronously perform forward resolution of a query to a list of entries. 
     [hr]
     Asynchronously perform reverse resolution of an endpoint to a list of entries. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.basic_resolver [*basic_resolver]] [constructor]]
    [Construct with executor. 
     [hr]
     Construct with execution context. 
     [hr]
     Move-construct a basic_resolver from another. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.cancel [*cancel]]]
    [Cancel any asynchronous operations that are waiting on the resolver. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.operator_eq_ [*operator=]]]
    [Move-assign a basic_resolver from another. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.resolve [*resolve]]]
    [(Deprecated: Use overload with separate host and service parameters.) Perform forward resolution of a query to a list of entries. 
     [hr]
     Perform forward resolution of a query to a list of entries. 
     [hr]
     Perform reverse resolution of an endpoint to a list of entries. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver._basic_resolver [*~basic_resolver]] [destructor]]
    [Destroys the resolver. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver.address_configured [*address_configured]] [static]]
    [Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.all_matching [*all_matching]] [static]]
    [If used with v4_mapped, return all matching IPv6 and IPv4 addresses. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.canonical_name [*canonical_name]] [static]]
    [Determine the canonical name of the host specified in the query. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.numeric_host [*numeric_host]] [static]]
    [Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.numeric_service [*numeric_service]] [static]]
    [Service name should be treated as a numeric string defining a port number and no name resolution should be attempted. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.passive [*passive]] [static]]
    [Indicate that returned endpoint is intended for use as a locally bound socket endpoint. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.v4_mapped [*v4_mapped]] [static]]
    [If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses. ]
  ]

]

The [link asio.reference.ip__basic_resolver `ip::basic_resolver`] class template provides the ability to resolve a query to a list of endpoints.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/tcp.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:socket ip::tcp::socket]

[indexterm2 asio.indexterm.ip__tcp.socket..socket..ip::tcp] 
The TCP socket type. 


  typedef basic_stream_socket< tcp > socket;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_stream_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_stream_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_read_some [*async_read_some]]]
    [Start an asynchronous read. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_receive [*async_receive]]]
    [Start an asynchronous receive. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_send [*async_send]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_write_some [*async_write_some]]]
    [Start an asynchronous write. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.basic_stream_socket [*basic_stream_socket]] [constructor]]
    [Construct a basic_stream_socket without opening it. 
     [hr]
     Construct and open a basic_stream_socket. 
     [hr]
     Construct a basic_stream_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_stream_socket on an existing native socket. 
     [hr]
     Move-construct a basic_stream_socket from another. 
     [hr]
     Move-construct a basic_stream_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_stream_socket from another. 
     [hr]
     Move-assign a basic_stream_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.read_some [*read_some]]]
    [Read some data from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.receive [*receive]]]
    [Receive some data on the socket. 
     [hr]
     Receive some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.send [*send]]]
    [Send some data on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.write_some [*write_some]]]
    [Write some data to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket._basic_stream_socket [*~basic_stream_socket]] [destructor]]
    [Destroys the socket. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_stream_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_stream_socket `basic_stream_socket`] class template provides asynchronous and blocking stream-oriented socket functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.





[heading Requirements]

['Header: ][^asio/ip/tcp.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:type ip::tcp::type]

[indexterm2 asio.indexterm.ip__tcp.type..type..ip::tcp] 
Obtain an identifier for the type of the protocol. 


  int type() const;



[endsect]



[section:v4 ip::tcp::v4]

[indexterm2 asio.indexterm.ip__tcp.v4..v4..ip::tcp] 
Construct to represent the IPv4 TCP protocol. 


  static tcp v4();



[endsect]



[section:v6 ip::tcp::v6]

[indexterm2 asio.indexterm.ip__tcp.v6..v6..ip::tcp] 
Construct to represent the IPv6 TCP protocol. 


  static tcp v6();



[endsect]



[endsect]

[section:ip__udp ip::udp]


Encapsulates the flags needed for UDP. 


  class udp


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__udp.endpoint [*endpoint]]]
    [The type of a UDP endpoint. ]
  
  ]

  [

    [[link asio.reference.ip__udp.resolver [*resolver]]]
    [The UDP resolver type. ]
  
  ]

  [

    [[link asio.reference.ip__udp.socket [*socket]]]
    [The UDP socket type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__udp.family [*family]]]
    [Obtain an identifier for the protocol family. ]
  ]
  
  [
    [[link asio.reference.ip__udp.protocol [*protocol]]]
    [Obtain an identifier for the protocol. ]
  ]
  
  [
    [[link asio.reference.ip__udp.type [*type]]]
    [Obtain an identifier for the type of the protocol. ]
  ]
  
  [
    [[link asio.reference.ip__udp.v4 [*v4]] [static]]
    [Construct to represent the IPv4 UDP protocol. ]
  ]
  
  [
    [[link asio.reference.ip__udp.v6 [*v6]] [static]]
    [Construct to represent the IPv6 UDP protocol. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__udp.operator_not__eq_ [*operator!=]]]
    [Compare two protocols for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__udp.operator_eq__eq_ [*operator==]]]
    [Compare two protocols for equality. ]
  ]
  
]

The [link asio.reference.ip__udp `ip::udp`] class contains flags necessary for UDP sockets.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Safe.




[heading Requirements]

['Header: ][^asio/ip/udp.hpp]

['Convenience header: ][^asio.hpp]


[section:endpoint ip::udp::endpoint]

[indexterm2 asio.indexterm.ip__udp.endpoint..endpoint..ip::udp] 
The type of a UDP endpoint. 


  typedef basic_endpoint< udp > endpoint;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_endpoint.data_type [*data_type]]]
    [The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer. ]
  
  ]

  [

    [[link asio.reference.ip__basic_endpoint.protocol_type [*protocol_type]]]
    [The protocol type associated with the endpoint. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_endpoint.address [*address]]]
    [Get the IP address associated with the endpoint. 
     [hr]
     Set the IP address associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.basic_endpoint [*basic_endpoint]] [constructor]]
    [Default constructor. 
     [hr]
     Construct an endpoint using a port number, specified in the host's byte order. The IP address will be the any address (i.e. INADDR_ANY or in6addr_any). This constructor would typically be used for accepting new connections. 
     [hr]
     Construct an endpoint using a port number and an IP address. This constructor may be used for accepting connections on a specific interface or for making a connection to a remote endpoint. 
     [hr]
     Copy constructor. 
     [hr]
     Move constructor. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.capacity [*capacity]]]
    [Get the capacity of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.data [*data]]]
    [Get the underlying endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_eq_ [*operator=]]]
    [Assign from another endpoint. 
     [hr]
     Move-assign from another endpoint. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.port [*port]]]
    [Get the port associated with the endpoint. The port number is always in the host's byte order. 
     [hr]
     Set the port associated with the endpoint. The port number is always in the host's byte order. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.protocol [*protocol]]]
    [The protocol associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.resize [*resize]]]
    [Set the underlying size of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.size [*size]]]
    [Get the underlying size of the endpoint in the native type. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_endpoint.operator_not__eq_ [*operator!=]]]
    [Compare two endpoints for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_lt_ [*operator<]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_lt__eq_ [*operator<=]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_eq__eq_ [*operator==]]]
    [Compare two endpoints for equality. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_gt_ [*operator>]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.operator_gt__eq_ [*operator>=]]]
    [Compare endpoints for ordering. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_endpoint.operator_lt__lt_ [*operator<<]]]
    [Output an endpoint as a string. ]
  ]
  
]

The [link asio.reference.ip__basic_endpoint `ip::basic_endpoint`] class template describes an endpoint that may be associated with a particular socket.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.





[heading Requirements]

['Header: ][^asio/ip/udp.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:family ip::udp::family]

[indexterm2 asio.indexterm.ip__udp.family..family..ip::udp] 
Obtain an identifier for the protocol family. 


  int family() const;



[endsect]



[section:operator_not__eq_ ip::udp::operator!=]

[indexterm2 asio.indexterm.ip__udp.operator_not__eq_..operator!=..ip::udp] 
Compare two protocols for inequality. 


  friend bool operator!=(
      const udp & p1,
      const udp & p2);


[heading Requirements]

['Header: ][^asio/ip/udp.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq__eq_ ip::udp::operator==]

[indexterm2 asio.indexterm.ip__udp.operator_eq__eq_..operator==..ip::udp] 
Compare two protocols for equality. 


  friend bool operator==(
      const udp & p1,
      const udp & p2);


[heading Requirements]

['Header: ][^asio/ip/udp.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:protocol ip::udp::protocol]

[indexterm2 asio.indexterm.ip__udp.protocol..protocol..ip::udp] 
Obtain an identifier for the protocol. 


  int protocol() const;



[endsect]



[section:resolver ip::udp::resolver]

[indexterm2 asio.indexterm.ip__udp.resolver..resolver..ip::udp] 
The UDP resolver type. 


  typedef basic_resolver< udp > resolver;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ip__basic_resolver__rebind_executor [*rebind_executor]]]
    [Rebinds the resolver type to another executor. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.flags [*flags]]]
    [A bitmask type (C++ Std \[lib.bitmask.types\]). ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.iterator [*iterator]]]
    [(Deprecated.) The iterator type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.query [*query]]]
    [(Deprecated.) The query type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.results_type [*results_type]]]
    [The results type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver.async_resolve [*async_resolve]]]
    [(Deprecated: Use overload with separate host and service parameters.) Asynchronously perform forward resolution of a query to a list of entries. 
     [hr]
     Asynchronously perform forward resolution of a query to a list of entries. 
     [hr]
     Asynchronously perform reverse resolution of an endpoint to a list of entries. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.basic_resolver [*basic_resolver]] [constructor]]
    [Construct with executor. 
     [hr]
     Construct with execution context. 
     [hr]
     Move-construct a basic_resolver from another. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.cancel [*cancel]]]
    [Cancel any asynchronous operations that are waiting on the resolver. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.operator_eq_ [*operator=]]]
    [Move-assign a basic_resolver from another. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.resolve [*resolve]]]
    [(Deprecated: Use overload with separate host and service parameters.) Perform forward resolution of a query to a list of entries. 
     [hr]
     Perform forward resolution of a query to a list of entries. 
     [hr]
     Perform reverse resolution of an endpoint to a list of entries. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver._basic_resolver [*~basic_resolver]] [destructor]]
    [Destroys the resolver. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__basic_resolver.address_configured [*address_configured]] [static]]
    [Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.all_matching [*all_matching]] [static]]
    [If used with v4_mapped, return all matching IPv6 and IPv4 addresses. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.canonical_name [*canonical_name]] [static]]
    [Determine the canonical name of the host specified in the query. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.numeric_host [*numeric_host]] [static]]
    [Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.numeric_service [*numeric_service]] [static]]
    [Service name should be treated as a numeric string defining a port number and no name resolution should be attempted. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.passive [*passive]] [static]]
    [Indicate that returned endpoint is intended for use as a locally bound socket endpoint. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver.v4_mapped [*v4_mapped]] [static]]
    [If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses. ]
  ]

]

The [link asio.reference.ip__basic_resolver `ip::basic_resolver`] class template provides the ability to resolve a query to a list of endpoints.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/udp.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:socket ip::udp::socket]

[indexterm2 asio.indexterm.ip__udp.socket..socket..ip::udp] 
The UDP socket type. 


  typedef basic_datagram_socket< udp > socket;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_datagram_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_datagram_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_receive [*async_receive]]]
    [Start an asynchronous receive on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_receive_from [*async_receive_from]]]
    [Start an asynchronous receive. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_send [*async_send]]]
    [Start an asynchronous send on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_send_to [*async_send_to]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.basic_datagram_socket [*basic_datagram_socket]] [constructor]]
    [Construct a basic_datagram_socket without opening it. 
     [hr]
     Construct and open a basic_datagram_socket. 
     [hr]
     Construct a basic_datagram_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_datagram_socket on an existing native socket. 
     [hr]
     Move-construct a basic_datagram_socket from another. 
     [hr]
     Move-construct a basic_datagram_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_datagram_socket from another. 
     [hr]
     Move-assign a basic_datagram_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.receive [*receive]]]
    [Receive some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.receive_from [*receive_from]]]
    [Receive a datagram with the endpoint of the sender. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.send [*send]]]
    [Send some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.send_to [*send_to]]]
    [Send a datagram to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket._basic_datagram_socket [*~basic_datagram_socket]] [destructor]]
    [Destroys the socket. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_datagram_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_datagram_socket `basic_datagram_socket`] class template provides asynchronous and blocking datagram-oriented socket functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/ip/udp.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:type ip::udp::type]

[indexterm2 asio.indexterm.ip__udp.type..type..ip::udp] 
Obtain an identifier for the type of the protocol. 


  int type() const;



[endsect]



[section:v4 ip::udp::v4]

[indexterm2 asio.indexterm.ip__udp.v4..v4..ip::udp] 
Construct to represent the IPv4 UDP protocol. 


  static udp v4();



[endsect]



[section:v6 ip::udp::v6]

[indexterm2 asio.indexterm.ip__udp.v6..v6..ip::udp] 
Construct to represent the IPv6 UDP protocol. 


  static udp v6();



[endsect]



[endsect]


[section:ip__unicast__hops ip::unicast::hops]

[indexterm1 asio.indexterm.ip__unicast__hops..ip::unicast::hops] 
Socket option for time-to-live associated with outgoing unicast packets. 


  typedef implementation_defined hops;



Implements the IPPROTO\_IP/IP\_UNICAST\_TTL socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::ip::unicast::hops option(4);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::ip::unicast::hops option;
   socket.get_option(option);
   int ttl = option.value();







[heading Requirements]

['Header: ][^asio/ip/unicast.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:ip__v4_mapped_t ip::v4_mapped_t]

[indexterm1 asio.indexterm.ip__v4_mapped_t..ip::v4_mapped_t] 
Tag type used for distinguishing overloads that deal in IPv4-mapped IPv6 addresses. 


  enum v4_mapped_t

[indexterm2 asio.indexterm.ip__v4_mapped_t.v4_mapped..v4_mapped..ip::v4_mapped_t]

[heading Values]
[variablelist

  [
    [v4_mapped]
    []
  ]

]


[heading Requirements]

['Header: ][^asio/ip/address_v6.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:ip__v6_only ip::v6_only]

[indexterm1 asio.indexterm.ip__v6_only..ip::v6_only] 
Socket option for determining whether an IPv6 socket supports IPv6 communication only. 


  typedef implementation_defined v6_only;



Implements the IPPROTO\_IPV6/IP\_V6ONLY socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::v6_only option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::ip::v6_only option;
   socket.get_option(option);
   bool v6_only = option.value();







[heading Requirements]

['Header: ][^asio/ip/v6_only.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:is_applicable_property is_applicable_property]



  template<
      typename T,
      typename Property,
      typename  = void>
  struct is_applicable_property


[heading Requirements]

['Header: ][^asio/is_applicable_property.hpp]

['Convenience header: ][^asio.hpp]


[endsect]

[section:is_const_buffer_sequence is_const_buffer_sequence]


Trait to determine whether a type satisfies the ConstBufferSequence requirements. 


  template<
      typename T>
  struct is_const_buffer_sequence


[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]

[section:is_dynamic_buffer is_dynamic_buffer]


Trait to determine whether a type satisfies the DynamicBuffer requirements. 


  template<
      typename T>
  struct is_dynamic_buffer


If `ASIO_NO_DYNAMIC_BUFFER_V1` is not defined, determines whether the type satisfies the DynamicBuffer\_v1 requirements. Otherwise, if `ASIO_NO_DYNAMIC_BUFFER_V1` is defined, determines whether the type satisfies the DynamicBuffer\_v2 requirements. 

[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]

[section:is_dynamic_buffer_v1 is_dynamic_buffer_v1]


Trait to determine whether a type satisfies the DynamicBuffer\_v1 requirements. 


  template<
      typename T>
  struct is_dynamic_buffer_v1


[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]

[section:is_dynamic_buffer_v2 is_dynamic_buffer_v2]


Trait to determine whether a type satisfies the DynamicBuffer\_v2 requirements. 


  template<
      typename T>
  struct is_dynamic_buffer_v2


[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]

[section:is_endpoint_sequence is_endpoint_sequence]


Type trait used to determine whether a type is an endpoint sequence that can be used with with `connect` and `async_connect`. 


  template<
      typename T>
  struct is_endpoint_sequence


[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.is_endpoint_sequence.value [*value]] [static]]
    [The value member is true if the type may be used as an endpoint sequence. ]
  ]

]

[heading Requirements]

['Header: ][^asio/connect.hpp]

['Convenience header: ][^asio.hpp]


[section:value is_endpoint_sequence::value]

[indexterm2 asio.indexterm.is_endpoint_sequence.value..value..is_endpoint_sequence] 
The value member is true if the type may be used as an endpoint sequence. 


  static const bool value;



[endsect]



[endsect]

[section:is_executor is_executor]


The [link asio.reference.is_executor `is_executor`] trait detects whether a type T meets the Executor type requirements. 


  template<
      typename T>
  struct is_executor


Class template `is_executor` is a UnaryTypeTrait that is derived from `true_type` if the type `T` meets the syntactic requirements for Executor, otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/is_executor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]

[section:is_match_condition is_match_condition]


Type trait used to determine whether a type can be used as a match condition function with read\_until and async\_read\_until. 


  template<
      typename T>
  struct is_match_condition


[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.is_match_condition.value [*value]] [static]]
    [The value member is true if the type may be used as a match condition. ]
  ]

]

[heading Requirements]

['Header: ][^asio/read_until.hpp]

['Convenience header: ][^asio.hpp]


[section:value is_match_condition::value]

[indexterm2 asio.indexterm.is_match_condition.value..value..is_match_condition] 
The value member is true if the type may be used as a match condition. 


  static const bool value;



[endsect]



[endsect]

[section:is_mutable_buffer_sequence is_mutable_buffer_sequence]


Trait to determine whether a type satisfies the MutableBufferSequence requirements. 


  template<
      typename T>
  struct is_mutable_buffer_sequence


[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]

[section:is_nothrow_prefer is_nothrow_prefer]


A type trait that determines whether a `prefer` expression will not throw. 


  template<
      typename T,
      typename... Properties>
  struct is_nothrow_prefer


Class template `is_nothrow_prefer` is a trait that is derived from `true_type` if the expression `asio::prefer(std::declval<T>(), std::declval<Properties>()...)` is `noexcept`; otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/prefer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]

[section:is_nothrow_query is_nothrow_query]


A type trait that determines whether a `query` expression will not throw. 


  template<
      typename T,
      typename Property>
  struct is_nothrow_query


Class template `is_nothrow_query` is a trait that is derived from `true_type` if the expression `asio::query(std::declval<T>(), std::declval<Property>())` is `noexcept`; otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/query.hpp]

['Convenience header: ][^asio.hpp]


[endsect]

[section:is_nothrow_require is_nothrow_require]


A type trait that determines whether a `require` expression will not throw. 


  template<
      typename T,
      typename... Properties>
  struct is_nothrow_require


Class template `is_nothrow_require` is a trait that is derived from `true_type` if the expression `asio::require(std::declval<T>(), std::declval<Properties>()...)` is `noexcept`; otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/require.hpp]

['Convenience header: ][^asio.hpp]


[endsect]

[section:is_nothrow_require_concept is_nothrow_require_concept]


A type trait that determines whether a `require_concept` expression will not throw. 


  template<
      typename T,
      typename Property>
  struct is_nothrow_require_concept


Class template `is_nothrow_require_concept` is a trait that is derived from `true_type` if the expression `asio::require_concept(std::declval<T>(), std::declval<Property>())` is `noexcept`; otherwise `false_type`. 

[heading Requirements]

['Header: ][^asio/require_concept.hpp]

['Convenience header: ][^asio.hpp]


[endsect]

[section:is_read_buffered is_read_buffered]


The [link asio.reference.is_read_buffered `is_read_buffered`] class is a traits class that may be used to determine whether a stream type supports buffering of read data. 


  template<
      typename Stream>
  class is_read_buffered


[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.is_read_buffered.value [*value]] [static]]
    [The value member is true only if the Stream type supports buffering of read data. ]
  ]

]

[heading Requirements]

['Header: ][^asio/is_read_buffered.hpp]

['Convenience header: ][^asio.hpp]


[section:value is_read_buffered::value]

[indexterm2 asio.indexterm.is_read_buffered.value..value..is_read_buffered] 
The value member is true only if the Stream type supports buffering of read data. 


  static const bool value;



[endsect]



[endsect]

[section:is_write_buffered is_write_buffered]


The [link asio.reference.is_write_buffered `is_write_buffered`] class is a traits class that may be used to determine whether a stream type supports buffering of written data. 


  template<
      typename Stream>
  class is_write_buffered


[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.is_write_buffered.value [*value]] [static]]
    [The value member is true only if the Stream type supports buffering of written data. ]
  ]

]

[heading Requirements]

['Header: ][^asio/is_write_buffered.hpp]

['Convenience header: ][^asio.hpp]


[section:value is_write_buffered::value]

[indexterm2 asio.indexterm.is_write_buffered.value..value..is_write_buffered] 
The value member is true only if the Stream type supports buffering of written data. 


  static const bool value;



[endsect]



[endsect]

[section:local__basic_endpoint local::basic_endpoint]


Describes an endpoint for a UNIX socket. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``>
  class basic_endpoint


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.local__basic_endpoint.data_type [*data_type]]]
    [The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer. ]
  
  ]

  [

    [[link asio.reference.local__basic_endpoint.protocol_type [*protocol_type]]]
    [The protocol type associated with the endpoint. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.local__basic_endpoint.basic_endpoint [*basic_endpoint]] [constructor]]
    [Default constructor. 
     [hr]
     Construct an endpoint using the specified path name. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.capacity [*capacity]]]
    [Get the capacity of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.data [*data]]]
    [Get the underlying endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.operator_eq_ [*operator=]]]
    [Assign from another endpoint. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.path [*path]]]
    [Get the path associated with the endpoint. 
     [hr]
     Set the path associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.protocol [*protocol]]]
    [The protocol associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.resize [*resize]]]
    [Set the underlying size of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.size [*size]]]
    [Get the underlying size of the endpoint in the native type. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.local__basic_endpoint.operator_not__eq_ [*operator!=]]]
    [Compare two endpoints for inequality. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.operator_lt_ [*operator<]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.operator_lt__eq_ [*operator<=]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.operator_eq__eq_ [*operator==]]]
    [Compare two endpoints for equality. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.operator_gt_ [*operator>]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.operator_gt__eq_ [*operator>=]]]
    [Compare endpoints for ordering. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.local__basic_endpoint.operator_lt__lt_ [*operator<<]]]
    [Output an endpoint as a string. ]
  ]
  
]

The [link asio.reference.local__basic_endpoint `local::basic_endpoint`] class template describes an endpoint that may be associated with a particular UNIX socket.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.




[heading Requirements]

['Header: ][^asio/local/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]

[section:basic_endpoint local::basic_endpoint::basic_endpoint]

[indexterm2 asio.indexterm.local__basic_endpoint.basic_endpoint..basic_endpoint..local::basic_endpoint] 
Default constructor. 


  ``[link asio.reference.local__basic_endpoint.basic_endpoint.overload1 basic_endpoint]``();
  ``  [''''&raquo;''' [link asio.reference.local__basic_endpoint.basic_endpoint.overload1 more...]]``


Construct an endpoint using the specified path name. 


  ``[link asio.reference.local__basic_endpoint.basic_endpoint.overload2 basic_endpoint]``(
      const char * path_name);
  ``  [''''&raquo;''' [link asio.reference.local__basic_endpoint.basic_endpoint.overload2 more...]]``

  ``[link asio.reference.local__basic_endpoint.basic_endpoint.overload3 basic_endpoint]``(
      const std::string & path_name);
  ``  [''''&raquo;''' [link asio.reference.local__basic_endpoint.basic_endpoint.overload3 more...]]``


Copy constructor. 


  ``[link asio.reference.local__basic_endpoint.basic_endpoint.overload4 basic_endpoint]``(
      const basic_endpoint & other);
  ``  [''''&raquo;''' [link asio.reference.local__basic_endpoint.basic_endpoint.overload4 more...]]``


[section:overload1 local::basic_endpoint::basic_endpoint (1 of 4 overloads)]


Default constructor. 


  basic_endpoint();



[endsect]



[section:overload2 local::basic_endpoint::basic_endpoint (2 of 4 overloads)]


Construct an endpoint using the specified path name. 


  basic_endpoint(
      const char * path_name);



[endsect]



[section:overload3 local::basic_endpoint::basic_endpoint (3 of 4 overloads)]


Construct an endpoint using the specified path name. 


  basic_endpoint(
      const std::string & path_name);



[endsect]



[section:overload4 local::basic_endpoint::basic_endpoint (4 of 4 overloads)]


Copy constructor. 


  basic_endpoint(
      const basic_endpoint & other);



[endsect]


[endsect]


[section:capacity local::basic_endpoint::capacity]

[indexterm2 asio.indexterm.local__basic_endpoint.capacity..capacity..local::basic_endpoint] 
Get the capacity of the endpoint in the native type. 


  std::size_t capacity() const;



[endsect]


[section:data local::basic_endpoint::data]

[indexterm2 asio.indexterm.local__basic_endpoint.data..data..local::basic_endpoint] 
Get the underlying endpoint in the native type. 


  data_type * ``[link asio.reference.local__basic_endpoint.data.overload1 data]``();
  ``  [''''&raquo;''' [link asio.reference.local__basic_endpoint.data.overload1 more...]]``

  const data_type * ``[link asio.reference.local__basic_endpoint.data.overload2 data]``() const;
  ``  [''''&raquo;''' [link asio.reference.local__basic_endpoint.data.overload2 more...]]``


[section:overload1 local::basic_endpoint::data (1 of 2 overloads)]


Get the underlying endpoint in the native type. 


  data_type * data();



[endsect]



[section:overload2 local::basic_endpoint::data (2 of 2 overloads)]


Get the underlying endpoint in the native type. 


  const data_type * data() const;



[endsect]


[endsect]


[section:data_type local::basic_endpoint::data_type]

[indexterm2 asio.indexterm.local__basic_endpoint.data_type..data_type..local::basic_endpoint] 
The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer. 


  typedef implementation_defined data_type;



[heading Requirements]

['Header: ][^asio/local/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_not__eq_ local::basic_endpoint::operator!=]

[indexterm2 asio.indexterm.local__basic_endpoint.operator_not__eq_..operator!=..local::basic_endpoint] 
Compare two endpoints for inequality. 


  friend bool operator!=(
      const basic_endpoint< Protocol > & e1,
      const basic_endpoint< Protocol > & e2);


[heading Requirements]

['Header: ][^asio/local/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_lt_ local::basic_endpoint::operator<]

[indexterm2 asio.indexterm.local__basic_endpoint.operator_lt_..operator<..local::basic_endpoint] 
Compare endpoints for ordering. 


  friend bool operator<(
      const basic_endpoint< Protocol > & e1,
      const basic_endpoint< Protocol > & e2);


[heading Requirements]

['Header: ][^asio/local/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_lt__lt_ local::basic_endpoint::operator<<]

[indexterm2 asio.indexterm.local__basic_endpoint.operator_lt__lt_..operator<<..local::basic_endpoint] 
Output an endpoint as a string. 


  std::basic_ostream< Elem, Traits > & operator<<(
      std::basic_ostream< Elem, Traits > & os,
      const basic_endpoint< Protocol > & endpoint);


Used to output a human-readable string for a specified endpoint.


[heading Parameters]
    

[variablelist
  
[[os][The output stream to which the string will be written.]]

[[endpoint][The endpoint to be written.]]

]


[heading Return Value]
      
The output stream. 




[endsect]



[section:operator_lt__eq_ local::basic_endpoint::operator<=]

[indexterm2 asio.indexterm.local__basic_endpoint.operator_lt__eq_..operator<=..local::basic_endpoint] 
Compare endpoints for ordering. 


  friend bool operator<=(
      const basic_endpoint< Protocol > & e1,
      const basic_endpoint< Protocol > & e2);


[heading Requirements]

['Header: ][^asio/local/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq_ local::basic_endpoint::operator=]

[indexterm2 asio.indexterm.local__basic_endpoint.operator_eq_..operator=..local::basic_endpoint] 
Assign from another endpoint. 


  basic_endpoint & operator=(
      const basic_endpoint & other);



[endsect]



[section:operator_eq__eq_ local::basic_endpoint::operator==]

[indexterm2 asio.indexterm.local__basic_endpoint.operator_eq__eq_..operator==..local::basic_endpoint] 
Compare two endpoints for equality. 


  friend bool operator==(
      const basic_endpoint< Protocol > & e1,
      const basic_endpoint< Protocol > & e2);


[heading Requirements]

['Header: ][^asio/local/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_gt_ local::basic_endpoint::operator>]

[indexterm2 asio.indexterm.local__basic_endpoint.operator_gt_..operator>..local::basic_endpoint] 
Compare endpoints for ordering. 


  friend bool operator>(
      const basic_endpoint< Protocol > & e1,
      const basic_endpoint< Protocol > & e2);


[heading Requirements]

['Header: ][^asio/local/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_gt__eq_ local::basic_endpoint::operator>=]

[indexterm2 asio.indexterm.local__basic_endpoint.operator_gt__eq_..operator>=..local::basic_endpoint] 
Compare endpoints for ordering. 


  friend bool operator>=(
      const basic_endpoint< Protocol > & e1,
      const basic_endpoint< Protocol > & e2);


[heading Requirements]

['Header: ][^asio/local/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:path local::basic_endpoint::path]

[indexterm2 asio.indexterm.local__basic_endpoint.path..path..local::basic_endpoint] 
Get the path associated with the endpoint. 


  std::string ``[link asio.reference.local__basic_endpoint.path.overload1 path]``() const;
  ``  [''''&raquo;''' [link asio.reference.local__basic_endpoint.path.overload1 more...]]``


Set the path associated with the endpoint. 


  void ``[link asio.reference.local__basic_endpoint.path.overload2 path]``(
      const char * p);
  ``  [''''&raquo;''' [link asio.reference.local__basic_endpoint.path.overload2 more...]]``

  void ``[link asio.reference.local__basic_endpoint.path.overload3 path]``(
      const std::string & p);
  ``  [''''&raquo;''' [link asio.reference.local__basic_endpoint.path.overload3 more...]]``


[section:overload1 local::basic_endpoint::path (1 of 3 overloads)]


Get the path associated with the endpoint. 


  std::string path() const;



[endsect]



[section:overload2 local::basic_endpoint::path (2 of 3 overloads)]


Set the path associated with the endpoint. 


  void path(
      const char * p);



[endsect]



[section:overload3 local::basic_endpoint::path (3 of 3 overloads)]


Set the path associated with the endpoint. 


  void path(
      const std::string & p);



[endsect]


[endsect]


[section:protocol local::basic_endpoint::protocol]

[indexterm2 asio.indexterm.local__basic_endpoint.protocol..protocol..local::basic_endpoint] 
The protocol associated with the endpoint. 


  protocol_type protocol() const;



[endsect]



[section:protocol_type local::basic_endpoint::protocol_type]

[indexterm2 asio.indexterm.local__basic_endpoint.protocol_type..protocol_type..local::basic_endpoint] 
The protocol type associated with the endpoint. 


  typedef Protocol protocol_type;



[heading Requirements]

['Header: ][^asio/local/basic_endpoint.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:resize local::basic_endpoint::resize]

[indexterm2 asio.indexterm.local__basic_endpoint.resize..resize..local::basic_endpoint] 
Set the underlying size of the endpoint in the native type. 


  void resize(
      std::size_t new_size);



[endsect]



[section:size local::basic_endpoint::size]

[indexterm2 asio.indexterm.local__basic_endpoint.size..size..local::basic_endpoint] 
Get the underlying size of the endpoint in the native type. 


  std::size_t size() const;



[endsect]



[endsect]

[section:local__connect_pair local::connect_pair]

[indexterm1 asio.indexterm.local__connect_pair..local::connect_pair] 
Create a pair of connected sockets. 

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor1]``,
      typename ``[link asio.reference.Executor1 Executor2]``>
  void ``[link asio.reference.local__connect_pair.overload1 connect_pair]``(
      basic_socket< Protocol, Executor1 > & socket1,
      basic_socket< Protocol, Executor2 > & socket2);
  ``  [''''&raquo;''' [link asio.reference.local__connect_pair.overload1 more...]]``

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor1]``,
      typename ``[link asio.reference.Executor1 Executor2]``>
  void ``[link asio.reference.local__connect_pair.overload2 connect_pair]``(
      basic_socket< Protocol, Executor1 > & socket1,
      basic_socket< Protocol, Executor2 > & socket2,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.local__connect_pair.overload2 more...]]``

[heading Requirements]

['Header: ][^asio/local/connect_pair.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 local::connect_pair (1 of 2 overloads)]


Create a pair of connected sockets. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor1]``,
      typename ``[link asio.reference.Executor1 Executor2]``>
  void connect_pair(
      basic_socket< Protocol, Executor1 > & socket1,
      basic_socket< Protocol, Executor2 > & socket2);



[endsect]



[section:overload2 local::connect_pair (2 of 2 overloads)]


Create a pair of connected sockets. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.Executor1 Executor1]``,
      typename ``[link asio.reference.Executor1 Executor2]``>
  void connect_pair(
      basic_socket< Protocol, Executor1 > & socket1,
      basic_socket< Protocol, Executor2 > & socket2,
      asio::error_code & ec);



[endsect]


[endsect]

[section:local__datagram_protocol local::datagram_protocol]


Encapsulates the flags needed for datagram-oriented UNIX sockets. 


  class datagram_protocol


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.local__datagram_protocol.endpoint [*endpoint]]]
    [The type of a UNIX domain endpoint. ]
  
  ]

  [

    [[link asio.reference.local__datagram_protocol.socket [*socket]]]
    [The UNIX domain socket type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.local__datagram_protocol.family [*family]]]
    [Obtain an identifier for the protocol family. ]
  ]
  
  [
    [[link asio.reference.local__datagram_protocol.protocol [*protocol]]]
    [Obtain an identifier for the protocol. ]
  ]
  
  [
    [[link asio.reference.local__datagram_protocol.type [*type]]]
    [Obtain an identifier for the type of the protocol. ]
  ]
  
]

The [link asio.reference.local__datagram_protocol `local::datagram_protocol`] class contains flags necessary for datagram-oriented UNIX domain sockets.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Safe.




[heading Requirements]

['Header: ][^asio/local/datagram_protocol.hpp]

['Convenience header: ][^asio.hpp]


[section:endpoint local::datagram_protocol::endpoint]

[indexterm2 asio.indexterm.local__datagram_protocol.endpoint..endpoint..local::datagram_protocol] 
The type of a UNIX domain endpoint. 


  typedef basic_endpoint< datagram_protocol > endpoint;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.local__basic_endpoint.data_type [*data_type]]]
    [The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer. ]
  
  ]

  [

    [[link asio.reference.local__basic_endpoint.protocol_type [*protocol_type]]]
    [The protocol type associated with the endpoint. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.local__basic_endpoint.basic_endpoint [*basic_endpoint]] [constructor]]
    [Default constructor. 
     [hr]
     Construct an endpoint using the specified path name. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.capacity [*capacity]]]
    [Get the capacity of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.data [*data]]]
    [Get the underlying endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.operator_eq_ [*operator=]]]
    [Assign from another endpoint. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.path [*path]]]
    [Get the path associated with the endpoint. 
     [hr]
     Set the path associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.protocol [*protocol]]]
    [The protocol associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.resize [*resize]]]
    [Set the underlying size of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.size [*size]]]
    [Get the underlying size of the endpoint in the native type. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.local__basic_endpoint.operator_not__eq_ [*operator!=]]]
    [Compare two endpoints for inequality. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.operator_lt_ [*operator<]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.operator_lt__eq_ [*operator<=]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.operator_eq__eq_ [*operator==]]]
    [Compare two endpoints for equality. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.operator_gt_ [*operator>]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.operator_gt__eq_ [*operator>=]]]
    [Compare endpoints for ordering. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.local__basic_endpoint.operator_lt__lt_ [*operator<<]]]
    [Output an endpoint as a string. ]
  ]
  
]

The [link asio.reference.local__basic_endpoint `local::basic_endpoint`] class template describes an endpoint that may be associated with a particular UNIX socket.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.





[heading Requirements]

['Header: ][^asio/local/datagram_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:family local::datagram_protocol::family]

[indexterm2 asio.indexterm.local__datagram_protocol.family..family..local::datagram_protocol] 
Obtain an identifier for the protocol family. 


  int family() const;



[endsect]



[section:protocol local::datagram_protocol::protocol]

[indexterm2 asio.indexterm.local__datagram_protocol.protocol..protocol..local::datagram_protocol] 
Obtain an identifier for the protocol. 


  int protocol() const;



[endsect]



[section:socket local::datagram_protocol::socket]

[indexterm2 asio.indexterm.local__datagram_protocol.socket..socket..local::datagram_protocol] 
The UNIX domain socket type. 


  typedef basic_datagram_socket< datagram_protocol > socket;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_datagram_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_datagram_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_datagram_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_receive [*async_receive]]]
    [Start an asynchronous receive on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_receive_from [*async_receive_from]]]
    [Start an asynchronous receive. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_send [*async_send]]]
    [Start an asynchronous send on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_send_to [*async_send_to]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.basic_datagram_socket [*basic_datagram_socket]] [constructor]]
    [Construct a basic_datagram_socket without opening it. 
     [hr]
     Construct and open a basic_datagram_socket. 
     [hr]
     Construct a basic_datagram_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_datagram_socket on an existing native socket. 
     [hr]
     Move-construct a basic_datagram_socket from another. 
     [hr]
     Move-construct a basic_datagram_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_datagram_socket from another. 
     [hr]
     Move-assign a basic_datagram_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.receive [*receive]]]
    [Receive some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.receive_from [*receive_from]]]
    [Receive a datagram with the endpoint of the sender. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.send [*send]]]
    [Send some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.send_to [*send_to]]]
    [Send a datagram to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket._basic_datagram_socket [*~basic_datagram_socket]] [destructor]]
    [Destroys the socket. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_datagram_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_datagram_socket `basic_datagram_socket`] class template provides asynchronous and blocking datagram-oriented socket functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/local/datagram_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:type local::datagram_protocol::type]

[indexterm2 asio.indexterm.local__datagram_protocol.type..type..local::datagram_protocol] 
Obtain an identifier for the type of the protocol. 


  int type() const;



[endsect]



[endsect]

[section:local__stream_protocol local::stream_protocol]


Encapsulates the flags needed for stream-oriented UNIX sockets. 


  class stream_protocol


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.local__stream_protocol.acceptor [*acceptor]]]
    [The UNIX domain acceptor type. ]
  
  ]

  [

    [[link asio.reference.local__stream_protocol.endpoint [*endpoint]]]
    [The type of a UNIX domain endpoint. ]
  
  ]

  [

    [[link asio.reference.local__stream_protocol.iostream [*iostream]]]
    [The UNIX domain iostream type. ]
  
  ]

  [

    [[link asio.reference.local__stream_protocol.socket [*socket]]]
    [The UNIX domain socket type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.local__stream_protocol.family [*family]]]
    [Obtain an identifier for the protocol family. ]
  ]
  
  [
    [[link asio.reference.local__stream_protocol.protocol [*protocol]]]
    [Obtain an identifier for the protocol. ]
  ]
  
  [
    [[link asio.reference.local__stream_protocol.type [*type]]]
    [Obtain an identifier for the type of the protocol. ]
  ]
  
]

The [link asio.reference.local__stream_protocol `local::stream_protocol`] class contains flags necessary for stream-oriented UNIX domain sockets.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Safe.




[heading Requirements]

['Header: ][^asio/local/stream_protocol.hpp]

['Convenience header: ][^asio.hpp]


[section:acceptor local::stream_protocol::acceptor]

[indexterm2 asio.indexterm.local__stream_protocol.acceptor..acceptor..local::stream_protocol] 
The UNIX domain acceptor type. 


  typedef basic_socket_acceptor< stream_protocol > acceptor;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_socket_acceptor__rebind_executor [*rebind_executor]]]
    [Rebinds the acceptor type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.native_handle_type [*native_handle_type]]]
    [The native representation of an acceptor. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_socket_acceptor.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket_acceptor.accept [*accept]]]
    [Accept a new connection. 
     [hr]
     Accept a new connection and obtain the endpoint of the peer. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.assign [*assign]]]
    [Assigns an existing native acceptor to the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.async_accept [*async_accept]]]
    [Start an asynchronous accept. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.async_wait [*async_wait]]]
    [Asynchronously wait for the acceptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.basic_socket_acceptor [*basic_socket_acceptor]] [constructor]]
    [Construct an acceptor without opening it. 
     [hr]
     Construct an open acceptor. 
     [hr]
     Construct an acceptor opened on the given endpoint. 
     [hr]
     Construct a basic_socket_acceptor on an existing native acceptor. 
     [hr]
     Move-construct a basic_socket_acceptor from another. 
     [hr]
     Move-construct a basic_socket_acceptor from an acceptor of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.bind [*bind]]]
    [Bind the acceptor to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.close [*close]]]
    [Close the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.get_option [*get_option]]]
    [Get an option from the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.io_control [*io_control]]]
    [Perform an IO control command on the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.is_open [*is_open]]]
    [Determine whether the acceptor is open. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.listen [*listen]]]
    [Place the acceptor into the state where it will listen for new connections. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.native_handle [*native_handle]]]
    [Get the native acceptor representation. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native acceptor implementation. 
     [hr]
     Sets the non-blocking mode of the native acceptor implementation. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the acceptor. 
     [hr]
     Sets the non-blocking mode of the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.open [*open]]]
    [Open the acceptor using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.operator_eq_ [*operator=]]]
    [Move-assign a basic_socket_acceptor from another. 
     [hr]
     Move-assign a basic_socket_acceptor from an acceptor of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.release [*release]]]
    [Release ownership of the underlying native acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.set_option [*set_option]]]
    [Set an option on the acceptor. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.wait [*wait]]]
    [Wait for the acceptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor._basic_socket_acceptor [*~basic_socket_acceptor]] [destructor]]
    [Destroys the acceptor. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket_acceptor.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_socket_acceptor `basic_socket_acceptor`] class template is used for accepting new socket connections.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.


[heading Example]
  
Opening a socket acceptor with the SO\_REUSEADDR option enabled: 

   asio::ip::tcp::acceptor acceptor(my_context);
   asio::ip::tcp::endpoint endpoint(asio::ip::tcp::v4(), port);
   acceptor.open(endpoint.protocol());
   acceptor.set_option(asio::ip::tcp::acceptor::reuse_address(true));
   acceptor.bind(endpoint);
   acceptor.listen();







[heading Requirements]

['Header: ][^asio/local/stream_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:endpoint local::stream_protocol::endpoint]

[indexterm2 asio.indexterm.local__stream_protocol.endpoint..endpoint..local::stream_protocol] 
The type of a UNIX domain endpoint. 


  typedef basic_endpoint< stream_protocol > endpoint;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.local__basic_endpoint.data_type [*data_type]]]
    [The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer. ]
  
  ]

  [

    [[link asio.reference.local__basic_endpoint.protocol_type [*protocol_type]]]
    [The protocol type associated with the endpoint. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.local__basic_endpoint.basic_endpoint [*basic_endpoint]] [constructor]]
    [Default constructor. 
     [hr]
     Construct an endpoint using the specified path name. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.capacity [*capacity]]]
    [Get the capacity of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.data [*data]]]
    [Get the underlying endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.operator_eq_ [*operator=]]]
    [Assign from another endpoint. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.path [*path]]]
    [Get the path associated with the endpoint. 
     [hr]
     Set the path associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.protocol [*protocol]]]
    [The protocol associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.resize [*resize]]]
    [Set the underlying size of the endpoint in the native type. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.size [*size]]]
    [Get the underlying size of the endpoint in the native type. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.local__basic_endpoint.operator_not__eq_ [*operator!=]]]
    [Compare two endpoints for inequality. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.operator_lt_ [*operator<]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.operator_lt__eq_ [*operator<=]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.operator_eq__eq_ [*operator==]]]
    [Compare two endpoints for equality. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.operator_gt_ [*operator>]]]
    [Compare endpoints for ordering. ]
  ]
  
  [
    [[link asio.reference.local__basic_endpoint.operator_gt__eq_ [*operator>=]]]
    [Compare endpoints for ordering. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.local__basic_endpoint.operator_lt__lt_ [*operator<<]]]
    [Output an endpoint as a string. ]
  ]
  
]

The [link asio.reference.local__basic_endpoint `local::basic_endpoint`] class template describes an endpoint that may be associated with a particular UNIX socket.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.





[heading Requirements]

['Header: ][^asio/local/stream_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:family local::stream_protocol::family]

[indexterm2 asio.indexterm.local__stream_protocol.family..family..local::stream_protocol] 
Obtain an identifier for the protocol family. 


  int family() const;



[endsect]



[section:iostream local::stream_protocol::iostream]

[indexterm2 asio.indexterm.local__stream_protocol.iostream..iostream..local::stream_protocol] 
The UNIX domain iostream type. 


  typedef basic_socket_iostream< stream_protocol > iostream;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_socket_iostream.clock_type [*clock_type]]]
    [The clock type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.duration [*duration]]]
    [The duration type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.duration_type [*duration_type]]]
    [(Deprecated: Use duration.) The duration type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.time_point [*time_point]]]
    [The time type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_iostream.time_type [*time_type]]]
    [(Deprecated: Use time_point.) The time type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket_iostream.basic_socket_iostream [*basic_socket_iostream]] [constructor]]
    [Construct a basic_socket_iostream without establishing a connection. 
     [hr]
     Construct a basic_socket_iostream from the supplied socket. 
     [hr]
     Move-construct a basic_socket_iostream from another. 
     [hr]
     Establish a connection to an endpoint corresponding to a resolver query. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.close [*close]]]
    [Close the connection. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.connect [*connect]]]
    [Establish a connection to an endpoint corresponding to a resolver query. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.error [*error]]]
    [Get the last error associated with the stream. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.expires_after [*expires_after]]]
    [Set the stream's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.expires_at [*expires_at]]]
    [(Deprecated: Use expiry().) Get the stream's expiry time as an absolute time. 
     [hr]
     Set the stream's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.expires_from_now [*expires_from_now]]]
    [(Deprecated: Use expiry().) Get the stream's expiry time relative to now. 
     [hr]
     (Deprecated: Use expires_after().) Set the stream's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.expiry [*expiry]]]
    [Get the stream's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.operator_eq_ [*operator=]]]
    [Move-assign a basic_socket_iostream from another. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.rdbuf [*rdbuf]]]
    [Return a pointer to the underlying streambuf. ]
  ]
  
  [
    [[link asio.reference.basic_socket_iostream.socket [*socket]]]
    [Get a reference to the underlying socket. ]
  ]
  
]


[heading Requirements]

['Header: ][^asio/local/stream_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:protocol local::stream_protocol::protocol]

[indexterm2 asio.indexterm.local__stream_protocol.protocol..protocol..local::stream_protocol] 
Obtain an identifier for the protocol. 


  int protocol() const;



[endsect]



[section:socket local::stream_protocol::socket]

[indexterm2 asio.indexterm.local__stream_protocol.socket..socket..local::stream_protocol] 
The UNIX domain socket type. 


  typedef basic_stream_socket< stream_protocol > socket;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_stream_socket__rebind_executor [*rebind_executor]]]
    [Rebinds the socket type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.basic_stream_socket.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_stream_socket.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_read_some [*async_read_some]]]
    [Start an asynchronous read. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_receive [*async_receive]]]
    [Start an asynchronous receive. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_send [*async_send]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_wait [*async_wait]]]
    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.async_write_some [*async_write_some]]]
    [Start an asynchronous write. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.basic_stream_socket [*basic_stream_socket]] [constructor]]
    [Construct a basic_stream_socket without opening it. 
     [hr]
     Construct and open a basic_stream_socket. 
     [hr]
     Construct a basic_stream_socket, opening it and binding it to the given local endpoint. 
     [hr]
     Construct a basic_stream_socket on an existing native socket. 
     [hr]
     Move-construct a basic_stream_socket from another. 
     [hr]
     Move-construct a basic_stream_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.close [*close]]]
    [Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.connect [*connect]]]
    [Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 
     [hr]
     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 
     [hr]
     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.operator_eq_ [*operator=]]]
    [Move-assign a basic_stream_socket from another. 
     [hr]
     Move-assign a basic_stream_socket from a socket of another protocol type. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.read_some [*read_some]]]
    [Read some data from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.receive [*receive]]]
    [Receive some data on the socket. 
     [hr]
     Receive some data on a connected socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.release [*release]]]
    [Release ownership of the underlying native socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.send [*send]]]
    [Send some data on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.write_some [*write_some]]]
    [Write some data to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket._basic_stream_socket [*~basic_stream_socket]] [destructor]]
    [Destroys the socket. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_stream_socket.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

The [link asio.reference.basic_stream_socket `basic_stream_socket`] class template provides asynchronous and blocking stream-oriented socket functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.





[heading Requirements]

['Header: ][^asio/local/stream_protocol.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:type local::stream_protocol::type]

[indexterm2 asio.indexterm.local__stream_protocol.type..type..local::stream_protocol] 
Obtain an identifier for the type of the protocol. 


  int type() const;



[endsect]



[endsect]

[section:make_strand make_strand]

[indexterm1 asio.indexterm.make_strand..make_strand] 
The `asio::make_strand` function creates a [link asio.reference.strand `strand`]  object for an executor or execution context. 


Create a [link asio.reference.strand `strand`]  object for an executor. 

  template<
      typename ``[link asio.reference.Executor1 Executor]``>
  strand< Executor > ``[link asio.reference.make_strand.overload1 make_strand]``(
      const Executor & ex,
      typename enable_if< is_executor< Executor >::value||execution::is_executor< Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.make_strand.overload1 more...]]``

Create a [link asio.reference.strand `strand`]  object for an execution context. 

  template<
      typename ExecutionContext>
  strand< typename ExecutionContext::executor_type > ``[link asio.reference.make_strand.overload2 make_strand]``(
      ExecutionContext & ctx,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.make_strand.overload2 more...]]``

[heading Requirements]

['Header: ][^asio/strand.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 make_strand (1 of 2 overloads)]


Create a [link asio.reference.strand `strand`]  object for an executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``>
  strand< Executor > make_strand(
      const Executor & ex,
      typename enable_if< is_executor< Executor >::value||execution::is_executor< Executor >::value >::type *  = 0);



[endsect]



[section:overload2 make_strand (2 of 2 overloads)]


Create a [link asio.reference.strand `strand`]  object for an execution context. 


  template<
      typename ExecutionContext>
  strand< typename ExecutionContext::executor_type > make_strand(
      ExecutionContext & ctx,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);



[endsect]


[endsect]

[section:make_work_guard make_work_guard]

[indexterm1 asio.indexterm.make_work_guard..make_work_guard] 
Create an [link asio.reference.executor_work_guard `executor_work_guard`]  object. 

  template<
      typename ``[link asio.reference.Executor1 Executor]``>
  executor_work_guard< Executor > ``[link asio.reference.make_work_guard.overload1 make_work_guard]``(
      const Executor & ex,
      typename enable_if< is_executor< Executor >::value||execution::is_executor< Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.make_work_guard.overload1 more...]]``

  template<
      typename ExecutionContext>
  executor_work_guard< typename ExecutionContext::executor_type > ``[link asio.reference.make_work_guard.overload2 make_work_guard]``(
      ExecutionContext & ctx,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.make_work_guard.overload2 more...]]``

  template<
      typename T>
  executor_work_guard< typename associated_executor< T >::type > ``[link asio.reference.make_work_guard.overload3 make_work_guard]``(
      const T & t,
      typename enable_if< !is_executor< T >::value &&!execution::is_executor< T >::value &&!is_convertible< T &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.make_work_guard.overload3 more...]]``

  template<
      typename T,
      typename ``[link asio.reference.Executor1 Executor]``>
  executor_work_guard< typename associated_executor< T, Executor >::type > ``[link asio.reference.make_work_guard.overload4 make_work_guard]``(
      const T & t,
      const Executor & ex,
      typename enable_if< is_executor< Executor >::value||execution::is_executor< Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.make_work_guard.overload4 more...]]``

  template<
      typename T,
      typename ExecutionContext>
  executor_work_guard< typename associated_executor< T, typename ExecutionContext::executor_type >::type > ``[link asio.reference.make_work_guard.overload5 make_work_guard]``(
      const T & t,
      ExecutionContext & ctx,
      typename enable_if< !is_executor< T >::value &&!execution::is_executor< T >::value &&!is_convertible< T &, execution_context & >::value &&is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.make_work_guard.overload5 more...]]``

[heading Requirements]

['Header: ][^asio/executor_work_guard.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 make_work_guard (1 of 5 overloads)]


Create an [link asio.reference.executor_work_guard `executor_work_guard`]  object. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``>
  executor_work_guard< Executor > make_work_guard(
      const Executor & ex,
      typename enable_if< is_executor< Executor >::value||execution::is_executor< Executor >::value >::type *  = 0);



[endsect]



[section:overload2 make_work_guard (2 of 5 overloads)]


Create an [link asio.reference.executor_work_guard `executor_work_guard`]  object. 


  template<
      typename ExecutionContext>
  executor_work_guard< typename ExecutionContext::executor_type > make_work_guard(
      ExecutionContext & ctx,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);



[endsect]



[section:overload3 make_work_guard (3 of 5 overloads)]


Create an [link asio.reference.executor_work_guard `executor_work_guard`]  object. 


  template<
      typename T>
  executor_work_guard< typename associated_executor< T >::type > make_work_guard(
      const T & t,
      typename enable_if< !is_executor< T >::value &&!execution::is_executor< T >::value &&!is_convertible< T &, execution_context & >::value >::type *  = 0);



[endsect]



[section:overload4 make_work_guard (4 of 5 overloads)]


Create an [link asio.reference.executor_work_guard `executor_work_guard`]  object. 


  template<
      typename T,
      typename ``[link asio.reference.Executor1 Executor]``>
  executor_work_guard< typename associated_executor< T, Executor >::type > make_work_guard(
      const T & t,
      const Executor & ex,
      typename enable_if< is_executor< Executor >::value||execution::is_executor< Executor >::value >::type *  = 0);



[endsect]



[section:overload5 make_work_guard (5 of 5 overloads)]


Create an [link asio.reference.executor_work_guard `executor_work_guard`]  object. 


  template<
      typename T,
      typename ExecutionContext>
  executor_work_guard< typename associated_executor< T, typename ExecutionContext::executor_type >::type > make_work_guard(
      const T & t,
      ExecutionContext & ctx,
      typename enable_if< !is_executor< T >::value &&!execution::is_executor< T >::value &&!is_convertible< T &, execution_context & >::value &&is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);



[endsect]


[endsect]

[section:multiple_exceptions multiple_exceptions]


Exception thrown when there are multiple pending exceptions to rethrow. 


  class multiple_exceptions :
    public std::exception


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.multiple_exceptions.first_exception [*first_exception]]]
    [Obtain a pointer to the first exception. ]
  ]
  
  [
    [[link asio.reference.multiple_exceptions.multiple_exceptions [*multiple_exceptions]] [constructor]]
    [Constructor. ]
  ]
  
  [
    [[link asio.reference.multiple_exceptions.what [*what]]]
    [Obtain message associated with exception. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/multiple_exceptions.hpp]

['Convenience header: ][^asio.hpp]


[section:first_exception multiple_exceptions::first_exception]

[indexterm2 asio.indexterm.multiple_exceptions.first_exception..first_exception..multiple_exceptions] 
Obtain a pointer to the first exception. 


  std::exception_ptr first_exception() const;



[endsect]



[section:multiple_exceptions multiple_exceptions::multiple_exceptions]

[indexterm2 asio.indexterm.multiple_exceptions.multiple_exceptions..multiple_exceptions..multiple_exceptions] 
Constructor. 


  multiple_exceptions(
      std::exception_ptr first);



[endsect]



[section:what multiple_exceptions::what]

[indexterm2 asio.indexterm.multiple_exceptions.what..what..multiple_exceptions] 
Obtain message associated with exception. 


  virtual const char * what() const;



[endsect]



[endsect]

[section:mutable_buffer mutable_buffer]


Holds a buffer that can be modified. 


  class mutable_buffer


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.mutable_buffer.data [*data]]]
    [Get a pointer to the beginning of the memory range. ]
  ]
  
  [
    [[link asio.reference.mutable_buffer.mutable_buffer [*mutable_buffer]] [constructor]]
    [Construct an empty buffer. 
     [hr]
     Construct a buffer to represent a given memory range. ]
  ]
  
  [
    [[link asio.reference.mutable_buffer.operator_plus__eq_ [*operator+=]]]
    [Move the start of the buffer by the specified number of bytes. ]
  ]
  
  [
    [[link asio.reference.mutable_buffer.size [*size]]]
    [Get the size of the memory range. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.mutable_buffer.operator_plus_ [*operator+]]]
    [Create a new modifiable buffer that is offset from the start of another. ]
  ]
  
]

The [link asio.reference.mutable_buffer `mutable_buffer`] class provides a safe representation of a buffer that can be modified. It does not own the underlying data, and so is cheap to copy or assign.


[heading Accessing Buffer Contents]
  


The contents of a buffer may be accessed using the `data()` and `size()` member functions:



   asio::mutable_buffer b1 = ...;
   std::size_t s1 = b1.size();
   unsigned char* p1 = static_cast<unsigned char*>(b1.data());




The `data()` member function permits violations of type safety, so uses of it in application code should be carefully considered. 

[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[section:data mutable_buffer::data]

[indexterm2 asio.indexterm.mutable_buffer.data..data..mutable_buffer] 
Get a pointer to the beginning of the memory range. 


  void * data() const;



[endsect]


[section:mutable_buffer mutable_buffer::mutable_buffer]

[indexterm2 asio.indexterm.mutable_buffer.mutable_buffer..mutable_buffer..mutable_buffer] 
Construct an empty buffer. 


  ``[link asio.reference.mutable_buffer.mutable_buffer.overload1 mutable_buffer]``();
  ``  [''''&raquo;''' [link asio.reference.mutable_buffer.mutable_buffer.overload1 more...]]``


Construct a buffer to represent a given memory range. 


  ``[link asio.reference.mutable_buffer.mutable_buffer.overload2 mutable_buffer]``(
      void * data,
      std::size_t size);
  ``  [''''&raquo;''' [link asio.reference.mutable_buffer.mutable_buffer.overload2 more...]]``


[section:overload1 mutable_buffer::mutable_buffer (1 of 2 overloads)]


Construct an empty buffer. 


  mutable_buffer();



[endsect]



[section:overload2 mutable_buffer::mutable_buffer (2 of 2 overloads)]


Construct a buffer to represent a given memory range. 


  mutable_buffer(
      void * data,
      std::size_t size);



[endsect]


[endsect]

[section:operator_plus_ mutable_buffer::operator+]

[indexterm2 asio.indexterm.mutable_buffer.operator_plus_..operator+..mutable_buffer] 
Create a new modifiable buffer that is offset from the start of another. 


  mutable_buffer ``[link asio.reference.mutable_buffer.operator_plus_.overload1 operator+]``(
      const mutable_buffer & b,
      std::size_t n);
  ``  [''''&raquo;''' [link asio.reference.mutable_buffer.operator_plus_.overload1 more...]]``

  mutable_buffer ``[link asio.reference.mutable_buffer.operator_plus_.overload2 operator+]``(
      std::size_t n,
      const mutable_buffer & b);
  ``  [''''&raquo;''' [link asio.reference.mutable_buffer.operator_plus_.overload2 more...]]``


[section:overload1 mutable_buffer::operator+ (1 of 2 overloads)]


Create a new modifiable buffer that is offset from the start of another. 


  mutable_buffer operator+(
      const mutable_buffer & b,
      std::size_t n);



[endsect]



[section:overload2 mutable_buffer::operator+ (2 of 2 overloads)]


Create a new modifiable buffer that is offset from the start of another. 


  mutable_buffer operator+(
      std::size_t n,
      const mutable_buffer & b);



[endsect]


[endsect]


[section:operator_plus__eq_ mutable_buffer::operator+=]

[indexterm2 asio.indexterm.mutable_buffer.operator_plus__eq_..operator+=..mutable_buffer] 
Move the start of the buffer by the specified number of bytes. 


  mutable_buffer & operator+=(
      std::size_t n);



[endsect]



[section:size mutable_buffer::size]

[indexterm2 asio.indexterm.mutable_buffer.size..size..mutable_buffer] 
Get the size of the memory range. 


  std::size_t size() const;



[endsect]



[endsect]

[section:mutable_buffers_1 mutable_buffers_1]


(Deprecated: Use [link asio.reference.mutable_buffer `mutable_buffer`].) Adapts a single modifiable buffer so that it meets the requirements of the MutableBufferSequence concept. 


  class mutable_buffers_1 :
    public mutable_buffer


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.mutable_buffers_1.const_iterator [*const_iterator]]]
    [A random-access iterator type that may be used to read elements. ]
  
  ]

  [

    [[link asio.reference.mutable_buffers_1.value_type [*value_type]]]
    [The type for each element in the list of buffers. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.mutable_buffers_1.begin [*begin]]]
    [Get a random-access iterator to the first element. ]
  ]
  
  [
    [[link asio.reference.mutable_buffers_1.data [*data]]]
    [Get a pointer to the beginning of the memory range. ]
  ]
  
  [
    [[link asio.reference.mutable_buffers_1.end [*end]]]
    [Get a random-access iterator for one past the last element. ]
  ]
  
  [
    [[link asio.reference.mutable_buffers_1.mutable_buffers_1 [*mutable_buffers_1]] [constructor]]
    [Construct to represent a given memory range. 
     [hr]
     Construct to represent a single modifiable buffer. ]
  ]
  
  [
    [[link asio.reference.mutable_buffers_1.operator_plus__eq_ [*operator+=]]]
    [Move the start of the buffer by the specified number of bytes. ]
  ]
  
  [
    [[link asio.reference.mutable_buffers_1.size [*size]]]
    [Get the size of the memory range. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.mutable_buffers_1.operator_plus_ [*operator+]]]
    [Create a new modifiable buffer that is offset from the start of another. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[section:begin mutable_buffers_1::begin]

[indexterm2 asio.indexterm.mutable_buffers_1.begin..begin..mutable_buffers_1] 
Get a random-access iterator to the first element. 


  const_iterator begin() const;



[endsect]



[section:const_iterator mutable_buffers_1::const_iterator]

[indexterm2 asio.indexterm.mutable_buffers_1.const_iterator..const_iterator..mutable_buffers_1] 
A random-access iterator type that may be used to read elements. 


  typedef const mutable_buffer * const_iterator;



[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:data mutable_buffers_1::data]


['Inherited from mutable_buffer.]

[indexterm2 asio.indexterm.mutable_buffers_1.data..data..mutable_buffers_1] 
Get a pointer to the beginning of the memory range. 


  void * data() const;



[endsect]



[section:end mutable_buffers_1::end]

[indexterm2 asio.indexterm.mutable_buffers_1.end..end..mutable_buffers_1] 
Get a random-access iterator for one past the last element. 


  const_iterator end() const;



[endsect]


[section:mutable_buffers_1 mutable_buffers_1::mutable_buffers_1]

[indexterm2 asio.indexterm.mutable_buffers_1.mutable_buffers_1..mutable_buffers_1..mutable_buffers_1] 
Construct to represent a given memory range. 


  ``[link asio.reference.mutable_buffers_1.mutable_buffers_1.overload1 mutable_buffers_1]``(
      void * data,
      std::size_t size);
  ``  [''''&raquo;''' [link asio.reference.mutable_buffers_1.mutable_buffers_1.overload1 more...]]``


Construct to represent a single modifiable buffer. 


  explicit ``[link asio.reference.mutable_buffers_1.mutable_buffers_1.overload2 mutable_buffers_1]``(
      const mutable_buffer & b);
  ``  [''''&raquo;''' [link asio.reference.mutable_buffers_1.mutable_buffers_1.overload2 more...]]``


[section:overload1 mutable_buffers_1::mutable_buffers_1 (1 of 2 overloads)]


Construct to represent a given memory range. 


  mutable_buffers_1(
      void * data,
      std::size_t size);



[endsect]



[section:overload2 mutable_buffers_1::mutable_buffers_1 (2 of 2 overloads)]


Construct to represent a single modifiable buffer. 


  mutable_buffers_1(
      const mutable_buffer & b);



[endsect]


[endsect]

[section:operator_plus_ mutable_buffers_1::operator+]

[indexterm2 asio.indexterm.mutable_buffers_1.operator_plus_..operator+..mutable_buffers_1] 
Create a new modifiable buffer that is offset from the start of another. 


  mutable_buffer ``[link asio.reference.mutable_buffers_1.operator_plus_.overload1 operator+]``(
      const mutable_buffer & b,
      std::size_t n);
  ``  [''''&raquo;''' [link asio.reference.mutable_buffers_1.operator_plus_.overload1 more...]]``

  mutable_buffer ``[link asio.reference.mutable_buffers_1.operator_plus_.overload2 operator+]``(
      std::size_t n,
      const mutable_buffer & b);
  ``  [''''&raquo;''' [link asio.reference.mutable_buffers_1.operator_plus_.overload2 more...]]``


[section:overload1 mutable_buffers_1::operator+ (1 of 2 overloads)]


['Inherited from mutable_buffer.]


Create a new modifiable buffer that is offset from the start of another. 


  mutable_buffer operator+(
      const mutable_buffer & b,
      std::size_t n);



[endsect]



[section:overload2 mutable_buffers_1::operator+ (2 of 2 overloads)]


['Inherited from mutable_buffer.]


Create a new modifiable buffer that is offset from the start of another. 


  mutable_buffer operator+(
      std::size_t n,
      const mutable_buffer & b);



[endsect]


[endsect]


[section:operator_plus__eq_ mutable_buffers_1::operator+=]


['Inherited from mutable_buffer.]

[indexterm2 asio.indexterm.mutable_buffers_1.operator_plus__eq_..operator+=..mutable_buffers_1] 
Move the start of the buffer by the specified number of bytes. 


  mutable_buffer & operator+=(
      std::size_t n);



[endsect]



[section:size mutable_buffers_1::size]


['Inherited from mutable_buffer.]

[indexterm2 asio.indexterm.mutable_buffers_1.size..size..mutable_buffers_1] 
Get the size of the memory range. 


  std::size_t size() const;



[endsect]



[section:value_type mutable_buffers_1::value_type]

[indexterm2 asio.indexterm.mutable_buffers_1.value_type..value_type..mutable_buffers_1] 
The type for each element in the list of buffers. 


  typedef mutable_buffer value_type;


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.mutable_buffer.data [*data]]]
    [Get a pointer to the beginning of the memory range. ]
  ]
  
  [
    [[link asio.reference.mutable_buffer.mutable_buffer [*mutable_buffer]] [constructor]]
    [Construct an empty buffer. 
     [hr]
     Construct a buffer to represent a given memory range. ]
  ]
  
  [
    [[link asio.reference.mutable_buffer.operator_plus__eq_ [*operator+=]]]
    [Move the start of the buffer by the specified number of bytes. ]
  ]
  
  [
    [[link asio.reference.mutable_buffer.size [*size]]]
    [Get the size of the memory range. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.mutable_buffer.operator_plus_ [*operator+]]]
    [Create a new modifiable buffer that is offset from the start of another. ]
  ]
  
]

The [link asio.reference.mutable_buffer `mutable_buffer`] class provides a safe representation of a buffer that can be modified. It does not own the underlying data, and so is cheap to copy or assign.


[heading Accessing Buffer Contents]
  


The contents of a buffer may be accessed using the `data()` and `size()` member functions:



   asio::mutable_buffer b1 = ...;
   std::size_t s1 = b1.size();
   unsigned char* p1 = static_cast<unsigned char*>(b1.data());




The `data()` member function permits violations of type safety, so uses of it in application code should be carefully considered. 


[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:null_buffers null_buffers]


(Deprecated: Use the socket/descriptor wait() and async\_wait() member functions.) An implementation of both the ConstBufferSequence and MutableBufferSequence concepts to represent a null buffer sequence. 


  class null_buffers


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.null_buffers.const_iterator [*const_iterator]]]
    [A random-access iterator type that may be used to read elements. ]
  
  ]

  [

    [[link asio.reference.null_buffers.value_type [*value_type]]]
    [The type for each element in the list of buffers. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.null_buffers.begin [*begin]]]
    [Get a random-access iterator to the first element. ]
  ]
  
  [
    [[link asio.reference.null_buffers.end [*end]]]
    [Get a random-access iterator for one past the last element. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[section:begin null_buffers::begin]

[indexterm2 asio.indexterm.null_buffers.begin..begin..null_buffers] 
Get a random-access iterator to the first element. 


  const_iterator begin() const;



[endsect]



[section:const_iterator null_buffers::const_iterator]

[indexterm2 asio.indexterm.null_buffers.const_iterator..const_iterator..null_buffers] 
A random-access iterator type that may be used to read elements. 


  typedef const mutable_buffer * const_iterator;



[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:end null_buffers::end]

[indexterm2 asio.indexterm.null_buffers.end..end..null_buffers] 
Get a random-access iterator for one past the last element. 


  const_iterator end() const;



[endsect]



[section:value_type null_buffers::value_type]

[indexterm2 asio.indexterm.null_buffers.value_type..value_type..null_buffers] 
The type for each element in the list of buffers. 


  typedef mutable_buffer value_type;


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.mutable_buffer.data [*data]]]
    [Get a pointer to the beginning of the memory range. ]
  ]
  
  [
    [[link asio.reference.mutable_buffer.mutable_buffer [*mutable_buffer]] [constructor]]
    [Construct an empty buffer. 
     [hr]
     Construct a buffer to represent a given memory range. ]
  ]
  
  [
    [[link asio.reference.mutable_buffer.operator_plus__eq_ [*operator+=]]]
    [Move the start of the buffer by the specified number of bytes. ]
  ]
  
  [
    [[link asio.reference.mutable_buffer.size [*size]]]
    [Get the size of the memory range. ]
  ]
  
]

[heading Related Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.mutable_buffer.operator_plus_ [*operator+]]]
    [Create a new modifiable buffer that is offset from the start of another. ]
  ]
  
]

The [link asio.reference.mutable_buffer `mutable_buffer`] class provides a safe representation of a buffer that can be modified. It does not own the underlying data, and so is cheap to copy or assign.


[heading Accessing Buffer Contents]
  


The contents of a buffer may be accessed using the `data()` and `size()` member functions:



   asio::mutable_buffer b1 = ...;
   std::size_t s1 = b1.size();
   unsigned char* p1 = static_cast<unsigned char*>(b1.data());




The `data()` member function permits violations of type safety, so uses of it in application code should be carefully considered. 


[heading Requirements]

['Header: ][^asio/buffer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]


[section:operator_lt__lt_ operator<<]

[indexterm1 asio.indexterm.operator_lt__lt_..operator<<] 
Output an error code. 


  template<
      typename Elem,
      typename Traits>
  std::basic_ostream< Elem, Traits > & operator<<(
      std::basic_ostream< Elem, Traits > & os,
      const error_code & ec);


[heading Requirements]

['Header: ][^asio/error_code.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:placeholders__bytes_transferred placeholders::bytes_transferred]

[indexterm1 asio.indexterm.placeholders__bytes_transferred..placeholders::bytes_transferred] 
An argument placeholder, for use with boost::bind(), that corresponds to the bytes\_transferred argument of a handler for asynchronous functions such as `asio::basic_stream_socket::async_write_some` or `asio::async_write`. 


  unspecified bytes_transferred;


[heading Requirements]

['Header: ][^asio/placeholders.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:placeholders__endpoint placeholders::endpoint]

[indexterm1 asio.indexterm.placeholders__endpoint..placeholders::endpoint] 
An argument placeholder, for use with boost::bind(), that corresponds to the results argument of a handler for asynchronous functions such as `asio::async_connect`. 


  unspecified endpoint;


[heading Requirements]

['Header: ][^asio/placeholders.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:placeholders__error placeholders::error]

[indexterm1 asio.indexterm.placeholders__error..placeholders::error] 
An argument placeholder, for use with boost::bind(), that corresponds to the error argument of a handler for any of the asynchronous functions. 


  unspecified error;


[heading Requirements]

['Header: ][^asio/placeholders.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:placeholders__iterator placeholders::iterator]

[indexterm1 asio.indexterm.placeholders__iterator..placeholders::iterator] 
An argument placeholder, for use with boost::bind(), that corresponds to the iterator argument of a handler for asynchronous functions such as `asio::async_connect`. 


  unspecified iterator;


[heading Requirements]

['Header: ][^asio/placeholders.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:placeholders__results placeholders::results]

[indexterm1 asio.indexterm.placeholders__results..placeholders::results] 
An argument placeholder, for use with boost::bind(), that corresponds to the results argument of a handler for asynchronous functions such as asio::basic\_resolver::async\_resolve. 


  unspecified results;


[heading Requirements]

['Header: ][^asio/placeholders.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:placeholders__signal_number placeholders::signal_number]

[indexterm1 asio.indexterm.placeholders__signal_number..placeholders::signal_number] 
An argument placeholder, for use with boost::bind(), that corresponds to the signal\_number argument of a handler for asynchronous functions such as `asio::signal_set::async_wait`. 


  unspecified signal_number;


[heading Requirements]

['Header: ][^asio/placeholders.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:posix__basic_descriptor posix::basic_descriptor]


Provides POSIX descriptor functionality. 


  template<
      typename ``[link asio.reference.Executor1 Executor]`` = any_io_executor>
  class basic_descriptor :
    public posix::descriptor_base


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.posix__basic_descriptor__rebind_executor [*rebind_executor]]]
    [Rebinds the descriptor type to another executor. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.lowest_layer_type [*lowest_layer_type]]]
    [A descriptor is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.native_handle_type [*native_handle_type]]]
    [The native representation of a descriptor. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.posix__basic_descriptor.assign [*assign]]]
    [Assign an existing native descriptor to the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.async_wait [*async_wait]]]
    [Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.basic_descriptor [*basic_descriptor]] [constructor]]
    [Construct a descriptor without opening it. 
     [hr]
     Construct a descriptor on an existing native descriptor. 
     [hr]
     Move-construct a descriptor from another. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.close [*close]]]
    [Close the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.io_control [*io_control]]]
    [Perform an IO control command on the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.is_open [*is_open]]]
    [Determine whether the descriptor is open. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.native_handle [*native_handle]]]
    [Get the native descriptor representation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native descriptor implementation. 
     [hr]
     Sets the non-blocking mode of the native descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the descriptor. 
     [hr]
     Sets the non-blocking mode of the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.operator_eq_ [*operator=]]]
    [Move-assign a descriptor from another. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.release [*release]]]
    [Release ownership of the native descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.wait [*wait]]]
    [Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.posix__basic_descriptor._basic_descriptor [*~basic_descriptor]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

The [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] class template provides the ability to wrap a POSIX descriptor.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/posix/basic_descriptor.hpp]

['Convenience header: ][^asio.hpp]

[section:assign posix::basic_descriptor::assign]

[indexterm2 asio.indexterm.posix__basic_descriptor.assign..assign..posix::basic_descriptor] 
Assign an existing native descriptor to the descriptor. 


  void ``[link asio.reference.posix__basic_descriptor.assign.overload1 assign]``(
      const native_handle_type & native_descriptor);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.assign.overload1 more...]]``

  void ``[link asio.reference.posix__basic_descriptor.assign.overload2 assign]``(
      const native_handle_type & native_descriptor,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.assign.overload2 more...]]``


[section:overload1 posix::basic_descriptor::assign (1 of 2 overloads)]


Assign an existing native descriptor to the descriptor. 


  void assign(
      const native_handle_type & native_descriptor);



[endsect]



[section:overload2 posix::basic_descriptor::assign (2 of 2 overloads)]


Assign an existing native descriptor to the descriptor. 


  void assign(
      const native_handle_type & native_descriptor,
      asio::error_code & ec);



[endsect]


[endsect]


[section:async_wait posix::basic_descriptor::async_wait]

[indexterm2 asio.indexterm.posix__basic_descriptor.async_wait..async_wait..posix::basic_descriptor] 
Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. 


  template<
      typename ``[link asio.reference.WaitHandler WaitHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_wait(
      wait_type w,
      WaitHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to perform an asynchronous wait for a descriptor to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired descriptor state.]]

[[handler][The handler to be called when the wait operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error // Result of operation
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  


   void wait_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Wait succeeded.
     }
   }

   ...

   asio::posix::stream_descriptor descriptor(my_context);
   ...
   descriptor.async_wait(
       asio::posix::stream_descriptor::wait_read,
       wait_handler);







[endsect]


[section:basic_descriptor posix::basic_descriptor::basic_descriptor]

[indexterm2 asio.indexterm.posix__basic_descriptor.basic_descriptor..basic_descriptor..posix::basic_descriptor] 
Construct a descriptor without opening it. 


  explicit ``[link asio.reference.posix__basic_descriptor.basic_descriptor.overload1 basic_descriptor]``(
      const executor_type & ex);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.basic_descriptor.overload1 more...]]``

  template<
      typename ExecutionContext>
  explicit ``[link asio.reference.posix__basic_descriptor.basic_descriptor.overload2 basic_descriptor]``(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.basic_descriptor.overload2 more...]]``


Construct a descriptor on an existing native descriptor. 


  ``[link asio.reference.posix__basic_descriptor.basic_descriptor.overload3 basic_descriptor]``(
      const executor_type & ex,
      const native_handle_type & native_descriptor);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.basic_descriptor.overload3 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.posix__basic_descriptor.basic_descriptor.overload4 basic_descriptor]``(
      ExecutionContext & context,
      const native_handle_type & native_descriptor,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.basic_descriptor.overload4 more...]]``


Move-construct a descriptor from another. 


  ``[link asio.reference.posix__basic_descriptor.basic_descriptor.overload5 basic_descriptor]``(
      basic_descriptor && other);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.basic_descriptor.overload5 more...]]``


[section:overload1 posix::basic_descriptor::basic_descriptor (1 of 5 overloads)]


Construct a descriptor without opening it. 


  basic_descriptor(
      const executor_type & ex);


This constructor creates a descriptor without opening it.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the descriptor will use, by default, to dispatch handlers for any asynchronous operations performed on the descriptor. ]]

]




[endsect]



[section:overload2 posix::basic_descriptor::basic_descriptor (2 of 5 overloads)]


Construct a descriptor without opening it. 


  template<
      typename ExecutionContext>
  basic_descriptor(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a descriptor without opening it.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the descriptor will use, by default, to dispatch handlers for any asynchronous operations performed on the descriptor. ]]

]




[endsect]



[section:overload3 posix::basic_descriptor::basic_descriptor (3 of 5 overloads)]


Construct a descriptor on an existing native descriptor. 


  basic_descriptor(
      const executor_type & ex,
      const native_handle_type & native_descriptor);


This constructor creates a descriptor object to hold an existing native descriptor.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the descriptor will use, by default, to dispatch handlers for any asynchronous operations performed on the descriptor.]]

[[native_descriptor][A native descriptor.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload4 posix::basic_descriptor::basic_descriptor (4 of 5 overloads)]


Construct a descriptor on an existing native descriptor. 


  template<
      typename ExecutionContext>
  basic_descriptor(
      ExecutionContext & context,
      const native_handle_type & native_descriptor,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a descriptor object to hold an existing native descriptor.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the descriptor will use, by default, to dispatch handlers for any asynchronous operations performed on the descriptor.]]

[[native_descriptor][A native descriptor.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload5 posix::basic_descriptor::basic_descriptor (5 of 5 overloads)]


Move-construct a descriptor from another. 


  basic_descriptor(
      basic_descriptor && other);


This constructor moves a descriptor from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other descriptor object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_descriptor(const executor_type&)` constructor. 




[endsect]


[endsect]


[section:bytes_readable posix::basic_descriptor::bytes_readable]


['Inherited from posix::descriptor_base.]

[indexterm2 asio.indexterm.posix__basic_descriptor.bytes_readable..bytes_readable..posix::basic_descriptor] 
IO control command to get the amount of data that can be read without blocking. 


  typedef implementation_defined bytes_readable;



Implements the FIONREAD IO control command.


[heading Example]
  


   asio::posix::stream_descriptor descriptor(my_context);
   ...
   asio::descriptor_base::bytes_readable command(true);
   descriptor.io_control(command);
   std::size_t bytes_readable = command.get();







[heading Requirements]

['Header: ][^asio/posix/basic_descriptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:cancel posix::basic_descriptor::cancel]

[indexterm2 asio.indexterm.posix__basic_descriptor.cancel..cancel..posix::basic_descriptor] 
Cancel all asynchronous operations associated with the descriptor. 


  void ``[link asio.reference.posix__basic_descriptor.cancel.overload1 cancel]``();
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.cancel.overload1 more...]]``

  void ``[link asio.reference.posix__basic_descriptor.cancel.overload2 cancel]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.cancel.overload2 more...]]``


[section:overload1 posix::basic_descriptor::cancel (1 of 2 overloads)]


Cancel all asynchronous operations associated with the descriptor. 


  void cancel();


This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 posix::basic_descriptor::cancel (2 of 2 overloads)]


Cancel all asynchronous operations associated with the descriptor. 


  void cancel(
      asio::error_code & ec);


This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. ]]

]




[endsect]


[endsect]

[section:close posix::basic_descriptor::close]

[indexterm2 asio.indexterm.posix__basic_descriptor.close..close..posix::basic_descriptor] 
Close the descriptor. 


  void ``[link asio.reference.posix__basic_descriptor.close.overload1 close]``();
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.close.overload1 more...]]``

  void ``[link asio.reference.posix__basic_descriptor.close.overload2 close]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.close.overload2 more...]]``


[section:overload1 posix::basic_descriptor::close (1 of 2 overloads)]


Close the descriptor. 


  void close();


This function is used to close the descriptor. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed. ]]

]




[endsect]



[section:overload2 posix::basic_descriptor::close (2 of 2 overloads)]


Close the descriptor. 


  void close(
      asio::error_code & ec);


This function is used to close the descriptor. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed. ]]

]




[endsect]


[endsect]


[section:executor_type posix::basic_descriptor::executor_type]

[indexterm2 asio.indexterm.posix__basic_descriptor.executor_type..executor_type..posix::basic_descriptor] 
The type of the executor associated with the object. 


  typedef Executor executor_type;



[heading Requirements]

['Header: ][^asio/posix/basic_descriptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:get_executor posix::basic_descriptor::get_executor]

[indexterm2 asio.indexterm.posix__basic_descriptor.get_executor..get_executor..posix::basic_descriptor] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:io_control posix::basic_descriptor::io_control]

[indexterm2 asio.indexterm.posix__basic_descriptor.io_control..io_control..posix::basic_descriptor] 
Perform an IO control command on the descriptor. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void ``[link asio.reference.posix__basic_descriptor.io_control.overload1 io_control]``(
      IoControlCommand & command);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.io_control.overload1 more...]]``

  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void ``[link asio.reference.posix__basic_descriptor.io_control.overload2 io_control]``(
      IoControlCommand & command,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.io_control.overload2 more...]]``


[section:overload1 posix::basic_descriptor::io_control (1 of 2 overloads)]


Perform an IO control command on the descriptor. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void io_control(
      IoControlCommand & command);


This function is used to execute an IO control command on the descriptor.


[heading Parameters]
    

[variablelist
  
[[command][The IO control command to be performed on the descriptor.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]



[heading Example]
  
Getting the number of bytes ready to read: 

   asio::posix::stream_descriptor descriptor(my_context);
   ...
   asio::posix::stream_descriptor::bytes_readable command;
   descriptor.io_control(command);
   std::size_t bytes_readable = command.get();







[endsect]



[section:overload2 posix::basic_descriptor::io_control (2 of 2 overloads)]


Perform an IO control command on the descriptor. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void io_control(
      IoControlCommand & command,
      asio::error_code & ec);


This function is used to execute an IO control command on the descriptor.


[heading Parameters]
    

[variablelist
  
[[command][The IO control command to be performed on the descriptor.]]

[[ec][Set to indicate what error occurred, if any.]]

]



[heading Example]
  
Getting the number of bytes ready to read: 

   asio::posix::stream_descriptor descriptor(my_context);
   ...
   asio::posix::stream_descriptor::bytes_readable command;
   asio::error_code ec;
   descriptor.io_control(command, ec);
   if (ec)
   {
     // An error occurred.
   }
   std::size_t bytes_readable = command.get();







[endsect]


[endsect]


[section:is_open posix::basic_descriptor::is_open]

[indexterm2 asio.indexterm.posix__basic_descriptor.is_open..is_open..posix::basic_descriptor] 
Determine whether the descriptor is open. 


  bool is_open() const;



[endsect]


[section:lowest_layer posix::basic_descriptor::lowest_layer]

[indexterm2 asio.indexterm.posix__basic_descriptor.lowest_layer..lowest_layer..posix::basic_descriptor] 
Get a reference to the lowest layer. 


  lowest_layer_type & ``[link asio.reference.posix__basic_descriptor.lowest_layer.overload1 lowest_layer]``();
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.lowest_layer.overload1 more...]]``


Get a const reference to the lowest layer. 


  const lowest_layer_type & ``[link asio.reference.posix__basic_descriptor.lowest_layer.overload2 lowest_layer]``() const;
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.lowest_layer.overload2 more...]]``


[section:overload1 posix::basic_descriptor::lowest_layer (1 of 2 overloads)]


Get a reference to the lowest layer. 


  lowest_layer_type & lowest_layer();


This function returns a reference to the lowest layer in a stack of layers. Since a descriptor cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]



[section:overload2 posix::basic_descriptor::lowest_layer (2 of 2 overloads)]


Get a const reference to the lowest layer. 


  const lowest_layer_type & lowest_layer() const;


This function returns a const reference to the lowest layer in a stack of layers. Since a descriptor cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]


[endsect]


[section:lowest_layer_type posix::basic_descriptor::lowest_layer_type]

[indexterm2 asio.indexterm.posix__basic_descriptor.lowest_layer_type..lowest_layer_type..posix::basic_descriptor] 
A descriptor is always the lowest layer. 


  typedef basic_descriptor lowest_layer_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.posix__basic_descriptor__rebind_executor [*rebind_executor]]]
    [Rebinds the descriptor type to another executor. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.lowest_layer_type [*lowest_layer_type]]]
    [A descriptor is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.native_handle_type [*native_handle_type]]]
    [The native representation of a descriptor. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.posix__basic_descriptor.assign [*assign]]]
    [Assign an existing native descriptor to the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.async_wait [*async_wait]]]
    [Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.basic_descriptor [*basic_descriptor]] [constructor]]
    [Construct a descriptor without opening it. 
     [hr]
     Construct a descriptor on an existing native descriptor. 
     [hr]
     Move-construct a descriptor from another. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.close [*close]]]
    [Close the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.io_control [*io_control]]]
    [Perform an IO control command on the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.is_open [*is_open]]]
    [Determine whether the descriptor is open. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.native_handle [*native_handle]]]
    [Get the native descriptor representation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native descriptor implementation. 
     [hr]
     Sets the non-blocking mode of the native descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the descriptor. 
     [hr]
     Sets the non-blocking mode of the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.operator_eq_ [*operator=]]]
    [Move-assign a descriptor from another. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.release [*release]]]
    [Release ownership of the native descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.wait [*wait]]]
    [Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.posix__basic_descriptor._basic_descriptor [*~basic_descriptor]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

The [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] class template provides the ability to wrap a POSIX descriptor.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/posix/basic_descriptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:native_handle posix::basic_descriptor::native_handle]

[indexterm2 asio.indexterm.posix__basic_descriptor.native_handle..native_handle..posix::basic_descriptor] 
Get the native descriptor representation. 


  native_handle_type native_handle();


This function may be used to obtain the underlying representation of the descriptor. This is intended to allow access to native descriptor functionality that is not otherwise provided. 


[endsect]



[section:native_handle_type posix::basic_descriptor::native_handle_type]

[indexterm2 asio.indexterm.posix__basic_descriptor.native_handle_type..native_handle_type..posix::basic_descriptor] 
The native representation of a descriptor. 


  typedef implementation_defined native_handle_type;



[heading Requirements]

['Header: ][^asio/posix/basic_descriptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:native_non_blocking posix::basic_descriptor::native_non_blocking]

[indexterm2 asio.indexterm.posix__basic_descriptor.native_non_blocking..native_non_blocking..posix::basic_descriptor] 
Gets the non-blocking mode of the native descriptor implementation. 


  bool ``[link asio.reference.posix__basic_descriptor.native_non_blocking.overload1 native_non_blocking]``() const;
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.native_non_blocking.overload1 more...]]``


Sets the non-blocking mode of the native descriptor implementation. 


  void ``[link asio.reference.posix__basic_descriptor.native_non_blocking.overload2 native_non_blocking]``(
      bool mode);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.native_non_blocking.overload2 more...]]``

  void ``[link asio.reference.posix__basic_descriptor.native_non_blocking.overload3 native_non_blocking]``(
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.native_non_blocking.overload3 more...]]``


[section:overload1 posix::basic_descriptor::native_non_blocking (1 of 3 overloads)]


Gets the non-blocking mode of the native descriptor implementation. 


  bool native_non_blocking() const;


This function is used to retrieve the non-blocking mode of the underlying native descriptor. This mode has no effect on the behaviour of the descriptor object's synchronous operations.


[heading Return Value]
      
`true` if the underlying descriptor is in non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).


[heading Remarks]
      
The current non-blocking mode is cached by the descriptor object. Consequently, the return value may be incorrect if the non-blocking mode was set directly on the native descriptor. 




[endsect]



[section:overload2 posix::basic_descriptor::native_non_blocking (2 of 3 overloads)]


Sets the non-blocking mode of the native descriptor implementation. 


  void native_non_blocking(
      bool mode);


This function is used to modify the non-blocking mode of the underlying native descriptor. It has no effect on the behaviour of the descriptor object's synchronous operations.


[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the underlying descriptor is put into non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. If the `mode` is `false`, but the current value of `non_blocking()` is `true`, this function fails with `asio::error::invalid_argument`, as the combination does not make sense. ]]

]




[endsect]



[section:overload3 posix::basic_descriptor::native_non_blocking (3 of 3 overloads)]


Sets the non-blocking mode of the native descriptor implementation. 


  void native_non_blocking(
      bool mode,
      asio::error_code & ec);


This function is used to modify the non-blocking mode of the underlying native descriptor. It has no effect on the behaviour of the descriptor object's synchronous operations.


[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the underlying descriptor is put into non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).]]

[[ec][Set to indicate what error occurred, if any. If the `mode` is `false`, but the current value of `non_blocking()` is `true`, this function fails with `asio::error::invalid_argument`, as the combination does not make sense. ]]

]




[endsect]


[endsect]

[section:non_blocking posix::basic_descriptor::non_blocking]

[indexterm2 asio.indexterm.posix__basic_descriptor.non_blocking..non_blocking..posix::basic_descriptor] 
Gets the non-blocking mode of the descriptor. 


  bool ``[link asio.reference.posix__basic_descriptor.non_blocking.overload1 non_blocking]``() const;
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.non_blocking.overload1 more...]]``


Sets the non-blocking mode of the descriptor. 


  void ``[link asio.reference.posix__basic_descriptor.non_blocking.overload2 non_blocking]``(
      bool mode);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.non_blocking.overload2 more...]]``

  void ``[link asio.reference.posix__basic_descriptor.non_blocking.overload3 non_blocking]``(
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.non_blocking.overload3 more...]]``


[section:overload1 posix::basic_descriptor::non_blocking (1 of 3 overloads)]


Gets the non-blocking mode of the descriptor. 


  bool non_blocking() const;



[heading Return Value]
      
`true` if the descriptor's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]



[section:overload2 posix::basic_descriptor::non_blocking (2 of 3 overloads)]


Sets the non-blocking mode of the descriptor. 


  void non_blocking(
      bool mode);



[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the descriptor's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]



[section:overload3 posix::basic_descriptor::non_blocking (3 of 3 overloads)]


Sets the non-blocking mode of the descriptor. 


  void non_blocking(
      bool mode,
      asio::error_code & ec);



[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the descriptor's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]


[endsect]


[section:operator_eq_ posix::basic_descriptor::operator=]

[indexterm2 asio.indexterm.posix__basic_descriptor.operator_eq_..operator=..posix::basic_descriptor] 
Move-assign a descriptor from another. 


  basic_descriptor & operator=(
      basic_descriptor && other);


This assignment operator moves a descriptor from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other descriptor object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_descriptor(const executor_type&)` constructor. 




[endsect]



[section:release posix::basic_descriptor::release]

[indexterm2 asio.indexterm.posix__basic_descriptor.release..release..posix::basic_descriptor] 
Release ownership of the native descriptor implementation. 


  native_handle_type release();


This function may be used to obtain the underlying representation of the descriptor. After calling this function, `is_open()` returns false. The caller is responsible for closing the descriptor.

All outstanding asynchronous read or write operations will finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error. 


[endsect]


[section:wait posix::basic_descriptor::wait]

[indexterm2 asio.indexterm.posix__basic_descriptor.wait..wait..posix::basic_descriptor] 
Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. 


  void ``[link asio.reference.posix__basic_descriptor.wait.overload1 wait]``(
      wait_type w);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.wait.overload1 more...]]``

  void ``[link asio.reference.posix__basic_descriptor.wait.overload2 wait]``(
      wait_type w,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.wait.overload2 more...]]``


[section:overload1 posix::basic_descriptor::wait (1 of 2 overloads)]


Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. 


  void wait(
      wait_type w);


This function is used to perform a blocking wait for a descriptor to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired descriptor state.]]

]


[heading Example]
  
Waiting for a descriptor to become readable. 

   asio::posix::stream_descriptor descriptor(my_context);
   ...
   descriptor.wait(asio::posix::stream_descriptor::wait_read);







[endsect]



[section:overload2 posix::basic_descriptor::wait (2 of 2 overloads)]


Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. 


  void wait(
      wait_type w,
      asio::error_code & ec);


This function is used to perform a blocking wait for a descriptor to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired descriptor state.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  
Waiting for a descriptor to become readable. 

   asio::posix::stream_descriptor descriptor(my_context);
   ...
   asio::error_code ec;
   descriptor.wait(asio::posix::stream_descriptor::wait_read, ec);







[endsect]


[endsect]


[section:wait_type posix::basic_descriptor::wait_type]


['Inherited from posix::descriptor_base.]

[indexterm2 asio.indexterm.posix__basic_descriptor.wait_type..wait_type..posix::basic_descriptor] 
Wait types. 


  enum wait_type

[indexterm2 asio.indexterm.posix__basic_descriptor.wait_type.wait_read..wait_read..posix::basic_descriptor]
[indexterm2 asio.indexterm.posix__basic_descriptor.wait_type.wait_write..wait_write..posix::basic_descriptor]
[indexterm2 asio.indexterm.posix__basic_descriptor.wait_type.wait_error..wait_error..posix::basic_descriptor]

[heading Values]
[variablelist

  [
    [wait_read]
    [Wait for a descriptor to become ready to read. ]
  ]

  [
    [wait_write]
    [Wait for a descriptor to become ready to write. ]
  ]

  [
    [wait_error]
    [Wait for a descriptor to have error conditions pending. ]
  ]

]


For use with `descriptor::wait()` and `descriptor::async_wait()`. 


[endsect]



[section:_basic_descriptor posix::basic_descriptor::~basic_descriptor]

[indexterm2 asio.indexterm.posix__basic_descriptor._basic_descriptor..~basic_descriptor..posix::basic_descriptor] 
Protected destructor to prevent deletion through this type. 


  ~basic_descriptor();


This function destroys the descriptor, cancelling any outstanding asynchronous wait operations associated with the descriptor as if by calling `cancel`. 


[endsect]



[endsect]

[section:posix__basic_descriptor__rebind_executor posix::basic_descriptor::rebind_executor]


Rebinds the descriptor type to another executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  struct rebind_executor


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.posix__basic_descriptor__rebind_executor.other [*other]]]
    [The descriptor type when rebound to the specified executor. ]
  
  ]

]

[heading Requirements]

['Header: ][^asio/posix/basic_descriptor.hpp]

['Convenience header: ][^asio.hpp]


[section:other posix::basic_descriptor::rebind_executor::other]

[indexterm2 asio.indexterm.posix__basic_descriptor__rebind_executor.other..other..posix::basic_descriptor::rebind_executor] 
The descriptor type when rebound to the specified executor. 


  typedef basic_descriptor< Executor1 > other;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.posix__basic_descriptor__rebind_executor [*rebind_executor]]]
    [Rebinds the descriptor type to another executor. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.lowest_layer_type [*lowest_layer_type]]]
    [A descriptor is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.native_handle_type [*native_handle_type]]]
    [The native representation of a descriptor. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.posix__basic_descriptor.assign [*assign]]]
    [Assign an existing native descriptor to the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.async_wait [*async_wait]]]
    [Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.basic_descriptor [*basic_descriptor]] [constructor]]
    [Construct a descriptor without opening it. 
     [hr]
     Construct a descriptor on an existing native descriptor. 
     [hr]
     Move-construct a descriptor from another. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.close [*close]]]
    [Close the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.io_control [*io_control]]]
    [Perform an IO control command on the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.is_open [*is_open]]]
    [Determine whether the descriptor is open. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.native_handle [*native_handle]]]
    [Get the native descriptor representation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native descriptor implementation. 
     [hr]
     Sets the non-blocking mode of the native descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the descriptor. 
     [hr]
     Sets the non-blocking mode of the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.operator_eq_ [*operator=]]]
    [Move-assign a descriptor from another. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.release [*release]]]
    [Release ownership of the native descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.wait [*wait]]]
    [Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.posix__basic_descriptor._basic_descriptor [*~basic_descriptor]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

The [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] class template provides the ability to wrap a POSIX descriptor.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/posix/basic_descriptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:posix__basic_stream_descriptor posix::basic_stream_descriptor]


Provides stream-oriented descriptor functionality. 


  template<
      typename ``[link asio.reference.Executor1 Executor]`` = any_io_executor>
  class basic_stream_descriptor :
    public posix::basic_descriptor< Executor >


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.posix__basic_stream_descriptor__rebind_executor [*rebind_executor]]]
    [Rebinds the descriptor type to another executor. ]
  
  ]

  [

    [[link asio.reference.posix__basic_stream_descriptor.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.posix__basic_stream_descriptor.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.posix__basic_stream_descriptor.lowest_layer_type [*lowest_layer_type]]]
    [A descriptor is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.posix__basic_stream_descriptor.native_handle_type [*native_handle_type]]]
    [The native representation of a descriptor. ]
  
  ]

  [

    [[link asio.reference.posix__basic_stream_descriptor.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.posix__basic_stream_descriptor.assign [*assign]]]
    [Assign an existing native descriptor to the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.async_read_some [*async_read_some]]]
    [Start an asynchronous read. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.async_wait [*async_wait]]]
    [Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.async_write_some [*async_write_some]]]
    [Start an asynchronous write. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor [*basic_stream_descriptor]] [constructor]]
    [Construct a stream descriptor without opening it. 
     [hr]
     Construct a stream descriptor on an existing native descriptor. 
     [hr]
     Move-construct a stream descriptor from another. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.close [*close]]]
    [Close the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.io_control [*io_control]]]
    [Perform an IO control command on the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.is_open [*is_open]]]
    [Determine whether the descriptor is open. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.native_handle [*native_handle]]]
    [Get the native descriptor representation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native descriptor implementation. 
     [hr]
     Sets the non-blocking mode of the native descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the descriptor. 
     [hr]
     Sets the non-blocking mode of the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.operator_eq_ [*operator=]]]
    [Move-assign a stream descriptor from another. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.read_some [*read_some]]]
    [Read some data from the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.release [*release]]]
    [Release ownership of the native descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.wait [*wait]]]
    [Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.write_some [*write_some]]]
    [Write some data to the descriptor. ]
  ]
  
]

The [link asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] class template provides asynchronous and blocking stream-oriented descriptor functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.




[heading Requirements]

['Header: ][^asio/posix/basic_stream_descriptor.hpp]

['Convenience header: ][^asio.hpp]

[section:assign posix::basic_stream_descriptor::assign]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.assign..assign..posix::basic_stream_descriptor] 
Assign an existing native descriptor to the descriptor. 


  void ``[link asio.reference.posix__basic_stream_descriptor.assign.overload1 assign]``(
      const native_handle_type & native_descriptor);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.assign.overload1 more...]]``

  void ``[link asio.reference.posix__basic_stream_descriptor.assign.overload2 assign]``(
      const native_handle_type & native_descriptor,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.assign.overload2 more...]]``


[section:overload1 posix::basic_stream_descriptor::assign (1 of 2 overloads)]


['Inherited from posix::basic_descriptor.]


Assign an existing native descriptor to the descriptor. 


  void assign(
      const native_handle_type & native_descriptor);



[endsect]



[section:overload2 posix::basic_stream_descriptor::assign (2 of 2 overloads)]


['Inherited from posix::basic_descriptor.]


Assign an existing native descriptor to the descriptor. 


  void assign(
      const native_handle_type & native_descriptor,
      asio::error_code & ec);



[endsect]


[endsect]


[section:async_read_some posix::basic_stream_descriptor::async_read_some]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.async_read_some..async_read_some..posix::basic_stream_descriptor] 
Start an asynchronous read. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_some(
      const MutableBufferSequence & buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously read data from the stream descriptor. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes read.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
The read operation may not read all of the requested number of bytes. Consider using the [link asio.reference.async_read `async_read`]  function if you need to ensure that the requested amount of data is read before the asynchronous operation completes.


[heading Example]
  
To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   descriptor.async_read_some(asio::buffer(data, size), handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:async_wait posix::basic_stream_descriptor::async_wait]


['Inherited from posix::basic_descriptor.]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.async_wait..async_wait..posix::basic_stream_descriptor] 
Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. 


  template<
      typename ``[link asio.reference.WaitHandler WaitHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_wait(
      wait_type w,
      WaitHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to perform an asynchronous wait for a descriptor to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired descriptor state.]]

[[handler][The handler to be called when the wait operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error // Result of operation
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Example]
  


   void wait_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Wait succeeded.
     }
   }

   ...

   asio::posix::stream_descriptor descriptor(my_context);
   ...
   descriptor.async_wait(
       asio::posix::stream_descriptor::wait_read,
       wait_handler);







[endsect]



[section:async_write_some posix::basic_stream_descriptor::async_write_some]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.async_write_some..async_write_some..posix::basic_stream_descriptor] 
Start an asynchronous write. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_write_some(
      const ConstBufferSequence & buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously write data to the stream descriptor. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be written to the descriptor. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes written.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
The write operation may not transmit all of the data to the peer. Consider using the [link asio.reference.async_write `async_write`]  function if you need to ensure that all data is written before the asynchronous operation completes.


[heading Example]
  
To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   descriptor.async_write_some(asio::buffer(data, size), handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]


[section:basic_stream_descriptor posix::basic_stream_descriptor::basic_stream_descriptor]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.basic_stream_descriptor..basic_stream_descriptor..posix::basic_stream_descriptor] 
Construct a stream descriptor without opening it. 


  explicit ``[link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload1 basic_stream_descriptor]``(
      const executor_type & ex);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload1 more...]]``

  template<
      typename ExecutionContext>
  explicit ``[link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload2 basic_stream_descriptor]``(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload2 more...]]``


Construct a stream descriptor on an existing native descriptor. 


  ``[link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload3 basic_stream_descriptor]``(
      const executor_type & ex,
      const native_handle_type & native_descriptor);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload3 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload4 basic_stream_descriptor]``(
      ExecutionContext & context,
      const native_handle_type & native_descriptor,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload4 more...]]``


Move-construct a stream descriptor from another. 


  ``[link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload5 basic_stream_descriptor]``(
      basic_stream_descriptor && other);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload5 more...]]``


[section:overload1 posix::basic_stream_descriptor::basic_stream_descriptor (1 of 5 overloads)]


Construct a stream descriptor without opening it. 


  basic_stream_descriptor(
      const executor_type & ex);


This constructor creates a stream descriptor without opening it. The descriptor needs to be opened and then connected or accepted before data can be sent or received on it.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the descriptor will use, by default, to dispatch handlers for any asynchronous operations performed on the descriptor. ]]

]




[endsect]



[section:overload2 posix::basic_stream_descriptor::basic_stream_descriptor (2 of 5 overloads)]


Construct a stream descriptor without opening it. 


  template<
      typename ExecutionContext>
  basic_stream_descriptor(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a stream descriptor without opening it. The descriptor needs to be opened and then connected or accepted before data can be sent or received on it.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the descriptor will use, by default, to dispatch handlers for any asynchronous operations performed on the descriptor. ]]

]




[endsect]



[section:overload3 posix::basic_stream_descriptor::basic_stream_descriptor (3 of 5 overloads)]


Construct a stream descriptor on an existing native descriptor. 


  basic_stream_descriptor(
      const executor_type & ex,
      const native_handle_type & native_descriptor);


This constructor creates a stream descriptor object to hold an existing native descriptor.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the descriptor will use, by default, to dispatch handlers for any asynchronous operations performed on the descriptor.]]

[[native_descriptor][The new underlying descriptor implementation.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload4 posix::basic_stream_descriptor::basic_stream_descriptor (4 of 5 overloads)]


Construct a stream descriptor on an existing native descriptor. 


  template<
      typename ExecutionContext>
  basic_stream_descriptor(
      ExecutionContext & context,
      const native_handle_type & native_descriptor,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a stream descriptor object to hold an existing native descriptor.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the descriptor will use, by default, to dispatch handlers for any asynchronous operations performed on the descriptor.]]

[[native_descriptor][The new underlying descriptor implementation.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload5 posix::basic_stream_descriptor::basic_stream_descriptor (5 of 5 overloads)]


Move-construct a stream descriptor from another. 


  basic_stream_descriptor(
      basic_stream_descriptor && other);


This constructor moves a stream descriptor from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other stream descriptor object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_stream_descriptor(const executor_type&)` constructor. 




[endsect]


[endsect]


[section:bytes_readable posix::basic_stream_descriptor::bytes_readable]


['Inherited from posix::descriptor_base.]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.bytes_readable..bytes_readable..posix::basic_stream_descriptor] 
IO control command to get the amount of data that can be read without blocking. 


  typedef implementation_defined bytes_readable;



Implements the FIONREAD IO control command.


[heading Example]
  


   asio::posix::stream_descriptor descriptor(my_context);
   ...
   asio::descriptor_base::bytes_readable command(true);
   descriptor.io_control(command);
   std::size_t bytes_readable = command.get();







[heading Requirements]

['Header: ][^asio/posix/basic_stream_descriptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:cancel posix::basic_stream_descriptor::cancel]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.cancel..cancel..posix::basic_stream_descriptor] 
Cancel all asynchronous operations associated with the descriptor. 


  void ``[link asio.reference.posix__basic_stream_descriptor.cancel.overload1 cancel]``();
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.cancel.overload1 more...]]``

  void ``[link asio.reference.posix__basic_stream_descriptor.cancel.overload2 cancel]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.cancel.overload2 more...]]``


[section:overload1 posix::basic_stream_descriptor::cancel (1 of 2 overloads)]


['Inherited from posix::basic_descriptor.]


Cancel all asynchronous operations associated with the descriptor. 


  void cancel();


This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 posix::basic_stream_descriptor::cancel (2 of 2 overloads)]


['Inherited from posix::basic_descriptor.]


Cancel all asynchronous operations associated with the descriptor. 


  void cancel(
      asio::error_code & ec);


This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. ]]

]




[endsect]


[endsect]

[section:close posix::basic_stream_descriptor::close]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.close..close..posix::basic_stream_descriptor] 
Close the descriptor. 


  void ``[link asio.reference.posix__basic_stream_descriptor.close.overload1 close]``();
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.close.overload1 more...]]``

  void ``[link asio.reference.posix__basic_stream_descriptor.close.overload2 close]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.close.overload2 more...]]``


[section:overload1 posix::basic_stream_descriptor::close (1 of 2 overloads)]


['Inherited from posix::basic_descriptor.]


Close the descriptor. 


  void close();


This function is used to close the descriptor. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed. ]]

]




[endsect]



[section:overload2 posix::basic_stream_descriptor::close (2 of 2 overloads)]


['Inherited from posix::basic_descriptor.]


Close the descriptor. 


  void close(
      asio::error_code & ec);


This function is used to close the descriptor. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed. ]]

]




[endsect]


[endsect]


[section:executor_type posix::basic_stream_descriptor::executor_type]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.executor_type..executor_type..posix::basic_stream_descriptor] 
The type of the executor associated with the object. 


  typedef Executor executor_type;



[heading Requirements]

['Header: ][^asio/posix/basic_stream_descriptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:get_executor posix::basic_stream_descriptor::get_executor]


['Inherited from posix::basic_descriptor.]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.get_executor..get_executor..posix::basic_stream_descriptor] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:io_control posix::basic_stream_descriptor::io_control]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.io_control..io_control..posix::basic_stream_descriptor] 
Perform an IO control command on the descriptor. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void ``[link asio.reference.posix__basic_stream_descriptor.io_control.overload1 io_control]``(
      IoControlCommand & command);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.io_control.overload1 more...]]``

  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void ``[link asio.reference.posix__basic_stream_descriptor.io_control.overload2 io_control]``(
      IoControlCommand & command,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.io_control.overload2 more...]]``


[section:overload1 posix::basic_stream_descriptor::io_control (1 of 2 overloads)]


['Inherited from posix::basic_descriptor.]


Perform an IO control command on the descriptor. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void io_control(
      IoControlCommand & command);


This function is used to execute an IO control command on the descriptor.


[heading Parameters]
    

[variablelist
  
[[command][The IO control command to be performed on the descriptor.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]



[heading Example]
  
Getting the number of bytes ready to read: 

   asio::posix::stream_descriptor descriptor(my_context);
   ...
   asio::posix::stream_descriptor::bytes_readable command;
   descriptor.io_control(command);
   std::size_t bytes_readable = command.get();







[endsect]



[section:overload2 posix::basic_stream_descriptor::io_control (2 of 2 overloads)]


['Inherited from posix::basic_descriptor.]


Perform an IO control command on the descriptor. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  void io_control(
      IoControlCommand & command,
      asio::error_code & ec);


This function is used to execute an IO control command on the descriptor.


[heading Parameters]
    

[variablelist
  
[[command][The IO control command to be performed on the descriptor.]]

[[ec][Set to indicate what error occurred, if any.]]

]



[heading Example]
  
Getting the number of bytes ready to read: 

   asio::posix::stream_descriptor descriptor(my_context);
   ...
   asio::posix::stream_descriptor::bytes_readable command;
   asio::error_code ec;
   descriptor.io_control(command, ec);
   if (ec)
   {
     // An error occurred.
   }
   std::size_t bytes_readable = command.get();







[endsect]


[endsect]


[section:is_open posix::basic_stream_descriptor::is_open]


['Inherited from posix::basic_descriptor.]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.is_open..is_open..posix::basic_stream_descriptor] 
Determine whether the descriptor is open. 


  bool is_open() const;



[endsect]


[section:lowest_layer posix::basic_stream_descriptor::lowest_layer]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.lowest_layer..lowest_layer..posix::basic_stream_descriptor] 
Get a reference to the lowest layer. 


  lowest_layer_type & ``[link asio.reference.posix__basic_stream_descriptor.lowest_layer.overload1 lowest_layer]``();
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.lowest_layer.overload1 more...]]``


Get a const reference to the lowest layer. 


  const lowest_layer_type & ``[link asio.reference.posix__basic_stream_descriptor.lowest_layer.overload2 lowest_layer]``() const;
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.lowest_layer.overload2 more...]]``


[section:overload1 posix::basic_stream_descriptor::lowest_layer (1 of 2 overloads)]


['Inherited from posix::basic_descriptor.]


Get a reference to the lowest layer. 


  lowest_layer_type & lowest_layer();


This function returns a reference to the lowest layer in a stack of layers. Since a descriptor cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]



[section:overload2 posix::basic_stream_descriptor::lowest_layer (2 of 2 overloads)]


['Inherited from posix::basic_descriptor.]


Get a const reference to the lowest layer. 


  const lowest_layer_type & lowest_layer() const;


This function returns a const reference to the lowest layer in a stack of layers. Since a descriptor cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]


[endsect]


[section:lowest_layer_type posix::basic_stream_descriptor::lowest_layer_type]


['Inherited from posix::basic_descriptor.]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.lowest_layer_type..lowest_layer_type..posix::basic_stream_descriptor] 
A descriptor is always the lowest layer. 


  typedef basic_descriptor lowest_layer_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.posix__basic_descriptor__rebind_executor [*rebind_executor]]]
    [Rebinds the descriptor type to another executor. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.lowest_layer_type [*lowest_layer_type]]]
    [A descriptor is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.native_handle_type [*native_handle_type]]]
    [The native representation of a descriptor. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.posix__basic_descriptor.assign [*assign]]]
    [Assign an existing native descriptor to the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.async_wait [*async_wait]]]
    [Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.basic_descriptor [*basic_descriptor]] [constructor]]
    [Construct a descriptor without opening it. 
     [hr]
     Construct a descriptor on an existing native descriptor. 
     [hr]
     Move-construct a descriptor from another. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.close [*close]]]
    [Close the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.io_control [*io_control]]]
    [Perform an IO control command on the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.is_open [*is_open]]]
    [Determine whether the descriptor is open. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.native_handle [*native_handle]]]
    [Get the native descriptor representation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native descriptor implementation. 
     [hr]
     Sets the non-blocking mode of the native descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the descriptor. 
     [hr]
     Sets the non-blocking mode of the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.operator_eq_ [*operator=]]]
    [Move-assign a descriptor from another. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.release [*release]]]
    [Release ownership of the native descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.wait [*wait]]]
    [Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.posix__basic_descriptor._basic_descriptor [*~basic_descriptor]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

The [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] class template provides the ability to wrap a POSIX descriptor.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/posix/basic_stream_descriptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:native_handle posix::basic_stream_descriptor::native_handle]


['Inherited from posix::basic_descriptor.]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.native_handle..native_handle..posix::basic_stream_descriptor] 
Get the native descriptor representation. 


  native_handle_type native_handle();


This function may be used to obtain the underlying representation of the descriptor. This is intended to allow access to native descriptor functionality that is not otherwise provided. 


[endsect]



[section:native_handle_type posix::basic_stream_descriptor::native_handle_type]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.native_handle_type..native_handle_type..posix::basic_stream_descriptor] 
The native representation of a descriptor. 


  typedef basic_descriptor< Executor >::native_handle_type native_handle_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.posix__basic_descriptor__rebind_executor [*rebind_executor]]]
    [Rebinds the descriptor type to another executor. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.lowest_layer_type [*lowest_layer_type]]]
    [A descriptor is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.native_handle_type [*native_handle_type]]]
    [The native representation of a descriptor. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.posix__basic_descriptor.assign [*assign]]]
    [Assign an existing native descriptor to the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.async_wait [*async_wait]]]
    [Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.basic_descriptor [*basic_descriptor]] [constructor]]
    [Construct a descriptor without opening it. 
     [hr]
     Construct a descriptor on an existing native descriptor. 
     [hr]
     Move-construct a descriptor from another. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.close [*close]]]
    [Close the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.io_control [*io_control]]]
    [Perform an IO control command on the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.is_open [*is_open]]]
    [Determine whether the descriptor is open. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.native_handle [*native_handle]]]
    [Get the native descriptor representation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native descriptor implementation. 
     [hr]
     Sets the non-blocking mode of the native descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the descriptor. 
     [hr]
     Sets the non-blocking mode of the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.operator_eq_ [*operator=]]]
    [Move-assign a descriptor from another. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.release [*release]]]
    [Release ownership of the native descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.wait [*wait]]]
    [Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.posix__basic_descriptor._basic_descriptor [*~basic_descriptor]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

The [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] class template provides the ability to wrap a POSIX descriptor.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/posix/basic_stream_descriptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:native_non_blocking posix::basic_stream_descriptor::native_non_blocking]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.native_non_blocking..native_non_blocking..posix::basic_stream_descriptor] 
Gets the non-blocking mode of the native descriptor implementation. 


  bool ``[link asio.reference.posix__basic_stream_descriptor.native_non_blocking.overload1 native_non_blocking]``() const;
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.native_non_blocking.overload1 more...]]``


Sets the non-blocking mode of the native descriptor implementation. 


  void ``[link asio.reference.posix__basic_stream_descriptor.native_non_blocking.overload2 native_non_blocking]``(
      bool mode);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.native_non_blocking.overload2 more...]]``

  void ``[link asio.reference.posix__basic_stream_descriptor.native_non_blocking.overload3 native_non_blocking]``(
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.native_non_blocking.overload3 more...]]``


[section:overload1 posix::basic_stream_descriptor::native_non_blocking (1 of 3 overloads)]


['Inherited from posix::basic_descriptor.]


Gets the non-blocking mode of the native descriptor implementation. 


  bool native_non_blocking() const;


This function is used to retrieve the non-blocking mode of the underlying native descriptor. This mode has no effect on the behaviour of the descriptor object's synchronous operations.


[heading Return Value]
      
`true` if the underlying descriptor is in non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).


[heading Remarks]
      
The current non-blocking mode is cached by the descriptor object. Consequently, the return value may be incorrect if the non-blocking mode was set directly on the native descriptor. 




[endsect]



[section:overload2 posix::basic_stream_descriptor::native_non_blocking (2 of 3 overloads)]


['Inherited from posix::basic_descriptor.]


Sets the non-blocking mode of the native descriptor implementation. 


  void native_non_blocking(
      bool mode);


This function is used to modify the non-blocking mode of the underlying native descriptor. It has no effect on the behaviour of the descriptor object's synchronous operations.


[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the underlying descriptor is put into non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. If the `mode` is `false`, but the current value of `non_blocking()` is `true`, this function fails with `asio::error::invalid_argument`, as the combination does not make sense. ]]

]




[endsect]



[section:overload3 posix::basic_stream_descriptor::native_non_blocking (3 of 3 overloads)]


['Inherited from posix::basic_descriptor.]


Sets the non-blocking mode of the native descriptor implementation. 


  void native_non_blocking(
      bool mode,
      asio::error_code & ec);


This function is used to modify the non-blocking mode of the underlying native descriptor. It has no effect on the behaviour of the descriptor object's synchronous operations.


[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the underlying descriptor is put into non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).]]

[[ec][Set to indicate what error occurred, if any. If the `mode` is `false`, but the current value of `non_blocking()` is `true`, this function fails with `asio::error::invalid_argument`, as the combination does not make sense. ]]

]




[endsect]


[endsect]

[section:non_blocking posix::basic_stream_descriptor::non_blocking]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.non_blocking..non_blocking..posix::basic_stream_descriptor] 
Gets the non-blocking mode of the descriptor. 


  bool ``[link asio.reference.posix__basic_stream_descriptor.non_blocking.overload1 non_blocking]``() const;
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.non_blocking.overload1 more...]]``


Sets the non-blocking mode of the descriptor. 


  void ``[link asio.reference.posix__basic_stream_descriptor.non_blocking.overload2 non_blocking]``(
      bool mode);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.non_blocking.overload2 more...]]``

  void ``[link asio.reference.posix__basic_stream_descriptor.non_blocking.overload3 non_blocking]``(
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.non_blocking.overload3 more...]]``


[section:overload1 posix::basic_stream_descriptor::non_blocking (1 of 3 overloads)]


['Inherited from posix::basic_descriptor.]


Gets the non-blocking mode of the descriptor. 


  bool non_blocking() const;



[heading Return Value]
      
`true` if the descriptor's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]



[section:overload2 posix::basic_stream_descriptor::non_blocking (2 of 3 overloads)]


['Inherited from posix::basic_descriptor.]


Sets the non-blocking mode of the descriptor. 


  void non_blocking(
      bool mode);



[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the descriptor's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]



[section:overload3 posix::basic_stream_descriptor::non_blocking (3 of 3 overloads)]


['Inherited from posix::basic_descriptor.]


Sets the non-blocking mode of the descriptor. 


  void non_blocking(
      bool mode,
      asio::error_code & ec);



[heading Parameters]
    

[variablelist
  
[[mode][If `true`, the descriptor's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 




[endsect]


[endsect]


[section:operator_eq_ posix::basic_stream_descriptor::operator=]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.operator_eq_..operator=..posix::basic_stream_descriptor] 
Move-assign a stream descriptor from another. 


  basic_stream_descriptor & operator=(
      basic_stream_descriptor && other);


This assignment operator moves a stream descriptor from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other stream descriptor object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_stream_descriptor(const executor_type&)` constructor. 




[endsect]


[section:read_some posix::basic_stream_descriptor::read_some]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.read_some..read_some..posix::basic_stream_descriptor] 
Read some data from the descriptor. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.posix__basic_stream_descriptor.read_some.overload1 read_some]``(
      const MutableBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.read_some.overload1 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.posix__basic_stream_descriptor.read_some.overload2 read_some]``(
      const MutableBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.read_some.overload2 more...]]``


[section:overload1 posix::basic_stream_descriptor::read_some (1 of 2 overloads)]


Read some data from the descriptor. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_some(
      const MutableBufferSequence & buffers);


This function is used to read data from the stream descriptor. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be read.]]

]


[heading Return Value]
      
The number of bytes read.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]

]


[heading Remarks]
      
The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes.


[heading Example]
  
To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   descriptor.read_some(asio::buffer(data, size));


See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 posix::basic_stream_descriptor::read_some (2 of 2 overloads)]


Read some data from the descriptor. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_some(
      const MutableBufferSequence & buffers,
      asio::error_code & ec);


This function is used to read data from the stream descriptor. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be read.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes read. Returns 0 if an error occurred.


[heading Remarks]
      
The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes. 




[endsect]


[endsect]


[section:release posix::basic_stream_descriptor::release]


['Inherited from posix::basic_descriptor.]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.release..release..posix::basic_stream_descriptor] 
Release ownership of the native descriptor implementation. 


  native_handle_type release();


This function may be used to obtain the underlying representation of the descriptor. After calling this function, `is_open()` returns false. The caller is responsible for closing the descriptor.

All outstanding asynchronous read or write operations will finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error. 


[endsect]


[section:wait posix::basic_stream_descriptor::wait]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.wait..wait..posix::basic_stream_descriptor] 
Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. 


  void ``[link asio.reference.posix__basic_stream_descriptor.wait.overload1 wait]``(
      wait_type w);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.wait.overload1 more...]]``

  void ``[link asio.reference.posix__basic_stream_descriptor.wait.overload2 wait]``(
      wait_type w,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.wait.overload2 more...]]``


[section:overload1 posix::basic_stream_descriptor::wait (1 of 2 overloads)]


['Inherited from posix::basic_descriptor.]


Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. 


  void wait(
      wait_type w);


This function is used to perform a blocking wait for a descriptor to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired descriptor state.]]

]


[heading Example]
  
Waiting for a descriptor to become readable. 

   asio::posix::stream_descriptor descriptor(my_context);
   ...
   descriptor.wait(asio::posix::stream_descriptor::wait_read);







[endsect]



[section:overload2 posix::basic_stream_descriptor::wait (2 of 2 overloads)]


['Inherited from posix::basic_descriptor.]


Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. 


  void wait(
      wait_type w,
      asio::error_code & ec);


This function is used to perform a blocking wait for a descriptor to enter a ready to read, write or error condition state.


[heading Parameters]
    

[variablelist
  
[[w][Specifies the desired descriptor state.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Example]
  
Waiting for a descriptor to become readable. 

   asio::posix::stream_descriptor descriptor(my_context);
   ...
   asio::error_code ec;
   descriptor.wait(asio::posix::stream_descriptor::wait_read, ec);







[endsect]


[endsect]


[section:wait_type posix::basic_stream_descriptor::wait_type]


['Inherited from posix::descriptor_base.]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.wait_type..wait_type..posix::basic_stream_descriptor] 
Wait types. 


  enum wait_type

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.wait_type.wait_read..wait_read..posix::basic_stream_descriptor]
[indexterm2 asio.indexterm.posix__basic_stream_descriptor.wait_type.wait_write..wait_write..posix::basic_stream_descriptor]
[indexterm2 asio.indexterm.posix__basic_stream_descriptor.wait_type.wait_error..wait_error..posix::basic_stream_descriptor]

[heading Values]
[variablelist

  [
    [wait_read]
    [Wait for a descriptor to become ready to read. ]
  ]

  [
    [wait_write]
    [Wait for a descriptor to become ready to write. ]
  ]

  [
    [wait_error]
    [Wait for a descriptor to have error conditions pending. ]
  ]

]


For use with `descriptor::wait()` and `descriptor::async_wait()`. 


[endsect]


[section:write_some posix::basic_stream_descriptor::write_some]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor.write_some..write_some..posix::basic_stream_descriptor] 
Write some data to the descriptor. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.posix__basic_stream_descriptor.write_some.overload1 write_some]``(
      const ConstBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.write_some.overload1 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.posix__basic_stream_descriptor.write_some.overload2 write_some]``(
      const ConstBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.write_some.overload2 more...]]``


[section:overload1 posix::basic_stream_descriptor::write_some (1 of 2 overloads)]


Write some data to the descriptor. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_some(
      const ConstBufferSequence & buffers);


This function is used to write data to the stream descriptor. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be written to the descriptor.]]

]


[heading Return Value]
      
The number of bytes written.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]

]


[heading Remarks]
      
The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes.


[heading Example]
  
To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   descriptor.write_some(asio::buffer(data, size));


See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 posix::basic_stream_descriptor::write_some (2 of 2 overloads)]


Write some data to the descriptor. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_some(
      const ConstBufferSequence & buffers,
      asio::error_code & ec);


This function is used to write data to the stream descriptor. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be written to the descriptor.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes written. Returns 0 if an error occurred.


[heading Remarks]
      
The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes. 




[endsect]


[endsect]


[endsect]

[section:posix__basic_stream_descriptor__rebind_executor posix::basic_stream_descriptor::rebind_executor]


Rebinds the descriptor type to another executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  struct rebind_executor


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.posix__basic_stream_descriptor__rebind_executor.other [*other]]]
    [The descriptor type when rebound to the specified executor. ]
  
  ]

]

[heading Requirements]

['Header: ][^asio/posix/basic_stream_descriptor.hpp]

['Convenience header: ][^asio.hpp]


[section:other posix::basic_stream_descriptor::rebind_executor::other]

[indexterm2 asio.indexterm.posix__basic_stream_descriptor__rebind_executor.other..other..posix::basic_stream_descriptor::rebind_executor] 
The descriptor type when rebound to the specified executor. 


  typedef basic_stream_descriptor< Executor1 > other;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.posix__basic_stream_descriptor__rebind_executor [*rebind_executor]]]
    [Rebinds the descriptor type to another executor. ]
  
  ]

  [

    [[link asio.reference.posix__basic_stream_descriptor.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.posix__basic_stream_descriptor.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.posix__basic_stream_descriptor.lowest_layer_type [*lowest_layer_type]]]
    [A descriptor is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.posix__basic_stream_descriptor.native_handle_type [*native_handle_type]]]
    [The native representation of a descriptor. ]
  
  ]

  [

    [[link asio.reference.posix__basic_stream_descriptor.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.posix__basic_stream_descriptor.assign [*assign]]]
    [Assign an existing native descriptor to the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.async_read_some [*async_read_some]]]
    [Start an asynchronous read. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.async_wait [*async_wait]]]
    [Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.async_write_some [*async_write_some]]]
    [Start an asynchronous write. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor [*basic_stream_descriptor]] [constructor]]
    [Construct a stream descriptor without opening it. 
     [hr]
     Construct a stream descriptor on an existing native descriptor. 
     [hr]
     Move-construct a stream descriptor from another. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.close [*close]]]
    [Close the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.io_control [*io_control]]]
    [Perform an IO control command on the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.is_open [*is_open]]]
    [Determine whether the descriptor is open. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.native_handle [*native_handle]]]
    [Get the native descriptor representation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native descriptor implementation. 
     [hr]
     Sets the non-blocking mode of the native descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the descriptor. 
     [hr]
     Sets the non-blocking mode of the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.operator_eq_ [*operator=]]]
    [Move-assign a stream descriptor from another. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.read_some [*read_some]]]
    [Read some data from the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.release [*release]]]
    [Release ownership of the native descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.wait [*wait]]]
    [Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.write_some [*write_some]]]
    [Write some data to the descriptor. ]
  ]
  
]

The [link asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] class template provides asynchronous and blocking stream-oriented descriptor functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.





[heading Requirements]

['Header: ][^asio/posix/basic_stream_descriptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]


[section:posix__descriptor posix::descriptor]

[indexterm1 asio.indexterm.posix__descriptor..posix::descriptor] 
Typedef for the typical usage of [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`]. 


  typedef basic_descriptor descriptor;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.posix__basic_descriptor__rebind_executor [*rebind_executor]]]
    [Rebinds the descriptor type to another executor. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.lowest_layer_type [*lowest_layer_type]]]
    [A descriptor is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.native_handle_type [*native_handle_type]]]
    [The native representation of a descriptor. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.posix__basic_descriptor.assign [*assign]]]
    [Assign an existing native descriptor to the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.async_wait [*async_wait]]]
    [Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.basic_descriptor [*basic_descriptor]] [constructor]]
    [Construct a descriptor without opening it. 
     [hr]
     Construct a descriptor on an existing native descriptor. 
     [hr]
     Move-construct a descriptor from another. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.close [*close]]]
    [Close the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.io_control [*io_control]]]
    [Perform an IO control command on the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.is_open [*is_open]]]
    [Determine whether the descriptor is open. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.native_handle [*native_handle]]]
    [Get the native descriptor representation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native descriptor implementation. 
     [hr]
     Sets the non-blocking mode of the native descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the descriptor. 
     [hr]
     Sets the non-blocking mode of the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.operator_eq_ [*operator=]]]
    [Move-assign a descriptor from another. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.release [*release]]]
    [Release ownership of the native descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.wait [*wait]]]
    [Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.posix__basic_descriptor._basic_descriptor [*~basic_descriptor]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

The [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] class template provides the ability to wrap a POSIX descriptor.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/posix/descriptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:posix__descriptor_base posix::descriptor_base]


The [link asio.reference.posix__descriptor_base `posix::descriptor_base`] class is used as a base for the descriptor class as a place to define the associated IO control commands. 


  class descriptor_base


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.posix__descriptor_base.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.posix__descriptor_base.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.posix__descriptor_base._descriptor_base [*~descriptor_base]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/posix/descriptor_base.hpp]

['Convenience header: ][^asio.hpp]


[section:bytes_readable posix::descriptor_base::bytes_readable]

[indexterm2 asio.indexterm.posix__descriptor_base.bytes_readable..bytes_readable..posix::descriptor_base] 
IO control command to get the amount of data that can be read without blocking. 


  typedef implementation_defined bytes_readable;



Implements the FIONREAD IO control command.


[heading Example]
  


   asio::posix::stream_descriptor descriptor(my_context);
   ...
   asio::descriptor_base::bytes_readable command(true);
   descriptor.io_control(command);
   std::size_t bytes_readable = command.get();







[heading Requirements]

['Header: ][^asio/posix/descriptor_base.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:wait_type posix::descriptor_base::wait_type]

[indexterm2 asio.indexterm.posix__descriptor_base.wait_type..wait_type..posix::descriptor_base] 
Wait types. 


  enum wait_type

[indexterm2 asio.indexterm.posix__descriptor_base.wait_type.wait_read..wait_read..posix::descriptor_base]
[indexterm2 asio.indexterm.posix__descriptor_base.wait_type.wait_write..wait_write..posix::descriptor_base]
[indexterm2 asio.indexterm.posix__descriptor_base.wait_type.wait_error..wait_error..posix::descriptor_base]

[heading Values]
[variablelist

  [
    [wait_read]
    [Wait for a descriptor to become ready to read. ]
  ]

  [
    [wait_write]
    [Wait for a descriptor to become ready to write. ]
  ]

  [
    [wait_error]
    [Wait for a descriptor to have error conditions pending. ]
  ]

]


For use with `descriptor::wait()` and `descriptor::async_wait()`. 


[endsect]



[section:_descriptor_base posix::descriptor_base::~descriptor_base]

[indexterm2 asio.indexterm.posix__descriptor_base._descriptor_base..~descriptor_base..posix::descriptor_base] 
Protected destructor to prevent deletion through this type. 


  ~descriptor_base();



[endsect]



[endsect]


[section:posix__stream_descriptor posix::stream_descriptor]

[indexterm1 asio.indexterm.posix__stream_descriptor..posix::stream_descriptor] 
Typedef for the typical usage of a stream-oriented descriptor. 


  typedef basic_stream_descriptor stream_descriptor;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.posix__basic_stream_descriptor__rebind_executor [*rebind_executor]]]
    [Rebinds the descriptor type to another executor. ]
  
  ]

  [

    [[link asio.reference.posix__basic_stream_descriptor.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.posix__basic_stream_descriptor.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.posix__basic_stream_descriptor.lowest_layer_type [*lowest_layer_type]]]
    [A descriptor is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.posix__basic_stream_descriptor.native_handle_type [*native_handle_type]]]
    [The native representation of a descriptor. ]
  
  ]

  [

    [[link asio.reference.posix__basic_stream_descriptor.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.posix__basic_stream_descriptor.assign [*assign]]]
    [Assign an existing native descriptor to the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.async_read_some [*async_read_some]]]
    [Start an asynchronous read. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.async_wait [*async_wait]]]
    [Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.async_write_some [*async_write_some]]]
    [Start an asynchronous write. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor [*basic_stream_descriptor]] [constructor]]
    [Construct a stream descriptor without opening it. 
     [hr]
     Construct a stream descriptor on an existing native descriptor. 
     [hr]
     Move-construct a stream descriptor from another. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.close [*close]]]
    [Close the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.io_control [*io_control]]]
    [Perform an IO control command on the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.is_open [*is_open]]]
    [Determine whether the descriptor is open. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.native_handle [*native_handle]]]
    [Get the native descriptor representation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native descriptor implementation. 
     [hr]
     Sets the non-blocking mode of the native descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the descriptor. 
     [hr]
     Sets the non-blocking mode of the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.operator_eq_ [*operator=]]]
    [Move-assign a stream descriptor from another. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.read_some [*read_some]]]
    [Read some data from the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.release [*release]]]
    [Release ownership of the native descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.wait [*wait]]]
    [Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.write_some [*write_some]]]
    [Write some data to the descriptor. ]
  ]
  
]

The [link asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] class template provides asynchronous and blocking stream-oriented descriptor functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.





[heading Requirements]

['Header: ][^asio/posix/stream_descriptor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:post post]

[indexterm1 asio.indexterm.post..post] 
Submits a completion token or function object for execution. 

  template<
      typename CompletionToken>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.post.overload1 post]``(
      CompletionToken && token);
  ``  [''''&raquo;''' [link asio.reference.post.overload1 more...]]``

  template<
      typename ``[link asio.reference.Executor1 Executor]``,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.post.overload2 post]``(
      const Executor & ex,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< execution::is_executor< Executor >::value||is_executor< Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.post.overload2 more...]]``

  template<
      typename ExecutionContext,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.post.overload3 post]``(
      ExecutionContext & ctx,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.post.overload3 more...]]``

[heading Requirements]

['Header: ][^asio/post.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 post (1 of 3 overloads)]


Submits a completion token or function object for execution. 


  template<
      typename CompletionToken>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` post(
      CompletionToken && token);


This function submits an object for execution using the object's associated executor. The function object is queued for execution, and is never called from the current thread prior to returning from `post()`.

The use of `post()`, rather than [link asio.reference.defer `defer`] , indicates the caller's preference that the function object be eagerly queued for execution.

This function has the following effects:


* Constructs a function object handler of type `Handler`, initialized with `handler(forward<CompletionToken>(token))`.


* Constructs an object `result` of type `async_result<Handler>`, initializing the object as `result(handler)`.


* Obtains the handler's associated executor object `ex` by performing `get_associated_executor(handler)`.


* Obtains the handler's associated allocator object `alloc` by performing `get_associated_allocator(handler)`.


* Performs `ex.post(std::move(handler), alloc)`.


* Returns `result.get()`. 




[endsect]



[section:overload2 post (2 of 3 overloads)]


Submits a completion token or function object for execution. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` post(
      const Executor & ex,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< execution::is_executor< Executor >::value||is_executor< Executor >::value >::type *  = 0);


This function submits an object for execution using the specified executor. The function object is queued for execution, and is never called from the current thread prior to returning from `post()`.

The use of `post()`, rather than [link asio.reference.defer `defer`] , indicates the caller's preference that the function object be eagerly queued for execution.

This function has the following effects:


* Constructs a function object handler of type `Handler`, initialized with `handler(forward<CompletionToken>(token))`.


* Constructs an object `result` of type `async_result<Handler>`, initializing the object as `result(handler)`.


* Obtains the handler's associated executor object `ex1` by performing `get_associated_executor(handler)`.


* Creates a work object `w` by performing `make_work(ex1)`.


* Obtains the handler's associated allocator object `alloc` by performing `get_associated_allocator(handler)`.


* Constructs a function object `f` with a function call operator that performs `ex1.dispatch(std::move(handler), alloc)` followed by `w.reset()`.


* Performs `Executor(ex).post(std::move(f), alloc)`.


* Returns `result.get()`. 




[endsect]



[section:overload3 post (3 of 3 overloads)]


Submits a completion token or function object for execution. 


  template<
      typename ExecutionContext,
      typename CompletionToken = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` post(
      ExecutionContext & ctx,
      CompletionToken && token = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);



[heading Return Value]
      
`post(ctx.get_executor(), forward<CompletionToken>(token))`. 




[endsect]


[endsect]


[section:prefer prefer]

[indexterm1 asio.indexterm.prefer..prefer] 
A customisation point that attempts to apply a property to an object. 


  constexpr unspecified prefer = unspecified;


The name `prefer` denotes a customisation point object. The expression `asio::prefer(E, P0, Pn...)` for some subexpressions `E` and `P0`, and where `Pn...` represents `N` subexpressions (where `N` is 0 or more, and with types `T = decay_t<decltype(E)>` and `Prop0 = decay_t<decltype(P0)>`) is expression-equivalent to:


* If `is_applicable_property_v<T, Prop0> && Prop0::is_preferable` is not a well-formed constant expression with value `true`, `asio::prefer(E, P0, Pn...)` is ill-formed.


* Otherwise, `E` if `N == 0` and the expression `Prop0::template static_query_v<T> == Prop0::value()` is a well-formed constant expression with value `true`.


* Otherwise, `(E).require(P0)` if `N == 0` and the expression `(E).require(P0)` is a valid expression.


* Otherwise, `require(E, P0)` if `N == 0` and the expression `require(E, P0)` is a valid expression with overload resolution performed in a context that does not include the declaration of the `require` customization point object.


* Otherwise, `(E).prefer(P0)` if `N == 0` and the expression `(E).prefer(P0)` is a valid expression.


* Otherwise, `prefer(E, P0)` if `N == 0` and the expression `prefer(E, P0)` is a valid expression with overload resolution performed in a context that does not include the declaration of the `prefer` customization point object.


* Otherwise, `E` if `N == 0`.


* Otherwise, `asio::prefer(asio::prefer(E, P0), Pn...)` if `N > 0` and the expression `asio::prefer(asio::prefer(E, P0), Pn...)` is a valid expression.


* Otherwise, `asio::prefer(E, P0, Pn...)` is ill-formed. 



[heading Requirements]

['Header: ][^asio/prefer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:prefer_result prefer_result]


A type trait that determines the result type of a `prefer` expression. 


  template<
      typename T,
      typename... Properties>
  struct prefer_result


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.prefer_result.type [*type]]]
    [The result of the prefer expression. ]
  
  ]

]

Class template `prefer_result` is a trait that determines the result type of the expression `asio::prefer(std::declval<T>(), std::declval<Properties>()...)`. 

[heading Requirements]

['Header: ][^asio/prefer.hpp]

['Convenience header: ][^asio.hpp]


[section:type prefer_result::type]

[indexterm2 asio.indexterm.prefer_result.type..type..prefer_result] 
The result of the `prefer` expression. 


  typedef automatically_determined type;



[heading Requirements]

['Header: ][^asio/prefer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]


[section:query query]

[indexterm1 asio.indexterm.query..query] 
A customisation point that queries the value of a property. 


  constexpr unspecified query = unspecified;


The name `query` denotes a customization point object. The expression `asio::query(E, P)` for some subexpressions `E` and `P` (with types `T = decay_t<decltype(E)>` and `Prop = decay_t<decltype(P)>`) is expression-equivalent to:


* If `is_applicable_property_v<T, Prop>` is not a well-formed constant expression with value `true`, `asio::query(E, P)` is ill-formed.


* Otherwise, `Prop::template static_query_v<T>` if the expression `Prop::template static_query_v<T>` is a well-formed constant expression.


* Otherwise, `(E).query(P)` if the expression `(E).query(P)` is well-formed.


* Otherwise, `query(E, P)` if the expression `query(E, P)` is a valid expression with overload resolution performed in a context that does not include the declaration of the `query` customization point object.


* Otherwise, `asio::query(E, P)` is ill-formed. 



[heading Requirements]

['Header: ][^asio/query.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:query_result query_result]


A type trait that determines the result type of a `query` expression. 


  template<
      typename T,
      typename Property>
  struct query_result


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.query_result.type [*type]]]
    [The result of the query expression. ]
  
  ]

]

Class template `query_result` is a trait that determines the result type of the expression `asio::query(std::declval<T>(), std::declval<Property>())`. 

[heading Requirements]

['Header: ][^asio/query.hpp]

['Convenience header: ][^asio.hpp]


[section:type query_result::type]

[indexterm2 asio.indexterm.query_result.type..type..query_result] 
The result of the `query` expression. 


  typedef automatically_determined type;



[heading Requirements]

['Header: ][^asio/query.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:read read]

[indexterm1 asio.indexterm.read..read] 
The `read` function is a composed operation that reads a certain amount of data from a stream before returning. 


Attempt to read a certain amount of data from a stream before returning. 

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.read.overload1 read]``(
      SyncReadStream & s,
      const MutableBufferSequence & buffers,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read.overload1 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.read.overload2 read]``(
      SyncReadStream & s,
      const MutableBufferSequence & buffers,
      asio::error_code & ec,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read.overload2 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.read.overload3 read]``(
      SyncReadStream & s,
      const MutableBufferSequence & buffers,
      CompletionCondition completion_condition,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read.overload3 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.read.overload4 read]``(
      SyncReadStream & s,
      const MutableBufferSequence & buffers,
      CompletionCondition completion_condition,
      asio::error_code & ec,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read.overload4 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``>
  std::size_t ``[link asio.reference.read.overload5 read]``(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read.overload5 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``>
  std::size_t ``[link asio.reference.read.overload6 read]``(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read.overload6 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.read.overload7 read]``(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      CompletionCondition completion_condition,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read.overload7 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.read.overload8 read]``(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      CompletionCondition completion_condition,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read.overload8 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator>
  std::size_t ``[link asio.reference.read.overload9 read]``(
      SyncReadStream & s,
      basic_streambuf< Allocator > & b);
  ``  [''''&raquo;''' [link asio.reference.read.overload9 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator>
  std::size_t ``[link asio.reference.read.overload10 read]``(
      SyncReadStream & s,
      basic_streambuf< Allocator > & b,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.read.overload10 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.read.overload11 read]``(
      SyncReadStream & s,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition);
  ``  [''''&raquo;''' [link asio.reference.read.overload11 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.read.overload12 read]``(
      SyncReadStream & s,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.read.overload12 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``>
  std::size_t ``[link asio.reference.read.overload13 read]``(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read.overload13 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``>
  std::size_t ``[link asio.reference.read.overload14 read]``(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read.overload14 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.read.overload15 read]``(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      CompletionCondition completion_condition,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read.overload15 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.read.overload16 read]``(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      CompletionCondition completion_condition,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read.overload16 more...]]``

[heading Requirements]

['Header: ][^asio/read.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 read (1 of 16 overloads)]


Attempt to read a certain amount of data from a stream before returning. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read(
      SyncReadStream & s,
      const MutableBufferSequence & buffers,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);


This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:


* The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the stream.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  
To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::read(s, asio::buffer(data, size)); 


See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::read(
       s, buffers,
       asio::transfer_all()); 







[endsect]



[section:overload2 read (2 of 16 overloads)]


Attempt to read a certain amount of data from a stream before returning. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read(
      SyncReadStream & s,
      const MutableBufferSequence & buffers,
      asio::error_code & ec,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);


This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:


* The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the stream.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Example]
  
To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::read(s, asio::buffer(data, size), ec); 


See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::read(
       s, buffers,
       asio::transfer_all(), ec); 







[endsect]



[section:overload3 read (3 of 16 overloads)]


Attempt to read a certain amount of data from a stream before returning. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t read(
      SyncReadStream & s,
      const MutableBufferSequence & buffers,
      CompletionCondition completion_condition,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);


This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:


* The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's read\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the stream.]]

[[completion_condition][The function object to be called to determine whether the read operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest read_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the stream's read\_some function.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  
To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::read(s, asio::buffer(data, size),
       asio::transfer_at_least(32)); 


See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload4 read (4 of 16 overloads)]


Attempt to read a certain amount of data from a stream before returning. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t read(
      SyncReadStream & s,
      const MutableBufferSequence & buffers,
      CompletionCondition completion_condition,
      asio::error_code & ec,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);


This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:


* The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's read\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the stream.]]

[[completion_condition][The function object to be called to determine whether the read operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest read_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the stream's read\_some function.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes read. If an error occurs, returns the total number of bytes successfully transferred prior to the error. 




[endsect]



[section:overload5 read (5 of 16 overloads)]


Attempt to read a certain amount of data from a stream before returning. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``>
  std::size_t read(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:


* The specified dynamic buffer sequence is full (that is, it has reached maximum size).


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::read(
       s, buffers,
       asio::transfer_all()); 







[endsect]



[section:overload6 read (6 of 16 overloads)]


Attempt to read a certain amount of data from a stream before returning. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``>
  std::size_t read(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:


* The supplied buffer is full (that is, it has reached maximum size).


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::read(
       s, buffers,
       asio::transfer_all(), ec); 







[endsect]



[section:overload7 read (7 of 16 overloads)]


Attempt to read a certain amount of data from a stream before returning. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t read(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      CompletionCondition completion_condition,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:


* The specified dynamic buffer sequence is full (that is, it has reached maximum size).


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's read\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read.]]

[[completion_condition][The function object to be called to determine whether the read operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest read_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the stream's read\_some function.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload8 read (8 of 16 overloads)]


Attempt to read a certain amount of data from a stream before returning. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t read(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      CompletionCondition completion_condition,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:


* The specified dynamic buffer sequence is full (that is, it has reached maximum size).


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's read\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read.]]

[[completion_condition][The function object to be called to determine whether the read operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest read_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the stream's read\_some function.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes read. If an error occurs, returns the total number of bytes successfully transferred prior to the error. 




[endsect]



[section:overload9 read (9 of 16 overloads)]


Attempt to read a certain amount of data from a stream before returning. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator>
  std::size_t read(
      SyncReadStream & s,
      basic_streambuf< Allocator > & b);


This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:


* The supplied buffer is full (that is, it has reached maximum size).


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[b][The [link asio.reference.basic_streambuf `basic_streambuf`] object into which the data will be read.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::read(
       s, b,
       asio::transfer_all()); 







[endsect]



[section:overload10 read (10 of 16 overloads)]


Attempt to read a certain amount of data from a stream before returning. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator>
  std::size_t read(
      SyncReadStream & s,
      basic_streambuf< Allocator > & b,
      asio::error_code & ec);


This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:


* The supplied buffer is full (that is, it has reached maximum size).


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[b][The [link asio.reference.basic_streambuf `basic_streambuf`] object into which the data will be read.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::read(
       s, b,
       asio::transfer_all(), ec); 







[endsect]



[section:overload11 read (11 of 16 overloads)]


Attempt to read a certain amount of data from a stream before returning. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t read(
      SyncReadStream & s,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition);


This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:


* The supplied buffer is full (that is, it has reached maximum size).


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's read\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[b][The [link asio.reference.basic_streambuf `basic_streambuf`] object into which the data will be read.]]

[[completion_condition][The function object to be called to determine whether the read operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest read_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the stream's read\_some function.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload12 read (12 of 16 overloads)]


Attempt to read a certain amount of data from a stream before returning. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t read(
      SyncReadStream & s,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition,
      asio::error_code & ec);


This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:


* The supplied buffer is full (that is, it has reached maximum size).


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's read\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[b][The [link asio.reference.basic_streambuf `basic_streambuf`] object into which the data will be read.]]

[[completion_condition][The function object to be called to determine whether the read operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest read_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the stream's read\_some function.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes read. If an error occurs, returns the total number of bytes successfully transferred prior to the error. 




[endsect]



[section:overload13 read (13 of 16 overloads)]


Attempt to read a certain amount of data from a stream before returning. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``>
  std::size_t read(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:


* The specified dynamic buffer sequence is full (that is, it has reached maximum size).


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::read(
       s, buffers,
       asio::transfer_all()); 







[endsect]



[section:overload14 read (14 of 16 overloads)]


Attempt to read a certain amount of data from a stream before returning. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``>
  std::size_t read(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:


* The supplied buffer is full (that is, it has reached maximum size).


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::read(
       s, buffers,
       asio::transfer_all(), ec); 







[endsect]



[section:overload15 read (15 of 16 overloads)]


Attempt to read a certain amount of data from a stream before returning. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t read(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      CompletionCondition completion_condition,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:


* The specified dynamic buffer sequence is full (that is, it has reached maximum size).


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's read\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read.]]

[[completion_condition][The function object to be called to determine whether the read operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest read_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the stream's read\_some function.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload16 read (16 of 16 overloads)]


Attempt to read a certain amount of data from a stream before returning. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t read(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      CompletionCondition completion_condition,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:


* The specified dynamic buffer sequence is full (that is, it has reached maximum size).


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's read\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read.]]

[[completion_condition][The function object to be called to determine whether the read operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest read_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the stream's read\_some function.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes read. If an error occurs, returns the total number of bytes successfully transferred prior to the error. 




[endsect]


[endsect]

[section:read_at read_at]

[indexterm1 asio.indexterm.read_at..read_at] 
The `read_at` function is a composed operation that reads a certain amount of data at the specified offset before returning. 


Attempt to read a certain amount of data at the specified offset before returning. 

  template<
      typename ``[link asio.reference.SyncRandomAccessReadDevice SyncRandomAccessReadDevice]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.read_at.overload1 read_at]``(
      SyncRandomAccessReadDevice & d,
      uint64_t offset,
      const MutableBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.read_at.overload1 more...]]``

  template<
      typename ``[link asio.reference.SyncRandomAccessReadDevice SyncRandomAccessReadDevice]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.read_at.overload2 read_at]``(
      SyncRandomAccessReadDevice & d,
      uint64_t offset,
      const MutableBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.read_at.overload2 more...]]``

  template<
      typename ``[link asio.reference.SyncRandomAccessReadDevice SyncRandomAccessReadDevice]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.read_at.overload3 read_at]``(
      SyncRandomAccessReadDevice & d,
      uint64_t offset,
      const MutableBufferSequence & buffers,
      CompletionCondition completion_condition);
  ``  [''''&raquo;''' [link asio.reference.read_at.overload3 more...]]``

  template<
      typename ``[link asio.reference.SyncRandomAccessReadDevice SyncRandomAccessReadDevice]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.read_at.overload4 read_at]``(
      SyncRandomAccessReadDevice & d,
      uint64_t offset,
      const MutableBufferSequence & buffers,
      CompletionCondition completion_condition,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.read_at.overload4 more...]]``

  template<
      typename ``[link asio.reference.SyncRandomAccessReadDevice SyncRandomAccessReadDevice]``,
      typename Allocator>
  std::size_t ``[link asio.reference.read_at.overload5 read_at]``(
      SyncRandomAccessReadDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b);
  ``  [''''&raquo;''' [link asio.reference.read_at.overload5 more...]]``

  template<
      typename ``[link asio.reference.SyncRandomAccessReadDevice SyncRandomAccessReadDevice]``,
      typename Allocator>
  std::size_t ``[link asio.reference.read_at.overload6 read_at]``(
      SyncRandomAccessReadDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.read_at.overload6 more...]]``

  template<
      typename ``[link asio.reference.SyncRandomAccessReadDevice SyncRandomAccessReadDevice]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.read_at.overload7 read_at]``(
      SyncRandomAccessReadDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition);
  ``  [''''&raquo;''' [link asio.reference.read_at.overload7 more...]]``

  template<
      typename ``[link asio.reference.SyncRandomAccessReadDevice SyncRandomAccessReadDevice]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.read_at.overload8 read_at]``(
      SyncRandomAccessReadDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.read_at.overload8 more...]]``

[heading Requirements]

['Header: ][^asio/read_at.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 read_at (1 of 8 overloads)]


Attempt to read a certain amount of data at the specified offset before returning. 


  template<
      typename ``[link asio.reference.SyncRandomAccessReadDevice SyncRandomAccessReadDevice]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_at(
      SyncRandomAccessReadDevice & d,
      uint64_t offset,
      const MutableBufferSequence & buffers);


This function is used to read a certain number of bytes of data from a random access device at the specified offset. The call will block until one of the following conditions is true:


* The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.


* An error occurred.

This operation is implemented in terms of zero or more calls to the device's read\_some\_at function.


[heading Parameters]
    

[variablelist
  
[[d][The device from which the data is to be read. The type must support the SyncRandomAccessReadDevice concept.]]

[[offset][The offset at which the data will be read.]]

[[buffers][One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the device.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  
To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::read_at(d, 42, asio::buffer(data, size)); 


See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::read_at(
       d, 42, buffers,
       asio::transfer_all()); 







[endsect]



[section:overload2 read_at (2 of 8 overloads)]


Attempt to read a certain amount of data at the specified offset before returning. 


  template<
      typename ``[link asio.reference.SyncRandomAccessReadDevice SyncRandomAccessReadDevice]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_at(
      SyncRandomAccessReadDevice & d,
      uint64_t offset,
      const MutableBufferSequence & buffers,
      asio::error_code & ec);


This function is used to read a certain number of bytes of data from a random access device at the specified offset. The call will block until one of the following conditions is true:


* The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.


* An error occurred.

This operation is implemented in terms of zero or more calls to the device's read\_some\_at function.


[heading Parameters]
    

[variablelist
  
[[d][The device from which the data is to be read. The type must support the SyncRandomAccessReadDevice concept.]]

[[offset][The offset at which the data will be read.]]

[[buffers][One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the device.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Example]
  
To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::read_at(d, 42,
       asio::buffer(data, size), ec); 


See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::read_at(
       d, 42, buffers,
       asio::transfer_all(), ec); 







[endsect]



[section:overload3 read_at (3 of 8 overloads)]


Attempt to read a certain amount of data at the specified offset before returning. 


  template<
      typename ``[link asio.reference.SyncRandomAccessReadDevice SyncRandomAccessReadDevice]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t read_at(
      SyncRandomAccessReadDevice & d,
      uint64_t offset,
      const MutableBufferSequence & buffers,
      CompletionCondition completion_condition);


This function is used to read a certain number of bytes of data from a random access device at the specified offset. The call will block until one of the following conditions is true:


* The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the device's read\_some\_at function.


[heading Parameters]
    

[variablelist
  
[[d][The device from which the data is to be read. The type must support the SyncRandomAccessReadDevice concept.]]

[[offset][The offset at which the data will be read.]]

[[buffers][One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the device.]]

[[completion_condition][The function object to be called to determine whether the read operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest read_some_at operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the device's read\_some\_at function.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  
To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::read_at(d, 42, asio::buffer(data, size),
       asio::transfer_at_least(32)); 


See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload4 read_at (4 of 8 overloads)]


Attempt to read a certain amount of data at the specified offset before returning. 


  template<
      typename ``[link asio.reference.SyncRandomAccessReadDevice SyncRandomAccessReadDevice]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t read_at(
      SyncRandomAccessReadDevice & d,
      uint64_t offset,
      const MutableBufferSequence & buffers,
      CompletionCondition completion_condition,
      asio::error_code & ec);


This function is used to read a certain number of bytes of data from a random access device at the specified offset. The call will block until one of the following conditions is true:


* The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the device's read\_some\_at function.


[heading Parameters]
    

[variablelist
  
[[d][The device from which the data is to be read. The type must support the SyncRandomAccessReadDevice concept.]]

[[offset][The offset at which the data will be read.]]

[[buffers][One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the device.]]

[[completion_condition][The function object to be called to determine whether the read operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest read_some_at operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the device's read\_some\_at function.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes read. If an error occurs, returns the total number of bytes successfully transferred prior to the error. 




[endsect]



[section:overload5 read_at (5 of 8 overloads)]


Attempt to read a certain amount of data at the specified offset before returning. 


  template<
      typename ``[link asio.reference.SyncRandomAccessReadDevice SyncRandomAccessReadDevice]``,
      typename Allocator>
  std::size_t read_at(
      SyncRandomAccessReadDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b);


This function is used to read a certain number of bytes of data from a random access device at the specified offset. The call will block until one of the following conditions is true:


* An error occurred.

This operation is implemented in terms of zero or more calls to the device's read\_some\_at function.


[heading Parameters]
    

[variablelist
  
[[d][The device from which the data is to be read. The type must support the SyncRandomAccessReadDevice concept.]]

[[offset][The offset at which the data will be read.]]

[[b][The [link asio.reference.basic_streambuf `basic_streambuf`] object into which the data will be read.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::read_at(
       d, 42, b,
       asio::transfer_all()); 







[endsect]



[section:overload6 read_at (6 of 8 overloads)]


Attempt to read a certain amount of data at the specified offset before returning. 


  template<
      typename ``[link asio.reference.SyncRandomAccessReadDevice SyncRandomAccessReadDevice]``,
      typename Allocator>
  std::size_t read_at(
      SyncRandomAccessReadDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      asio::error_code & ec);


This function is used to read a certain number of bytes of data from a random access device at the specified offset. The call will block until one of the following conditions is true:


* An error occurred.

This operation is implemented in terms of zero or more calls to the device's read\_some\_at function.


[heading Parameters]
    

[variablelist
  
[[d][The device from which the data is to be read. The type must support the SyncRandomAccessReadDevice concept.]]

[[offset][The offset at which the data will be read.]]

[[b][The [link asio.reference.basic_streambuf `basic_streambuf`] object into which the data will be read.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::read_at(
       d, 42, b,
       asio::transfer_all(), ec); 







[endsect]



[section:overload7 read_at (7 of 8 overloads)]


Attempt to read a certain amount of data at the specified offset before returning. 


  template<
      typename ``[link asio.reference.SyncRandomAccessReadDevice SyncRandomAccessReadDevice]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t read_at(
      SyncRandomAccessReadDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition);


This function is used to read a certain number of bytes of data from a random access device at the specified offset. The call will block until one of the following conditions is true:


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the device's read\_some\_at function.


[heading Parameters]
    

[variablelist
  
[[d][The device from which the data is to be read. The type must support the SyncRandomAccessReadDevice concept.]]

[[offset][The offset at which the data will be read.]]

[[b][The [link asio.reference.basic_streambuf `basic_streambuf`] object into which the data will be read.]]

[[completion_condition][The function object to be called to determine whether the read operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest read_some_at operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the device's read\_some\_at function.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload8 read_at (8 of 8 overloads)]


Attempt to read a certain amount of data at the specified offset before returning. 


  template<
      typename ``[link asio.reference.SyncRandomAccessReadDevice SyncRandomAccessReadDevice]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t read_at(
      SyncRandomAccessReadDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition,
      asio::error_code & ec);


This function is used to read a certain number of bytes of data from a random access device at the specified offset. The call will block until one of the following conditions is true:


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the device's read\_some\_at function.


[heading Parameters]
    

[variablelist
  
[[d][The device from which the data is to be read. The type must support the SyncRandomAccessReadDevice concept.]]

[[offset][The offset at which the data will be read.]]

[[b][The [link asio.reference.basic_streambuf `basic_streambuf`] object into which the data will be read.]]

[[completion_condition][The function object to be called to determine whether the read operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest read_some_at operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the device's read\_some\_at function.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes read. If an error occurs, returns the total number of bytes successfully transferred prior to the error. 




[endsect]


[endsect]

[section:read_until read_until]

[indexterm1 asio.indexterm.read_until..read_until] 
The `read_until` function is a composed operation that reads data into a dynamic buffer sequence, or into a streambuf, until it contains a delimiter, matches a regular expression, or a function object indicates a match. 


Read data into a dynamic buffer sequence until it contains a specified delimiter. 

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``>
  std::size_t ``[link asio.reference.read_until.overload1 read_until]``(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      char delim,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload1 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``>
  std::size_t ``[link asio.reference.read_until.overload2 read_until]``(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      char delim,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload2 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``>
  std::size_t ``[link asio.reference.read_until.overload3 read_until]``(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      string_view delim,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload3 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``>
  std::size_t ``[link asio.reference.read_until.overload4 read_until]``(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      string_view delim,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload4 more...]]``

Read data into a dynamic buffer sequence until some part of the data it contains matches a regular expression. 

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``>
  std::size_t ``[link asio.reference.read_until.overload5 read_until]``(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      const boost::regex & expr,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload5 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``>
  std::size_t ``[link asio.reference.read_until.overload6 read_until]``(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      const boost::regex & expr,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload6 more...]]``

Read data into a dynamic buffer sequence until a function object indicates a match. 

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename MatchCondition>
  std::size_t ``[link asio.reference.read_until.overload7 read_until]``(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      MatchCondition match_condition,
      typename enable_if< is_match_condition< MatchCondition >::value &&is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload7 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename MatchCondition>
  std::size_t ``[link asio.reference.read_until.overload8 read_until]``(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      MatchCondition match_condition,
      asio::error_code & ec,
      typename enable_if< is_match_condition< MatchCondition >::value &&is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload8 more...]]``

Read data into a streambuf until it contains a specified delimiter. 

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator>
  std::size_t ``[link asio.reference.read_until.overload9 read_until]``(
      SyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      char delim);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload9 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator>
  std::size_t ``[link asio.reference.read_until.overload10 read_until]``(
      SyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      char delim,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload10 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator>
  std::size_t ``[link asio.reference.read_until.overload11 read_until]``(
      SyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      string_view delim);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload11 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator>
  std::size_t ``[link asio.reference.read_until.overload12 read_until]``(
      SyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      string_view delim,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload12 more...]]``

Read data into a streambuf until some part of the data it contains matches a regular expression. 

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator>
  std::size_t ``[link asio.reference.read_until.overload13 read_until]``(
      SyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      const boost::regex & expr);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload13 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator>
  std::size_t ``[link asio.reference.read_until.overload14 read_until]``(
      SyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      const boost::regex & expr,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload14 more...]]``

Read data into a streambuf until a function object indicates a match. 

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator,
      typename MatchCondition>
  std::size_t ``[link asio.reference.read_until.overload15 read_until]``(
      SyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      MatchCondition match_condition,
      typename enable_if< is_match_condition< MatchCondition >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload15 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator,
      typename MatchCondition>
  std::size_t ``[link asio.reference.read_until.overload16 read_until]``(
      SyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      MatchCondition match_condition,
      asio::error_code & ec,
      typename enable_if< is_match_condition< MatchCondition >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload16 more...]]``

Read data into a dynamic buffer sequence until it contains a specified delimiter. 

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``>
  std::size_t ``[link asio.reference.read_until.overload17 read_until]``(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      char delim,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload17 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``>
  std::size_t ``[link asio.reference.read_until.overload18 read_until]``(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      char delim,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload18 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``>
  std::size_t ``[link asio.reference.read_until.overload19 read_until]``(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      string_view delim,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload19 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``>
  std::size_t ``[link asio.reference.read_until.overload20 read_until]``(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      string_view delim,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload20 more...]]``

Read data into a dynamic buffer sequence until some part of the data it contains matches a regular expression. 

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``>
  std::size_t ``[link asio.reference.read_until.overload21 read_until]``(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      const boost::regex & expr,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload21 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``>
  std::size_t ``[link asio.reference.read_until.overload22 read_until]``(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      const boost::regex & expr,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload22 more...]]``

Read data into a dynamic buffer sequence until a function object indicates a match. 

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename MatchCondition>
  std::size_t ``[link asio.reference.read_until.overload23 read_until]``(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      MatchCondition match_condition,
      typename enable_if< is_match_condition< MatchCondition >::value &&is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload23 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename MatchCondition>
  std::size_t ``[link asio.reference.read_until.overload24 read_until]``(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      MatchCondition match_condition,
      asio::error_code & ec,
      typename enable_if< is_match_condition< MatchCondition >::value &&is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload24 more...]]``

[heading Requirements]

['Header: ][^asio/read_until.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 read_until (1 of 24 overloads)]


Read data into a dynamic buffer sequence until it contains a specified delimiter. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      char delim,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains the specified delimiter. The call will block until one of the following conditions is true:


* The get area of the dynamic buffer sequence contains the specified delimiter.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the dynamic buffer sequence's get area already contains the delimiter, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read.]]

[[delim][The delimiter character.]]

]


[heading Return Value]
      
The number of bytes in the dynamic buffer sequence's get area up to and including the delimiter.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
After a successful read\_until operation, the dynamic buffer sequence may contain additional data beyond the delimiter. An application will typically leave that data in the dynamic buffer sequence for a subsequent read\_until operation to examine.


[heading Example]
  
To read data into a `std::string` until a newline is encountered: 

   std::string data;
   std::size_t n = asio::read_until(s,
       asio::dynamic_buffer(data), '\n');
   std::string line = data.substr(0, n);
   data.erase(0, n); 


After the `read_until` operation completes successfully, the string `data` contains the delimiter: 

   { 'a', 'b', ..., 'c', '\n', 'd', 'e', ... } 


The call to `substr` then extracts the data up to and including the delimiter, so that the string `line` contains: 

   { 'a', 'b', ..., 'c', '\n' } 


After the call to `erase`, the remaining data is left in the buffer `b` as follows: 

   { 'd', 'e', ... } 


This data may be the start of a new line, to be extracted by a subsequent `read_until` operation. 




[endsect]



[section:overload2 read_until (2 of 24 overloads)]


Read data into a dynamic buffer sequence until it contains a specified delimiter. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      char delim,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains the specified delimiter. The call will block until one of the following conditions is true:


* The get area of the dynamic buffer sequence contains the specified delimiter.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the dynamic buffer sequence's get area already contains the delimiter, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read.]]

[[delim][The delimiter character.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes in the dynamic buffer sequence's get area up to and including the delimiter. Returns 0 if an error occurred.


[heading Remarks]
      
After a successful read\_until operation, the dynamic buffer sequence may contain additional data beyond the delimiter. An application will typically leave that data in the dynamic buffer sequence for a subsequent read\_until operation to examine. 




[endsect]



[section:overload3 read_until (3 of 24 overloads)]


Read data into a dynamic buffer sequence until it contains a specified delimiter. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      string_view delim,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains the specified delimiter. The call will block until one of the following conditions is true:


* The get area of the dynamic buffer sequence contains the specified delimiter.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the dynamic buffer sequence's get area already contains the delimiter, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read.]]

[[delim][The delimiter string.]]

]


[heading Return Value]
      
The number of bytes in the dynamic buffer sequence's get area up to and including the delimiter.


[heading Remarks]
      
After a successful read\_until operation, the dynamic buffer sequence may contain additional data beyond the delimiter. An application will typically leave that data in the dynamic buffer sequence for a subsequent read\_until operation to examine.


[heading Example]
  
To read data into a `std::string` until a CR-LF sequence is encountered: 

   std::string data;
   std::size_t n = asio::read_until(s,
       asio::dynamic_buffer(data), "\r\n");
   std::string line = data.substr(0, n);
   data.erase(0, n); 


After the `read_until` operation completes successfully, the string `data` contains the delimiter: 

   { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } 


The call to `substr` then extracts the data up to and including the delimiter, so that the string `line` contains: 

   { 'a', 'b', ..., 'c', '\r', '\n' } 


After the call to `erase`, the remaining data is left in the buffer `b` as follows: 

   { 'd', 'e', ... } 


This data may be the start of a new line, to be extracted by a subsequent `read_until` operation. 




[endsect]



[section:overload4 read_until (4 of 24 overloads)]


Read data into a dynamic buffer sequence until it contains a specified delimiter. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      string_view delim,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains the specified delimiter. The call will block until one of the following conditions is true:


* The get area of the dynamic buffer sequence contains the specified delimiter.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the dynamic buffer sequence's get area already contains the delimiter, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read.]]

[[delim][The delimiter string.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes in the dynamic buffer sequence's get area up to and including the delimiter. Returns 0 if an error occurred.


[heading Remarks]
      
After a successful read\_until operation, the dynamic buffer sequence may contain additional data beyond the delimiter. An application will typically leave that data in the dynamic buffer sequence for a subsequent read\_until operation to examine. 




[endsect]



[section:overload5 read_until (5 of 24 overloads)]


Read data into a dynamic buffer sequence until some part of the data it contains matches a regular expression. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      const boost::regex & expr,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains some data that matches a regular expression. The call will block until one of the following conditions is true:


* A substring of the dynamic buffer sequence's get area matches the regular expression.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the dynamic buffer sequence's get area already contains data that matches the regular expression, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][A dynamic buffer sequence into which the data will be read.]]

[[expr][The regular expression.]]

]


[heading Return Value]
      
The number of bytes in the dynamic buffer sequence's get area up to and including the substring that matches the regular expression.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
After a successful read\_until operation, the dynamic buffer sequence may contain additional data beyond that which matched the regular expression. An application will typically leave that data in the dynamic buffer sequence for a subsequent read\_until operation to examine.


[heading Example]
  
To read data into a `std::string` until a CR-LF sequence is encountered: 

   std::string data;
   std::size_t n = asio::read_until(s,
       asio::dynamic_buffer(data), boost::regex("\r\n"));
   std::string line = data.substr(0, n);
   data.erase(0, n); 


After the `read_until` operation completes successfully, the string `data` contains the delimiter: 

   { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } 


The call to `substr` then extracts the data up to and including the delimiter, so that the string `line` contains: 

   { 'a', 'b', ..., 'c', '\r', '\n' } 


After the call to `erase`, the remaining data is left in the buffer `b` as follows: 

   { 'd', 'e', ... } 


This data may be the start of a new line, to be extracted by a subsequent `read_until` operation. 




[endsect]



[section:overload6 read_until (6 of 24 overloads)]


Read data into a dynamic buffer sequence until some part of the data it contains matches a regular expression. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      const boost::regex & expr,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains some data that matches a regular expression. The call will block until one of the following conditions is true:


* A substring of the dynamic buffer sequence's get area matches the regular expression.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the dynamic buffer sequence's get area already contains data that matches the regular expression, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][A dynamic buffer sequence into which the data will be read.]]

[[expr][The regular expression.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes in the dynamic buffer sequence's get area up to and including the substring that matches the regular expression. Returns 0 if an error occurred.


[heading Remarks]
      
After a successful read\_until operation, the dynamic buffer sequence may contain additional data beyond that which matched the regular expression. An application will typically leave that data in the dynamic buffer sequence for a subsequent read\_until operation to examine. 




[endsect]



[section:overload7 read_until (7 of 24 overloads)]


Read data into a dynamic buffer sequence until a function object indicates a match. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename MatchCondition>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      MatchCondition match_condition,
      typename enable_if< is_match_condition< MatchCondition >::value &&is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to read data into the specified dynamic buffer sequence until a user-defined match condition function object, when applied to the data contained in the dynamic buffer sequence, indicates a successful match. The call will block until one of the following conditions is true:


* The match condition function object returns a std::pair where the second element evaluates to true.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the match condition function object already indicates a match, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][A dynamic buffer sequence into which the data will be read.]]

[[match_condition][The function object to be called to determine whether a match exists. The signature of the function object must be: 
``
   pair<iterator, bool> match_condition(iterator begin, iterator end);
``
where `iterator` represents the type: 
``
   buffers_iterator<typename DynamicBuffer_v1::const_buffers_type>
``
The iterator parameters `begin` and `end` define the range of bytes to be scanned to determine whether there is a match. The `first` member of the return value is an iterator marking one-past-the-end of the bytes that have been consumed by the match function. This iterator is used to calculate the `begin` parameter for any subsequent invocation of the match condition. The `second` member of the return value is true if a match has been found, false otherwise.]]

]


[heading Return Value]
      
The number of bytes in the dynamic\_buffer's get area that have been fully consumed by the match function.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
After a successful read\_until operation, the dynamic buffer sequence may contain additional data beyond that which matched the function object. An application will typically leave that data in the dynamic buffer sequence for a subsequent read\_until operation to examine.

The default implementation of the `is_match_condition` type trait evaluates to true for function pointers and function objects with a `result_type` typedef. It must be specialised for other user-defined function objects.


[heading Examples]
  
To read data into a dynamic buffer sequence until whitespace is encountered: 

   typedef asio::buffers_iterator<
       asio::const_buffers_1> iterator;

   std::pair<iterator, bool>
   match_whitespace(iterator begin, iterator end)
   {
     iterator i = begin;
     while (i != end)
       if (std::isspace(*i++))
         return std::make_pair(i, true);
     return std::make_pair(i, false);
   }
   ...
   std::string data;
   asio::read_until(s, data, match_whitespace);




To read data into a `std::string` until a matching character is found: 

   class match_char
   {
   public:
     explicit match_char(char c) : c_(c) {}

     template <typename Iterator>
     std::pair<Iterator, bool> operator()(
         Iterator begin, Iterator end) const
     {
       Iterator i = begin;
       while (i != end)
         if (c_ == *i++)
           return std::make_pair(i, true);
       return std::make_pair(i, false);
     }

   private:
     char c_;
   };

   namespace asio {
     template <> struct is_match_condition<match_char>
       : public boost::true_type {};
   } // namespace asio
   ...
   std::string data;
   asio::read_until(s, data, match_char('a'));





[endsect]



[section:overload8 read_until (8 of 24 overloads)]


Read data into a dynamic buffer sequence until a function object indicates a match. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename MatchCondition>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBuffer_v1 && buffers,
      MatchCondition match_condition,
      asio::error_code & ec,
      typename enable_if< is_match_condition< MatchCondition >::value &&is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to read data into the specified dynamic buffer sequence until a user-defined match condition function object, when applied to the data contained in the dynamic buffer sequence, indicates a successful match. The call will block until one of the following conditions is true:


* The match condition function object returns a std::pair where the second element evaluates to true.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the match condition function object already indicates a match, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][A dynamic buffer sequence into which the data will be read.]]

[[match_condition][The function object to be called to determine whether a match exists. The signature of the function object must be: 
``
   pair<iterator, bool> match_condition(iterator begin, iterator end);
``
where `iterator` represents the type: 
``
   buffers_iterator<DynamicBuffer_v1::const_buffers_type>
``
The iterator parameters `begin` and `end` define the range of bytes to be scanned to determine whether there is a match. The `first` member of the return value is an iterator marking one-past-the-end of the bytes that have been consumed by the match function. This iterator is used to calculate the `begin` parameter for any subsequent invocation of the match condition. The `second` member of the return value is true if a match has been found, false otherwise.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes in the dynamic buffer sequence's get area that have been fully consumed by the match function. Returns 0 if an error occurred.


[heading Remarks]
      
After a successful read\_until operation, the dynamic buffer sequence may contain additional data beyond that which matched the function object. An application will typically leave that data in the dynamic buffer sequence for a subsequent read\_until operation to examine.

The default implementation of the `is_match_condition` type trait evaluates to true for function pointers and function objects with a `result_type` typedef. It must be specialised for other user-defined function objects. 




[endsect]



[section:overload9 read_until (9 of 24 overloads)]


Read data into a streambuf until it contains a specified delimiter. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator>
  std::size_t read_until(
      SyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      char delim);


This function is used to read data into the specified streambuf until the streambuf's get area contains the specified delimiter. The call will block until one of the following conditions is true:


* The get area of the streambuf contains the specified delimiter.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the streambuf's get area already contains the delimiter, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[b][A streambuf object into which the data will be read.]]

[[delim][The delimiter character.]]

]


[heading Return Value]
      
The number of bytes in the streambuf's get area up to and including the delimiter.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
After a successful read\_until operation, the streambuf may contain additional data beyond the delimiter. An application will typically leave that data in the streambuf for a subsequent read\_until operation to examine.


[heading Example]
  
To read data into a streambuf until a newline is encountered: 

   asio::streambuf b;
   asio::read_until(s, b, '\n');
   std::istream is(&b);
   std::string line;
   std::getline(is, line); 


After the `read_until` operation completes successfully, the buffer `b` contains the delimiter: 

   { 'a', 'b', ..., 'c', '\n', 'd', 'e', ... } 


The call to `std::getline` then extracts the data up to and including the newline (which is discarded), so that the string `line` contains: 

   { 'a', 'b', ..., 'c' } 


The remaining data is left in the buffer `b` as follows: 

   { 'd', 'e', ... } 


This data may be the start of a new line, to be extracted by a subsequent `read_until` operation. 




[endsect]



[section:overload10 read_until (10 of 24 overloads)]


Read data into a streambuf until it contains a specified delimiter. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator>
  std::size_t read_until(
      SyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      char delim,
      asio::error_code & ec);


This function is used to read data into the specified streambuf until the streambuf's get area contains the specified delimiter. The call will block until one of the following conditions is true:


* The get area of the streambuf contains the specified delimiter.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the streambuf's get area already contains the delimiter, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[b][A streambuf object into which the data will be read.]]

[[delim][The delimiter character.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes in the streambuf's get area up to and including the delimiter. Returns 0 if an error occurred.


[heading Remarks]
      
After a successful read\_until operation, the streambuf may contain additional data beyond the delimiter. An application will typically leave that data in the streambuf for a subsequent read\_until operation to examine. 




[endsect]



[section:overload11 read_until (11 of 24 overloads)]


Read data into a streambuf until it contains a specified delimiter. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator>
  std::size_t read_until(
      SyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      string_view delim);


This function is used to read data into the specified streambuf until the streambuf's get area contains the specified delimiter. The call will block until one of the following conditions is true:


* The get area of the streambuf contains the specified delimiter.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the streambuf's get area already contains the delimiter, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[b][A streambuf object into which the data will be read.]]

[[delim][The delimiter string.]]

]


[heading Return Value]
      
The number of bytes in the streambuf's get area up to and including the delimiter.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
After a successful read\_until operation, the streambuf may contain additional data beyond the delimiter. An application will typically leave that data in the streambuf for a subsequent read\_until operation to examine.


[heading Example]
  
To read data into a streambuf until a newline is encountered: 

   asio::streambuf b;
   asio::read_until(s, b, "\r\n");
   std::istream is(&b);
   std::string line;
   std::getline(is, line); 


After the `read_until` operation completes successfully, the buffer `b` contains the delimiter: 

   { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } 


The call to `std::getline` then extracts the data up to and including the newline (which is discarded), so that the string `line` contains: 

   { 'a', 'b', ..., 'c', '\r' } 


The remaining data is left in the buffer `b` as follows: 

   { 'd', 'e', ... } 


This data may be the start of a new line, to be extracted by a subsequent `read_until` operation. 




[endsect]



[section:overload12 read_until (12 of 24 overloads)]


Read data into a streambuf until it contains a specified delimiter. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator>
  std::size_t read_until(
      SyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      string_view delim,
      asio::error_code & ec);


This function is used to read data into the specified streambuf until the streambuf's get area contains the specified delimiter. The call will block until one of the following conditions is true:


* The get area of the streambuf contains the specified delimiter.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the streambuf's get area already contains the delimiter, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[b][A streambuf object into which the data will be read.]]

[[delim][The delimiter string.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes in the streambuf's get area up to and including the delimiter. Returns 0 if an error occurred.


[heading Remarks]
      
After a successful read\_until operation, the streambuf may contain additional data beyond the delimiter. An application will typically leave that data in the streambuf for a subsequent read\_until operation to examine. 




[endsect]



[section:overload13 read_until (13 of 24 overloads)]


Read data into a streambuf until some part of the data it contains matches a regular expression. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator>
  std::size_t read_until(
      SyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      const boost::regex & expr);


This function is used to read data into the specified streambuf until the streambuf's get area contains some data that matches a regular expression. The call will block until one of the following conditions is true:


* A substring of the streambuf's get area matches the regular expression.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the streambuf's get area already contains data that matches the regular expression, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[b][A streambuf object into which the data will be read.]]

[[expr][The regular expression.]]

]


[heading Return Value]
      
The number of bytes in the streambuf's get area up to and including the substring that matches the regular expression.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
After a successful read\_until operation, the streambuf may contain additional data beyond that which matched the regular expression. An application will typically leave that data in the streambuf for a subsequent read\_until operation to examine.


[heading Example]
  
To read data into a streambuf until a CR-LF sequence is encountered: 

   asio::streambuf b;
   asio::read_until(s, b, boost::regex("\r\n"));
   std::istream is(&b);
   std::string line;
   std::getline(is, line); 


After the `read_until` operation completes successfully, the buffer `b` contains the data which matched the regular expression: 

   { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } 


The call to `std::getline` then extracts the data up to and including the newline (which is discarded), so that the string `line` contains: 

   { 'a', 'b', ..., 'c', '\r' } 


The remaining data is left in the buffer `b` as follows: 

   { 'd', 'e', ... } 


This data may be the start of a new line, to be extracted by a subsequent `read_until` operation. 




[endsect]



[section:overload14 read_until (14 of 24 overloads)]


Read data into a streambuf until some part of the data it contains matches a regular expression. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator>
  std::size_t read_until(
      SyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      const boost::regex & expr,
      asio::error_code & ec);


This function is used to read data into the specified streambuf until the streambuf's get area contains some data that matches a regular expression. The call will block until one of the following conditions is true:


* A substring of the streambuf's get area matches the regular expression.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the streambuf's get area already contains data that matches the regular expression, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[b][A streambuf object into which the data will be read.]]

[[expr][The regular expression.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes in the streambuf's get area up to and including the substring that matches the regular expression. Returns 0 if an error occurred.


[heading Remarks]
      
After a successful read\_until operation, the streambuf may contain additional data beyond that which matched the regular expression. An application will typically leave that data in the streambuf for a subsequent read\_until operation to examine. 




[endsect]



[section:overload15 read_until (15 of 24 overloads)]


Read data into a streambuf until a function object indicates a match. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator,
      typename MatchCondition>
  std::size_t read_until(
      SyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      MatchCondition match_condition,
      typename enable_if< is_match_condition< MatchCondition >::value >::type *  = 0);


This function is used to read data into the specified streambuf until a user-defined match condition function object, when applied to the data contained in the streambuf, indicates a successful match. The call will block until one of the following conditions is true:


* The match condition function object returns a std::pair where the second element evaluates to true.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the match condition function object already indicates a match, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[b][A streambuf object into which the data will be read.]]

[[match_condition][The function object to be called to determine whether a match exists. The signature of the function object must be: 
``
   pair<iterator, bool> match_condition(iterator begin, iterator end);
``
where `iterator` represents the type: 
``
   buffers_iterator<basic_streambuf<Allocator>::const_buffers_type>
``
The iterator parameters `begin` and `end` define the range of bytes to be scanned to determine whether there is a match. The `first` member of the return value is an iterator marking one-past-the-end of the bytes that have been consumed by the match function. This iterator is used to calculate the `begin` parameter for any subsequent invocation of the match condition. The `second` member of the return value is true if a match has been found, false otherwise.]]

]


[heading Return Value]
      
The number of bytes in the streambuf's get area that have been fully consumed by the match function.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
After a successful read\_until operation, the streambuf may contain additional data beyond that which matched the function object. An application will typically leave that data in the streambuf for a subsequent read\_until operation to examine.

The default implementation of the `is_match_condition` type trait evaluates to true for function pointers and function objects with a `result_type` typedef. It must be specialised for other user-defined function objects.


[heading Examples]
  
To read data into a streambuf until whitespace is encountered: 

   typedef asio::buffers_iterator<
       asio::streambuf::const_buffers_type> iterator;

   std::pair<iterator, bool>
   match_whitespace(iterator begin, iterator end)
   {
     iterator i = begin;
     while (i != end)
       if (std::isspace(*i++))
         return std::make_pair(i, true);
     return std::make_pair(i, false);
   }
   ...
   asio::streambuf b;
   asio::read_until(s, b, match_whitespace);




To read data into a streambuf until a matching character is found: 

   class match_char
   {
   public:
     explicit match_char(char c) : c_(c) {}

     template <typename Iterator>
     std::pair<Iterator, bool> operator()(
         Iterator begin, Iterator end) const
     {
       Iterator i = begin;
       while (i != end)
         if (c_ == *i++)
           return std::make_pair(i, true);
       return std::make_pair(i, false);
     }

   private:
     char c_;
   };

   namespace asio {
     template <> struct is_match_condition<match_char>
       : public boost::true_type {};
   } // namespace asio
   ...
   asio::streambuf b;
   asio::read_until(s, b, match_char('a'));





[endsect]



[section:overload16 read_until (16 of 24 overloads)]


Read data into a streambuf until a function object indicates a match. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator,
      typename MatchCondition>
  std::size_t read_until(
      SyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      MatchCondition match_condition,
      asio::error_code & ec,
      typename enable_if< is_match_condition< MatchCondition >::value >::type *  = 0);


This function is used to read data into the specified streambuf until a user-defined match condition function object, when applied to the data contained in the streambuf, indicates a successful match. The call will block until one of the following conditions is true:


* The match condition function object returns a std::pair where the second element evaluates to true.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the match condition function object already indicates a match, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[b][A streambuf object into which the data will be read.]]

[[match_condition][The function object to be called to determine whether a match exists. The signature of the function object must be: 
``
   pair<iterator, bool> match_condition(iterator begin, iterator end);
``
where `iterator` represents the type: 
``
   buffers_iterator<basic_streambuf<Allocator>::const_buffers_type>
``
The iterator parameters `begin` and `end` define the range of bytes to be scanned to determine whether there is a match. The `first` member of the return value is an iterator marking one-past-the-end of the bytes that have been consumed by the match function. This iterator is used to calculate the `begin` parameter for any subsequent invocation of the match condition. The `second` member of the return value is true if a match has been found, false otherwise.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes in the streambuf's get area that have been fully consumed by the match function. Returns 0 if an error occurred.


[heading Remarks]
      
After a successful read\_until operation, the streambuf may contain additional data beyond that which matched the function object. An application will typically leave that data in the streambuf for a subsequent read\_until operation to examine.

The default implementation of the `is_match_condition` type trait evaluates to true for function pointers and function objects with a `result_type` typedef. It must be specialised for other user-defined function objects. 




[endsect]



[section:overload17 read_until (17 of 24 overloads)]


Read data into a dynamic buffer sequence until it contains a specified delimiter. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      char delim,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains the specified delimiter. The call will block until one of the following conditions is true:


* The get area of the dynamic buffer sequence contains the specified delimiter.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the dynamic buffer sequence's get area already contains the delimiter, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read.]]

[[delim][The delimiter character.]]

]


[heading Return Value]
      
The number of bytes in the dynamic buffer sequence's get area up to and including the delimiter.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
After a successful read\_until operation, the dynamic buffer sequence may contain additional data beyond the delimiter. An application will typically leave that data in the dynamic buffer sequence for a subsequent read\_until operation to examine.


[heading Example]
  
To read data into a `std::string` until a newline is encountered: 

   std::string data;
   std::size_t n = asio::read_until(s,
       asio::dynamic_buffer(data), '\n');
   std::string line = data.substr(0, n);
   data.erase(0, n); 


After the `read_until` operation completes successfully, the string `data` contains the delimiter: 

   { 'a', 'b', ..., 'c', '\n', 'd', 'e', ... } 


The call to `substr` then extracts the data up to and including the delimiter, so that the string `line` contains: 

   { 'a', 'b', ..., 'c', '\n' } 


After the call to `erase`, the remaining data is left in the buffer `b` as follows: 

   { 'd', 'e', ... } 


This data may be the start of a new line, to be extracted by a subsequent `read_until` operation. 




[endsect]



[section:overload18 read_until (18 of 24 overloads)]


Read data into a dynamic buffer sequence until it contains a specified delimiter. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      char delim,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains the specified delimiter. The call will block until one of the following conditions is true:


* The get area of the dynamic buffer sequence contains the specified delimiter.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the dynamic buffer sequence's get area already contains the delimiter, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read.]]

[[delim][The delimiter character.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes in the dynamic buffer sequence's get area up to and including the delimiter. Returns 0 if an error occurred.


[heading Remarks]
      
After a successful read\_until operation, the dynamic buffer sequence may contain additional data beyond the delimiter. An application will typically leave that data in the dynamic buffer sequence for a subsequent read\_until operation to examine. 




[endsect]



[section:overload19 read_until (19 of 24 overloads)]


Read data into a dynamic buffer sequence until it contains a specified delimiter. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      string_view delim,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains the specified delimiter. The call will block until one of the following conditions is true:


* The get area of the dynamic buffer sequence contains the specified delimiter.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the dynamic buffer sequence's get area already contains the delimiter, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read.]]

[[delim][The delimiter string.]]

]


[heading Return Value]
      
The number of bytes in the dynamic buffer sequence's get area up to and including the delimiter.


[heading Remarks]
      
After a successful read\_until operation, the dynamic buffer sequence may contain additional data beyond the delimiter. An application will typically leave that data in the dynamic buffer sequence for a subsequent read\_until operation to examine.


[heading Example]
  
To read data into a `std::string` until a CR-LF sequence is encountered: 

   std::string data;
   std::size_t n = asio::read_until(s,
       asio::dynamic_buffer(data), "\r\n");
   std::string line = data.substr(0, n);
   data.erase(0, n); 


After the `read_until` operation completes successfully, the string `data` contains the delimiter: 

   { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } 


The call to `substr` then extracts the data up to and including the delimiter, so that the string `line` contains: 

   { 'a', 'b', ..., 'c', '\r', '\n' } 


After the call to `erase`, the remaining data is left in the buffer `b` as follows: 

   { 'd', 'e', ... } 


This data may be the start of a new line, to be extracted by a subsequent `read_until` operation. 




[endsect]



[section:overload20 read_until (20 of 24 overloads)]


Read data into a dynamic buffer sequence until it contains a specified delimiter. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      string_view delim,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains the specified delimiter. The call will block until one of the following conditions is true:


* The get area of the dynamic buffer sequence contains the specified delimiter.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the dynamic buffer sequence's get area already contains the delimiter, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][The dynamic buffer sequence into which the data will be read.]]

[[delim][The delimiter string.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes in the dynamic buffer sequence's get area up to and including the delimiter. Returns 0 if an error occurred.


[heading Remarks]
      
After a successful read\_until operation, the dynamic buffer sequence may contain additional data beyond the delimiter. An application will typically leave that data in the dynamic buffer sequence for a subsequent read\_until operation to examine. 




[endsect]



[section:overload21 read_until (21 of 24 overloads)]


Read data into a dynamic buffer sequence until some part of the data it contains matches a regular expression. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      const boost::regex & expr,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains some data that matches a regular expression. The call will block until one of the following conditions is true:


* A substring of the dynamic buffer sequence's get area matches the regular expression.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the dynamic buffer sequence's get area already contains data that matches the regular expression, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][A dynamic buffer sequence into which the data will be read.]]

[[expr][The regular expression.]]

]


[heading Return Value]
      
The number of bytes in the dynamic buffer sequence's get area up to and including the substring that matches the regular expression.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
After a successful read\_until operation, the dynamic buffer sequence may contain additional data beyond that which matched the regular expression. An application will typically leave that data in the dynamic buffer sequence for a subsequent read\_until operation to examine.


[heading Example]
  
To read data into a `std::string` until a CR-LF sequence is encountered: 

   std::string data;
   std::size_t n = asio::read_until(s,
       asio::dynamic_buffer(data), boost::regex("\r\n"));
   std::string line = data.substr(0, n);
   data.erase(0, n); 


After the `read_until` operation completes successfully, the string `data` contains the delimiter: 

   { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } 


The call to `substr` then extracts the data up to and including the delimiter, so that the string `line` contains: 

   { 'a', 'b', ..., 'c', '\r', '\n' } 


After the call to `erase`, the remaining data is left in the buffer `b` as follows: 

   { 'd', 'e', ... } 


This data may be the start of a new line, to be extracted by a subsequent `read_until` operation. 




[endsect]



[section:overload22 read_until (22 of 24 overloads)]


Read data into a dynamic buffer sequence until some part of the data it contains matches a regular expression. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      const boost::regex & expr,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains some data that matches a regular expression. The call will block until one of the following conditions is true:


* A substring of the dynamic buffer sequence's get area matches the regular expression.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the dynamic buffer sequence's get area already contains data that matches the regular expression, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][A dynamic buffer sequence into which the data will be read.]]

[[expr][The regular expression.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes in the dynamic buffer sequence's get area up to and including the substring that matches the regular expression. Returns 0 if an error occurred.


[heading Remarks]
      
After a successful read\_until operation, the dynamic buffer sequence may contain additional data beyond that which matched the regular expression. An application will typically leave that data in the dynamic buffer sequence for a subsequent read\_until operation to examine. 




[endsect]



[section:overload23 read_until (23 of 24 overloads)]


Read data into a dynamic buffer sequence until a function object indicates a match. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename MatchCondition>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      MatchCondition match_condition,
      typename enable_if< is_match_condition< MatchCondition >::value &&is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to read data into the specified dynamic buffer sequence until a user-defined match condition function object, when applied to the data contained in the dynamic buffer sequence, indicates a successful match. The call will block until one of the following conditions is true:


* The match condition function object returns a std::pair where the second element evaluates to true.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the match condition function object already indicates a match, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][A dynamic buffer sequence into which the data will be read.]]

[[match_condition][The function object to be called to determine whether a match exists. The signature of the function object must be: 
``
   pair<iterator, bool> match_condition(iterator begin, iterator end);
``
where `iterator` represents the type: 
``
   buffers_iterator<typename DynamicBuffer_v2::const_buffers_type>
``
The iterator parameters `begin` and `end` define the range of bytes to be scanned to determine whether there is a match. The `first` member of the return value is an iterator marking one-past-the-end of the bytes that have been consumed by the match function. This iterator is used to calculate the `begin` parameter for any subsequent invocation of the match condition. The `second` member of the return value is true if a match has been found, false otherwise.]]

]


[heading Return Value]
      
The number of bytes in the dynamic\_buffer's get area that have been fully consumed by the match function.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
After a successful read\_until operation, the dynamic buffer sequence may contain additional data beyond that which matched the function object. An application will typically leave that data in the dynamic buffer sequence for a subsequent read\_until operation to examine.

The default implementation of the `is_match_condition` type trait evaluates to true for function pointers and function objects with a `result_type` typedef. It must be specialised for other user-defined function objects.


[heading Examples]
  
To read data into a dynamic buffer sequence until whitespace is encountered: 

   typedef asio::buffers_iterator<
       asio::const_buffers_1> iterator;

   std::pair<iterator, bool>
   match_whitespace(iterator begin, iterator end)
   {
     iterator i = begin;
     while (i != end)
       if (std::isspace(*i++))
         return std::make_pair(i, true);
     return std::make_pair(i, false);
   }
   ...
   std::string data;
   asio::read_until(s, data, match_whitespace);




To read data into a `std::string` until a matching character is found: 

   class match_char
   {
   public:
     explicit match_char(char c) : c_(c) {}

     template <typename Iterator>
     std::pair<Iterator, bool> operator()(
         Iterator begin, Iterator end) const
     {
       Iterator i = begin;
       while (i != end)
         if (c_ == *i++)
           return std::make_pair(i, true);
       return std::make_pair(i, false);
     }

   private:
     char c_;
   };

   namespace asio {
     template <> struct is_match_condition<match_char>
       : public boost::true_type {};
   } // namespace asio
   ...
   std::string data;
   asio::read_until(s, data, match_char('a'));





[endsect]



[section:overload24 read_until (24 of 24 overloads)]


Read data into a dynamic buffer sequence until a function object indicates a match. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename MatchCondition>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBuffer_v2 buffers,
      MatchCondition match_condition,
      asio::error_code & ec,
      typename enable_if< is_match_condition< MatchCondition >::value &&is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to read data into the specified dynamic buffer sequence until a user-defined match condition function object, when applied to the data contained in the dynamic buffer sequence, indicates a successful match. The call will block until one of the following conditions is true:


* The match condition function object returns a std::pair where the second element evaluates to true.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read\_some function. If the match condition function object already indicates a match, the function returns immediately.


[heading Parameters]
    

[variablelist
  
[[s][The stream from which the data is to be read. The type must support the SyncReadStream concept.]]

[[buffers][A dynamic buffer sequence into which the data will be read.]]

[[match_condition][The function object to be called to determine whether a match exists. The signature of the function object must be: 
``
   pair<iterator, bool> match_condition(iterator begin, iterator end);
``
where `iterator` represents the type: 
``
   buffers_iterator<DynamicBuffer_v2::const_buffers_type>
``
The iterator parameters `begin` and `end` define the range of bytes to be scanned to determine whether there is a match. The `first` member of the return value is an iterator marking one-past-the-end of the bytes that have been consumed by the match function. This iterator is used to calculate the `begin` parameter for any subsequent invocation of the match condition. The `second` member of the return value is true if a match has been found, false otherwise.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes in the dynamic buffer sequence's get area that have been fully consumed by the match function. Returns 0 if an error occurred.


[heading Remarks]
      
After a successful read\_until operation, the dynamic buffer sequence may contain additional data beyond that which matched the function object. An application will typically leave that data in the dynamic buffer sequence for a subsequent read\_until operation to examine.

The default implementation of the `is_match_condition` type trait evaluates to true for function pointers and function objects with a `result_type` typedef. It must be specialised for other user-defined function objects. 




[endsect]


[endsect]


[section:redirect_error redirect_error]

[indexterm1 asio.indexterm.redirect_error..redirect_error] 
Create a completion token to capture [link asio.reference.error_code `error_code`] values to a variable. 


  template<
      typename CompletionToken>
  redirect_error_t< typename decay< CompletionToken >::type > redirect_error(
      CompletionToken && completion_token,
      asio::error_code & ec);


[heading Requirements]

['Header: ][^asio/redirect_error.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:redirect_error_t redirect_error_t]


Completion token type used to specify that an error produced by an asynchronous operation is captured to an [link asio.reference.error_code `error_code`] variable. 


  template<
      typename CompletionToken>
  class redirect_error_t


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.redirect_error_t.redirect_error_t [*redirect_error_t]] [constructor]]
    [Constructor. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.redirect_error_t.ec_ [*ec_]]]
    []
  ]

  [
    [[link asio.reference.redirect_error_t.token_ [*token_]]]
    []
  ]

]

The [link asio.reference.redirect_error_t `redirect_error_t`] class is used to indicate that any [link asio.reference.error_code `error_code`] produced by an asynchronous operation is captured to a specified variable. 

[heading Requirements]

['Header: ][^asio/redirect_error.hpp]

['Convenience header: ][^asio.hpp]


[section:ec_ redirect_error_t::ec_]

[indexterm2 asio.indexterm.redirect_error_t.ec_..ec_..redirect_error_t] 

  asio::error_code & ec_;



[endsect]



[section:redirect_error_t redirect_error_t::redirect_error_t]

[indexterm2 asio.indexterm.redirect_error_t.redirect_error_t..redirect_error_t..redirect_error_t] 
Constructor. 


  template<
      typename T>
  redirect_error_t(
      T && completion_token,
      asio::error_code & ec);



[endsect]



[section:token_ redirect_error_t::token_]

[indexterm2 asio.indexterm.redirect_error_t.token_..token_..redirect_error_t] 

  CompletionToken token_;



[endsect]



[endsect]


[section:require require]

[indexterm1 asio.indexterm.require..require] 
A customisation point that applies a concept-preserving property to an object. 


  constexpr unspecified require = unspecified;


The name `require` denotes a customisation point object. The expression `asio::require(E, P0, Pn...)` for some subexpressions `E` and `P0`, and where `Pn...` represents `N` subexpressions (where `N` is 0 or more, and with types `T = decay_t<decltype(E)>` and `Prop0 = decay_t<decltype(P0)>`) is expression-equivalent to:


* If `is_applicable_property_v<T, Prop0> && Prop0::is_requirable` is not a well-formed constant expression with value `true`, `asio::require(E, P0, Pn...)` is ill-formed.


* Otherwise, `E` if `N == 0` and the expression `Prop0::template static_query_v<T> == Prop0::value()` is a well-formed constant expression with value `true`.


* Otherwise, `(E).require(P0)` if `N == 0` and the expression `(E).require(P0)` is a valid expression.


* Otherwise, `require(E, P0)` if `N == 0` and the expression `require(E, P0)` is a valid expression with overload resolution performed in a context that does not include the declaration of the `require` customization point object.


* Otherwise, `asio::require(asio::require(E, P0), Pn...)` if `N > 0` and the expression `asio::require(asio::require(E, P0), Pn...)` is a valid expression.


* Otherwise, `asio::require(E, P0, Pn...)` is ill-formed. 



[heading Requirements]

['Header: ][^asio/require.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:require_concept require_concept]

[indexterm1 asio.indexterm.require_concept..require_concept] 
A customisation point that applies a concept-enforcing property to an object. 


  constexpr unspecified require_concept = unspecified;


The name `require_concept` denotes a customization point object. The expression `asio::require_concept(E, P)` for some subexpressions `E` and `P` (with types `T = decay_t<decltype(E)>` and `Prop = decay_t<decltype(P)>`) is expression-equivalent to:


* If `is_applicable_property_v<T, Prop> && Prop::is_requirable_concept` is not a well-formed constant expression with value `true`, `asio::require_concept(E, P)` is ill-formed.


* Otherwise, `E` if the expression `Prop::template static_query_v<T> == Prop::value()` is a well-formed constant expression with value `true`.


* Otherwise, `(E).require_concept(P)` if the expression `(E).require_concept(P)` is well-formed.


* Otherwise, `require_concept(E, P)` if the expression `require_concept(E, P)` is a valid expression with overload resolution performed in a context that does not include the declaration of the `require_concept` customization point object.


* Otherwise, `asio::require_concept(E, P)` is ill-formed. 



[heading Requirements]

['Header: ][^asio/require_concept.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:require_concept_result require_concept_result]


A type trait that determines the result type of a `require_concept` expression. 


  template<
      typename T,
      typename Property>
  struct require_concept_result


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.require_concept_result.type [*type]]]
    [The result of the require_concept expression. ]
  
  ]

]

Class template `require_concept_result` is a trait that determines the result type of the expression `asio::require_concept(std::declval<T>(), std::declval<Property>())`. 

[heading Requirements]

['Header: ][^asio/require_concept.hpp]

['Convenience header: ][^asio.hpp]


[section:type require_concept_result::type]

[indexterm2 asio.indexterm.require_concept_result.type..type..require_concept_result] 
The result of the `require_concept` expression. 


  typedef automatically_determined type;



[heading Requirements]

['Header: ][^asio/require_concept.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:require_result require_result]


A type trait that determines the result type of a `require` expression. 


  template<
      typename T,
      typename... Properties>
  struct require_result


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.require_result.type [*type]]]
    [The result of the require expression. ]
  
  ]

]

Class template `require_result` is a trait that determines the result type of the expression `asio::require(std::declval<T>(), std::declval<Properties>()...)`. 

[heading Requirements]

['Header: ][^asio/require.hpp]

['Convenience header: ][^asio.hpp]


[section:type require_result::type]

[indexterm2 asio.indexterm.require_result.type..type..require_result] 
The result of the `require` expression. 


  typedef automatically_determined type;



[heading Requirements]

['Header: ][^asio/require.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]


[section:resolver_errc__try_again resolver_errc::try_again]

[indexterm1 asio.indexterm.resolver_errc__try_again..resolver_errc::try_again] 

  const error::netdb_errors try_again = error::host_not_found_try_again;


[heading Requirements]

['Header: ][^asio/error.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:serial_port serial_port]

[indexterm1 asio.indexterm.serial_port..serial_port] 
Typedef for the typical usage of a serial port. 


  typedef basic_serial_port serial_port;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_serial_port__rebind_executor [*rebind_executor]]]
    [Rebinds the serial port type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_serial_port.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_serial_port.lowest_layer_type [*lowest_layer_type]]]
    [A basic_basic_serial_port is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_serial_port.native_handle_type [*native_handle_type]]]
    [The native representation of a serial port. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_serial_port.assign [*assign]]]
    [Assign an existing native serial port to the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.async_read_some [*async_read_some]]]
    [Start an asynchronous read. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.async_write_some [*async_write_some]]]
    [Start an asynchronous write. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.basic_serial_port [*basic_serial_port]] [constructor]]
    [Construct a basic_serial_port without opening it. 
     [hr]
     Construct and open a basic_serial_port. 
     [hr]
     Construct a basic_serial_port on an existing native serial port. 
     [hr]
     Move-construct a basic_serial_port from another. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.close [*close]]]
    [Close the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.get_option [*get_option]]]
    [Get an option from the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.is_open [*is_open]]]
    [Determine whether the serial port is open. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.native_handle [*native_handle]]]
    [Get the native serial port representation. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.open [*open]]]
    [Open the serial port using the specified device name. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.operator_eq_ [*operator=]]]
    [Move-assign a basic_serial_port from another. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.read_some [*read_some]]]
    [Read some data from the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.send_break [*send_break]]]
    [Send a break sequence to the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.set_option [*set_option]]]
    [Set an option on the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.write_some [*write_some]]]
    [Write some data to the serial port. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port._basic_serial_port [*~basic_serial_port]] [destructor]]
    [Destroys the serial port. ]
  ]
  
]

The [link asio.reference.basic_serial_port `basic_serial_port`] class provides a wrapper over serial port functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/serial_port.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:serial_port_base serial_port_base]


The [link asio.reference.serial_port_base `serial_port_base`] class is used as a base for the [link asio.reference.basic_serial_port `basic_serial_port`] class template so that we have a common place to define the serial port options. 


  class serial_port_base


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.serial_port_base__baud_rate [*baud_rate]]]
    [Serial port option to permit changing the baud rate. ]
  
  ]

  [

    [[link asio.reference.serial_port_base__character_size [*character_size]]]
    [Serial port option to permit changing the character size. ]
  
  ]

  [

    [[link asio.reference.serial_port_base__flow_control [*flow_control]]]
    [Serial port option to permit changing the flow control. ]
  
  ]

  [

    [[link asio.reference.serial_port_base__parity [*parity]]]
    [Serial port option to permit changing the parity. ]
  
  ]

  [

    [[link asio.reference.serial_port_base__stop_bits [*stop_bits]]]
    [Serial port option to permit changing the number of stop bits. ]
  
  ]

]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.serial_port_base._serial_port_base [*~serial_port_base]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/serial_port_base.hpp]

['Convenience header: ][^asio.hpp]


[section:_serial_port_base serial_port_base::~serial_port_base]

[indexterm2 asio.indexterm.serial_port_base._serial_port_base..~serial_port_base..serial_port_base] 
Protected destructor to prevent deletion through this type. 


  ~serial_port_base();



[endsect]



[endsect]

[section:serial_port_base__baud_rate serial_port_base::baud_rate]


Serial port option to permit changing the baud rate. 


  class baud_rate


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.serial_port_base__baud_rate.baud_rate [*baud_rate]] [constructor]]
    []
  ]
  
  [
    [[link asio.reference.serial_port_base__baud_rate.load [*load]]]
    []
  ]
  
  [
    [[link asio.reference.serial_port_base__baud_rate.store [*store]]]
    []
  ]
  
  [
    [[link asio.reference.serial_port_base__baud_rate.value [*value]]]
    []
  ]
  
]

Implements changing the baud rate for a given serial port. 

[heading Requirements]

['Header: ][^asio/serial_port_base.hpp]

['Convenience header: ][^asio.hpp]


[section:baud_rate serial_port_base::baud_rate::baud_rate]

[indexterm2 asio.indexterm.serial_port_base__baud_rate.baud_rate..baud_rate..serial_port_base::baud_rate] 

  baud_rate(
      unsigned int rate = 0);



[endsect]



[section:load serial_port_base::baud_rate::load]

[indexterm2 asio.indexterm.serial_port_base__baud_rate.load..load..serial_port_base::baud_rate] 

  void load(
      const ASIO_OPTION_STORAGE & storage,
      asio::error_code & ec);



[endsect]



[section:store serial_port_base::baud_rate::store]

[indexterm2 asio.indexterm.serial_port_base__baud_rate.store..store..serial_port_base::baud_rate] 

  void store(
      ASIO_OPTION_STORAGE & storage,
      asio::error_code & ec) const;



[endsect]



[section:value serial_port_base::baud_rate::value]

[indexterm2 asio.indexterm.serial_port_base__baud_rate.value..value..serial_port_base::baud_rate] 

  unsigned int value() const;



[endsect]



[endsect]

[section:serial_port_base__character_size serial_port_base::character_size]


Serial port option to permit changing the character size. 


  class character_size


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.serial_port_base__character_size.character_size [*character_size]] [constructor]]
    []
  ]
  
  [
    [[link asio.reference.serial_port_base__character_size.load [*load]]]
    []
  ]
  
  [
    [[link asio.reference.serial_port_base__character_size.store [*store]]]
    []
  ]
  
  [
    [[link asio.reference.serial_port_base__character_size.value [*value]]]
    []
  ]
  
]

Implements changing the character size for a given serial port. 

[heading Requirements]

['Header: ][^asio/serial_port_base.hpp]

['Convenience header: ][^asio.hpp]


[section:character_size serial_port_base::character_size::character_size]

[indexterm2 asio.indexterm.serial_port_base__character_size.character_size..character_size..serial_port_base::character_size] 

  character_size(
      unsigned int t = 8);



[endsect]



[section:load serial_port_base::character_size::load]

[indexterm2 asio.indexterm.serial_port_base__character_size.load..load..serial_port_base::character_size] 

  void load(
      const ASIO_OPTION_STORAGE & storage,
      asio::error_code & ec);



[endsect]



[section:store serial_port_base::character_size::store]

[indexterm2 asio.indexterm.serial_port_base__character_size.store..store..serial_port_base::character_size] 

  void store(
      ASIO_OPTION_STORAGE & storage,
      asio::error_code & ec) const;



[endsect]



[section:value serial_port_base::character_size::value]

[indexterm2 asio.indexterm.serial_port_base__character_size.value..value..serial_port_base::character_size] 

  unsigned int value() const;



[endsect]



[endsect]

[section:serial_port_base__flow_control serial_port_base::flow_control]


Serial port option to permit changing the flow control. 


  class flow_control


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.serial_port_base__flow_control.type [*type]]]
    []
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.serial_port_base__flow_control.flow_control [*flow_control]] [constructor]]
    []
  ]
  
  [
    [[link asio.reference.serial_port_base__flow_control.load [*load]]]
    []
  ]
  
  [
    [[link asio.reference.serial_port_base__flow_control.store [*store]]]
    []
  ]
  
  [
    [[link asio.reference.serial_port_base__flow_control.value [*value]]]
    []
  ]
  
]

Implements changing the flow control for a given serial port. 

[heading Requirements]

['Header: ][^asio/serial_port_base.hpp]

['Convenience header: ][^asio.hpp]


[section:flow_control serial_port_base::flow_control::flow_control]

[indexterm2 asio.indexterm.serial_port_base__flow_control.flow_control..flow_control..serial_port_base::flow_control] 

  flow_control(
      type t = none);



[endsect]



[section:load serial_port_base::flow_control::load]

[indexterm2 asio.indexterm.serial_port_base__flow_control.load..load..serial_port_base::flow_control] 

  void load(
      const ASIO_OPTION_STORAGE & storage,
      asio::error_code & ec);



[endsect]



[section:store serial_port_base::flow_control::store]

[indexterm2 asio.indexterm.serial_port_base__flow_control.store..store..serial_port_base::flow_control] 

  void store(
      ASIO_OPTION_STORAGE & storage,
      asio::error_code & ec) const;



[endsect]



[section:type serial_port_base::flow_control::type]

[indexterm2 asio.indexterm.serial_port_base__flow_control.type..type..serial_port_base::flow_control] 

  enum type

[indexterm2 asio.indexterm.serial_port_base__flow_control.type.none..none..serial_port_base::flow_control]
[indexterm2 asio.indexterm.serial_port_base__flow_control.type.software..software..serial_port_base::flow_control]
[indexterm2 asio.indexterm.serial_port_base__flow_control.type.hardware..hardware..serial_port_base::flow_control]

[heading Values]
[variablelist

  [
    [none]
    []
  ]

  [
    [software]
    []
  ]

  [
    [hardware]
    []
  ]

]



[endsect]



[section:value serial_port_base::flow_control::value]

[indexterm2 asio.indexterm.serial_port_base__flow_control.value..value..serial_port_base::flow_control] 

  type value() const;



[endsect]



[endsect]

[section:serial_port_base__parity serial_port_base::parity]


Serial port option to permit changing the parity. 


  class parity


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.serial_port_base__parity.type [*type]]]
    []
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.serial_port_base__parity.load [*load]]]
    []
  ]
  
  [
    [[link asio.reference.serial_port_base__parity.parity [*parity]] [constructor]]
    []
  ]
  
  [
    [[link asio.reference.serial_port_base__parity.store [*store]]]
    []
  ]
  
  [
    [[link asio.reference.serial_port_base__parity.value [*value]]]
    []
  ]
  
]

Implements changing the parity for a given serial port. 

[heading Requirements]

['Header: ][^asio/serial_port_base.hpp]

['Convenience header: ][^asio.hpp]


[section:load serial_port_base::parity::load]

[indexterm2 asio.indexterm.serial_port_base__parity.load..load..serial_port_base::parity] 

  void load(
      const ASIO_OPTION_STORAGE & storage,
      asio::error_code & ec);



[endsect]



[section:parity serial_port_base::parity::parity]

[indexterm2 asio.indexterm.serial_port_base__parity.parity..parity..serial_port_base::parity] 

  parity(
      type t = none);



[endsect]



[section:store serial_port_base::parity::store]

[indexterm2 asio.indexterm.serial_port_base__parity.store..store..serial_port_base::parity] 

  void store(
      ASIO_OPTION_STORAGE & storage,
      asio::error_code & ec) const;



[endsect]



[section:type serial_port_base::parity::type]

[indexterm2 asio.indexterm.serial_port_base__parity.type..type..serial_port_base::parity] 

  enum type

[indexterm2 asio.indexterm.serial_port_base__parity.type.none..none..serial_port_base::parity]
[indexterm2 asio.indexterm.serial_port_base__parity.type.odd..odd..serial_port_base::parity]
[indexterm2 asio.indexterm.serial_port_base__parity.type.even..even..serial_port_base::parity]

[heading Values]
[variablelist

  [
    [none]
    []
  ]

  [
    [odd]
    []
  ]

  [
    [even]
    []
  ]

]



[endsect]



[section:value serial_port_base::parity::value]

[indexterm2 asio.indexterm.serial_port_base__parity.value..value..serial_port_base::parity] 

  type value() const;



[endsect]



[endsect]

[section:serial_port_base__stop_bits serial_port_base::stop_bits]


Serial port option to permit changing the number of stop bits. 


  class stop_bits


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.serial_port_base__stop_bits.type [*type]]]
    []
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.serial_port_base__stop_bits.load [*load]]]
    []
  ]
  
  [
    [[link asio.reference.serial_port_base__stop_bits.stop_bits [*stop_bits]] [constructor]]
    []
  ]
  
  [
    [[link asio.reference.serial_port_base__stop_bits.store [*store]]]
    []
  ]
  
  [
    [[link asio.reference.serial_port_base__stop_bits.value [*value]]]
    []
  ]
  
]

Implements changing the number of stop bits for a given serial port. 

[heading Requirements]

['Header: ][^asio/serial_port_base.hpp]

['Convenience header: ][^asio.hpp]


[section:load serial_port_base::stop_bits::load]

[indexterm2 asio.indexterm.serial_port_base__stop_bits.load..load..serial_port_base::stop_bits] 

  void load(
      const ASIO_OPTION_STORAGE & storage,
      asio::error_code & ec);



[endsect]



[section:stop_bits serial_port_base::stop_bits::stop_bits]

[indexterm2 asio.indexterm.serial_port_base__stop_bits.stop_bits..stop_bits..serial_port_base::stop_bits] 

  stop_bits(
      type t = one);



[endsect]



[section:store serial_port_base::stop_bits::store]

[indexterm2 asio.indexterm.serial_port_base__stop_bits.store..store..serial_port_base::stop_bits] 

  void store(
      ASIO_OPTION_STORAGE & storage,
      asio::error_code & ec) const;



[endsect]



[section:type serial_port_base::stop_bits::type]

[indexterm2 asio.indexterm.serial_port_base__stop_bits.type..type..serial_port_base::stop_bits] 

  enum type

[indexterm2 asio.indexterm.serial_port_base__stop_bits.type.one..one..serial_port_base::stop_bits]
[indexterm2 asio.indexterm.serial_port_base__stop_bits.type.onepointfive..onepointfive..serial_port_base::stop_bits]
[indexterm2 asio.indexterm.serial_port_base__stop_bits.type.two..two..serial_port_base::stop_bits]

[heading Values]
[variablelist

  [
    [one]
    []
  ]

  [
    [onepointfive]
    []
  ]

  [
    [two]
    []
  ]

]



[endsect]



[section:value serial_port_base::stop_bits::value]

[indexterm2 asio.indexterm.serial_port_base__stop_bits.value..value..serial_port_base::stop_bits] 

  type value() const;



[endsect]



[endsect]

[section:service_already_exists service_already_exists]


Exception thrown when trying to add a duplicate service to an [link asio.reference.execution_context `execution_context`]. 


  class service_already_exists


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.service_already_exists.service_already_exists [*service_already_exists]] [constructor]]
    []
  ]
  
]

[heading Requirements]

['Header: ][^asio/execution_context.hpp]

['Convenience header: ][^asio/execution.hpp]


[section:service_already_exists service_already_exists::service_already_exists]

[indexterm2 asio.indexterm.service_already_exists.service_already_exists..service_already_exists..service_already_exists] 

  service_already_exists();



[endsect]



[endsect]


[section:signal_set signal_set]

[indexterm1 asio.indexterm.signal_set..signal_set] 
Typedef for the typical usage of a signal set. 


  typedef basic_signal_set signal_set;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_signal_set__rebind_executor [*rebind_executor]]]
    [Rebinds the signal set type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_signal_set.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_signal_set.add [*add]]]
    [Add a signal to a signal_set. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set.async_wait [*async_wait]]]
    [Start an asynchronous operation to wait for a signal to be delivered. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set.basic_signal_set [*basic_signal_set]] [constructor]]
    [Construct a signal set without adding any signals. 
     [hr]
     Construct a signal set and add one signal. 
     [hr]
     Construct a signal set and add two signals. 
     [hr]
     Construct a signal set and add three signals. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set.cancel [*cancel]]]
    [Cancel all operations associated with the signal set. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set.clear [*clear]]]
    [Remove all signals from a signal_set. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set.remove [*remove]]]
    [Remove a signal from a signal_set. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set._basic_signal_set [*~basic_signal_set]] [destructor]]
    [Destroys the signal set. ]
  ]
  
]

The [link asio.reference.basic_signal_set `basic_signal_set`] class provides the ability to perform an asynchronous wait for one or more signals to occur.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.


[heading Example]
  
Performing an asynchronous wait: 

   void handler(
       const asio::error_code& error,
       int signal_number)
   {
     if (!error)
     {
       // A signal occurred.
     }
   }

   ...

   // Construct a signal set registered for process termination.
   asio::signal_set signals(my_context, SIGINT, SIGTERM);

   // Start an asynchronous wait for one of the signals to occur.
   signals.async_wait(handler);





[heading Queueing of signal notifications]
  


If a signal is registered with a signal\_set, and the signal occurs when there are no waiting handlers, then the signal notification is queued. The next async\_wait operation on that signal\_set will dequeue the notification. If multiple notifications are queued, subsequent async\_wait operations dequeue them one at a time. Signal notifications are dequeued in order of ascending signal number.

If a signal number is removed from a signal\_set (using the `remove` or `erase` member functions) then any queued notifications for that signal are discarded.


[heading Multiple registration of signals]
  


The same signal number may be registered with different signal\_set objects. When the signal occurs, one handler is called for each signal\_set object.

Note that multiple registration only works for signals that are registered using Asio. The application must not also register a signal handler using functions such as `signal()` or `sigaction()`.


[heading Signal masking on POSIX platforms]
  


POSIX allows signals to be blocked using functions such as `sigprocmask()` and `pthread_sigmask()`. For signals to be delivered, programs must ensure that any signals registered using signal\_set objects are unblocked in at least one thread. 


[heading Requirements]

['Header: ][^asio/signal_set.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:socket_base socket_base]


The [link asio.reference.socket_base `socket_base`] class is used as a base for the [link asio.reference.basic_stream_socket `basic_stream_socket`] and [link asio.reference.basic_datagram_socket `basic_datagram_socket`] class templates so that we have a common place to define the shutdown\_type and enum. 


  class socket_base


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.socket_base.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.socket_base.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.socket_base.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.socket_base.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[link asio.reference.socket_base.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.socket_base.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.socket_base.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.socket_base.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.socket_base.out_of_band_inline [*out_of_band_inline]]]
    [Socket option for putting received out-of-band data inline. ]
  
  ]

  [

    [[link asio.reference.socket_base.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.socket_base.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.socket_base.reuse_address [*reuse_address]]]
    [Socket option to allow the socket to be bound to an address that is already in use. ]
  
  ]

  [

    [[link asio.reference.socket_base.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.socket_base.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.socket_base.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[link asio.reference.socket_base.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.socket_base._socket_base [*~socket_base]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.socket_base.max_connections [*max_connections]] [static]]
    [(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.socket_base.max_listen_connections [*max_listen_connections]] [static]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.socket_base.message_do_not_route [*message_do_not_route]] [static]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.socket_base.message_end_of_record [*message_end_of_record]] [static]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.socket_base.message_out_of_band [*message_out_of_band]] [static]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.socket_base.message_peek [*message_peek]] [static]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

[heading Requirements]

['Header: ][^asio/socket_base.hpp]

['Convenience header: ][^asio.hpp]


[section:broadcast socket_base::broadcast]

[indexterm2 asio.indexterm.socket_base.broadcast..broadcast..socket_base] 
Socket option to permit sending of broadcast messages. 


  typedef implementation_defined broadcast;



Implements the SOL\_SOCKET/SO\_BROADCAST socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::broadcast option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::broadcast option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/socket_base.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:bytes_readable socket_base::bytes_readable]

[indexterm2 asio.indexterm.socket_base.bytes_readable..bytes_readable..socket_base] 
IO control command to get the amount of data that can be read without blocking. 


  typedef implementation_defined bytes_readable;



Implements the FIONREAD IO control command.


[heading Example]
  


   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();







[heading Requirements]

['Header: ][^asio/socket_base.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:debug socket_base::debug]

[indexterm2 asio.indexterm.socket_base.debug..debug..socket_base] 
Socket option to enable socket-level debugging. 


  typedef implementation_defined debug;



Implements the SOL\_SOCKET/SO\_DEBUG socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::debug option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::debug option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/socket_base.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:do_not_route socket_base::do_not_route]

[indexterm2 asio.indexterm.socket_base.do_not_route..do_not_route..socket_base] 
Socket option to prevent routing, use local interfaces only. 


  typedef implementation_defined do_not_route;



Implements the SOL\_SOCKET/SO\_DONTROUTE socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::do_not_route option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(my_context);
   ...
   asio::socket_base::do_not_route option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/socket_base.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:enable_connection_aborted socket_base::enable_connection_aborted]

[indexterm2 asio.indexterm.socket_base.enable_connection_aborted..enable_connection_aborted..socket_base] 
Socket option to report aborted connections on accept. 


  typedef implementation_defined enable_connection_aborted;



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.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::enable_connection_aborted option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::enable_connection_aborted option;
   acceptor.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/socket_base.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:keep_alive socket_base::keep_alive]

[indexterm2 asio.indexterm.socket_base.keep_alive..keep_alive..socket_base] 
Socket option to send keep-alives. 


  typedef implementation_defined keep_alive;



Implements the SOL\_SOCKET/SO\_KEEPALIVE socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::keep_alive option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::keep_alive option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/socket_base.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:linger socket_base::linger]

[indexterm2 asio.indexterm.socket_base.linger..linger..socket_base] 
Socket option to specify whether the socket lingers on close if unsent data is present. 


  typedef implementation_defined linger;



Implements the SOL\_SOCKET/SO\_LINGER socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::linger option(true, 30);
   socket.set_option(option);





Getting the current option value: 

   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();







[heading Requirements]

['Header: ][^asio/socket_base.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:max_connections socket_base::max_connections]

[indexterm2 asio.indexterm.socket_base.max_connections..max_connections..socket_base] 
(Deprecated: Use max\_listen\_connections.) The maximum length of the queue of pending incoming connections. 


  static const int max_connections = implementation_defined;



[endsect]



[section:max_listen_connections socket_base::max_listen_connections]

[indexterm2 asio.indexterm.socket_base.max_listen_connections..max_listen_connections..socket_base] 
The maximum length of the queue of pending incoming connections. 


  static const int max_listen_connections = implementation_defined;



[endsect]



[section:message_do_not_route socket_base::message_do_not_route]

[indexterm2 asio.indexterm.socket_base.message_do_not_route..message_do_not_route..socket_base] 
Specify that the data should not be subject to routing. 


  static const int message_do_not_route = implementation_defined;



[endsect]



[section:message_end_of_record socket_base::message_end_of_record]

[indexterm2 asio.indexterm.socket_base.message_end_of_record..message_end_of_record..socket_base] 
Specifies that the data marks the end of a record. 


  static const int message_end_of_record = implementation_defined;



[endsect]



[section:message_flags socket_base::message_flags]

[indexterm2 asio.indexterm.socket_base.message_flags..message_flags..socket_base] 
Bitmask type for flags that can be passed to send and receive operations. 


  typedef int message_flags;



[heading Requirements]

['Header: ][^asio/socket_base.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:message_out_of_band socket_base::message_out_of_band]

[indexterm2 asio.indexterm.socket_base.message_out_of_band..message_out_of_band..socket_base] 
Process out-of-band data. 


  static const int message_out_of_band = implementation_defined;



[endsect]



[section:message_peek socket_base::message_peek]

[indexterm2 asio.indexterm.socket_base.message_peek..message_peek..socket_base] 
Peek at incoming data without removing it from the input queue. 


  static const int message_peek = implementation_defined;



[endsect]



[section:out_of_band_inline socket_base::out_of_band_inline]

[indexterm2 asio.indexterm.socket_base.out_of_band_inline..out_of_band_inline..socket_base] 
Socket option for putting received out-of-band data inline. 


  typedef implementation_defined out_of_band_inline;



Implements the SOL\_SOCKET/SO\_OOBINLINE socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::out_of_band_inline option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::out_of_band_inline option;
   socket.get_option(option);
   bool value = option.value();







[heading Requirements]

['Header: ][^asio/socket_base.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:receive_buffer_size socket_base::receive_buffer_size]

[indexterm2 asio.indexterm.socket_base.receive_buffer_size..receive_buffer_size..socket_base] 
Socket option for the receive buffer size of a socket. 


  typedef implementation_defined receive_buffer_size;



Implements the SOL\_SOCKET/SO\_RCVBUF socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_buffer_size option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/socket_base.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:receive_low_watermark socket_base::receive_low_watermark]

[indexterm2 asio.indexterm.socket_base.receive_low_watermark..receive_low_watermark..socket_base] 
Socket option for the receive low watermark. 


  typedef implementation_defined receive_low_watermark;



Implements the SOL\_SOCKET/SO\_RCVLOWAT socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::receive_low_watermark option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/socket_base.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:reuse_address socket_base::reuse_address]

[indexterm2 asio.indexterm.socket_base.reuse_address..reuse_address..socket_base] 
Socket option to allow the socket to be bound to an address that is already in use. 


  typedef implementation_defined reuse_address;



Implements the SOL\_SOCKET/SO\_REUSEADDR socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::reuse_address option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(my_context);
   ...
   asio::socket_base::reuse_address option;
   acceptor.get_option(option);
   bool is_set = option.value();







[heading Requirements]

['Header: ][^asio/socket_base.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:send_buffer_size socket_base::send_buffer_size]

[indexterm2 asio.indexterm.socket_base.send_buffer_size..send_buffer_size..socket_base] 
Socket option for the send buffer size of a socket. 


  typedef implementation_defined send_buffer_size;



Implements the SOL\_SOCKET/SO\_SNDBUF socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_buffer_size option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/socket_base.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:send_low_watermark socket_base::send_low_watermark]

[indexterm2 asio.indexterm.socket_base.send_low_watermark..send_low_watermark..socket_base] 
Socket option for the send low watermark. 


  typedef implementation_defined send_low_watermark;



Implements the SOL\_SOCKET/SO\_SNDLOWAT socket option.


[heading Examples]
  
Setting the option: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(my_context);
   ...
   asio::socket_base::send_low_watermark option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

['Header: ][^asio/socket_base.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:shutdown_type socket_base::shutdown_type]

[indexterm2 asio.indexterm.socket_base.shutdown_type..shutdown_type..socket_base] 
Different ways a socket may be shutdown. 


  enum shutdown_type

[indexterm2 asio.indexterm.socket_base.shutdown_type.shutdown_receive..shutdown_receive..socket_base]
[indexterm2 asio.indexterm.socket_base.shutdown_type.shutdown_send..shutdown_send..socket_base]
[indexterm2 asio.indexterm.socket_base.shutdown_type.shutdown_both..shutdown_both..socket_base]

[heading Values]
[variablelist

  [
    [shutdown_receive]
    [Shutdown the receive side of the socket. ]
  ]

  [
    [shutdown_send]
    [Shutdown the send side of the socket. ]
  ]

  [
    [shutdown_both]
    [Shutdown both send and receive on the socket. ]
  ]

]



[endsect]



[section:wait_type socket_base::wait_type]

[indexterm2 asio.indexterm.socket_base.wait_type..wait_type..socket_base] 
Wait types. 


  enum wait_type

[indexterm2 asio.indexterm.socket_base.wait_type.wait_read..wait_read..socket_base]
[indexterm2 asio.indexterm.socket_base.wait_type.wait_write..wait_write..socket_base]
[indexterm2 asio.indexterm.socket_base.wait_type.wait_error..wait_error..socket_base]

[heading Values]
[variablelist

  [
    [wait_read]
    [Wait for a socket to become ready to read. ]
  ]

  [
    [wait_write]
    [Wait for a socket to become ready to write. ]
  ]

  [
    [wait_error]
    [Wait for a socket to have error conditions pending. ]
  ]

]


For use with `basic_socket::wait()` and `basic_socket::async_wait()`. 


[endsect]



[section:_socket_base socket_base::~socket_base]

[indexterm2 asio.indexterm.socket_base._socket_base..~socket_base..socket_base] 
Protected destructor to prevent deletion through this type. 


  ~socket_base();



[endsect]



[endsect]

[section:spawn spawn]

[indexterm1 asio.indexterm.spawn..spawn] 
Start a new stackful coroutine. 


Start a new stackful coroutine, calling the specified handler when it completes. 

  template<
      typename Function>
  void ``[link asio.reference.spawn.overload1 spawn]``(
      Function && function,
      const boost::coroutines::attributes & attributes = boost::coroutines::attributes());
  ``  [''''&raquo;''' [link asio.reference.spawn.overload1 more...]]``

  template<
      typename ``[link asio.reference.Handler Handler]``,
      typename Function>
  void ``[link asio.reference.spawn.overload2 spawn]``(
      Handler && handler,
      Function && function,
      const boost::coroutines::attributes & attributes = boost::coroutines::attributes(),
      typename enable_if< !is_executor< typename decay< Handler >::type >::value &&!execution::is_executor< typename decay< Handler >::type >::value &&!is_convertible< Handler &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.spawn.overload2 more...]]``

Start a new stackful coroutine, inheriting the execution context of another. 

  template<
      typename ``[link asio.reference.Handler Handler]``,
      typename Function>
  void ``[link asio.reference.spawn.overload3 spawn]``(
      basic_yield_context< Handler > ctx,
      Function && function,
      const boost::coroutines::attributes & attributes = boost::coroutines::attributes());
  ``  [''''&raquo;''' [link asio.reference.spawn.overload3 more...]]``

Start a new stackful coroutine that executes on a given executor. 

  template<
      typename Function,
      typename ``[link asio.reference.Executor1 Executor]``>
  void ``[link asio.reference.spawn.overload4 spawn]``(
      const Executor & ex,
      Function && function,
      const boost::coroutines::attributes & attributes = boost::coroutines::attributes(),
      typename enable_if< is_executor< Executor >::value||execution::is_executor< Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.spawn.overload4 more...]]``

Start a new stackful coroutine that executes on a given strand. 

  template<
      typename Function,
      typename ``[link asio.reference.Executor1 Executor]``>
  void ``[link asio.reference.spawn.overload5 spawn]``(
      const strand< Executor > & ex,
      Function && function,
      const boost::coroutines::attributes & attributes = boost::coroutines::attributes());
  ``  [''''&raquo;''' [link asio.reference.spawn.overload5 more...]]``

Start a new stackful coroutine that executes in the context of a strand. 

  template<
      typename Function>
  void ``[link asio.reference.spawn.overload6 spawn]``(
      const asio::io_context::strand & s,
      Function && function,
      const boost::coroutines::attributes & attributes = boost::coroutines::attributes());
  ``  [''''&raquo;''' [link asio.reference.spawn.overload6 more...]]``

Start a new stackful coroutine that executes on a given execution context. 

  template<
      typename Function,
      typename ExecutionContext>
  void ``[link asio.reference.spawn.overload7 spawn]``(
      ExecutionContext & ctx,
      Function && function,
      const boost::coroutines::attributes & attributes = boost::coroutines::attributes(),
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.spawn.overload7 more...]]``

The `spawn()` function is a high-level wrapper over the Boost.Coroutine library. This function enables programs to implement asynchronous logic in a synchronous manner, as illustrated by the following example:



   asio::spawn(my_strand, do_echo);

   // ...

   void do_echo(asio::yield_context yield)
   {
     try
     {
       char data[128];
       for (;;)
       {
         std::size_t length =
           my_socket.async_read_some(
             asio::buffer(data), yield);

         asio::async_write(my_socket,
             asio::buffer(data, length), yield);
       }
     }
     catch (std::exception& e)
     {
       // ...
     }
   } 




[heading Requirements]

['Header: ][^asio/spawn.hpp]

['Convenience header: ]None


[section:overload1 spawn (1 of 7 overloads)]


Start a new stackful coroutine, calling the specified handler when it completes. 


  template<
      typename Function>
  void spawn(
      Function && function,
      const boost::coroutines::attributes & attributes = boost::coroutines::attributes());


This function is used to launch a new coroutine.


[heading Parameters]
    

[variablelist
  
[[function][The coroutine function. The function must have the signature: 
``
   void function(basic_yield_context<Handler> yield); 
``
]]

[[attributes][Boost.Coroutine attributes used to customise the coroutine. ]]

]




[endsect]



[section:overload2 spawn (2 of 7 overloads)]


Start a new stackful coroutine, calling the specified handler when it completes. 


  template<
      typename ``[link asio.reference.Handler Handler]``,
      typename Function>
  void spawn(
      Handler && handler,
      Function && function,
      const boost::coroutines::attributes & attributes = boost::coroutines::attributes(),
      typename enable_if< !is_executor< typename decay< Handler >::type >::value &&!execution::is_executor< typename decay< Handler >::type >::value &&!is_convertible< Handler &, execution_context & >::value >::type *  = 0);


This function is used to launch a new coroutine.


[heading Parameters]
    

[variablelist
  
[[handler][A handler to be called when the coroutine exits. More importantly, the handler provides an execution context (via the the handler invocation hook) for the coroutine. The handler must have the signature: 
``
   void handler(); 
``
]]

[[function][The coroutine function. The function must have the signature: 
``
   void function(basic_yield_context<Handler> yield); 
``
]]

[[attributes][Boost.Coroutine attributes used to customise the coroutine. ]]

]




[endsect]



[section:overload3 spawn (3 of 7 overloads)]


Start a new stackful coroutine, inheriting the execution context of another. 


  template<
      typename ``[link asio.reference.Handler Handler]``,
      typename Function>
  void spawn(
      basic_yield_context< Handler > ctx,
      Function && function,
      const boost::coroutines::attributes & attributes = boost::coroutines::attributes());


This function is used to launch a new coroutine.


[heading Parameters]
    

[variablelist
  
[[ctx][Identifies the current coroutine as a parent of the new coroutine. This specifies that the new coroutine should inherit the execution context of the parent. For example, if the parent coroutine is executing in a particular strand, then the new coroutine will execute in the same strand.]]

[[function][The coroutine function. The function must have the signature: 
``
   void function(basic_yield_context<Handler> yield); 
``
]]

[[attributes][Boost.Coroutine attributes used to customise the coroutine. ]]

]




[endsect]



[section:overload4 spawn (4 of 7 overloads)]


Start a new stackful coroutine that executes on a given executor. 


  template<
      typename Function,
      typename ``[link asio.reference.Executor1 Executor]``>
  void spawn(
      const Executor & ex,
      Function && function,
      const boost::coroutines::attributes & attributes = boost::coroutines::attributes(),
      typename enable_if< is_executor< Executor >::value||execution::is_executor< Executor >::value >::type *  = 0);


This function is used to launch a new coroutine.


[heading Parameters]
    

[variablelist
  
[[ex][Identifies the executor that will run the coroutine. The new coroutine is implicitly given its own strand within this executor.]]

[[function][The coroutine function. The function must have the signature: 
``
   void function(yield_context yield); 
``
]]

[[attributes][Boost.Coroutine attributes used to customise the coroutine. ]]

]




[endsect]



[section:overload5 spawn (5 of 7 overloads)]


Start a new stackful coroutine that executes on a given strand. 


  template<
      typename Function,
      typename ``[link asio.reference.Executor1 Executor]``>
  void spawn(
      const strand< Executor > & ex,
      Function && function,
      const boost::coroutines::attributes & attributes = boost::coroutines::attributes());


This function is used to launch a new coroutine.


[heading Parameters]
    

[variablelist
  
[[ex][Identifies the strand that will run the coroutine.]]

[[function][The coroutine function. The function must have the signature: 
``
   void function(yield_context yield); 
``
]]

[[attributes][Boost.Coroutine attributes used to customise the coroutine. ]]

]




[endsect]



[section:overload6 spawn (6 of 7 overloads)]


Start a new stackful coroutine that executes in the context of a strand. 


  template<
      typename Function>
  void spawn(
      const asio::io_context::strand & s,
      Function && function,
      const boost::coroutines::attributes & attributes = boost::coroutines::attributes());


This function is used to launch a new coroutine.


[heading Parameters]
    

[variablelist
  
[[s][Identifies a strand. By starting multiple coroutines on the same strand, the implementation ensures that none of those coroutines can execute simultaneously.]]

[[function][The coroutine function. The function must have the signature: 
``
   void function(yield_context yield); 
``
]]

[[attributes][Boost.Coroutine attributes used to customise the coroutine. ]]

]




[endsect]



[section:overload7 spawn (7 of 7 overloads)]


Start a new stackful coroutine that executes on a given execution context. 


  template<
      typename Function,
      typename ExecutionContext>
  void spawn(
      ExecutionContext & ctx,
      Function && function,
      const boost::coroutines::attributes & attributes = boost::coroutines::attributes(),
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This function is used to launch a new coroutine.


[heading Parameters]
    

[variablelist
  
[[ctx][Identifies the execution context that will run the coroutine. The new coroutine is implicitly given its own strand within this execution context.]]

[[function][The coroutine function. The function must have the signature: 
``
   void function(yield_context yield); 
``
]]

[[attributes][Boost.Coroutine attributes used to customise the coroutine. ]]

]




[endsect]


[endsect]

[section:ssl__context ssl::context]



  class context :
    public ssl::context_base,
    noncopyable


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ssl__context.file_format [*file_format]]]
    [File format types. ]
  
  ]

  [

    [[link asio.reference.ssl__context.method [*method]]]
    [Different methods supported by a context. ]
  
  ]

  [

    [[link asio.reference.ssl__context.native_handle_type [*native_handle_type]]]
    [The native handle type of the SSL context. ]
  
  ]

  [

    [[link asio.reference.ssl__context.options [*options]]]
    [Bitmask type for SSL options. ]
  
  ]

  [

    [[link asio.reference.ssl__context.password_purpose [*password_purpose]]]
    [Purpose of PEM password. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ssl__context.add_certificate_authority [*add_certificate_authority]]]
    [Add certification authority for performing verification. ]
  ]
  
  [
    [[link asio.reference.ssl__context.add_verify_path [*add_verify_path]]]
    [Add a directory containing certificate authority files to be used for performing verification. ]
  ]
  
  [
    [[link asio.reference.ssl__context.clear_options [*clear_options]]]
    [Clear options on the context. ]
  ]
  
  [
    [[link asio.reference.ssl__context.context [*context]] [constructor]]
    [Constructor. 
     [hr]
     Construct to take ownership of a native handle. 
     [hr]
     Move-construct a context from another. ]
  ]
  
  [
    [[link asio.reference.ssl__context.load_verify_file [*load_verify_file]]]
    [Load a certification authority file for performing verification. ]
  ]
  
  [
    [[link asio.reference.ssl__context.native_handle [*native_handle]]]
    [Get the underlying implementation in the native type. ]
  ]
  
  [
    [[link asio.reference.ssl__context.operator_eq_ [*operator=]]]
    [Move-assign a context from another. ]
  ]
  
  [
    [[link asio.reference.ssl__context.set_default_verify_paths [*set_default_verify_paths]]]
    [Configures the context to use the default directories for finding certification authority certificates. ]
  ]
  
  [
    [[link asio.reference.ssl__context.set_options [*set_options]]]
    [Set options on the context. ]
  ]
  
  [
    [[link asio.reference.ssl__context.set_password_callback [*set_password_callback]]]
    [Set the password callback. ]
  ]
  
  [
    [[link asio.reference.ssl__context.set_verify_callback [*set_verify_callback]]]
    [Set the callback used to verify peer certificates. ]
  ]
  
  [
    [[link asio.reference.ssl__context.set_verify_depth [*set_verify_depth]]]
    [Set the peer verification depth. ]
  ]
  
  [
    [[link asio.reference.ssl__context.set_verify_mode [*set_verify_mode]]]
    [Set the peer verification mode. ]
  ]
  
  [
    [[link asio.reference.ssl__context.use_certificate [*use_certificate]]]
    [Use a certificate from a memory buffer. ]
  ]
  
  [
    [[link asio.reference.ssl__context.use_certificate_chain [*use_certificate_chain]]]
    [Use a certificate chain from a memory buffer. ]
  ]
  
  [
    [[link asio.reference.ssl__context.use_certificate_chain_file [*use_certificate_chain_file]]]
    [Use a certificate chain from a file. ]
  ]
  
  [
    [[link asio.reference.ssl__context.use_certificate_file [*use_certificate_file]]]
    [Use a certificate from a file. ]
  ]
  
  [
    [[link asio.reference.ssl__context.use_private_key [*use_private_key]]]
    [Use a private key from a memory buffer. ]
  ]
  
  [
    [[link asio.reference.ssl__context.use_private_key_file [*use_private_key_file]]]
    [Use a private key from a file. ]
  ]
  
  [
    [[link asio.reference.ssl__context.use_rsa_private_key [*use_rsa_private_key]]]
    [Use an RSA private key from a memory buffer. ]
  ]
  
  [
    [[link asio.reference.ssl__context.use_rsa_private_key_file [*use_rsa_private_key_file]]]
    [Use an RSA private key from a file. ]
  ]
  
  [
    [[link asio.reference.ssl__context.use_tmp_dh [*use_tmp_dh]]]
    [Use the specified memory buffer to obtain the temporary Diffie-Hellman parameters. ]
  ]
  
  [
    [[link asio.reference.ssl__context.use_tmp_dh_file [*use_tmp_dh_file]]]
    [Use the specified file to obtain the temporary Diffie-Hellman parameters. ]
  ]
  
  [
    [[link asio.reference.ssl__context._context [*~context]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ssl__context.default_workarounds [*default_workarounds]] [static]]
    [Implement various bug workarounds. ]
  ]

  [
    [[link asio.reference.ssl__context.no_compression [*no_compression]] [static]]
    [Disable compression. Compression is disabled by default. ]
  ]

  [
    [[link asio.reference.ssl__context.no_sslv2 [*no_sslv2]] [static]]
    [Disable SSL v2. ]
  ]

  [
    [[link asio.reference.ssl__context.no_sslv3 [*no_sslv3]] [static]]
    [Disable SSL v3. ]
  ]

  [
    [[link asio.reference.ssl__context.no_tlsv1 [*no_tlsv1]] [static]]
    [Disable TLS v1. ]
  ]

  [
    [[link asio.reference.ssl__context.no_tlsv1_1 [*no_tlsv1_1]] [static]]
    [Disable TLS v1.1. ]
  ]

  [
    [[link asio.reference.ssl__context.no_tlsv1_2 [*no_tlsv1_2]] [static]]
    [Disable TLS v1.2. ]
  ]

  [
    [[link asio.reference.ssl__context.no_tlsv1_3 [*no_tlsv1_3]] [static]]
    [Disable TLS v1.3. ]
  ]

  [
    [[link asio.reference.ssl__context.single_dh_use [*single_dh_use]] [static]]
    [Always create a new key when using tmp_dh parameters. ]
  ]

]

[heading Requirements]

['Header: ][^asio/ssl/context.hpp]

['Convenience header: ][^asio/ssl.hpp]

[section:add_certificate_authority ssl::context::add_certificate_authority]

[indexterm2 asio.indexterm.ssl__context.add_certificate_authority..add_certificate_authority..ssl::context] 
Add certification authority for performing verification. 


  void ``[link asio.reference.ssl__context.add_certificate_authority.overload1 add_certificate_authority]``(
      const const_buffer & ca);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.add_certificate_authority.overload1 more...]]``

  void ``[link asio.reference.ssl__context.add_certificate_authority.overload2 add_certificate_authority]``(
      const const_buffer & ca,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.add_certificate_authority.overload2 more...]]``


[section:overload1 ssl::context::add_certificate_authority (1 of 2 overloads)]


Add certification authority for performing verification. 


  void add_certificate_authority(
      const const_buffer & ca);


This function is used to add one trusted certification authority from a memory buffer.


[heading Parameters]
    

[variablelist
  
[[ca][The buffer containing the certification authority certificate. The certificate must use the PEM format.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_CTX_get_cert_store` and `X509_STORE_add_cert`. 




[endsect]



[section:overload2 ssl::context::add_certificate_authority (2 of 2 overloads)]


Add certification authority for performing verification. 


  void add_certificate_authority(
      const const_buffer & ca,
      asio::error_code & ec);


This function is used to add one trusted certification authority from a memory buffer.


[heading Parameters]
    

[variablelist
  
[[ca][The buffer containing the certification authority certificate. The certificate must use the PEM format.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_CTX_get_cert_store` and `X509_STORE_add_cert`. 




[endsect]


[endsect]

[section:add_verify_path ssl::context::add_verify_path]

[indexterm2 asio.indexterm.ssl__context.add_verify_path..add_verify_path..ssl::context] 
Add a directory containing certificate authority files to be used for performing verification. 


  void ``[link asio.reference.ssl__context.add_verify_path.overload1 add_verify_path]``(
      const std::string & path);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.add_verify_path.overload1 more...]]``

  void ``[link asio.reference.ssl__context.add_verify_path.overload2 add_verify_path]``(
      const std::string & path,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.add_verify_path.overload2 more...]]``


[section:overload1 ssl::context::add_verify_path (1 of 2 overloads)]


Add a directory containing certificate authority files to be used for performing verification. 


  void add_verify_path(
      const std::string & path);


This function is used to specify the name of a directory containing certification authority certificates. Each file in the directory must contain a single certificate. The files must be named using the subject name's hash and an extension of ".0".


[heading Parameters]
    

[variablelist
  
[[path][The name of a directory containing the certificates.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_CTX_load_verify_locations`. 




[endsect]



[section:overload2 ssl::context::add_verify_path (2 of 2 overloads)]


Add a directory containing certificate authority files to be used for performing verification. 


  void add_verify_path(
      const std::string & path,
      asio::error_code & ec);


This function is used to specify the name of a directory containing certification authority certificates. Each file in the directory must contain a single certificate. The files must be named using the subject name's hash and an extension of ".0".


[heading Parameters]
    

[variablelist
  
[[path][The name of a directory containing the certificates.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_CTX_load_verify_locations`. 




[endsect]


[endsect]

[section:clear_options ssl::context::clear_options]

[indexterm2 asio.indexterm.ssl__context.clear_options..clear_options..ssl::context] 
Clear options on the context. 


  void ``[link asio.reference.ssl__context.clear_options.overload1 clear_options]``(
      options o);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.clear_options.overload1 more...]]``

  void ``[link asio.reference.ssl__context.clear_options.overload2 clear_options]``(
      options o,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.clear_options.overload2 more...]]``


[section:overload1 ssl::context::clear_options (1 of 2 overloads)]


Clear options on the context. 


  void clear_options(
      options o);


This function may be used to configure the SSL options used by the context.


[heading Parameters]
    

[variablelist
  
[[o][A bitmask of options. The available option values are defined in the [link asio.reference.ssl__context_base `ssl::context_base`] class. The specified options, if currently enabled on the context, are cleared.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_CTX_clear_options`. 




[endsect]



[section:overload2 ssl::context::clear_options (2 of 2 overloads)]


Clear options on the context. 


  void clear_options(
      options o,
      asio::error_code & ec);


This function may be used to configure the SSL options used by the context.


[heading Parameters]
    

[variablelist
  
[[o][A bitmask of options. The available option values are defined in the [link asio.reference.ssl__context_base `ssl::context_base`] class. The specified options, if currently enabled on the context, are cleared.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_CTX_clear_options`. 




[endsect]


[endsect]

[section:context ssl::context::context]

[indexterm2 asio.indexterm.ssl__context.context..context..ssl::context] 
Constructor. 


  explicit ``[link asio.reference.ssl__context.context.overload1 context]``(
      method m);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.context.overload1 more...]]``


Construct to take ownership of a native handle. 


  explicit ``[link asio.reference.ssl__context.context.overload2 context]``(
      native_handle_type native_handle);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.context.overload2 more...]]``


Move-construct a context from another. 


  ``[link asio.reference.ssl__context.context.overload3 context]``(
      context && other);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.context.overload3 more...]]``


[section:overload1 ssl::context::context (1 of 3 overloads)]


Constructor. 


  context(
      method m);



[endsect]



[section:overload2 ssl::context::context (2 of 3 overloads)]


Construct to take ownership of a native handle. 


  context(
      native_handle_type native_handle);



[endsect]



[section:overload3 ssl::context::context (3 of 3 overloads)]


Move-construct a context from another. 


  context(
      context && other);


This constructor moves an SSL context from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other context object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the following operations only are valid for the moved-from object: 
* Destruction. 

* As a target for move-assignment. 






[endsect]


[endsect]


[section:default_workarounds ssl::context::default_workarounds]

[indexterm2 asio.indexterm.ssl__context.default_workarounds..default_workarounds..ssl::context] 
Implement various bug workarounds. 


  static const long default_workarounds = implementation_defined;



[endsect]



[section:file_format ssl::context::file_format]

[indexterm2 asio.indexterm.ssl__context.file_format..file_format..ssl::context] 
File format types. 


  enum file_format

[indexterm2 asio.indexterm.ssl__context.file_format.asn1..asn1..ssl::context]
[indexterm2 asio.indexterm.ssl__context.file_format.pem..pem..ssl::context]

[heading Values]
[variablelist

  [
    [asn1]
    [ASN.1 file. ]
  ]

  [
    [pem]
    [PEM file. ]
  ]

]



[endsect]


[section:load_verify_file ssl::context::load_verify_file]

[indexterm2 asio.indexterm.ssl__context.load_verify_file..load_verify_file..ssl::context] 
Load a certification authority file for performing verification. 


  void ``[link asio.reference.ssl__context.load_verify_file.overload1 load_verify_file]``(
      const std::string & filename);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.load_verify_file.overload1 more...]]``

  void ``[link asio.reference.ssl__context.load_verify_file.overload2 load_verify_file]``(
      const std::string & filename,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.load_verify_file.overload2 more...]]``


[section:overload1 ssl::context::load_verify_file (1 of 2 overloads)]


Load a certification authority file for performing verification. 


  void load_verify_file(
      const std::string & filename);


This function is used to load one or more trusted certification authorities from a file.


[heading Parameters]
    

[variablelist
  
[[filename][The name of a file containing certification authority certificates in PEM format.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_CTX_load_verify_locations`. 




[endsect]



[section:overload2 ssl::context::load_verify_file (2 of 2 overloads)]


Load a certification authority file for performing verification. 


  void load_verify_file(
      const std::string & filename,
      asio::error_code & ec);


This function is used to load the certificates for one or more trusted certification authorities from a file.


[heading Parameters]
    

[variablelist
  
[[filename][The name of a file containing certification authority certificates in PEM format.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_CTX_load_verify_locations`. 




[endsect]


[endsect]


[section:method ssl::context::method]

[indexterm2 asio.indexterm.ssl__context.method..method..ssl::context] 
Different methods supported by a context. 


  enum method

[indexterm2 asio.indexterm.ssl__context.method.sslv2..sslv2..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.sslv2_client..sslv2_client..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.sslv2_server..sslv2_server..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.sslv3..sslv3..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.sslv3_client..sslv3_client..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.sslv3_server..sslv3_server..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.tlsv1..tlsv1..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.tlsv1_client..tlsv1_client..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.tlsv1_server..tlsv1_server..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.sslv23..sslv23..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.sslv23_client..sslv23_client..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.sslv23_server..sslv23_server..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.tlsv11..tlsv11..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.tlsv11_client..tlsv11_client..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.tlsv11_server..tlsv11_server..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.tlsv12..tlsv12..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.tlsv12_client..tlsv12_client..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.tlsv12_server..tlsv12_server..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.tlsv13..tlsv13..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.tlsv13_client..tlsv13_client..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.tlsv13_server..tlsv13_server..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.tls..tls..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.tls_client..tls_client..ssl::context]
[indexterm2 asio.indexterm.ssl__context.method.tls_server..tls_server..ssl::context]

[heading Values]
[variablelist

  [
    [sslv2]
    [Generic SSL version 2. ]
  ]

  [
    [sslv2_client]
    [SSL version 2 client. ]
  ]

  [
    [sslv2_server]
    [SSL version 2 server. ]
  ]

  [
    [sslv3]
    [Generic SSL version 3. ]
  ]

  [
    [sslv3_client]
    [SSL version 3 client. ]
  ]

  [
    [sslv3_server]
    [SSL version 3 server. ]
  ]

  [
    [tlsv1]
    [Generic TLS version 1. ]
  ]

  [
    [tlsv1_client]
    [TLS version 1 client. ]
  ]

  [
    [tlsv1_server]
    [TLS version 1 server. ]
  ]

  [
    [sslv23]
    [Generic SSL/TLS. ]
  ]

  [
    [sslv23_client]
    [SSL/TLS client. ]
  ]

  [
    [sslv23_server]
    [SSL/TLS server. ]
  ]

  [
    [tlsv11]
    [Generic TLS version 1.1. ]
  ]

  [
    [tlsv11_client]
    [TLS version 1.1 client. ]
  ]

  [
    [tlsv11_server]
    [TLS version 1.1 server. ]
  ]

  [
    [tlsv12]
    [Generic TLS version 1.2. ]
  ]

  [
    [tlsv12_client]
    [TLS version 1.2 client. ]
  ]

  [
    [tlsv12_server]
    [TLS version 1.2 server. ]
  ]

  [
    [tlsv13]
    [Generic TLS version 1.3. ]
  ]

  [
    [tlsv13_client]
    [TLS version 1.3 client. ]
  ]

  [
    [tlsv13_server]
    [TLS version 1.3 server. ]
  ]

  [
    [tls]
    [Generic TLS. ]
  ]

  [
    [tls_client]
    [TLS client. ]
  ]

  [
    [tls_server]
    [TLS server. ]
  ]

]



[endsect]



[section:native_handle ssl::context::native_handle]

[indexterm2 asio.indexterm.ssl__context.native_handle..native_handle..ssl::context] 
Get the underlying implementation in the native type. 


  native_handle_type native_handle();


This function may be used to obtain the underlying implementation of the context. This is intended to allow access to context functionality that is not otherwise provided. 


[endsect]



[section:native_handle_type ssl::context::native_handle_type]

[indexterm2 asio.indexterm.ssl__context.native_handle_type..native_handle_type..ssl::context] 
The native handle type of the SSL context. 


  typedef SSL_CTX * native_handle_type;



[heading Requirements]

['Header: ][^asio/ssl/context.hpp]

['Convenience header: ][^asio/ssl.hpp]


[endsect]



[section:no_compression ssl::context::no_compression]

[indexterm2 asio.indexterm.ssl__context.no_compression..no_compression..ssl::context] 
Disable compression. Compression is disabled by default. 


  static const long no_compression = implementation_defined;



[endsect]



[section:no_sslv2 ssl::context::no_sslv2]

[indexterm2 asio.indexterm.ssl__context.no_sslv2..no_sslv2..ssl::context] 
Disable SSL v2. 


  static const long no_sslv2 = implementation_defined;



[endsect]



[section:no_sslv3 ssl::context::no_sslv3]

[indexterm2 asio.indexterm.ssl__context.no_sslv3..no_sslv3..ssl::context] 
Disable SSL v3. 


  static const long no_sslv3 = implementation_defined;



[endsect]



[section:no_tlsv1 ssl::context::no_tlsv1]

[indexterm2 asio.indexterm.ssl__context.no_tlsv1..no_tlsv1..ssl::context] 
Disable TLS v1. 


  static const long no_tlsv1 = implementation_defined;



[endsect]



[section:no_tlsv1_1 ssl::context::no_tlsv1_1]

[indexterm2 asio.indexterm.ssl__context.no_tlsv1_1..no_tlsv1_1..ssl::context] 
Disable TLS v1.1. 


  static const long no_tlsv1_1 = implementation_defined;



[endsect]



[section:no_tlsv1_2 ssl::context::no_tlsv1_2]

[indexterm2 asio.indexterm.ssl__context.no_tlsv1_2..no_tlsv1_2..ssl::context] 
Disable TLS v1.2. 


  static const long no_tlsv1_2 = implementation_defined;



[endsect]



[section:no_tlsv1_3 ssl::context::no_tlsv1_3]

[indexterm2 asio.indexterm.ssl__context.no_tlsv1_3..no_tlsv1_3..ssl::context] 
Disable TLS v1.3. 


  static const long no_tlsv1_3 = implementation_defined;



[endsect]



[section:operator_eq_ ssl::context::operator=]

[indexterm2 asio.indexterm.ssl__context.operator_eq_..operator=..ssl::context] 
Move-assign a context from another. 


  context & operator=(
      context && other);


This assignment operator moves an SSL context from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other context object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the following operations only are valid for the moved-from object: 
* Destruction. 

* As a target for move-assignment. 






[endsect]



[section:options ssl::context::options]

[indexterm2 asio.indexterm.ssl__context.options..options..ssl::context] 
Bitmask type for SSL options. 


  typedef long options;



[heading Requirements]

['Header: ][^asio/ssl/context.hpp]

['Convenience header: ][^asio/ssl.hpp]


[endsect]



[section:password_purpose ssl::context::password_purpose]

[indexterm2 asio.indexterm.ssl__context.password_purpose..password_purpose..ssl::context] 
Purpose of PEM password. 


  enum password_purpose

[indexterm2 asio.indexterm.ssl__context.password_purpose.for_reading..for_reading..ssl::context]
[indexterm2 asio.indexterm.ssl__context.password_purpose.for_writing..for_writing..ssl::context]

[heading Values]
[variablelist

  [
    [for_reading]
    [The password is needed for reading/decryption. ]
  ]

  [
    [for_writing]
    [The password is needed for writing/encryption. ]
  ]

]



[endsect]


[section:set_default_verify_paths ssl::context::set_default_verify_paths]

[indexterm2 asio.indexterm.ssl__context.set_default_verify_paths..set_default_verify_paths..ssl::context] 
Configures the context to use the default directories for finding certification authority certificates. 


  void ``[link asio.reference.ssl__context.set_default_verify_paths.overload1 set_default_verify_paths]``();
  ``  [''''&raquo;''' [link asio.reference.ssl__context.set_default_verify_paths.overload1 more...]]``

  void ``[link asio.reference.ssl__context.set_default_verify_paths.overload2 set_default_verify_paths]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.set_default_verify_paths.overload2 more...]]``


[section:overload1 ssl::context::set_default_verify_paths (1 of 2 overloads)]


Configures the context to use the default directories for finding certification authority certificates. 


  void set_default_verify_paths();


This function specifies that the context should use the default, system-dependent directories for locating certification authority certificates.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_CTX_set_default_verify_paths`. 




[endsect]



[section:overload2 ssl::context::set_default_verify_paths (2 of 2 overloads)]


Configures the context to use the default directories for finding certification authority certificates. 


  void set_default_verify_paths(
      asio::error_code & ec);


This function specifies that the context should use the default, system-dependent directories for locating certification authority certificates.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_CTX_set_default_verify_paths`. 




[endsect]


[endsect]

[section:set_options ssl::context::set_options]

[indexterm2 asio.indexterm.ssl__context.set_options..set_options..ssl::context] 
Set options on the context. 


  void ``[link asio.reference.ssl__context.set_options.overload1 set_options]``(
      options o);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.set_options.overload1 more...]]``

  void ``[link asio.reference.ssl__context.set_options.overload2 set_options]``(
      options o,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.set_options.overload2 more...]]``


[section:overload1 ssl::context::set_options (1 of 2 overloads)]


Set options on the context. 


  void set_options(
      options o);


This function may be used to configure the SSL options used by the context.


[heading Parameters]
    

[variablelist
  
[[o][A bitmask of options. The available option values are defined in the [link asio.reference.ssl__context_base `ssl::context_base`] class. The options are bitwise-ored with any existing value for the options.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_CTX_set_options`. 




[endsect]



[section:overload2 ssl::context::set_options (2 of 2 overloads)]


Set options on the context. 


  void set_options(
      options o,
      asio::error_code & ec);


This function may be used to configure the SSL options used by the context.


[heading Parameters]
    

[variablelist
  
[[o][A bitmask of options. The available option values are defined in the [link asio.reference.ssl__context_base `ssl::context_base`] class. The options are bitwise-ored with any existing value for the options.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_CTX_set_options`. 




[endsect]


[endsect]

[section:set_password_callback ssl::context::set_password_callback]

[indexterm2 asio.indexterm.ssl__context.set_password_callback..set_password_callback..ssl::context] 
Set the password callback. 


  template<
      typename PasswordCallback>
  void ``[link asio.reference.ssl__context.set_password_callback.overload1 set_password_callback]``(
      PasswordCallback callback);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.set_password_callback.overload1 more...]]``

  template<
      typename PasswordCallback>
  void ``[link asio.reference.ssl__context.set_password_callback.overload2 set_password_callback]``(
      PasswordCallback callback,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.set_password_callback.overload2 more...]]``


[section:overload1 ssl::context::set_password_callback (1 of 2 overloads)]


Set the password callback. 


  template<
      typename PasswordCallback>
  void set_password_callback(
      PasswordCallback callback);


This function is used to specify a callback function to obtain password information about an encrypted key in PEM format.


[heading Parameters]
    

[variablelist
  
[[callback][The function object to be used for obtaining the password. The function signature of the handler must be: 
``
   std::string password_callback(
     std::size_t max_length,  // The maximum size for a password.
     password_purpose purpose // Whether password is for reading or writing.
   ); 
``
The return value of the callback is a string containing the password.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_CTX_set_default_passwd_cb`. 




[endsect]



[section:overload2 ssl::context::set_password_callback (2 of 2 overloads)]


Set the password callback. 


  template<
      typename PasswordCallback>
  void set_password_callback(
      PasswordCallback callback,
      asio::error_code & ec);


This function is used to specify a callback function to obtain password information about an encrypted key in PEM format.


[heading Parameters]
    

[variablelist
  
[[callback][The function object to be used for obtaining the password. The function signature of the handler must be: 
``
   std::string password_callback(
     std::size_t max_length,  // The maximum size for a password.
     password_purpose purpose // Whether password is for reading or writing.
   ); 
``
The return value of the callback is a string containing the password.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_CTX_set_default_passwd_cb`. 




[endsect]


[endsect]

[section:set_verify_callback ssl::context::set_verify_callback]

[indexterm2 asio.indexterm.ssl__context.set_verify_callback..set_verify_callback..ssl::context] 
Set the callback used to verify peer certificates. 


  template<
      typename VerifyCallback>
  void ``[link asio.reference.ssl__context.set_verify_callback.overload1 set_verify_callback]``(
      VerifyCallback callback);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.set_verify_callback.overload1 more...]]``

  template<
      typename VerifyCallback>
  void ``[link asio.reference.ssl__context.set_verify_callback.overload2 set_verify_callback]``(
      VerifyCallback callback,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.set_verify_callback.overload2 more...]]``


[section:overload1 ssl::context::set_verify_callback (1 of 2 overloads)]


Set the callback used to verify peer certificates. 


  template<
      typename VerifyCallback>
  void set_verify_callback(
      VerifyCallback callback);


This function is used to specify a callback function that will be called by the implementation when it needs to verify a peer certificate.


[heading Parameters]
    

[variablelist
  
[[callback][The function object to be used for verifying a certificate. The function signature of the handler must be: 
``
   bool verify_callback(
     bool preverified, // True if the certificate passed pre-verification.
     verify_context& ctx // The peer certificate and other context.
   ); 
``
The return value of the callback is true if the certificate has passed verification, false otherwise.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_CTX_set_verify`. 




[endsect]



[section:overload2 ssl::context::set_verify_callback (2 of 2 overloads)]


Set the callback used to verify peer certificates. 


  template<
      typename VerifyCallback>
  void set_verify_callback(
      VerifyCallback callback,
      asio::error_code & ec);


This function is used to specify a callback function that will be called by the implementation when it needs to verify a peer certificate.


[heading Parameters]
    

[variablelist
  
[[callback][The function object to be used for verifying a certificate. The function signature of the handler must be: 
``
   bool verify_callback(
     bool preverified, // True if the certificate passed pre-verification.
     verify_context& ctx // The peer certificate and other context.
   ); 
``
The return value of the callback is true if the certificate has passed verification, false otherwise.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_CTX_set_verify`. 




[endsect]


[endsect]

[section:set_verify_depth ssl::context::set_verify_depth]

[indexterm2 asio.indexterm.ssl__context.set_verify_depth..set_verify_depth..ssl::context] 
Set the peer verification depth. 


  void ``[link asio.reference.ssl__context.set_verify_depth.overload1 set_verify_depth]``(
      int depth);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.set_verify_depth.overload1 more...]]``

  void ``[link asio.reference.ssl__context.set_verify_depth.overload2 set_verify_depth]``(
      int depth,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.set_verify_depth.overload2 more...]]``


[section:overload1 ssl::context::set_verify_depth (1 of 2 overloads)]


Set the peer verification depth. 


  void set_verify_depth(
      int depth);


This function may be used to configure the maximum verification depth allowed by the context.


[heading Parameters]
    

[variablelist
  
[[depth][Maximum depth for the certificate chain verification that shall be allowed.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_CTX_set_verify_depth`. 




[endsect]



[section:overload2 ssl::context::set_verify_depth (2 of 2 overloads)]


Set the peer verification depth. 


  void set_verify_depth(
      int depth,
      asio::error_code & ec);


This function may be used to configure the maximum verification depth allowed by the context.


[heading Parameters]
    

[variablelist
  
[[depth][Maximum depth for the certificate chain verification that shall be allowed.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_CTX_set_verify_depth`. 




[endsect]


[endsect]

[section:set_verify_mode ssl::context::set_verify_mode]

[indexterm2 asio.indexterm.ssl__context.set_verify_mode..set_verify_mode..ssl::context] 
Set the peer verification mode. 


  void ``[link asio.reference.ssl__context.set_verify_mode.overload1 set_verify_mode]``(
      verify_mode v);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.set_verify_mode.overload1 more...]]``

  void ``[link asio.reference.ssl__context.set_verify_mode.overload2 set_verify_mode]``(
      verify_mode v,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.set_verify_mode.overload2 more...]]``


[section:overload1 ssl::context::set_verify_mode (1 of 2 overloads)]


Set the peer verification mode. 


  void set_verify_mode(
      verify_mode v);


This function may be used to configure the peer verification mode used by the context.


[heading Parameters]
    

[variablelist
  
[[v][A bitmask of peer verification modes. See [link asio.reference.ssl__verify_mode `ssl::verify_mode`]  for available values.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_CTX_set_verify`. 




[endsect]



[section:overload2 ssl::context::set_verify_mode (2 of 2 overloads)]


Set the peer verification mode. 


  void set_verify_mode(
      verify_mode v,
      asio::error_code & ec);


This function may be used to configure the peer verification mode used by the context.


[heading Parameters]
    

[variablelist
  
[[v][A bitmask of peer verification modes. See [link asio.reference.ssl__verify_mode `ssl::verify_mode`]  for available values.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_CTX_set_verify`. 




[endsect]


[endsect]


[section:single_dh_use ssl::context::single_dh_use]

[indexterm2 asio.indexterm.ssl__context.single_dh_use..single_dh_use..ssl::context] 
Always create a new key when using tmp\_dh parameters. 


  static const long single_dh_use = implementation_defined;



[endsect]


[section:use_certificate ssl::context::use_certificate]

[indexterm2 asio.indexterm.ssl__context.use_certificate..use_certificate..ssl::context] 
Use a certificate from a memory buffer. 


  void ``[link asio.reference.ssl__context.use_certificate.overload1 use_certificate]``(
      const const_buffer & certificate,
      file_format format);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.use_certificate.overload1 more...]]``

  void ``[link asio.reference.ssl__context.use_certificate.overload2 use_certificate]``(
      const const_buffer & certificate,
      file_format format,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.use_certificate.overload2 more...]]``


[section:overload1 ssl::context::use_certificate (1 of 2 overloads)]


Use a certificate from a memory buffer. 


  void use_certificate(
      const const_buffer & certificate,
      file_format format);


This function is used to load a certificate into the context from a buffer.


[heading Parameters]
    

[variablelist
  
[[certificate][The buffer containing the certificate.]]

[[format][The certificate format (ASN.1 or PEM).]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_CTX_use_certificate` or SSL\_CTX\_use\_certificate\_ASN1. 




[endsect]



[section:overload2 ssl::context::use_certificate (2 of 2 overloads)]


Use a certificate from a memory buffer. 


  void use_certificate(
      const const_buffer & certificate,
      file_format format,
      asio::error_code & ec);


This function is used to load a certificate into the context from a buffer.


[heading Parameters]
    

[variablelist
  
[[certificate][The buffer containing the certificate.]]

[[format][The certificate format (ASN.1 or PEM).]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_CTX_use_certificate` or SSL\_CTX\_use\_certificate\_ASN1. 




[endsect]


[endsect]

[section:use_certificate_chain ssl::context::use_certificate_chain]

[indexterm2 asio.indexterm.ssl__context.use_certificate_chain..use_certificate_chain..ssl::context] 
Use a certificate chain from a memory buffer. 


  void ``[link asio.reference.ssl__context.use_certificate_chain.overload1 use_certificate_chain]``(
      const const_buffer & chain);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.use_certificate_chain.overload1 more...]]``

  void ``[link asio.reference.ssl__context.use_certificate_chain.overload2 use_certificate_chain]``(
      const const_buffer & chain,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.use_certificate_chain.overload2 more...]]``


[section:overload1 ssl::context::use_certificate_chain (1 of 2 overloads)]


Use a certificate chain from a memory buffer. 


  void use_certificate_chain(
      const const_buffer & chain);


This function is used to load a certificate chain into the context from a buffer.


[heading Parameters]
    

[variablelist
  
[[chain][The buffer containing the certificate chain. The certificate chain must use the PEM format.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_CTX_use_certificate` and SSL\_CTX\_add\_extra\_chain\_cert. 




[endsect]



[section:overload2 ssl::context::use_certificate_chain (2 of 2 overloads)]


Use a certificate chain from a memory buffer. 


  void use_certificate_chain(
      const const_buffer & chain,
      asio::error_code & ec);


This function is used to load a certificate chain into the context from a buffer.


[heading Parameters]
    

[variablelist
  
[[chain][The buffer containing the certificate chain. The certificate chain must use the PEM format.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_CTX_use_certificate` and SSL\_CTX\_add\_extra\_chain\_cert. 




[endsect]


[endsect]

[section:use_certificate_chain_file ssl::context::use_certificate_chain_file]

[indexterm2 asio.indexterm.ssl__context.use_certificate_chain_file..use_certificate_chain_file..ssl::context] 
Use a certificate chain from a file. 


  void ``[link asio.reference.ssl__context.use_certificate_chain_file.overload1 use_certificate_chain_file]``(
      const std::string & filename);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.use_certificate_chain_file.overload1 more...]]``

  void ``[link asio.reference.ssl__context.use_certificate_chain_file.overload2 use_certificate_chain_file]``(
      const std::string & filename,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.use_certificate_chain_file.overload2 more...]]``


[section:overload1 ssl::context::use_certificate_chain_file (1 of 2 overloads)]


Use a certificate chain from a file. 


  void use_certificate_chain_file(
      const std::string & filename);


This function is used to load a certificate chain into the context from a file.


[heading Parameters]
    

[variablelist
  
[[filename][The name of the file containing the certificate. The file must use the PEM format.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_CTX_use_certificate_chain_file`. 




[endsect]



[section:overload2 ssl::context::use_certificate_chain_file (2 of 2 overloads)]


Use a certificate chain from a file. 


  void use_certificate_chain_file(
      const std::string & filename,
      asio::error_code & ec);


This function is used to load a certificate chain into the context from a file.


[heading Parameters]
    

[variablelist
  
[[filename][The name of the file containing the certificate. The file must use the PEM format.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_CTX_use_certificate_chain_file`. 




[endsect]


[endsect]

[section:use_certificate_file ssl::context::use_certificate_file]

[indexterm2 asio.indexterm.ssl__context.use_certificate_file..use_certificate_file..ssl::context] 
Use a certificate from a file. 


  void ``[link asio.reference.ssl__context.use_certificate_file.overload1 use_certificate_file]``(
      const std::string & filename,
      file_format format);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.use_certificate_file.overload1 more...]]``

  void ``[link asio.reference.ssl__context.use_certificate_file.overload2 use_certificate_file]``(
      const std::string & filename,
      file_format format,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.use_certificate_file.overload2 more...]]``


[section:overload1 ssl::context::use_certificate_file (1 of 2 overloads)]


Use a certificate from a file. 


  void use_certificate_file(
      const std::string & filename,
      file_format format);


This function is used to load a certificate into the context from a file.


[heading Parameters]
    

[variablelist
  
[[filename][The name of the file containing the certificate.]]

[[format][The file format (ASN.1 or PEM).]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_CTX_use_certificate_file`. 




[endsect]



[section:overload2 ssl::context::use_certificate_file (2 of 2 overloads)]


Use a certificate from a file. 


  void use_certificate_file(
      const std::string & filename,
      file_format format,
      asio::error_code & ec);


This function is used to load a certificate into the context from a file.


[heading Parameters]
    

[variablelist
  
[[filename][The name of the file containing the certificate.]]

[[format][The file format (ASN.1 or PEM).]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_CTX_use_certificate_file`. 




[endsect]


[endsect]

[section:use_private_key ssl::context::use_private_key]

[indexterm2 asio.indexterm.ssl__context.use_private_key..use_private_key..ssl::context] 
Use a private key from a memory buffer. 


  void ``[link asio.reference.ssl__context.use_private_key.overload1 use_private_key]``(
      const const_buffer & private_key,
      file_format format);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.use_private_key.overload1 more...]]``

  void ``[link asio.reference.ssl__context.use_private_key.overload2 use_private_key]``(
      const const_buffer & private_key,
      file_format format,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.use_private_key.overload2 more...]]``


[section:overload1 ssl::context::use_private_key (1 of 2 overloads)]


Use a private key from a memory buffer. 


  void use_private_key(
      const const_buffer & private_key,
      file_format format);


This function is used to load a private key into the context from a buffer.


[heading Parameters]
    

[variablelist
  
[[private_key][The buffer containing the private key.]]

[[format][The private key format (ASN.1 or PEM).]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_CTX_use_PrivateKey` or SSL\_CTX\_use\_PrivateKey\_ASN1. 




[endsect]



[section:overload2 ssl::context::use_private_key (2 of 2 overloads)]


Use a private key from a memory buffer. 


  void use_private_key(
      const const_buffer & private_key,
      file_format format,
      asio::error_code & ec);


This function is used to load a private key into the context from a buffer.


[heading Parameters]
    

[variablelist
  
[[private_key][The buffer containing the private key.]]

[[format][The private key format (ASN.1 or PEM).]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_CTX_use_PrivateKey` or SSL\_CTX\_use\_PrivateKey\_ASN1. 




[endsect]


[endsect]

[section:use_private_key_file ssl::context::use_private_key_file]

[indexterm2 asio.indexterm.ssl__context.use_private_key_file..use_private_key_file..ssl::context] 
Use a private key from a file. 


  void ``[link asio.reference.ssl__context.use_private_key_file.overload1 use_private_key_file]``(
      const std::string & filename,
      file_format format);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.use_private_key_file.overload1 more...]]``

  void ``[link asio.reference.ssl__context.use_private_key_file.overload2 use_private_key_file]``(
      const std::string & filename,
      file_format format,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.use_private_key_file.overload2 more...]]``


[section:overload1 ssl::context::use_private_key_file (1 of 2 overloads)]


Use a private key from a file. 


  void use_private_key_file(
      const std::string & filename,
      file_format format);


This function is used to load a private key into the context from a file.


[heading Parameters]
    

[variablelist
  
[[filename][The name of the file containing the private key.]]

[[format][The file format (ASN.1 or PEM).]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_CTX_use_PrivateKey_file`. 




[endsect]



[section:overload2 ssl::context::use_private_key_file (2 of 2 overloads)]


Use a private key from a file. 


  void use_private_key_file(
      const std::string & filename,
      file_format format,
      asio::error_code & ec);


This function is used to load a private key into the context from a file.


[heading Parameters]
    

[variablelist
  
[[filename][The name of the file containing the private key.]]

[[format][The file format (ASN.1 or PEM).]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_CTX_use_PrivateKey_file`. 




[endsect]


[endsect]

[section:use_rsa_private_key ssl::context::use_rsa_private_key]

[indexterm2 asio.indexterm.ssl__context.use_rsa_private_key..use_rsa_private_key..ssl::context] 
Use an RSA private key from a memory buffer. 


  void ``[link asio.reference.ssl__context.use_rsa_private_key.overload1 use_rsa_private_key]``(
      const const_buffer & private_key,
      file_format format);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.use_rsa_private_key.overload1 more...]]``

  void ``[link asio.reference.ssl__context.use_rsa_private_key.overload2 use_rsa_private_key]``(
      const const_buffer & private_key,
      file_format format,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.use_rsa_private_key.overload2 more...]]``


[section:overload1 ssl::context::use_rsa_private_key (1 of 2 overloads)]


Use an RSA private key from a memory buffer. 


  void use_rsa_private_key(
      const const_buffer & private_key,
      file_format format);


This function is used to load an RSA private key into the context from a buffer.


[heading Parameters]
    

[variablelist
  
[[private_key][The buffer containing the RSA private key.]]

[[format][The private key format (ASN.1 or PEM).]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_CTX_use_RSAPrivateKey` or SSL\_CTX\_use\_RSAPrivateKey\_ASN1. 




[endsect]



[section:overload2 ssl::context::use_rsa_private_key (2 of 2 overloads)]


Use an RSA private key from a memory buffer. 


  void use_rsa_private_key(
      const const_buffer & private_key,
      file_format format,
      asio::error_code & ec);


This function is used to load an RSA private key into the context from a buffer.


[heading Parameters]
    

[variablelist
  
[[private_key][The buffer containing the RSA private key.]]

[[format][The private key format (ASN.1 or PEM).]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_CTX_use_RSAPrivateKey` or SSL\_CTX\_use\_RSAPrivateKey\_ASN1. 




[endsect]


[endsect]

[section:use_rsa_private_key_file ssl::context::use_rsa_private_key_file]

[indexterm2 asio.indexterm.ssl__context.use_rsa_private_key_file..use_rsa_private_key_file..ssl::context] 
Use an RSA private key from a file. 


  void ``[link asio.reference.ssl__context.use_rsa_private_key_file.overload1 use_rsa_private_key_file]``(
      const std::string & filename,
      file_format format);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.use_rsa_private_key_file.overload1 more...]]``

  void ``[link asio.reference.ssl__context.use_rsa_private_key_file.overload2 use_rsa_private_key_file]``(
      const std::string & filename,
      file_format format,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.use_rsa_private_key_file.overload2 more...]]``


[section:overload1 ssl::context::use_rsa_private_key_file (1 of 2 overloads)]


Use an RSA private key from a file. 


  void use_rsa_private_key_file(
      const std::string & filename,
      file_format format);


This function is used to load an RSA private key into the context from a file.


[heading Parameters]
    

[variablelist
  
[[filename][The name of the file containing the RSA private key.]]

[[format][The file format (ASN.1 or PEM).]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_CTX_use_RSAPrivateKey_file`. 




[endsect]



[section:overload2 ssl::context::use_rsa_private_key_file (2 of 2 overloads)]


Use an RSA private key from a file. 


  void use_rsa_private_key_file(
      const std::string & filename,
      file_format format,
      asio::error_code & ec);


This function is used to load an RSA private key into the context from a file.


[heading Parameters]
    

[variablelist
  
[[filename][The name of the file containing the RSA private key.]]

[[format][The file format (ASN.1 or PEM).]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_CTX_use_RSAPrivateKey_file`. 




[endsect]


[endsect]

[section:use_tmp_dh ssl::context::use_tmp_dh]

[indexterm2 asio.indexterm.ssl__context.use_tmp_dh..use_tmp_dh..ssl::context] 
Use the specified memory buffer to obtain the temporary Diffie-Hellman parameters. 


  void ``[link asio.reference.ssl__context.use_tmp_dh.overload1 use_tmp_dh]``(
      const const_buffer & dh);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.use_tmp_dh.overload1 more...]]``

  void ``[link asio.reference.ssl__context.use_tmp_dh.overload2 use_tmp_dh]``(
      const const_buffer & dh,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.use_tmp_dh.overload2 more...]]``


[section:overload1 ssl::context::use_tmp_dh (1 of 2 overloads)]


Use the specified memory buffer to obtain the temporary Diffie-Hellman parameters. 


  void use_tmp_dh(
      const const_buffer & dh);


This function is used to load Diffie-Hellman parameters into the context from a buffer.


[heading Parameters]
    

[variablelist
  
[[dh][The memory buffer containing the Diffie-Hellman parameters. The buffer must use the PEM format.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_CTX_set_tmp_dh`. 




[endsect]



[section:overload2 ssl::context::use_tmp_dh (2 of 2 overloads)]


Use the specified memory buffer to obtain the temporary Diffie-Hellman parameters. 


  void use_tmp_dh(
      const const_buffer & dh,
      asio::error_code & ec);


This function is used to load Diffie-Hellman parameters into the context from a buffer.


[heading Parameters]
    

[variablelist
  
[[dh][The memory buffer containing the Diffie-Hellman parameters. The buffer must use the PEM format.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_CTX_set_tmp_dh`. 




[endsect]


[endsect]

[section:use_tmp_dh_file ssl::context::use_tmp_dh_file]

[indexterm2 asio.indexterm.ssl__context.use_tmp_dh_file..use_tmp_dh_file..ssl::context] 
Use the specified file to obtain the temporary Diffie-Hellman parameters. 


  void ``[link asio.reference.ssl__context.use_tmp_dh_file.overload1 use_tmp_dh_file]``(
      const std::string & filename);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.use_tmp_dh_file.overload1 more...]]``

  void ``[link asio.reference.ssl__context.use_tmp_dh_file.overload2 use_tmp_dh_file]``(
      const std::string & filename,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.use_tmp_dh_file.overload2 more...]]``


[section:overload1 ssl::context::use_tmp_dh_file (1 of 2 overloads)]


Use the specified file to obtain the temporary Diffie-Hellman parameters. 


  void use_tmp_dh_file(
      const std::string & filename);


This function is used to load Diffie-Hellman parameters into the context from a file.


[heading Parameters]
    

[variablelist
  
[[filename][The name of the file containing the Diffie-Hellman parameters. The file must use the PEM format.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_CTX_set_tmp_dh`. 




[endsect]



[section:overload2 ssl::context::use_tmp_dh_file (2 of 2 overloads)]


Use the specified file to obtain the temporary Diffie-Hellman parameters. 


  void use_tmp_dh_file(
      const std::string & filename,
      asio::error_code & ec);


This function is used to load Diffie-Hellman parameters into the context from a file.


[heading Parameters]
    

[variablelist
  
[[filename][The name of the file containing the Diffie-Hellman parameters. The file must use the PEM format.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_CTX_set_tmp_dh`. 




[endsect]


[endsect]


[section:_context ssl::context::~context]

[indexterm2 asio.indexterm.ssl__context._context..~context..ssl::context] 
Destructor. 


  ~context();



[endsect]



[endsect]

[section:ssl__context_base ssl::context_base]


The [link asio.reference.ssl__context_base `ssl::context_base`] class is used as a base for the basic\_context class template so that we have a common place to define various enums. 


  class context_base


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ssl__context_base.file_format [*file_format]]]
    [File format types. ]
  
  ]

  [

    [[link asio.reference.ssl__context_base.method [*method]]]
    [Different methods supported by a context. ]
  
  ]

  [

    [[link asio.reference.ssl__context_base.options [*options]]]
    [Bitmask type for SSL options. ]
  
  ]

  [

    [[link asio.reference.ssl__context_base.password_purpose [*password_purpose]]]
    [Purpose of PEM password. ]
  
  ]

]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ssl__context_base._context_base [*~context_base]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ssl__context_base.default_workarounds [*default_workarounds]] [static]]
    [Implement various bug workarounds. ]
  ]

  [
    [[link asio.reference.ssl__context_base.no_compression [*no_compression]] [static]]
    [Disable compression. Compression is disabled by default. ]
  ]

  [
    [[link asio.reference.ssl__context_base.no_sslv2 [*no_sslv2]] [static]]
    [Disable SSL v2. ]
  ]

  [
    [[link asio.reference.ssl__context_base.no_sslv3 [*no_sslv3]] [static]]
    [Disable SSL v3. ]
  ]

  [
    [[link asio.reference.ssl__context_base.no_tlsv1 [*no_tlsv1]] [static]]
    [Disable TLS v1. ]
  ]

  [
    [[link asio.reference.ssl__context_base.no_tlsv1_1 [*no_tlsv1_1]] [static]]
    [Disable TLS v1.1. ]
  ]

  [
    [[link asio.reference.ssl__context_base.no_tlsv1_2 [*no_tlsv1_2]] [static]]
    [Disable TLS v1.2. ]
  ]

  [
    [[link asio.reference.ssl__context_base.no_tlsv1_3 [*no_tlsv1_3]] [static]]
    [Disable TLS v1.3. ]
  ]

  [
    [[link asio.reference.ssl__context_base.single_dh_use [*single_dh_use]] [static]]
    [Always create a new key when using tmp_dh parameters. ]
  ]

]

[heading Requirements]

['Header: ][^asio/ssl/context_base.hpp]

['Convenience header: ][^asio/ssl.hpp]


[section:default_workarounds ssl::context_base::default_workarounds]

[indexterm2 asio.indexterm.ssl__context_base.default_workarounds..default_workarounds..ssl::context_base] 
Implement various bug workarounds. 


  static const long default_workarounds = implementation_defined;



[endsect]



[section:file_format ssl::context_base::file_format]

[indexterm2 asio.indexterm.ssl__context_base.file_format..file_format..ssl::context_base] 
File format types. 


  enum file_format

[indexterm2 asio.indexterm.ssl__context_base.file_format.asn1..asn1..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.file_format.pem..pem..ssl::context_base]

[heading Values]
[variablelist

  [
    [asn1]
    [ASN.1 file. ]
  ]

  [
    [pem]
    [PEM file. ]
  ]

]



[endsect]



[section:method ssl::context_base::method]

[indexterm2 asio.indexterm.ssl__context_base.method..method..ssl::context_base] 
Different methods supported by a context. 


  enum method

[indexterm2 asio.indexterm.ssl__context_base.method.sslv2..sslv2..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.sslv2_client..sslv2_client..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.sslv2_server..sslv2_server..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.sslv3..sslv3..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.sslv3_client..sslv3_client..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.sslv3_server..sslv3_server..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.tlsv1..tlsv1..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.tlsv1_client..tlsv1_client..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.tlsv1_server..tlsv1_server..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.sslv23..sslv23..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.sslv23_client..sslv23_client..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.sslv23_server..sslv23_server..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.tlsv11..tlsv11..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.tlsv11_client..tlsv11_client..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.tlsv11_server..tlsv11_server..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.tlsv12..tlsv12..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.tlsv12_client..tlsv12_client..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.tlsv12_server..tlsv12_server..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.tlsv13..tlsv13..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.tlsv13_client..tlsv13_client..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.tlsv13_server..tlsv13_server..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.tls..tls..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.tls_client..tls_client..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.method.tls_server..tls_server..ssl::context_base]

[heading Values]
[variablelist

  [
    [sslv2]
    [Generic SSL version 2. ]
  ]

  [
    [sslv2_client]
    [SSL version 2 client. ]
  ]

  [
    [sslv2_server]
    [SSL version 2 server. ]
  ]

  [
    [sslv3]
    [Generic SSL version 3. ]
  ]

  [
    [sslv3_client]
    [SSL version 3 client. ]
  ]

  [
    [sslv3_server]
    [SSL version 3 server. ]
  ]

  [
    [tlsv1]
    [Generic TLS version 1. ]
  ]

  [
    [tlsv1_client]
    [TLS version 1 client. ]
  ]

  [
    [tlsv1_server]
    [TLS version 1 server. ]
  ]

  [
    [sslv23]
    [Generic SSL/TLS. ]
  ]

  [
    [sslv23_client]
    [SSL/TLS client. ]
  ]

  [
    [sslv23_server]
    [SSL/TLS server. ]
  ]

  [
    [tlsv11]
    [Generic TLS version 1.1. ]
  ]

  [
    [tlsv11_client]
    [TLS version 1.1 client. ]
  ]

  [
    [tlsv11_server]
    [TLS version 1.1 server. ]
  ]

  [
    [tlsv12]
    [Generic TLS version 1.2. ]
  ]

  [
    [tlsv12_client]
    [TLS version 1.2 client. ]
  ]

  [
    [tlsv12_server]
    [TLS version 1.2 server. ]
  ]

  [
    [tlsv13]
    [Generic TLS version 1.3. ]
  ]

  [
    [tlsv13_client]
    [TLS version 1.3 client. ]
  ]

  [
    [tlsv13_server]
    [TLS version 1.3 server. ]
  ]

  [
    [tls]
    [Generic TLS. ]
  ]

  [
    [tls_client]
    [TLS client. ]
  ]

  [
    [tls_server]
    [TLS server. ]
  ]

]



[endsect]



[section:no_compression ssl::context_base::no_compression]

[indexterm2 asio.indexterm.ssl__context_base.no_compression..no_compression..ssl::context_base] 
Disable compression. Compression is disabled by default. 


  static const long no_compression = implementation_defined;



[endsect]



[section:no_sslv2 ssl::context_base::no_sslv2]

[indexterm2 asio.indexterm.ssl__context_base.no_sslv2..no_sslv2..ssl::context_base] 
Disable SSL v2. 


  static const long no_sslv2 = implementation_defined;



[endsect]



[section:no_sslv3 ssl::context_base::no_sslv3]

[indexterm2 asio.indexterm.ssl__context_base.no_sslv3..no_sslv3..ssl::context_base] 
Disable SSL v3. 


  static const long no_sslv3 = implementation_defined;



[endsect]



[section:no_tlsv1 ssl::context_base::no_tlsv1]

[indexterm2 asio.indexterm.ssl__context_base.no_tlsv1..no_tlsv1..ssl::context_base] 
Disable TLS v1. 


  static const long no_tlsv1 = implementation_defined;



[endsect]



[section:no_tlsv1_1 ssl::context_base::no_tlsv1_1]

[indexterm2 asio.indexterm.ssl__context_base.no_tlsv1_1..no_tlsv1_1..ssl::context_base] 
Disable TLS v1.1. 


  static const long no_tlsv1_1 = implementation_defined;



[endsect]



[section:no_tlsv1_2 ssl::context_base::no_tlsv1_2]

[indexterm2 asio.indexterm.ssl__context_base.no_tlsv1_2..no_tlsv1_2..ssl::context_base] 
Disable TLS v1.2. 


  static const long no_tlsv1_2 = implementation_defined;



[endsect]



[section:no_tlsv1_3 ssl::context_base::no_tlsv1_3]

[indexterm2 asio.indexterm.ssl__context_base.no_tlsv1_3..no_tlsv1_3..ssl::context_base] 
Disable TLS v1.3. 


  static const long no_tlsv1_3 = implementation_defined;



[endsect]



[section:options ssl::context_base::options]

[indexterm2 asio.indexterm.ssl__context_base.options..options..ssl::context_base] 
Bitmask type for SSL options. 


  typedef long options;



[heading Requirements]

['Header: ][^asio/ssl/context_base.hpp]

['Convenience header: ][^asio/ssl.hpp]


[endsect]



[section:password_purpose ssl::context_base::password_purpose]

[indexterm2 asio.indexterm.ssl__context_base.password_purpose..password_purpose..ssl::context_base] 
Purpose of PEM password. 


  enum password_purpose

[indexterm2 asio.indexterm.ssl__context_base.password_purpose.for_reading..for_reading..ssl::context_base]
[indexterm2 asio.indexterm.ssl__context_base.password_purpose.for_writing..for_writing..ssl::context_base]

[heading Values]
[variablelist

  [
    [for_reading]
    [The password is needed for reading/decryption. ]
  ]

  [
    [for_writing]
    [The password is needed for writing/encryption. ]
  ]

]



[endsect]



[section:single_dh_use ssl::context_base::single_dh_use]

[indexterm2 asio.indexterm.ssl__context_base.single_dh_use..single_dh_use..ssl::context_base] 
Always create a new key when using tmp\_dh parameters. 


  static const long single_dh_use = implementation_defined;



[endsect]



[section:_context_base ssl::context_base::~context_base]

[indexterm2 asio.indexterm.ssl__context_base._context_base..~context_base..ssl::context_base] 
Protected destructor to prevent deletion through this type. 


  ~context_base();



[endsect]



[endsect]


[section:ssl__error__get_stream_category ssl::error::get_stream_category]

[indexterm1 asio.indexterm.ssl__error__get_stream_category..ssl::error::get_stream_category] 

  const asio::error_category & get_stream_category();


[heading Requirements]

['Header: ][^asio/ssl/error.hpp]

['Convenience header: ][^asio/ssl.hpp]


[endsect]



[section:ssl__error__make_error_code ssl::error::make_error_code]

[indexterm1 asio.indexterm.ssl__error__make_error_code..ssl::error::make_error_code] 

  asio::error_code make_error_code(
      stream_errors e);


[heading Requirements]

['Header: ][^asio/ssl/error.hpp]

['Convenience header: ][^asio/ssl.hpp]


[endsect]



[section:ssl__error__stream_category ssl::error::stream_category]

[indexterm1 asio.indexterm.ssl__error__stream_category..ssl::error::stream_category] 

  static const asio::error_category & stream_category = asio::ssl::error::get_stream_category();


[heading Requirements]

['Header: ][^asio/ssl/error.hpp]

['Convenience header: ][^asio/ssl.hpp]


[endsect]



[section:ssl__error__stream_errors ssl::error::stream_errors]

[indexterm1 asio.indexterm.ssl__error__stream_errors..ssl::error::stream_errors] 

  enum stream_errors

[indexterm2 asio.indexterm.ssl__error__stream_errors.stream_truncated..stream_truncated..ssl::error::stream_errors]
[indexterm2 asio.indexterm.ssl__error__stream_errors.unspecified_system_error..unspecified_system_error..ssl::error::stream_errors]
[indexterm2 asio.indexterm.ssl__error__stream_errors.unexpected_result..unexpected_result..ssl::error::stream_errors]

[heading Values]
[variablelist

  [
    [stream_truncated]
    [The underlying stream closed before the ssl stream gracefully shut down. ]
  ]

  [
    [unspecified_system_error]
    [The underlying SSL library returned a system error without providing further information. ]
  ]

  [
    [unexpected_result]
    [The underlying SSL library generated an unexpected result from a function call. ]
  ]

]


[heading Requirements]

['Header: ][^asio/ssl/error.hpp]

['Convenience header: ][^asio/ssl.hpp]


[endsect]


[section:ssl__host_name_verification ssl::host_name_verification]


Verifies a certificate against a host\_name according to the rules described in RFC 6125. 


  class host_name_verification


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ssl__host_name_verification.result_type [*result_type]]]
    [The type of the function object's result. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ssl__host_name_verification.host_name_verification [*host_name_verification]] [constructor]]
    [Constructor. ]
  ]
  
  [
    [[link asio.reference.ssl__host_name_verification.operator_lp__rp_ [*operator()]]]
    [Perform certificate verification. ]
  ]
  
]


[heading Example]
  
The following example shows how to synchronously open a secure connection to a given host name: 

   using asio::ip::tcp;
   namespace ssl = asio::ssl;
   typedef ssl::stream<tcp::socket> ssl_socket;

   // Create a context that uses the default paths for finding CA certificates.
   ssl::context ctx(ssl::context::sslv23);
   ctx.set_default_verify_paths();

   // Open a socket and connect it to the remote host.
   asio::io_context io_context;
   ssl_socket sock(io_context, ctx);
   tcp::resolver resolver(io_context);
   tcp::resolver::query query("host.name", "https");
   asio::connect(sock.lowest_layer(), resolver.resolve(query));
   sock.lowest_layer().set_option(tcp::no_delay(true));

   // Perform SSL handshake and verify the remote host's certificate.
   sock.set_verify_mode(ssl::verify_peer);
   sock.set_verify_callback(ssl::host_name_verification("host.name"));
   sock.handshake(ssl_socket::client);

   // ... read and write as normal ...






[heading Requirements]

['Header: ][^asio/ssl/host_name_verification.hpp]

['Convenience header: ][^asio/ssl.hpp]


[section:host_name_verification ssl::host_name_verification::host_name_verification]

[indexterm2 asio.indexterm.ssl__host_name_verification.host_name_verification..host_name_verification..ssl::host_name_verification] 
Constructor. 


  host_name_verification(
      const std::string & host);



[endsect]



[section:operator_lp__rp_ ssl::host_name_verification::operator()]

[indexterm2 asio.indexterm.ssl__host_name_verification.operator_lp__rp_..operator()..ssl::host_name_verification] 
Perform certificate verification. 


  bool operator()(
      bool preverified,
      verify_context & ctx) const;



[endsect]



[section:result_type ssl::host_name_verification::result_type]

[indexterm2 asio.indexterm.ssl__host_name_verification.result_type..result_type..ssl::host_name_verification] 
The type of the function object's result. 


  typedef bool result_type;



[heading Requirements]

['Header: ][^asio/ssl/host_name_verification.hpp]

['Convenience header: ][^asio/ssl.hpp]


[endsect]



[endsect]

[section:ssl__rfc2818_verification ssl::rfc2818_verification]


(Deprecated. Use [link asio.reference.ssl__host_name_verification `ssl::host_name_verification`].) Verifies a certificate against a hostname according to the rules described in RFC 2818. 


  class rfc2818_verification


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ssl__rfc2818_verification.result_type [*result_type]]]
    [The type of the function object's result. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ssl__rfc2818_verification.operator_lp__rp_ [*operator()]]]
    [Perform certificate verification. ]
  ]
  
  [
    [[link asio.reference.ssl__rfc2818_verification.rfc2818_verification [*rfc2818_verification]] [constructor]]
    [Constructor. ]
  ]
  
]


[heading Example]
  
The following example shows how to synchronously open a secure connection to a given host name: 

   using asio::ip::tcp;
   namespace ssl = asio::ssl;
   typedef ssl::stream<tcp::socket> ssl_socket;

   // Create a context that uses the default paths for finding CA certificates.
   ssl::context ctx(ssl::context::sslv23);
   ctx.set_default_verify_paths();

   // Open a socket and connect it to the remote host.
   asio::io_context io_context;
   ssl_socket sock(io_context, ctx);
   tcp::resolver resolver(io_context);
   tcp::resolver::query query("host.name", "https");
   asio::connect(sock.lowest_layer(), resolver.resolve(query));
   sock.lowest_layer().set_option(tcp::no_delay(true));

   // Perform SSL handshake and verify the remote host's certificate.
   sock.set_verify_mode(ssl::verify_peer);
   sock.set_verify_callback(ssl::rfc2818_verification("host.name"));
   sock.handshake(ssl_socket::client);

   // ... read and write as normal ...






[heading Requirements]

['Header: ][^asio/ssl/rfc2818_verification.hpp]

['Convenience header: ][^asio/ssl.hpp]


[section:operator_lp__rp_ ssl::rfc2818_verification::operator()]

[indexterm2 asio.indexterm.ssl__rfc2818_verification.operator_lp__rp_..operator()..ssl::rfc2818_verification] 
Perform certificate verification. 


  bool operator()(
      bool preverified,
      verify_context & ctx) const;



[endsect]



[section:result_type ssl::rfc2818_verification::result_type]

[indexterm2 asio.indexterm.ssl__rfc2818_verification.result_type..result_type..ssl::rfc2818_verification] 
The type of the function object's result. 


  typedef bool result_type;



[heading Requirements]

['Header: ][^asio/ssl/rfc2818_verification.hpp]

['Convenience header: ][^asio/ssl.hpp]


[endsect]



[section:rfc2818_verification ssl::rfc2818_verification::rfc2818_verification]

[indexterm2 asio.indexterm.ssl__rfc2818_verification.rfc2818_verification..rfc2818_verification..ssl::rfc2818_verification] 
Constructor. 


  rfc2818_verification(
      const std::string & host);



[endsect]



[endsect]

[section:ssl__stream ssl::stream]


Provides stream-oriented functionality using SSL. 


  template<
      typename Stream>
  class stream :
    public ssl::stream_base,
    noncopyable


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ssl__stream__impl_struct [*impl_struct]]]
    [Structure for use with deprecated impl_type. ]
  
  ]

  [

    [[link asio.reference.ssl__stream.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.ssl__stream.handshake_type [*handshake_type]]]
    [Different handshake types. ]
  
  ]

  [

    [[link asio.reference.ssl__stream.lowest_layer_type [*lowest_layer_type]]]
    [The type of the lowest layer. ]
  
  ]

  [

    [[link asio.reference.ssl__stream.native_handle_type [*native_handle_type]]]
    [The native handle type of the SSL stream. ]
  
  ]

  [

    [[link asio.reference.ssl__stream.next_layer_type [*next_layer_type]]]
    [The type of the next layer. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ssl__stream.async_handshake [*async_handshake]]]
    [Start an asynchronous SSL handshake. ]
  ]
  
  [
    [[link asio.reference.ssl__stream.async_read_some [*async_read_some]]]
    [Start an asynchronous read. ]
  ]
  
  [
    [[link asio.reference.ssl__stream.async_shutdown [*async_shutdown]]]
    [Asynchronously shut down SSL on the stream. ]
  ]
  
  [
    [[link asio.reference.ssl__stream.async_write_some [*async_write_some]]]
    [Start an asynchronous write. ]
  ]
  
  [
    [[link asio.reference.ssl__stream.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.ssl__stream.handshake [*handshake]]]
    [Perform SSL handshaking. ]
  ]
  
  [
    [[link asio.reference.ssl__stream.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.ssl__stream.native_handle [*native_handle]]]
    [Get the underlying implementation in the native type. ]
  ]
  
  [
    [[link asio.reference.ssl__stream.next_layer [*next_layer]]]
    [Get a reference to the next layer. ]
  ]
  
  [
    [[link asio.reference.ssl__stream.read_some [*read_some]]]
    [Read some data from the stream. ]
  ]
  
  [
    [[link asio.reference.ssl__stream.set_verify_callback [*set_verify_callback]]]
    [Set the callback used to verify peer certificates. ]
  ]
  
  [
    [[link asio.reference.ssl__stream.set_verify_depth [*set_verify_depth]]]
    [Set the peer verification depth. ]
  ]
  
  [
    [[link asio.reference.ssl__stream.set_verify_mode [*set_verify_mode]]]
    [Set the peer verification mode. ]
  ]
  
  [
    [[link asio.reference.ssl__stream.shutdown [*shutdown]]]
    [Shut down SSL on the stream. ]
  ]
  
  [
    [[link asio.reference.ssl__stream.stream [*stream]] [constructor]]
    [Construct a stream. 
     [hr]
     Move-construct a stream from another. ]
  ]
  
  [
    [[link asio.reference.ssl__stream.write_some [*write_some]]]
    [Write some data to the stream. ]
  ]
  
  [
    [[link asio.reference.ssl__stream._stream [*~stream]] [destructor]]
    [Destructor. ]
  ]
  
]

The stream class template provides asynchronous and blocking stream-oriented functionality using SSL.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. The application must also ensure that all asynchronous operations are performed within the same implicit or explicit strand.


[heading Example]
  
To use the SSL stream template with an `ip::tcp::socket`, you would write: 

   asio::io_context my_context;
   asio::ssl::context ctx(asio::ssl::context::sslv23);
   asio::ssl::stream<asio:ip::tcp::socket> sock(my_context, ctx);







[heading Requirements]

['Header: ][^asio/ssl/stream.hpp]

['Convenience header: ][^asio/ssl.hpp]

[section:async_handshake ssl::stream::async_handshake]

[indexterm2 asio.indexterm.ssl__stream.async_handshake..async_handshake..ssl::stream] 
Start an asynchronous SSL handshake. 


  template<
      typename ``[link asio.reference.HandshakeHandler HandshakeHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.ssl__stream.async_handshake.overload1 async_handshake]``(
      handshake_type type,
      HandshakeHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.async_handshake.overload1 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.BufferedHandshakeHandler BufferedHandshakeHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` ``[link asio.reference.ssl__stream.async_handshake.overload2 async_handshake]``(
      handshake_type type,
      const ConstBufferSequence & buffers,
      BufferedHandshakeHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.async_handshake.overload2 more...]]``


[section:overload1 ssl::stream::async_handshake (1 of 2 overloads)]


Start an asynchronous SSL handshake. 


  template<
      typename ``[link asio.reference.HandshakeHandler HandshakeHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_handshake(
      handshake_type type,
      HandshakeHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously perform an SSL handshake on the stream. This function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[type][The type of handshaking to be performed, i.e. as a client or as a server.]]

[[handler][The handler to be called when the handshake operation completes. Copies will be made of the handler as required. The equivalent function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error // Result of operation.
   ); 
``
]]

]




[endsect]



[section:overload2 ssl::stream::async_handshake (2 of 2 overloads)]


Start an asynchronous SSL handshake. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.BufferedHandshakeHandler BufferedHandshakeHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_handshake(
      handshake_type type,
      const ConstBufferSequence & buffers,
      BufferedHandshakeHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously perform an SSL handshake on the stream. This function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[type][The type of handshaking to be performed, i.e. as a client or as a server.]]

[[buffers][The buffered data to be reused for the handshake. Although the buffers object may be copied as necessary, ownership of the underlying buffers is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the handshake operation completes. Copies will be made of the handler as required. The equivalent function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred // Amount of buffers used in handshake.
   ); 
``
]]

]




[endsect]


[endsect]


[section:async_read_some ssl::stream::async_read_some]

[indexterm2 asio.indexterm.ssl__stream.async_read_some..async_read_some..ssl::stream] 
Start an asynchronous read. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_some(
      const MutableBufferSequence & buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously read one or more bytes of data from the stream. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][The buffers into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying buffers is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The equivalent function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes read.
   ); 
``
]]

]


[heading Remarks]
      
The async\_read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.async_read `async_read`]  function if you need to ensure that the requested amount of data is read before the asynchronous operation completes. 




[endsect]



[section:async_shutdown ssl::stream::async_shutdown]

[indexterm2 asio.indexterm.ssl__stream.async_shutdown..async_shutdown..ssl::stream] 
Asynchronously shut down SSL on the stream. 


  template<
      typename ``[link asio.reference.ShutdownHandler ShutdownHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_shutdown(
      ShutdownHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously shut down SSL on the stream. This function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[handler][The handler to be called when the handshake operation completes. Copies will be made of the handler as required. The equivalent function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error // Result of operation.
   ); 
``
]]

]




[endsect]



[section:async_write_some ssl::stream::async_write_some]

[indexterm2 asio.indexterm.ssl__stream.async_write_some..async_write_some..ssl::stream] 
Start an asynchronous write. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_write_some(
      const ConstBufferSequence & buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously write one or more bytes of data to the stream. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][The data to be written to the stream. Although the buffers object may be copied as necessary, ownership of the underlying buffers is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The equivalent function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes written.
   ); 
``
]]

]


[heading Remarks]
      
The async\_write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.async_write `async_write`]  function if you need to ensure that all data is written before the asynchronous operation completes. 




[endsect]



[section:executor_type ssl::stream::executor_type]

[indexterm2 asio.indexterm.ssl__stream.executor_type..executor_type..ssl::stream] 
The type of the executor associated with the object. 


  typedef lowest_layer_type::executor_type executor_type;



[heading Requirements]

['Header: ][^asio/ssl/stream.hpp]

['Convenience header: ][^asio/ssl.hpp]


[endsect]



[section:get_executor ssl::stream::get_executor]

[indexterm2 asio.indexterm.ssl__stream.get_executor..get_executor..ssl::stream] 
Get the executor associated with the object. 


  executor_type get_executor();


This function may be used to obtain the executor object that the stream uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A copy of the executor that stream will use to dispatch handlers. 




[endsect]


[section:handshake ssl::stream::handshake]

[indexterm2 asio.indexterm.ssl__stream.handshake..handshake..ssl::stream] 
Perform SSL handshaking. 


  void ``[link asio.reference.ssl__stream.handshake.overload1 handshake]``(
      handshake_type type);
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.handshake.overload1 more...]]``

  void ``[link asio.reference.ssl__stream.handshake.overload2 handshake]``(
      handshake_type type,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.handshake.overload2 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  void ``[link asio.reference.ssl__stream.handshake.overload3 handshake]``(
      handshake_type type,
      const ConstBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.handshake.overload3 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  void ``[link asio.reference.ssl__stream.handshake.overload4 handshake]``(
      handshake_type type,
      const ConstBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.handshake.overload4 more...]]``


[section:overload1 ssl::stream::handshake (1 of 4 overloads)]


Perform SSL handshaking. 


  void handshake(
      handshake_type type);


This function is used to perform SSL handshaking on the stream. The function call will block until handshaking is complete or an error occurs.


[heading Parameters]
    

[variablelist
  
[[type][The type of handshaking to be performed, i.e. as a client or as a server.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 ssl::stream::handshake (2 of 4 overloads)]


Perform SSL handshaking. 


  void handshake(
      handshake_type type,
      asio::error_code & ec);


This function is used to perform SSL handshaking on the stream. The function call will block until handshaking is complete or an error occurs.


[heading Parameters]
    

[variablelist
  
[[type][The type of handshaking to be performed, i.e. as a client or as a server.]]

[[ec][Set to indicate what error occurred, if any. ]]

]




[endsect]



[section:overload3 ssl::stream::handshake (3 of 4 overloads)]


Perform SSL handshaking. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  void handshake(
      handshake_type type,
      const ConstBufferSequence & buffers);


This function is used to perform SSL handshaking on the stream. The function call will block until handshaking is complete or an error occurs.


[heading Parameters]
    

[variablelist
  
[[type][The type of handshaking to be performed, i.e. as a client or as a server.]]

[[buffers][The buffered data to be reused for the handshake.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload4 ssl::stream::handshake (4 of 4 overloads)]


Perform SSL handshaking. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  void handshake(
      handshake_type type,
      const ConstBufferSequence & buffers,
      asio::error_code & ec);


This function is used to perform SSL handshaking on the stream. The function call will block until handshaking is complete or an error occurs.


[heading Parameters]
    

[variablelist
  
[[type][The type of handshaking to be performed, i.e. as a client or as a server.]]

[[buffers][The buffered data to be reused for the handshake.]]

[[ec][Set to indicate what error occurred, if any. ]]

]




[endsect]


[endsect]


[section:handshake_type ssl::stream::handshake_type]

[indexterm2 asio.indexterm.ssl__stream.handshake_type..handshake_type..ssl::stream] 
Different handshake types. 


  enum handshake_type

[indexterm2 asio.indexterm.ssl__stream.handshake_type.client..client..ssl::stream]
[indexterm2 asio.indexterm.ssl__stream.handshake_type.server..server..ssl::stream]

[heading Values]
[variablelist

  [
    [client]
    [Perform handshaking as a client. ]
  ]

  [
    [server]
    [Perform handshaking as a server. ]
  ]

]



[endsect]


[section:lowest_layer ssl::stream::lowest_layer]

[indexterm2 asio.indexterm.ssl__stream.lowest_layer..lowest_layer..ssl::stream] 
Get a reference to the lowest layer. 


  lowest_layer_type & ``[link asio.reference.ssl__stream.lowest_layer.overload1 lowest_layer]``();
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.lowest_layer.overload1 more...]]``

  const lowest_layer_type & ``[link asio.reference.ssl__stream.lowest_layer.overload2 lowest_layer]``() const;
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.lowest_layer.overload2 more...]]``


[section:overload1 ssl::stream::lowest_layer (1 of 2 overloads)]


Get a reference to the lowest layer. 


  lowest_layer_type & lowest_layer();


This function returns a reference to the lowest layer in a stack of stream layers.


[heading Return Value]
      
A reference to the lowest layer in the stack of stream layers. Ownership is not transferred to the caller. 




[endsect]



[section:overload2 ssl::stream::lowest_layer (2 of 2 overloads)]


Get a reference to the lowest layer. 


  const lowest_layer_type & lowest_layer() const;


This function returns a reference to the lowest layer in a stack of stream layers.


[heading Return Value]
      
A reference to the lowest layer in the stack of stream layers. Ownership is not transferred to the caller. 




[endsect]


[endsect]


[section:lowest_layer_type ssl::stream::lowest_layer_type]

[indexterm2 asio.indexterm.ssl__stream.lowest_layer_type..lowest_layer_type..ssl::stream] 
The type of the lowest layer. 


  typedef next_layer_type::lowest_layer_type lowest_layer_type;



[heading Requirements]

['Header: ][^asio/ssl/stream.hpp]

['Convenience header: ][^asio/ssl.hpp]


[endsect]



[section:native_handle ssl::stream::native_handle]

[indexterm2 asio.indexterm.ssl__stream.native_handle..native_handle..ssl::stream] 
Get the underlying implementation in the native type. 


  native_handle_type native_handle();


This function may be used to obtain the underlying implementation of the context. This is intended to allow access to context functionality that is not otherwise provided.


[heading Example]
  
The `native_handle()` function returns a pointer of type `SSL*` that is suitable for passing to functions such as `SSL_get_verify_result` and `SSL_get_peer_certificate:` 

   asio::ssl::stream<asio:ip::tcp::socket> sock(my_context, ctx);

   // ... establish connection and perform handshake ...

   if (X509* cert = SSL_get_peer_certificate(sock.native_handle()))
   {
     if (SSL_get_verify_result(sock.native_handle()) == X509_V_OK)
     {
       // ...
     }
   }







[endsect]



[section:native_handle_type ssl::stream::native_handle_type]

[indexterm2 asio.indexterm.ssl__stream.native_handle_type..native_handle_type..ssl::stream] 
The native handle type of the SSL stream. 


  typedef SSL * native_handle_type;



[heading Requirements]

['Header: ][^asio/ssl/stream.hpp]

['Convenience header: ][^asio/ssl.hpp]


[endsect]


[section:next_layer ssl::stream::next_layer]

[indexterm2 asio.indexterm.ssl__stream.next_layer..next_layer..ssl::stream] 
Get a reference to the next layer. 


  const next_layer_type & ``[link asio.reference.ssl__stream.next_layer.overload1 next_layer]``() const;
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.next_layer.overload1 more...]]``

  next_layer_type & ``[link asio.reference.ssl__stream.next_layer.overload2 next_layer]``();
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.next_layer.overload2 more...]]``


[section:overload1 ssl::stream::next_layer (1 of 2 overloads)]


Get a reference to the next layer. 


  const next_layer_type & next_layer() const;


This function returns a reference to the next layer in a stack of stream layers.


[heading Return Value]
      
A reference to the next layer in the stack of stream layers. Ownership is not transferred to the caller. 




[endsect]



[section:overload2 ssl::stream::next_layer (2 of 2 overloads)]


Get a reference to the next layer. 


  next_layer_type & next_layer();


This function returns a reference to the next layer in a stack of stream layers.


[heading Return Value]
      
A reference to the next layer in the stack of stream layers. Ownership is not transferred to the caller. 




[endsect]


[endsect]


[section:next_layer_type ssl::stream::next_layer_type]

[indexterm2 asio.indexterm.ssl__stream.next_layer_type..next_layer_type..ssl::stream] 
The type of the next layer. 


  typedef remove_reference< Stream >::type next_layer_type;



[heading Requirements]

['Header: ][^asio/ssl/stream.hpp]

['Convenience header: ][^asio/ssl.hpp]


[endsect]


[section:read_some ssl::stream::read_some]

[indexterm2 asio.indexterm.ssl__stream.read_some..read_some..ssl::stream] 
Read some data from the stream. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.ssl__stream.read_some.overload1 read_some]``(
      const MutableBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.read_some.overload1 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.ssl__stream.read_some.overload2 read_some]``(
      const MutableBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.read_some.overload2 more...]]``


[section:overload1 ssl::stream::read_some (1 of 2 overloads)]


Read some data from the stream. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_some(
      const MutableBufferSequence & buffers);


This function is used to read data from the stream. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][The buffers into which the data will be read.]]

]


[heading Return Value]
      
The number of bytes read.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes. 




[endsect]



[section:overload2 ssl::stream::read_some (2 of 2 overloads)]


Read some data from the stream. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_some(
      const MutableBufferSequence & buffers,
      asio::error_code & ec);


This function is used to read data from the stream. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][The buffers into which the data will be read.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes read. Returns 0 if an error occurred.


[heading Remarks]
      
The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes. 




[endsect]


[endsect]

[section:set_verify_callback ssl::stream::set_verify_callback]

[indexterm2 asio.indexterm.ssl__stream.set_verify_callback..set_verify_callback..ssl::stream] 
Set the callback used to verify peer certificates. 


  template<
      typename VerifyCallback>
  void ``[link asio.reference.ssl__stream.set_verify_callback.overload1 set_verify_callback]``(
      VerifyCallback callback);
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.set_verify_callback.overload1 more...]]``

  template<
      typename VerifyCallback>
  void ``[link asio.reference.ssl__stream.set_verify_callback.overload2 set_verify_callback]``(
      VerifyCallback callback,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.set_verify_callback.overload2 more...]]``


[section:overload1 ssl::stream::set_verify_callback (1 of 2 overloads)]


Set the callback used to verify peer certificates. 


  template<
      typename VerifyCallback>
  void set_verify_callback(
      VerifyCallback callback);


This function is used to specify a callback function that will be called by the implementation when it needs to verify a peer certificate.


[heading Parameters]
    

[variablelist
  
[[callback][The function object to be used for verifying a certificate. The function signature of the handler must be: 
``
   bool verify_callback(
     bool preverified, // True if the certificate passed pre-verification.
     verify_context& ctx // The peer certificate and other context.
   ); 
``
The return value of the callback is true if the certificate has passed verification, false otherwise.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_set_verify`. 




[endsect]



[section:overload2 ssl::stream::set_verify_callback (2 of 2 overloads)]


Set the callback used to verify peer certificates. 


  template<
      typename VerifyCallback>
  void set_verify_callback(
      VerifyCallback callback,
      asio::error_code & ec);


This function is used to specify a callback function that will be called by the implementation when it needs to verify a peer certificate.


[heading Parameters]
    

[variablelist
  
[[callback][The function object to be used for verifying a certificate. The function signature of the handler must be: 
``
   bool verify_callback(
     bool preverified, // True if the certificate passed pre-verification.
     verify_context& ctx // The peer certificate and other context.
   ); 
``
The return value of the callback is true if the certificate has passed verification, false otherwise.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_set_verify`. 




[endsect]


[endsect]

[section:set_verify_depth ssl::stream::set_verify_depth]

[indexterm2 asio.indexterm.ssl__stream.set_verify_depth..set_verify_depth..ssl::stream] 
Set the peer verification depth. 


  void ``[link asio.reference.ssl__stream.set_verify_depth.overload1 set_verify_depth]``(
      int depth);
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.set_verify_depth.overload1 more...]]``

  void ``[link asio.reference.ssl__stream.set_verify_depth.overload2 set_verify_depth]``(
      int depth,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.set_verify_depth.overload2 more...]]``


[section:overload1 ssl::stream::set_verify_depth (1 of 2 overloads)]


Set the peer verification depth. 


  void set_verify_depth(
      int depth);


This function may be used to configure the maximum verification depth allowed by the stream.


[heading Parameters]
    

[variablelist
  
[[depth][Maximum depth for the certificate chain verification that shall be allowed.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_set_verify_depth`. 




[endsect]



[section:overload2 ssl::stream::set_verify_depth (2 of 2 overloads)]


Set the peer verification depth. 


  void set_verify_depth(
      int depth,
      asio::error_code & ec);


This function may be used to configure the maximum verification depth allowed by the stream.


[heading Parameters]
    

[variablelist
  
[[depth][Maximum depth for the certificate chain verification that shall be allowed.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_set_verify_depth`. 




[endsect]


[endsect]

[section:set_verify_mode ssl::stream::set_verify_mode]

[indexterm2 asio.indexterm.ssl__stream.set_verify_mode..set_verify_mode..ssl::stream] 
Set the peer verification mode. 


  void ``[link asio.reference.ssl__stream.set_verify_mode.overload1 set_verify_mode]``(
      verify_mode v);
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.set_verify_mode.overload1 more...]]``

  void ``[link asio.reference.ssl__stream.set_verify_mode.overload2 set_verify_mode]``(
      verify_mode v,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.set_verify_mode.overload2 more...]]``


[section:overload1 ssl::stream::set_verify_mode (1 of 2 overloads)]


Set the peer verification mode. 


  void set_verify_mode(
      verify_mode v);


This function may be used to configure the peer verification mode used by the stream. The new mode will override the mode inherited from the context.


[heading Parameters]
    

[variablelist
  
[[v][A bitmask of peer verification modes. See [link asio.reference.ssl__verify_mode `ssl::verify_mode`]  for available values.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
Calls `SSL_set_verify`. 




[endsect]



[section:overload2 ssl::stream::set_verify_mode (2 of 2 overloads)]


Set the peer verification mode. 


  void set_verify_mode(
      verify_mode v,
      asio::error_code & ec);


This function may be used to configure the peer verification mode used by the stream. The new mode will override the mode inherited from the context.


[heading Parameters]
    

[variablelist
  
[[v][A bitmask of peer verification modes. See [link asio.reference.ssl__verify_mode `ssl::verify_mode`]  for available values.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Remarks]
      
Calls `SSL_set_verify`. 




[endsect]


[endsect]

[section:shutdown ssl::stream::shutdown]

[indexterm2 asio.indexterm.ssl__stream.shutdown..shutdown..ssl::stream] 
Shut down SSL on the stream. 


  void ``[link asio.reference.ssl__stream.shutdown.overload1 shutdown]``();
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.shutdown.overload1 more...]]``

  void ``[link asio.reference.ssl__stream.shutdown.overload2 shutdown]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.shutdown.overload2 more...]]``


[section:overload1 ssl::stream::shutdown (1 of 2 overloads)]


Shut down SSL on the stream. 


  void shutdown();


This function is used to shut down SSL on the stream. The function call will block until SSL has been shut down or an error occurs.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 ssl::stream::shutdown (2 of 2 overloads)]


Shut down SSL on the stream. 


  void shutdown(
      asio::error_code & ec);


This function is used to shut down SSL on the stream. The function call will block until SSL has been shut down or an error occurs.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. ]]

]




[endsect]


[endsect]

[section:stream ssl::stream::stream]

[indexterm2 asio.indexterm.ssl__stream.stream..stream..ssl::stream] 
Construct a stream. 


  template<
      typename Arg>
  ``[link asio.reference.ssl__stream.stream.overload1 stream]``(
      Arg && arg,
      context & ctx);
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.stream.overload1 more...]]``


Move-construct a stream from another. 


  ``[link asio.reference.ssl__stream.stream.overload2 stream]``(
      stream && other);
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.stream.overload2 more...]]``


[section:overload1 ssl::stream::stream (1 of 2 overloads)]


Construct a stream. 


  template<
      typename Arg>
  stream(
      Arg && arg,
      context & ctx);


This constructor creates a stream and initialises the underlying stream object.


[heading Parameters]
    

[variablelist
  
[[arg][The argument to be passed to initialise the underlying stream.]]

[[ctx][The SSL context to be used for the stream. ]]

]




[endsect]



[section:overload2 ssl::stream::stream (2 of 2 overloads)]


Move-construct a stream from another. 


  stream(
      stream && other);



[heading Parameters]
    

[variablelist
  
[[other][The other stream object from which the move will occur. Must have no outstanding asynchronous operations associated with it. Following the move, `other` has a valid but unspecified state where the only safe operation is destruction. ]]

]




[endsect]


[endsect]

[section:write_some ssl::stream::write_some]

[indexterm2 asio.indexterm.ssl__stream.write_some..write_some..ssl::stream] 
Write some data to the stream. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.ssl__stream.write_some.overload1 write_some]``(
      const ConstBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.write_some.overload1 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.ssl__stream.write_some.overload2 write_some]``(
      const ConstBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ssl__stream.write_some.overload2 more...]]``


[section:overload1 ssl::stream::write_some (1 of 2 overloads)]


Write some data to the stream. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_some(
      const ConstBufferSequence & buffers);


This function is used to write data on the stream. The function call will block until one or more bytes of data has been written successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][The data to be written.]]

]


[heading Return Value]
      
The number of bytes written.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes. 




[endsect]



[section:overload2 ssl::stream::write_some (2 of 2 overloads)]


Write some data to the stream. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_some(
      const ConstBufferSequence & buffers,
      asio::error_code & ec);


This function is used to write data on the stream. The function call will block until one or more bytes of data has been written successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][The data to be written to the stream.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes written. Returns 0 if an error occurred.


[heading Remarks]
      
The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes. 




[endsect]


[endsect]


[section:_stream ssl::stream::~stream]

[indexterm2 asio.indexterm.ssl__stream._stream..~stream..ssl::stream] 
Destructor. 


  ~stream();



[heading Remarks]
      
A `stream` object must not be destroyed while there are pending asynchronous operations associated with it. 




[endsect]



[endsect]

[section:ssl__stream__impl_struct ssl::stream::impl_struct]


Structure for use with deprecated impl\_type. 


  struct impl_struct


[heading Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ssl__stream__impl_struct.ssl [*ssl]]]
    []
  ]

]

[heading Requirements]

['Header: ][^asio/ssl/stream.hpp]

['Convenience header: ][^asio/ssl.hpp]


[section:ssl ssl::stream::impl_struct::ssl]

[indexterm2 asio.indexterm.ssl__stream__impl_struct.ssl..ssl..ssl::stream::impl_struct] 

  SSL * ssl;



[endsect]



[endsect]

[section:ssl__stream_base ssl::stream_base]


The [link asio.reference.ssl__stream_base `ssl::stream_base`] class is used as a base for the [link asio.reference.ssl__stream `ssl::stream`] class template so that we have a common place to define various enums. 


  class stream_base


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ssl__stream_base.handshake_type [*handshake_type]]]
    [Different handshake types. ]
  
  ]

]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ssl__stream_base._stream_base [*~stream_base]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/ssl/stream_base.hpp]

['Convenience header: ][^asio/ssl.hpp]


[section:handshake_type ssl::stream_base::handshake_type]

[indexterm2 asio.indexterm.ssl__stream_base.handshake_type..handshake_type..ssl::stream_base] 
Different handshake types. 


  enum handshake_type

[indexterm2 asio.indexterm.ssl__stream_base.handshake_type.client..client..ssl::stream_base]
[indexterm2 asio.indexterm.ssl__stream_base.handshake_type.server..server..ssl::stream_base]

[heading Values]
[variablelist

  [
    [client]
    [Perform handshaking as a client. ]
  ]

  [
    [server]
    [Perform handshaking as a server. ]
  ]

]



[endsect]



[section:_stream_base ssl::stream_base::~stream_base]

[indexterm2 asio.indexterm.ssl__stream_base._stream_base..~stream_base..ssl::stream_base] 
Protected destructor to prevent deletion through this type. 


  ~stream_base();



[endsect]



[endsect]


[section:ssl__verify_client_once ssl::verify_client_once]

[indexterm1 asio.indexterm.ssl__verify_client_once..ssl::verify_client_once] 
Do not request client certificate on renegotiation. Ignored unless [link asio.reference.ssl__verify_peer `ssl::verify_peer`]  is set. 


  const int verify_client_once = implementation_defined;


[heading Requirements]

['Header: ][^asio/ssl/verify_mode.hpp]

['Convenience header: ][^asio/ssl.hpp]


[endsect]


[section:ssl__verify_context ssl::verify_context]


A simple wrapper around the X509\_STORE\_CTX type, used during verification of a peer certificate. 


  class verify_context :
    noncopyable


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.ssl__verify_context.native_handle_type [*native_handle_type]]]
    [The native handle type of the verification context. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ssl__verify_context.native_handle [*native_handle]]]
    [Get the underlying implementation in the native type. ]
  ]
  
  [
    [[link asio.reference.ssl__verify_context.verify_context [*verify_context]] [constructor]]
    [Constructor. ]
  ]
  
]


[heading Remarks]
      
The [link asio.reference.ssl__verify_context `ssl::verify_context`] does not own the underlying X509\_STORE\_CTX object. 



[heading Requirements]

['Header: ][^asio/ssl/verify_context.hpp]

['Convenience header: ][^asio/ssl.hpp]


[section:native_handle ssl::verify_context::native_handle]

[indexterm2 asio.indexterm.ssl__verify_context.native_handle..native_handle..ssl::verify_context] 
Get the underlying implementation in the native type. 


  native_handle_type native_handle();


This function may be used to obtain the underlying implementation of the context. This is intended to allow access to context functionality that is not otherwise provided. 


[endsect]



[section:native_handle_type ssl::verify_context::native_handle_type]

[indexterm2 asio.indexterm.ssl__verify_context.native_handle_type..native_handle_type..ssl::verify_context] 
The native handle type of the verification context. 


  typedef X509_STORE_CTX * native_handle_type;



[heading Requirements]

['Header: ][^asio/ssl/verify_context.hpp]

['Convenience header: ][^asio/ssl.hpp]


[endsect]



[section:verify_context ssl::verify_context::verify_context]

[indexterm2 asio.indexterm.ssl__verify_context.verify_context..verify_context..ssl::verify_context] 
Constructor. 


  verify_context(
      native_handle_type handle);



[endsect]



[endsect]


[section:ssl__verify_fail_if_no_peer_cert ssl::verify_fail_if_no_peer_cert]

[indexterm1 asio.indexterm.ssl__verify_fail_if_no_peer_cert..ssl::verify_fail_if_no_peer_cert] 
Fail verification if the peer has no certificate. Ignored unless [link asio.reference.ssl__verify_peer `ssl::verify_peer`]  is set. 


  const int verify_fail_if_no_peer_cert = implementation_defined;


[heading Requirements]

['Header: ][^asio/ssl/verify_mode.hpp]

['Convenience header: ][^asio/ssl.hpp]


[endsect]



[section:ssl__verify_mode ssl::verify_mode]

[indexterm1 asio.indexterm.ssl__verify_mode..ssl::verify_mode] 
Bitmask type for peer verification. 


  typedef int verify_mode;



Possible values are:


* [link asio.reference.ssl__verify_none `ssl::verify_none`]  

* [link asio.reference.ssl__verify_peer `ssl::verify_peer`]  

* [link asio.reference.ssl__verify_fail_if_no_peer_cert `ssl::verify_fail_if_no_peer_cert`]  

* [link asio.reference.ssl__verify_client_once `ssl::verify_client_once`]  



[heading Requirements]

['Header: ][^asio/ssl/verify_mode.hpp]

['Convenience header: ][^asio/ssl.hpp]


[endsect]



[section:ssl__verify_none ssl::verify_none]

[indexterm1 asio.indexterm.ssl__verify_none..ssl::verify_none] 
No verification. 


  const int verify_none = implementation_defined;


[heading Requirements]

['Header: ][^asio/ssl/verify_mode.hpp]

['Convenience header: ][^asio/ssl.hpp]


[endsect]



[section:ssl__verify_peer ssl::verify_peer]

[indexterm1 asio.indexterm.ssl__verify_peer..ssl::verify_peer] 
Verify the peer. 


  const int verify_peer = implementation_defined;


[heading Requirements]

['Header: ][^asio/ssl/verify_mode.hpp]

['Convenience header: ][^asio/ssl.hpp]


[endsect]



[section:static_thread_pool static_thread_pool]

[indexterm1 asio.indexterm.static_thread_pool..static_thread_pool] 

  typedef thread_pool static_thread_pool;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.thread_pool__basic_executor_type [*basic_executor_type]]]
    [Executor implementation type used to submit functions to a thread pool. ]
  
  ]

  [

    [[link asio.reference.thread_pool.executor_type [*executor_type]]]
    [Executor used to submit functions to a thread pool. ]
  
  ]

  [

    [[link asio.reference.thread_pool.fork_event [*fork_event]]]
    [Fork-related event notifications. ]
  
  ]

  [

    [[link asio.reference.thread_pool.scheduler_type [*scheduler_type]]]
    [Scheduler used to schedule receivers on a thread pool. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.thread_pool.attach [*attach]]]
    [Attaches the current thread to the pool. ]
  ]
  
  [
    [[link asio.reference.thread_pool.executor [*executor]]]
    [Obtains the executor associated with the pool. ]
  ]
  
  [
    [[link asio.reference.thread_pool.get_executor [*get_executor]]]
    [Obtains the executor associated with the pool. ]
  ]
  
  [
    [[link asio.reference.thread_pool.join [*join]]]
    [Joins the threads. ]
  ]
  
  [
    [[link asio.reference.thread_pool.notify_fork [*notify_fork]]]
    [Notify the execution_context of a fork-related event. ]
  ]
  
  [
    [[link asio.reference.thread_pool.scheduler [*scheduler]]]
    [Obtains the scheduler associated with the pool. ]
  ]
  
  [
    [[link asio.reference.thread_pool.stop [*stop]]]
    [Stops the threads. ]
  ]
  
  [
    [[link asio.reference.thread_pool.thread_pool [*thread_pool]] [constructor]]
    [Constructs a pool with an automatically determined number of threads. 
     [hr]
     Constructs a pool with a specified number of threads. ]
  ]
  
  [
    [[link asio.reference.thread_pool.wait [*wait]]]
    [Waits for threads to complete. ]
  ]
  
  [
    [[link asio.reference.thread_pool._thread_pool [*~thread_pool]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.thread_pool.destroy [*destroy]]]
    [Destroys all services in the context. ]
  ]
  
  [
    [[link asio.reference.thread_pool.shutdown [*shutdown]]]
    [Shuts down all services in the context. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.thread_pool.add_service [*add_service]]]
    [(Deprecated: Use make_service().) Add a service object to the execution_context. ]
  ]
  
  [
    [[link asio.reference.thread_pool.has_service [*has_service]]]
    [Determine if an execution_context contains a specified service type. ]
  ]
  
  [
    [[link asio.reference.thread_pool.make_service [*make_service]]]
    [Creates a service object and adds it to the execution_context. ]
  ]
  
  [
    [[link asio.reference.thread_pool.use_service [*use_service]]]
    [Obtain the service object corresponding to the given type. ]
  ]
  
]

The thread pool class is an execution context where functions are permitted to run on one of a fixed number of threads.


[heading Submitting tasks to the pool]
  


To submit functions to the thread pool, use the [link asio.reference.dispatch `dispatch`] , [link asio.reference.post `post`]  or [link asio.reference.defer `defer`]  free functions.

For example:



   void my_task()
   {
     ...
   }

   ...

   // Launch the pool with four threads.
   asio::thread_pool pool(4);

   // Submit a function to the pool.
   asio::post(pool, my_task);

   // Submit a lambda object to the pool.
   asio::post(pool,
       []()
       {
         ...
       });

   // Wait for all tasks in the pool to complete.
   pool.join(); 





[heading Requirements]

['Header: ][^asio/static_thread_pool.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:steady_timer steady_timer]

[indexterm1 asio.indexterm.steady_timer..steady_timer] 
Typedef for a timer based on the steady clock. 


  typedef basic_waitable_timer< chrono::steady_clock > steady_timer;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_waitable_timer__rebind_executor [*rebind_executor]]]
    [Rebinds the timer type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.clock_type [*clock_type]]]
    [The clock type. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.duration [*duration]]]
    [The duration type of the clock. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.time_point [*time_point]]]
    [The time point type of the clock. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.traits_type [*traits_type]]]
    [The wait traits type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_waitable_timer.async_wait [*async_wait]]]
    [Start an asynchronous wait on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.basic_waitable_timer [*basic_waitable_timer]] [constructor]]
    [Constructor. 
     [hr]
     Constructor to set a particular expiry time as an absolute time. 
     [hr]
     Constructor to set a particular expiry time relative to now. 
     [hr]
     Move-construct a basic_waitable_timer from another. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.cancel [*cancel]]]
    [Cancel any asynchronous operations that are waiting on the timer. 
     [hr]
     (Deprecated: Use non-error_code overload.) Cancel any asynchronous operations that are waiting on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.cancel_one [*cancel_one]]]
    [Cancels one asynchronous operation that is waiting on the timer. 
     [hr]
     (Deprecated: Use non-error_code overload.) Cancels one asynchronous operation that is waiting on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.expires_after [*expires_after]]]
    [Set the timer's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.expires_at [*expires_at]]]
    [(Deprecated: Use expiry().) Get the timer's expiry time as an absolute time. 
     [hr]
     Set the timer's expiry time as an absolute time. 
     [hr]
     (Deprecated: Use non-error_code overload.) Set the timer's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.expires_from_now [*expires_from_now]]]
    [(Deprecated: Use expiry().) Get the timer's expiry time relative to now. 
     [hr]
     (Deprecated: Use expires_after().) Set the timer's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.expiry [*expiry]]]
    [Get the timer's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.operator_eq_ [*operator=]]]
    [Move-assign a basic_waitable_timer from another. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.wait [*wait]]]
    [Perform a blocking wait on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer._basic_waitable_timer [*~basic_waitable_timer]] [destructor]]
    [Destroys the timer. ]
  ]
  
]

The [link asio.reference.basic_waitable_timer `basic_waitable_timer`] class template provides the ability to perform a blocking or asynchronous wait for a timer to expire.

A waitable timer is always in one of two states: "expired" or "not expired". If the `wait()` or `async_wait()` function is called on an expired timer, the wait operation will complete immediately.

Most applications will use one of the [link asio.reference.steady_timer `steady_timer`], [link asio.reference.system_timer `system_timer`] or [link asio.reference.high_resolution_timer `high_resolution_timer`] typedefs.


[heading Remarks]
      
This waitable timer functionality is for use with the C++11 standard library's `<chrono>` facility, or with the Boost.Chrono library.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.


[heading Examples]
  
Performing a blocking wait (C++11): 

   // Construct a timer without setting an expiry time.
   asio::steady_timer timer(my_context);

   // Set an expiry time relative to now.
   timer.expires_after(std::chrono::seconds(5));

   // Wait for the timer to expire.
   timer.wait();





Performing an asynchronous wait (C++11): 

   void handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Timer expired.
     }
   }

   ...

   // Construct a timer with an absolute expiry time.
   asio::steady_timer timer(my_context,
       std::chrono::steady_clock::now() + std::chrono::seconds(60));

   // Start an asynchronous wait.
   timer.async_wait(handler);





[heading Changing an active waitable timer's expiry time]
  


Changing the expiry time of a timer while there are pending asynchronous waits causes those wait operations to be cancelled. To ensure that the action associated with the timer is performed only once, use something like this: used:



   void on_some_event()
   {
     if (my_timer.expires_after(seconds(5)) > 0)
     {
       // We managed to cancel the timer. Start new asynchronous wait.
       my_timer.async_wait(on_timeout);
     }
     else
     {
       // Too late, timer has already expired!
     }
   }

   void on_timeout(const asio::error_code& e)
   {
     if (e != asio::error::operation_aborted)
     {
       // Timer was not cancelled, take necessary action.
     }
   }





* The `asio::basic_waitable_timer::expires_after()` function cancels any pending asynchronous waits, and returns the number of asynchronous waits that were cancelled. If it returns 0 then you were too late and the wait handler has already been executed, or will soon be executed. If it returns 1 then the wait handler was successfully cancelled.


* If a wait handler is cancelled, the [link asio.reference.error_code `error_code`] passed to it contains the value `asio::error::operation_aborted`. 




This typedef uses the C++11 `<chrono>` standard library facility, if available. Otherwise, it may use the Boost.Chrono library. To explicitly utilise Boost.Chrono, use the [link asio.reference.basic_waitable_timer `basic_waitable_timer`] template directly: 

   typedef basic_waitable_timer<boost::chrono::steady_clock> timer;




[heading Requirements]

['Header: ][^asio/steady_timer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:strand strand]


Provides serialised function invocation for any executor type. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``>
  class strand


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.strand.inner_executor_type [*inner_executor_type]]]
    [The type of the underlying executor. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.strand.defer [*defer]]]
    [Request the strand to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.strand.dispatch [*dispatch]]]
    [Request the strand to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.strand.execute [*execute]]]
    []
  ]
  
  [
    [[link asio.reference.strand.get_inner_executor [*get_inner_executor]]]
    [Obtain the underlying executor. ]
  ]
  
  [
    [[link asio.reference.strand.operator_eq_ [*operator=]]]
    [Assignment operator. 
     [hr]
     Converting assignment operator. 
     [hr]
     Move assignment operator. 
     [hr]
     Converting move assignment operator. ]
  ]
  
  [
    [[link asio.reference.strand.post [*post]]]
    [Request the strand to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.strand.prefer [*prefer]]]
    []
  ]
  
  [
    [[link asio.reference.strand.query [*query]]]
    [Forward a query to the underlying executor. ]
  ]
  
  [
    [[link asio.reference.strand.require [*require]]]
    []
  ]
  
  [
    [[link asio.reference.strand.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the strand is running in the current thread. ]
  ]
  
  [
    [[link asio.reference.strand.strand [*strand]] [constructor]]
    [Default constructor. 
     [hr]
     Construct a strand for the specified executor. 
     [hr]
     Copy constructor. 
     [hr]
     Converting constructor. 
     [hr]
     Move constructor. 
     [hr]
     Converting move constructor. ]
  ]
  
  [
    [[link asio.reference.strand._strand [*~strand]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.strand.operator_not__eq_ [*operator!=]]]
    [Compare two strands for inequality. ]
  ]
  
  [
    [[link asio.reference.strand.operator_eq__eq_ [*operator==]]]
    [Compare two strands for equality. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/strand.hpp]

['Convenience header: ][^asio.hpp]


[section:defer strand::defer]

[indexterm2 asio.indexterm.strand.defer..defer..strand] 
Request the strand to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void defer(
      Function && f,
      const Allocator & a) const;


This function is used to ask the executor to execute the given function object. The function object will never be executed inside this function. Instead, it will be scheduled by the underlying executor's defer function.


[heading Parameters]
    

[variablelist
  
[[f][The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:
``
   void function(); 
``
]]

[[a][An allocator that may be used by the executor to allocate the internal storage needed for function invocation. ]]

]




[endsect]



[section:dispatch strand::dispatch]

[indexterm2 asio.indexterm.strand.dispatch..dispatch..strand] 
Request the strand to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void dispatch(
      Function && f,
      const Allocator & a) const;


This function is used to ask the strand to execute the given function object on its underlying executor. The function object will be executed inside this function if the strand is not otherwise busy and if the underlying executor's `dispatch()` function is also able to execute the function before returning.


[heading Parameters]
    

[variablelist
  
[[f][The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:
``
   void function(); 
``
]]

[[a][An allocator that may be used by the executor to allocate the internal storage needed for function invocation. ]]

]




[endsect]



[section:execute strand::execute]

[indexterm2 asio.indexterm.strand.execute..execute..strand] 

  Function::value::type execute(
      Function && f) const;



[endsect]



[section:get_inner_executor strand::get_inner_executor]

[indexterm2 asio.indexterm.strand.get_inner_executor..get_inner_executor..strand] 
Obtain the underlying executor. 


  inner_executor_type get_inner_executor() const;



[endsect]



[section:inner_executor_type strand::inner_executor_type]

[indexterm2 asio.indexterm.strand.inner_executor_type..inner_executor_type..strand] 
The type of the underlying executor. 


  typedef Executor inner_executor_type;



[heading Requirements]

['Header: ][^asio/strand.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_not__eq_ strand::operator!=]

[indexterm2 asio.indexterm.strand.operator_not__eq_..operator!=..strand] 
Compare two strands for inequality. 


  friend bool operator!=(
      const strand & a,
      const strand & b);


Two strands are equal if they refer to the same ordered, non-concurrent state. 

[heading Requirements]

['Header: ][^asio/strand.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:operator_eq_ strand::operator=]

[indexterm2 asio.indexterm.strand.operator_eq_..operator=..strand] 
Assignment operator. 


  strand & ``[link asio.reference.strand.operator_eq_.overload1 operator=]``(
      const strand & other);
  ``  [''''&raquo;''' [link asio.reference.strand.operator_eq_.overload1 more...]]``


Converting assignment operator. 


  template<
      class ``[link asio.reference.Executor1 OtherExecutor]``>
  strand & ``[link asio.reference.strand.operator_eq_.overload2 operator=]``(
      const strand< OtherExecutor > & other);
  ``  [''''&raquo;''' [link asio.reference.strand.operator_eq_.overload2 more...]]``


Move assignment operator. 


  strand & ``[link asio.reference.strand.operator_eq_.overload3 operator=]``(
      strand && other);
  ``  [''''&raquo;''' [link asio.reference.strand.operator_eq_.overload3 more...]]``


Converting move assignment operator. 


  template<
      class ``[link asio.reference.Executor1 OtherExecutor]``>
  strand & ``[link asio.reference.strand.operator_eq_.overload4 operator=]``(
      strand< OtherExecutor > && other);
  ``  [''''&raquo;''' [link asio.reference.strand.operator_eq_.overload4 more...]]``


[section:overload1 strand::operator= (1 of 4 overloads)]


Assignment operator. 


  strand & operator=(
      const strand & other);



[endsect]



[section:overload2 strand::operator= (2 of 4 overloads)]


Converting assignment operator. 


  template<
      class ``[link asio.reference.Executor1 OtherExecutor]``>
  strand & operator=(
      const strand< OtherExecutor > & other);


This assignment operator is only valid if the `OtherExecutor` type is convertible to `Executor`. 


[endsect]



[section:overload3 strand::operator= (3 of 4 overloads)]


Move assignment operator. 


  strand & operator=(
      strand && other);



[endsect]



[section:overload4 strand::operator= (4 of 4 overloads)]


Converting move assignment operator. 


  template<
      class ``[link asio.reference.Executor1 OtherExecutor]``>
  strand & operator=(
      strand< OtherExecutor > && other);


This assignment operator is only valid if the `OtherExecutor` type is convertible to `Executor`. 


[endsect]


[endsect]


[section:operator_eq__eq_ strand::operator==]

[indexterm2 asio.indexterm.strand.operator_eq__eq_..operator==..strand] 
Compare two strands for equality. 


  friend bool operator==(
      const strand & a,
      const strand & b);


Two strands are equal if they refer to the same ordered, non-concurrent state. 

[heading Requirements]

['Header: ][^asio/strand.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:post strand::post]

[indexterm2 asio.indexterm.strand.post..post..strand] 
Request the strand to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void post(
      Function && f,
      const Allocator & a) const;


This function is used to ask the executor to execute the given function object. The function object will never be executed inside this function. Instead, it will be scheduled by the underlying executor's defer function.


[heading Parameters]
    

[variablelist
  
[[f][The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:
``
   void function(); 
``
]]

[[a][An allocator that may be used by the executor to allocate the internal storage needed for function invocation. ]]

]




[endsect]



[section:prefer strand::prefer]

[indexterm2 asio.indexterm.strand.prefer..prefer..strand] 

  Property strand< typename decay< typename prefer_result< const Executor &, Property >::type >::type >::type prefer(
      const Property & p) const;



[endsect]



[section:query strand::query]

[indexterm2 asio.indexterm.strand.query..query..strand] 
Forward a query to the underlying executor. 


  template<
      typename Property>
  enable_if< can_query< const Executor &, Property >::value, typename query_result< const Executor &, Property >::type >::type query(
      const Property & p) const;


Do not call this function directly. It is intended for use with the [link asio.reference.execution__execute `execution::execute`] customisation point.

For example: 

   asio::strand<my_executor_type> ex = ...;
   if (asio::query(ex, asio::execution::blocking)
         == asio::execution::blocking.never)
     ... 





[endsect]



[section:require strand::require]

[indexterm2 asio.indexterm.strand.require..require..strand] 

  Property strand< typename decay< typename require_result< const Executor &, Property >::type >::type >::type require(
      const Property & p) const;



[endsect]



[section:running_in_this_thread strand::running_in_this_thread]

[indexterm2 asio.indexterm.strand.running_in_this_thread..running_in_this_thread..strand] 
Determine whether the strand is running in the current thread. 


  bool running_in_this_thread() const;



[heading Return Value]
      
`true` if the current thread is executing a function that was submitted to the strand using `post()`, `dispatch()` or `defer()`. Otherwise returns `false`. 




[endsect]


[section:strand strand::strand]

[indexterm2 asio.indexterm.strand.strand..strand..strand] 
Default constructor. 


  ``[link asio.reference.strand.strand.overload1 strand]``();
  ``  [''''&raquo;''' [link asio.reference.strand.strand.overload1 more...]]``


Construct a strand for the specified executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  explicit ``[link asio.reference.strand.strand.overload2 strand]``(
      const Executor1 & e,
      typename enable_if< conditional< !is_same< Executor1, strand >::value, is_convertible< Executor1, Executor >, false_type >::type::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.strand.strand.overload2 more...]]``


Copy constructor. 


  ``[link asio.reference.strand.strand.overload3 strand]``(
      const strand & other);
  ``  [''''&raquo;''' [link asio.reference.strand.strand.overload3 more...]]``


Converting constructor. 


  template<
      class ``[link asio.reference.Executor1 OtherExecutor]``>
  ``[link asio.reference.strand.strand.overload4 strand]``(
      const strand< OtherExecutor > & other);
  ``  [''''&raquo;''' [link asio.reference.strand.strand.overload4 more...]]``


Move constructor. 


  ``[link asio.reference.strand.strand.overload5 strand]``(
      strand && other);
  ``  [''''&raquo;''' [link asio.reference.strand.strand.overload5 more...]]``


Converting move constructor. 


  template<
      class ``[link asio.reference.Executor1 OtherExecutor]``>
  ``[link asio.reference.strand.strand.overload6 strand]``(
      strand< OtherExecutor > && other);
  ``  [''''&raquo;''' [link asio.reference.strand.strand.overload6 more...]]``


[section:overload1 strand::strand (1 of 6 overloads)]


Default constructor. 


  strand();


This constructor is only valid if the underlying executor type is default constructible. 


[endsect]



[section:overload2 strand::strand (2 of 6 overloads)]


Construct a strand for the specified executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  strand(
      const Executor1 & e,
      typename enable_if< conditional< !is_same< Executor1, strand >::value, is_convertible< Executor1, Executor >, false_type >::type::value >::type *  = 0);



[endsect]



[section:overload3 strand::strand (3 of 6 overloads)]


Copy constructor. 


  strand(
      const strand & other);



[endsect]



[section:overload4 strand::strand (4 of 6 overloads)]


Converting constructor. 


  template<
      class ``[link asio.reference.Executor1 OtherExecutor]``>
  strand(
      const strand< OtherExecutor > & other);


This constructor is only valid if the `OtherExecutor` type is convertible to `Executor`. 


[endsect]



[section:overload5 strand::strand (5 of 6 overloads)]


Move constructor. 


  strand(
      strand && other);



[endsect]



[section:overload6 strand::strand (6 of 6 overloads)]


Converting move constructor. 


  template<
      class ``[link asio.reference.Executor1 OtherExecutor]``>
  strand(
      strand< OtherExecutor > && other);


This constructor is only valid if the `OtherExecutor` type is convertible to `Executor`. 


[endsect]


[endsect]


[section:_strand strand::~strand]

[indexterm2 asio.indexterm.strand._strand..~strand..strand] 
Destructor. 


  ~strand();



[endsect]



[endsect]


[section:streambuf streambuf]

[indexterm1 asio.indexterm.streambuf..streambuf] 
Typedef for the typical usage of [link asio.reference.basic_streambuf `basic_streambuf`]. 


  typedef basic_streambuf streambuf;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_streambuf.const_buffers_type [*const_buffers_type]]]
    [The type used to represent the input sequence as a list of buffers. ]
  
  ]

  [

    [[link asio.reference.basic_streambuf.mutable_buffers_type [*mutable_buffers_type]]]
    [The type used to represent the output sequence as a list of buffers. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_streambuf.basic_streambuf [*basic_streambuf]] [constructor]]
    [Construct a basic_streambuf object. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.capacity [*capacity]]]
    [Get the current capacity of the basic_streambuf. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.commit [*commit]]]
    [Move characters from the output sequence to the input sequence. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.consume [*consume]]]
    [Remove characters from the input sequence. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.data [*data]]]
    [Get a list of buffers that represents the input sequence. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.max_size [*max_size]]]
    [Get the maximum size of the basic_streambuf. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.prepare [*prepare]]]
    [Get a list of buffers that represents the output sequence, with the given size. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.size [*size]]]
    [Get the size of the input sequence. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_streambuf.overflow [*overflow]]]
    [Override std::streambuf behaviour. ]
  ]
  
  [
    [[link asio.reference.basic_streambuf.reserve [*reserve]]]
    []
  ]
  
  [
    [[link asio.reference.basic_streambuf.underflow [*underflow]]]
    [Override std::streambuf behaviour. ]
  ]
  
]

The `basic_streambuf` class is derived from `std::streambuf` to associate the streambuf's input and output sequences with one or more character arrays. These character arrays are internal to the `basic_streambuf` object, but direct access to the array elements is provided to permit them to be used efficiently with I/O operations. Characters written to the output sequence of a `basic_streambuf` object are appended to the input sequence of the same object.

The `basic_streambuf` class's public interface is intended to permit the following implementation strategies:


* A single contiguous character array, which is reallocated as necessary to accommodate changes in the size of the character sequence. This is the implementation approach currently used in Asio.


* A sequence of one or more character arrays, where each array is of the same size. Additional character array objects are appended to the sequence to accommodate changes in the size of the character sequence.


* A sequence of one or more character arrays of varying sizes. Additional character array objects are appended to the sequence to accommodate changes in the size of the character sequence.

The constructor for [link asio.reference.basic_streambuf `basic_streambuf`] accepts a `size_t` argument specifying the maximum of the sum of the sizes of the input sequence and output sequence. During the lifetime of the `basic_streambuf` object, the following invariant holds: 

   size() <= max_size()


Any member function that would, if successful, cause the invariant to be violated shall throw an exception of class `std::length_error`.

The constructor for `basic_streambuf` takes an Allocator argument. A copy of this argument is used for any memory allocation performed, by the constructor and by all member functions, during the lifetime of each `basic_streambuf` object.


[heading Examples]
  
Writing directly from an streambuf to a socket: 

   asio::streambuf b;
   std::ostream os(&b);
   os << "Hello, World!\n";

   // try sending some data in input sequence
   size_t n = sock.send(b.data());

   b.consume(n); // sent data is removed from input sequence




Reading from a socket directly into a streambuf: 

   asio::streambuf b;

   // reserve 512 bytes in output sequence
   asio::streambuf::mutable_buffers_type bufs = b.prepare(512);

   size_t n = sock.receive(bufs);

   // received data is "committed" from output sequence to input sequence
   b.commit(n);

   std::istream is(&b);
   std::string s;
   is >> s;





[heading Requirements]

['Header: ][^asio/streambuf.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:system_category system_category]

[indexterm1 asio.indexterm.system_category..system_category] 
Returns the error category used for the system errors produced by asio. 


  const error_category & system_category();


[heading Requirements]

['Header: ][^asio/error_code.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:system_context system_context]


The executor context for the system executor. 


  class system_context :
    public execution_context


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.system_context.executor_type [*executor_type]]]
    [The executor type associated with the context. ]
  
  ]

  [

    [[link asio.reference.system_context.fork_event [*fork_event]]]
    [Fork-related event notifications. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.system_context.get_executor [*get_executor]]]
    [Obtain an executor for the context. ]
  ]
  
  [
    [[link asio.reference.system_context.join [*join]]]
    [Join all threads in the system thread pool. ]
  ]
  
  [
    [[link asio.reference.system_context.notify_fork [*notify_fork]]]
    [Notify the execution_context of a fork-related event. ]
  ]
  
  [
    [[link asio.reference.system_context.stop [*stop]]]
    [Signal all threads in the system thread pool to stop. ]
  ]
  
  [
    [[link asio.reference.system_context.stopped [*stopped]]]
    [Determine whether the system thread pool has been stopped. ]
  ]
  
  [
    [[link asio.reference.system_context._system_context [*~system_context]] [destructor]]
    [Destructor shuts down all threads in the system thread pool. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.system_context.destroy [*destroy]]]
    [Destroys all services in the context. ]
  ]
  
  [
    [[link asio.reference.system_context.shutdown [*shutdown]]]
    [Shuts down all services in the context. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.system_context.add_service [*add_service]]]
    [(Deprecated: Use make_service().) Add a service object to the execution_context. ]
  ]
  
  [
    [[link asio.reference.system_context.has_service [*has_service]]]
    [Determine if an execution_context contains a specified service type. ]
  ]
  
  [
    [[link asio.reference.system_context.make_service [*make_service]]]
    [Creates a service object and adds it to the execution_context. ]
  ]
  
  [
    [[link asio.reference.system_context.use_service [*use_service]]]
    [Obtain the service object corresponding to the given type. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/system_context.hpp]

['Convenience header: ][^asio.hpp]


[section:add_service system_context::add_service]


['Inherited from execution_context.]

[indexterm2 asio.indexterm.system_context.add_service..add_service..system_context] 
(Deprecated: Use `make_service()`.) Add a service object to the [link asio.reference.execution_context `execution_context`]. 


  template<
      typename ``[link asio.reference.Service Service]``>
  friend void add_service(
      execution_context & e,
      Service * svc);


This function is used to add a service to the [link asio.reference.execution_context `execution_context`].


[heading Parameters]
    

[variablelist
  
[[e][The [link asio.reference.execution_context `execution_context`] object that owns the service.]]

[[svc][The service object. On success, ownership of the service object is transferred to the [link asio.reference.execution_context `execution_context`]. When the [link asio.reference.execution_context `execution_context`] object is destroyed, it will destroy the service object by performing:
``
   delete static_cast<execution_context::service*>(svc) 
``
]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::service_already_exists][Thrown if a service of the given type is already present in the [link asio.reference.execution_context `execution_context`].]]

[[asio::invalid_service_owner][Thrown if the service's owning [link asio.reference.execution_context `execution_context`] is not the [link asio.reference.execution_context `execution_context`] object specified by the `e` parameter. ]]

]



[heading Requirements]

['Header: ][^asio/system_context.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:destroy system_context::destroy]


['Inherited from execution_context.]

[indexterm2 asio.indexterm.system_context.destroy..destroy..system_context] 
Destroys all services in the context. 


  void destroy();


This function is implemented as follows:


* For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, in reverse order * of the beginning of service object lifetime, performs `delete static_cast<execution_context::service*>(svc)`. 




[endsect]



[section:executor_type system_context::executor_type]

[indexterm2 asio.indexterm.system_context.executor_type..executor_type..system_context] 
The executor type associated with the context. 


  typedef basic_system_executor< execution::blocking_t::possibly_t, execution::relationship_t::fork_t, std::allocator< void > > executor_type;


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_system_executor.basic_system_executor [*basic_system_executor]] [constructor]]
    [Default constructor. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.defer [*defer]]]
    [Request the system executor to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.dispatch [*dispatch]]]
    [Request the system executor to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.execute [*execute]]]
    [Execution function. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.on_work_finished [*on_work_finished]]]
    [Inform the executor that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.on_work_started [*on_work_started]]]
    [Inform the executor that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.post [*post]]]
    [Request the system executor to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.query [*query]]]
    [Query the current value of the allocator property. 
     [hr]
     Query the occupancy (recommended number of work items) for the system context. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.query__static [*query]] [static]]
    [Query the current value of the mapping property. 
     [hr]
     Query the current value of the context property. 
     [hr]
     Query the current value of the blocking property. 
     [hr]
     Query the current value of the relationship property. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.require [*require]]]
    [Obtain an executor with the blocking.possibly property. 
     [hr]
     Obtain an executor with the blocking.always property. 
     [hr]
     Obtain an executor with the blocking.never property. 
     [hr]
     Obtain an executor with the relationship.continuation property. 
     [hr]
     Obtain an executor with the relationship.fork property. 
     [hr]
     Obtain an executor with the specified allocator property. 
     [hr]
     Obtain an executor with the default allocator property. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_system_executor.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]

The system executor represents an execution context where functions are permitted to run on arbitrary threads. When the blocking.never property is established, the system executor will schedule the function to run on an unspecified system thread pool. When either blocking.possibly or blocking.always is established, the executor invokes the function immediately. 


[heading Requirements]

['Header: ][^asio/system_context.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:fork_event system_context::fork_event]


['Inherited from execution_context.]

[indexterm2 asio.indexterm.system_context.fork_event..fork_event..system_context] 
Fork-related event notifications. 


  enum fork_event

[indexterm2 asio.indexterm.system_context.fork_event.fork_prepare..fork_prepare..system_context]
[indexterm2 asio.indexterm.system_context.fork_event.fork_parent..fork_parent..system_context]
[indexterm2 asio.indexterm.system_context.fork_event.fork_child..fork_child..system_context]

[heading Values]
[variablelist

  [
    [fork_prepare]
    [Notify the context that the process is about to fork. ]
  ]

  [
    [fork_parent]
    [Notify the context that the process has forked and is the parent. ]
  ]

  [
    [fork_child]
    [Notify the context that the process has forked and is the child. ]
  ]

]



[endsect]



[section:get_executor system_context::get_executor]

[indexterm2 asio.indexterm.system_context.get_executor..get_executor..system_context] 
Obtain an executor for the context. 


  executor_type get_executor();



[endsect]



[section:has_service system_context::has_service]


['Inherited from execution_context.]

[indexterm2 asio.indexterm.system_context.has_service..has_service..system_context] 
Determine if an [link asio.reference.execution_context `execution_context`] contains a specified service type. 


  template<
      typename ``[link asio.reference.Service Service]``>
  friend bool has_service(
      execution_context & e);


This function is used to determine whether the [link asio.reference.execution_context `execution_context`] contains a service object corresponding to the given service type.


[heading Parameters]
    

[variablelist
  
[[e][The [link asio.reference.execution_context `execution_context`] object that owns the service.]]

]


[heading Return Value]
      
A boolean indicating whether the [link asio.reference.execution_context `execution_context`] contains the service. 



[heading Requirements]

['Header: ][^asio/system_context.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:join system_context::join]

[indexterm2 asio.indexterm.system_context.join..join..system_context] 
Join all threads in the system thread pool. 


  void join();



[endsect]



[section:make_service system_context::make_service]


['Inherited from execution_context.]

[indexterm2 asio.indexterm.system_context.make_service..make_service..system_context] 
Creates a service object and adds it to the [link asio.reference.execution_context `execution_context`]. 


  template<
      typename ``[link asio.reference.Service Service]``,
      typename... Args>
  friend Service & make_service(
      execution_context & e,
      Args &&... args);


This function is used to add a service to the [link asio.reference.execution_context `execution_context`].


[heading Parameters]
    

[variablelist
  
[[e][The [link asio.reference.execution_context `execution_context`] object that owns the service.]]

[[args][Zero or more arguments to be passed to the service constructor.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::service_already_exists][Thrown if a service of the given type is already present in the [link asio.reference.execution_context `execution_context`]. ]]

]



[heading Requirements]

['Header: ][^asio/system_context.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:notify_fork system_context::notify_fork]


['Inherited from execution_context.]

[indexterm2 asio.indexterm.system_context.notify_fork..notify_fork..system_context] 
Notify the [link asio.reference.execution_context `execution_context`] of a fork-related event. 


  void notify_fork(
      fork_event event);


This function is used to inform the [link asio.reference.execution_context `execution_context`] that the process is about to fork, or has just forked. This allows the [link asio.reference.execution_context `execution_context`], and the services it contains, to perform any necessary housekeeping to ensure correct operation following a fork.

This function must not be called while any other [link asio.reference.execution_context `execution_context`] function, or any function associated with the execution\_context's derived class, is being called in another thread. It is, however, safe to call this function from within a completion handler, provided no other thread is accessing the [link asio.reference.execution_context `execution_context`] or its derived class.


[heading Parameters]
    

[variablelist
  
[[event][A fork-related event.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. If the notification fails the [link asio.reference.execution_context `execution_context`] object should no longer be used and should be destroyed.]]

]


[heading Example]
  
The following code illustrates how to incorporate the `notify_fork()` function: 

   my_execution_context.notify_fork(execution_context::fork_prepare);
   if (fork() == 0)
   {
     // This is the child process.
     my_execution_context.notify_fork(execution_context::fork_child);
   }
   else
   {
     // This is the parent process.
     my_execution_context.notify_fork(execution_context::fork_parent);
   } 





[heading Remarks]
      
For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, performs `svc->notify_fork();`. When processing the fork\_prepare event, services are visited in reverse order of the beginning of service object lifetime. Otherwise, services are visited in order of the beginning of service object lifetime. 




[endsect]



[section:shutdown system_context::shutdown]


['Inherited from execution_context.]

[indexterm2 asio.indexterm.system_context.shutdown..shutdown..system_context] 
Shuts down all services in the context. 


  void shutdown();


This function is implemented as follows:


* For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, in reverse order of the beginning of service object lifetime, performs `svc->shutdown()`. 




[endsect]



[section:stop system_context::stop]

[indexterm2 asio.indexterm.system_context.stop..stop..system_context] 
Signal all threads in the system thread pool to stop. 


  void stop();



[endsect]



[section:stopped system_context::stopped]

[indexterm2 asio.indexterm.system_context.stopped..stopped..system_context] 
Determine whether the system thread pool has been stopped. 


  bool stopped() const;



[endsect]


[section:use_service system_context::use_service]

[indexterm2 asio.indexterm.system_context.use_service..use_service..system_context] 
Obtain the service object corresponding to the given type. 


  template<
      typename ``[link asio.reference.Service Service]``>
  friend Service & ``[link asio.reference.system_context.use_service.overload1 use_service]``(
      execution_context & e);
  ``  [''''&raquo;''' [link asio.reference.system_context.use_service.overload1 more...]]``

  template<
      typename ``[link asio.reference.Service Service]``>
  friend Service & ``[link asio.reference.system_context.use_service.overload2 use_service]``(
      io_context & ioc);
  ``  [''''&raquo;''' [link asio.reference.system_context.use_service.overload2 more...]]``


[section:overload1 system_context::use_service (1 of 2 overloads)]


['Inherited from execution_context.]


Obtain the service object corresponding to the given type. 


  template<
      typename ``[link asio.reference.Service Service]``>
  friend Service & use_service(
      execution_context & e);


This function is used to locate a service object that corresponds to the given service type. If there is no existing implementation of the service, then the [link asio.reference.execution_context `execution_context`] will create a new instance of the service.


[heading Parameters]
    

[variablelist
  
[[e][The [link asio.reference.execution_context `execution_context`] object that owns the service.]]

]


[heading Return Value]
      
The service interface implementing the specified service type. Ownership of the service interface is not transferred to the caller. 



[heading Requirements]

['Header: ][^asio/system_context.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:overload2 system_context::use_service (2 of 2 overloads)]


['Inherited from execution_context.]


Obtain the service object corresponding to the given type. 


  template<
      typename ``[link asio.reference.Service Service]``>
  friend Service & use_service(
      io_context & ioc);


This function is used to locate a service object that corresponds to the given service type. If there is no existing implementation of the service, then the [link asio.reference.io_context `io_context`] will create a new instance of the service.


[heading Parameters]
    

[variablelist
  
[[ioc][The [link asio.reference.io_context `io_context`] object that owns the service.]]

]


[heading Return Value]
      
The service interface implementing the specified service type. Ownership of the service interface is not transferred to the caller.


[heading Remarks]
      
This overload is preserved for backwards compatibility with services that inherit from [link asio.reference.io_context__service `io_context::service`]. 



[heading Requirements]

['Header: ][^asio/system_context.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[endsect]


[section:_system_context system_context::~system_context]

[indexterm2 asio.indexterm.system_context._system_context..~system_context..system_context] 
Destructor shuts down all threads in the system thread pool. 


  ~system_context();



[endsect]



[endsect]

[section:system_error system_error]


The [link asio.reference.system_error `system_error`] class is used to represent system conditions that prevent the library from operating correctly. 


  class system_error :
    public std::exception


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.system_error.code [*code]]]
    [Get the error code associated with the exception. ]
  ]
  
  [
    [[link asio.reference.system_error.operator_eq_ [*operator=]]]
    [Assignment operator. ]
  ]
  
  [
    [[link asio.reference.system_error.system_error [*system_error]] [constructor]]
    [Construct with an error code. 
     [hr]
     Construct with an error code and context. 
     [hr]
     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.system_error.what [*what]]]
    [Get a string representation of the exception. ]
  ]
  
  [
    [[link asio.reference.system_error._system_error [*~system_error]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/system_error.hpp]

['Convenience header: ][^asio.hpp]


[section:code system_error::code]

[indexterm2 asio.indexterm.system_error.code..code..system_error] 
Get the error code associated with the exception. 


  error_code code() const;



[endsect]



[section:operator_eq_ system_error::operator=]

[indexterm2 asio.indexterm.system_error.operator_eq_..operator=..system_error] 
Assignment operator. 


  system_error & operator=(
      const system_error & e);



[endsect]


[section:system_error system_error::system_error]

[indexterm2 asio.indexterm.system_error.system_error..system_error..system_error] 
Construct with an error code. 


  ``[link asio.reference.system_error.system_error.overload1 system_error]``(
      const error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.system_error.system_error.overload1 more...]]``


Construct with an error code and context. 


  ``[link asio.reference.system_error.system_error.overload2 system_error]``(
      const error_code & ec,
      const std::string & context);
  ``  [''''&raquo;''' [link asio.reference.system_error.system_error.overload2 more...]]``


Copy constructor. 


  ``[link asio.reference.system_error.system_error.overload3 system_error]``(
      const system_error & other);
  ``  [''''&raquo;''' [link asio.reference.system_error.system_error.overload3 more...]]``


[section:overload1 system_error::system_error (1 of 3 overloads)]


Construct with an error code. 


  system_error(
      const error_code & ec);



[endsect]



[section:overload2 system_error::system_error (2 of 3 overloads)]


Construct with an error code and context. 


  system_error(
      const error_code & ec,
      const std::string & context);



[endsect]



[section:overload3 system_error::system_error (3 of 3 overloads)]


Copy constructor. 


  system_error(
      const system_error & other);



[endsect]


[endsect]


[section:what system_error::what]

[indexterm2 asio.indexterm.system_error.what..what..system_error] 
Get a string representation of the exception. 


  virtual const char * what() const;



[endsect]



[section:_system_error system_error::~system_error]

[indexterm2 asio.indexterm.system_error._system_error..~system_error..system_error] 
Destructor. 


  virtual ~system_error();



[endsect]



[endsect]


[section:system_executor system_executor]

[indexterm1 asio.indexterm.system_executor..system_executor] 
An executor that uses arbitrary threads. 


  typedef basic_system_executor< execution::blocking_t::possibly_t, execution::relationship_t::fork_t, std::allocator< void > > system_executor;


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_system_executor.basic_system_executor [*basic_system_executor]] [constructor]]
    [Default constructor. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.defer [*defer]]]
    [Request the system executor to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.dispatch [*dispatch]]]
    [Request the system executor to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.execute [*execute]]]
    [Execution function. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.on_work_finished [*on_work_finished]]]
    [Inform the executor that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.on_work_started [*on_work_started]]]
    [Inform the executor that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.post [*post]]]
    [Request the system executor to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.query [*query]]]
    [Query the current value of the allocator property. 
     [hr]
     Query the occupancy (recommended number of work items) for the system context. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.query__static [*query]] [static]]
    [Query the current value of the mapping property. 
     [hr]
     Query the current value of the context property. 
     [hr]
     Query the current value of the blocking property. 
     [hr]
     Query the current value of the relationship property. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.require [*require]]]
    [Obtain an executor with the blocking.possibly property. 
     [hr]
     Obtain an executor with the blocking.always property. 
     [hr]
     Obtain an executor with the blocking.never property. 
     [hr]
     Obtain an executor with the relationship.continuation property. 
     [hr]
     Obtain an executor with the relationship.fork property. 
     [hr]
     Obtain an executor with the specified allocator property. 
     [hr]
     Obtain an executor with the default allocator property. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_system_executor.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.basic_system_executor.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]

The system executor represents an execution context where functions are permitted to run on arbitrary threads. When the blocking.never property is established, the system executor will schedule the function to run on an unspecified system thread pool. When either blocking.possibly or blocking.always is established, the executor invokes the function immediately. 


The system executor represents an execution context where functions are permitted to run on arbitrary threads. When the blocking.never property is established, the system executor will schedule the function to run on an unspecified system thread pool. When either blocking.possibly or blocking.always is established, the executor invokes the function immediately. 

[heading Requirements]

['Header: ][^asio/system_executor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:system_timer system_timer]

[indexterm1 asio.indexterm.system_timer..system_timer] 
Typedef for a timer based on the system clock. 


  typedef basic_waitable_timer< chrono::system_clock > system_timer;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_waitable_timer__rebind_executor [*rebind_executor]]]
    [Rebinds the timer type to another executor. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.clock_type [*clock_type]]]
    [The clock type. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.duration [*duration]]]
    [The duration type of the clock. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.time_point [*time_point]]]
    [The time point type of the clock. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.traits_type [*traits_type]]]
    [The wait traits type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_waitable_timer.async_wait [*async_wait]]]
    [Start an asynchronous wait on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.basic_waitable_timer [*basic_waitable_timer]] [constructor]]
    [Constructor. 
     [hr]
     Constructor to set a particular expiry time as an absolute time. 
     [hr]
     Constructor to set a particular expiry time relative to now. 
     [hr]
     Move-construct a basic_waitable_timer from another. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.cancel [*cancel]]]
    [Cancel any asynchronous operations that are waiting on the timer. 
     [hr]
     (Deprecated: Use non-error_code overload.) Cancel any asynchronous operations that are waiting on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.cancel_one [*cancel_one]]]
    [Cancels one asynchronous operation that is waiting on the timer. 
     [hr]
     (Deprecated: Use non-error_code overload.) Cancels one asynchronous operation that is waiting on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.expires_after [*expires_after]]]
    [Set the timer's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.expires_at [*expires_at]]]
    [(Deprecated: Use expiry().) Get the timer's expiry time as an absolute time. 
     [hr]
     Set the timer's expiry time as an absolute time. 
     [hr]
     (Deprecated: Use non-error_code overload.) Set the timer's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.expires_from_now [*expires_from_now]]]
    [(Deprecated: Use expiry().) Get the timer's expiry time relative to now. 
     [hr]
     (Deprecated: Use expires_after().) Set the timer's expiry time relative to now. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.expiry [*expiry]]]
    [Get the timer's expiry time as an absolute time. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.operator_eq_ [*operator=]]]
    [Move-assign a basic_waitable_timer from another. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.wait [*wait]]]
    [Perform a blocking wait on the timer. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer._basic_waitable_timer [*~basic_waitable_timer]] [destructor]]
    [Destroys the timer. ]
  ]
  
]

The [link asio.reference.basic_waitable_timer `basic_waitable_timer`] class template provides the ability to perform a blocking or asynchronous wait for a timer to expire.

A waitable timer is always in one of two states: "expired" or "not expired". If the `wait()` or `async_wait()` function is called on an expired timer, the wait operation will complete immediately.

Most applications will use one of the [link asio.reference.steady_timer `steady_timer`], [link asio.reference.system_timer `system_timer`] or [link asio.reference.high_resolution_timer `high_resolution_timer`] typedefs.


[heading Remarks]
      
This waitable timer functionality is for use with the C++11 standard library's `<chrono>` facility, or with the Boost.Chrono library.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.


[heading Examples]
  
Performing a blocking wait (C++11): 

   // Construct a timer without setting an expiry time.
   asio::steady_timer timer(my_context);

   // Set an expiry time relative to now.
   timer.expires_after(std::chrono::seconds(5));

   // Wait for the timer to expire.
   timer.wait();





Performing an asynchronous wait (C++11): 

   void handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Timer expired.
     }
   }

   ...

   // Construct a timer with an absolute expiry time.
   asio::steady_timer timer(my_context,
       std::chrono::steady_clock::now() + std::chrono::seconds(60));

   // Start an asynchronous wait.
   timer.async_wait(handler);





[heading Changing an active waitable timer's expiry time]
  


Changing the expiry time of a timer while there are pending asynchronous waits causes those wait operations to be cancelled. To ensure that the action associated with the timer is performed only once, use something like this: used:



   void on_some_event()
   {
     if (my_timer.expires_after(seconds(5)) > 0)
     {
       // We managed to cancel the timer. Start new asynchronous wait.
       my_timer.async_wait(on_timeout);
     }
     else
     {
       // Too late, timer has already expired!
     }
   }

   void on_timeout(const asio::error_code& e)
   {
     if (e != asio::error::operation_aborted)
     {
       // Timer was not cancelled, take necessary action.
     }
   }





* The `asio::basic_waitable_timer::expires_after()` function cancels any pending asynchronous waits, and returns the number of asynchronous waits that were cancelled. If it returns 0 then you were too late and the wait handler has already been executed, or will soon be executed. If it returns 1 then the wait handler was successfully cancelled.


* If a wait handler is cancelled, the [link asio.reference.error_code `error_code`] passed to it contains the value `asio::error::operation_aborted`. 




This typedef uses the C++11 `<chrono>` standard library facility, if available. Otherwise, it may use the Boost.Chrono library. To explicitly utilise Boost.Chrono, use the [link asio.reference.basic_waitable_timer `basic_waitable_timer`] template directly: 

   typedef basic_waitable_timer<boost::chrono::system_clock> timer;




[heading Requirements]

['Header: ][^asio/system_timer.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:this_coro__executor this_coro::executor]

[indexterm1 asio.indexterm.this_coro__executor..this_coro::executor] 
Awaitable object that returns the executor of the current coroutine. 


  constexpr executor_t executor;


[heading Requirements]

['Header: ][^asio/this_coro.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:this_coro__executor_t this_coro::executor_t]


Awaitable type that returns the executor of the current coroutine. 


  struct executor_t


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.this_coro__executor_t.executor_t [*executor_t]] [constructor]]
    []
  ]
  
]

[heading Requirements]

['Header: ][^asio/this_coro.hpp]

['Convenience header: ][^asio.hpp]


[section:executor_t this_coro::executor_t::executor_t]

[indexterm2 asio.indexterm.this_coro__executor_t.executor_t..executor_t..this_coro::executor_t] 

  constexpr executor_t();



[endsect]



[endsect]

[section:thread thread]


A simple abstraction for starting threads. 


  class thread :
    noncopyable


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.thread.join [*join]]]
    [Wait for the thread to exit. ]
  ]
  
  [
    [[link asio.reference.thread.thread [*thread]] [constructor]]
    [Start a new thread that executes the supplied function. ]
  ]
  
  [
    [[link asio.reference.thread._thread [*~thread]] [destructor]]
    [Destructor. ]
  ]
  
]

The [link asio.reference.thread `thread`] class implements the smallest possible subset of the functionality of boost::thread. It is intended to be used only for starting a thread and waiting for it to exit. If more extensive threading capabilities are required, you are strongly advised to use something else.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.


[heading Example]
  
A typical use of [link asio.reference.thread `thread`] would be to launch a thread to run an io\_context's event processing loop:




   asio::io_context io_context;
   // ...
   asio::thread t(boost::bind(&asio::io_context::run, &io_context));
   // ...
   t.join(); 






[heading Requirements]

['Header: ][^asio/thread.hpp]

['Convenience header: ][^asio.hpp]


[section:join thread::join]

[indexterm2 asio.indexterm.thread.join..join..thread] 
Wait for the thread to exit. 


  void join();


This function will block until the thread has exited.

If this function is not called before the thread object is destroyed, the thread itself will continue to run until completion. You will, however, no longer have the ability to wait for it to exit. 


[endsect]



[section:thread thread::thread]

[indexterm2 asio.indexterm.thread.thread..thread..thread] 
Start a new thread that executes the supplied function. 


  template<
      typename Function>
  thread(
      Function f);


This constructor creates a new thread that will execute the given function or function object.


[heading Parameters]
    

[variablelist
  
[[f][The function or function object to be run in the thread. The function signature must be:
``
   void f(); 
``
]]

]




[endsect]



[section:_thread thread::~thread]

[indexterm2 asio.indexterm.thread._thread..~thread..thread] 
Destructor. 


  ~thread();



[endsect]



[endsect]

[section:thread_pool thread_pool]


A simple fixed-size thread pool. 


  class thread_pool :
    public execution_context


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.thread_pool__basic_executor_type [*basic_executor_type]]]
    [Executor implementation type used to submit functions to a thread pool. ]
  
  ]

  [

    [[link asio.reference.thread_pool.executor_type [*executor_type]]]
    [Executor used to submit functions to a thread pool. ]
  
  ]

  [

    [[link asio.reference.thread_pool.fork_event [*fork_event]]]
    [Fork-related event notifications. ]
  
  ]

  [

    [[link asio.reference.thread_pool.scheduler_type [*scheduler_type]]]
    [Scheduler used to schedule receivers on a thread pool. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.thread_pool.attach [*attach]]]
    [Attaches the current thread to the pool. ]
  ]
  
  [
    [[link asio.reference.thread_pool.executor [*executor]]]
    [Obtains the executor associated with the pool. ]
  ]
  
  [
    [[link asio.reference.thread_pool.get_executor [*get_executor]]]
    [Obtains the executor associated with the pool. ]
  ]
  
  [
    [[link asio.reference.thread_pool.join [*join]]]
    [Joins the threads. ]
  ]
  
  [
    [[link asio.reference.thread_pool.notify_fork [*notify_fork]]]
    [Notify the execution_context of a fork-related event. ]
  ]
  
  [
    [[link asio.reference.thread_pool.scheduler [*scheduler]]]
    [Obtains the scheduler associated with the pool. ]
  ]
  
  [
    [[link asio.reference.thread_pool.stop [*stop]]]
    [Stops the threads. ]
  ]
  
  [
    [[link asio.reference.thread_pool.thread_pool [*thread_pool]] [constructor]]
    [Constructs a pool with an automatically determined number of threads. 
     [hr]
     Constructs a pool with a specified number of threads. ]
  ]
  
  [
    [[link asio.reference.thread_pool.wait [*wait]]]
    [Waits for threads to complete. ]
  ]
  
  [
    [[link asio.reference.thread_pool._thread_pool [*~thread_pool]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.thread_pool.destroy [*destroy]]]
    [Destroys all services in the context. ]
  ]
  
  [
    [[link asio.reference.thread_pool.shutdown [*shutdown]]]
    [Shuts down all services in the context. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.thread_pool.add_service [*add_service]]]
    [(Deprecated: Use make_service().) Add a service object to the execution_context. ]
  ]
  
  [
    [[link asio.reference.thread_pool.has_service [*has_service]]]
    [Determine if an execution_context contains a specified service type. ]
  ]
  
  [
    [[link asio.reference.thread_pool.make_service [*make_service]]]
    [Creates a service object and adds it to the execution_context. ]
  ]
  
  [
    [[link asio.reference.thread_pool.use_service [*use_service]]]
    [Obtain the service object corresponding to the given type. ]
  ]
  
]

The thread pool class is an execution context where functions are permitted to run on one of a fixed number of threads.


[heading Submitting tasks to the pool]
  


To submit functions to the thread pool, use the [link asio.reference.dispatch `dispatch`] , [link asio.reference.post `post`]  or [link asio.reference.defer `defer`]  free functions.

For example:



   void my_task()
   {
     ...
   }

   ...

   // Launch the pool with four threads.
   asio::thread_pool pool(4);

   // Submit a function to the pool.
   asio::post(pool, my_task);

   // Submit a lambda object to the pool.
   asio::post(pool,
       []()
       {
         ...
       });

   // Wait for all tasks in the pool to complete.
   pool.join(); 




[heading Requirements]

['Header: ][^asio/thread_pool.hpp]

['Convenience header: ][^asio.hpp]


[section:add_service thread_pool::add_service]


['Inherited from execution_context.]

[indexterm2 asio.indexterm.thread_pool.add_service..add_service..thread_pool] 
(Deprecated: Use `make_service()`.) Add a service object to the [link asio.reference.execution_context `execution_context`]. 


  template<
      typename ``[link asio.reference.Service Service]``>
  friend void add_service(
      execution_context & e,
      Service * svc);


This function is used to add a service to the [link asio.reference.execution_context `execution_context`].


[heading Parameters]
    

[variablelist
  
[[e][The [link asio.reference.execution_context `execution_context`] object that owns the service.]]

[[svc][The service object. On success, ownership of the service object is transferred to the [link asio.reference.execution_context `execution_context`]. When the [link asio.reference.execution_context `execution_context`] object is destroyed, it will destroy the service object by performing:
``
   delete static_cast<execution_context::service*>(svc) 
``
]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::service_already_exists][Thrown if a service of the given type is already present in the [link asio.reference.execution_context `execution_context`].]]

[[asio::invalid_service_owner][Thrown if the service's owning [link asio.reference.execution_context `execution_context`] is not the [link asio.reference.execution_context `execution_context`] object specified by the `e` parameter. ]]

]



[heading Requirements]

['Header: ][^asio/thread_pool.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:attach thread_pool::attach]

[indexterm2 asio.indexterm.thread_pool.attach..attach..thread_pool] 
Attaches the current thread to the pool. 


  void attach();


This function attaches the current thread to the pool so that it may be used for executing submitted function objects. Blocks the calling thread until the pool is stopped or joined and has no outstanding work. 


[endsect]



[section:destroy thread_pool::destroy]


['Inherited from execution_context.]

[indexterm2 asio.indexterm.thread_pool.destroy..destroy..thread_pool] 
Destroys all services in the context. 


  void destroy();


This function is implemented as follows:


* For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, in reverse order * of the beginning of service object lifetime, performs `delete static_cast<execution_context::service*>(svc)`. 




[endsect]



[section:executor thread_pool::executor]

[indexterm2 asio.indexterm.thread_pool.executor..executor..thread_pool] 
Obtains the executor associated with the pool. 


  executor_type executor();



[endsect]



[section:executor_type thread_pool::executor_type]

[indexterm2 asio.indexterm.thread_pool.executor_type..executor_type..thread_pool] 
Executor used to submit functions to a thread pool. 


  typedef basic_executor_type< std::allocator< void >, 0 > executor_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.thread_pool__basic_executor_type.index_type [*index_type]]]
    [The bulk execution index type. ]
  
  ]

  [

    [[link asio.reference.thread_pool__basic_executor_type.sender_type [*sender_type]]]
    [The sender type, when this type is used as a scheduler. ]
  
  ]

  [

    [[link asio.reference.thread_pool__basic_executor_type.shape_type [*shape_type]]]
    [The bulk execution shape type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.thread_pool__basic_executor_type.basic_executor_type [*basic_executor_type]] [constructor]]
    [Copy constructor. 
     [hr]
     Move constructor. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.bulk_execute [*bulk_execute]]]
    [Bulk execution function. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.connect [*connect]]]
    [Connect function. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.defer [*defer]]]
    [Request the thread pool to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.dispatch [*dispatch]]]
    [Request the thread pool to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.execute [*execute]]]
    [Execution function. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.on_work_finished [*on_work_finished]]]
    [Inform the thread pool that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.on_work_started [*on_work_started]]]
    [Inform the thread pool that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.operator_eq_ [*operator=]]]
    [Assignment operator. 
     [hr]
     Move assignment operator. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.post [*post]]]
    [Request the thread pool to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.query [*query]]]
    [Query the current value of the context property. 
     [hr]
     Query the current value of the blocking property. 
     [hr]
     Query the current value of the relationship property. 
     [hr]
     Query the current value of the allocator property. 
     [hr]
     Query the occupancy (recommended number of work items) for the pool. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.query__static [*query]] [static]]
    [Query the current value of the bulk_guarantee property. 
     [hr]
     Query the current value of the mapping property. 
     [hr]
     Query the current value of the outstanding_work property. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.require [*require]]]
    [Obtain an executor with the blocking.possibly property. 
     [hr]
     Obtain an executor with the blocking.always property. 
     [hr]
     Obtain an executor with the blocking.never property. 
     [hr]
     Obtain an executor with the relationship.fork property. 
     [hr]
     Obtain an executor with the relationship.continuation property. 
     [hr]
     Obtain an executor with the outstanding_work.tracked property. 
     [hr]
     Obtain an executor with the outstanding_work.untracked property. 
     [hr]
     Obtain an executor with the specified allocator property. 
     [hr]
     Obtain an executor with the default allocator property. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the thread pool is running in the current thread. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.schedule [*schedule]]]
    [Schedule function. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type._basic_executor_type [*~basic_executor_type]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.thread_pool__basic_executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[heading Requirements]

['Header: ][^asio/thread_pool.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:fork_event thread_pool::fork_event]


['Inherited from execution_context.]

[indexterm2 asio.indexterm.thread_pool.fork_event..fork_event..thread_pool] 
Fork-related event notifications. 


  enum fork_event

[indexterm2 asio.indexterm.thread_pool.fork_event.fork_prepare..fork_prepare..thread_pool]
[indexterm2 asio.indexterm.thread_pool.fork_event.fork_parent..fork_parent..thread_pool]
[indexterm2 asio.indexterm.thread_pool.fork_event.fork_child..fork_child..thread_pool]

[heading Values]
[variablelist

  [
    [fork_prepare]
    [Notify the context that the process is about to fork. ]
  ]

  [
    [fork_parent]
    [Notify the context that the process has forked and is the parent. ]
  ]

  [
    [fork_child]
    [Notify the context that the process has forked and is the child. ]
  ]

]



[endsect]



[section:get_executor thread_pool::get_executor]

[indexterm2 asio.indexterm.thread_pool.get_executor..get_executor..thread_pool] 
Obtains the executor associated with the pool. 


  executor_type get_executor();



[endsect]



[section:has_service thread_pool::has_service]


['Inherited from execution_context.]

[indexterm2 asio.indexterm.thread_pool.has_service..has_service..thread_pool] 
Determine if an [link asio.reference.execution_context `execution_context`] contains a specified service type. 


  template<
      typename ``[link asio.reference.Service Service]``>
  friend bool has_service(
      execution_context & e);


This function is used to determine whether the [link asio.reference.execution_context `execution_context`] contains a service object corresponding to the given service type.


[heading Parameters]
    

[variablelist
  
[[e][The [link asio.reference.execution_context `execution_context`] object that owns the service.]]

]


[heading Return Value]
      
A boolean indicating whether the [link asio.reference.execution_context `execution_context`] contains the service. 



[heading Requirements]

['Header: ][^asio/thread_pool.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:join thread_pool::join]

[indexterm2 asio.indexterm.thread_pool.join..join..thread_pool] 
Joins the threads. 


  void join();


This function blocks until the threads in the pool have completed. If `stop()` is not called prior to `join()`, the `join()` call will wait until the pool has no more outstanding work. 


[endsect]



[section:make_service thread_pool::make_service]


['Inherited from execution_context.]

[indexterm2 asio.indexterm.thread_pool.make_service..make_service..thread_pool] 
Creates a service object and adds it to the [link asio.reference.execution_context `execution_context`]. 


  template<
      typename ``[link asio.reference.Service Service]``,
      typename... Args>
  friend Service & make_service(
      execution_context & e,
      Args &&... args);


This function is used to add a service to the [link asio.reference.execution_context `execution_context`].


[heading Parameters]
    

[variablelist
  
[[e][The [link asio.reference.execution_context `execution_context`] object that owns the service.]]

[[args][Zero or more arguments to be passed to the service constructor.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::service_already_exists][Thrown if a service of the given type is already present in the [link asio.reference.execution_context `execution_context`]. ]]

]



[heading Requirements]

['Header: ][^asio/thread_pool.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:notify_fork thread_pool::notify_fork]


['Inherited from execution_context.]

[indexterm2 asio.indexterm.thread_pool.notify_fork..notify_fork..thread_pool] 
Notify the [link asio.reference.execution_context `execution_context`] of a fork-related event. 


  void notify_fork(
      fork_event event);


This function is used to inform the [link asio.reference.execution_context `execution_context`] that the process is about to fork, or has just forked. This allows the [link asio.reference.execution_context `execution_context`], and the services it contains, to perform any necessary housekeeping to ensure correct operation following a fork.

This function must not be called while any other [link asio.reference.execution_context `execution_context`] function, or any function associated with the execution\_context's derived class, is being called in another thread. It is, however, safe to call this function from within a completion handler, provided no other thread is accessing the [link asio.reference.execution_context `execution_context`] or its derived class.


[heading Parameters]
    

[variablelist
  
[[event][A fork-related event.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. If the notification fails the [link asio.reference.execution_context `execution_context`] object should no longer be used and should be destroyed.]]

]


[heading Example]
  
The following code illustrates how to incorporate the `notify_fork()` function: 

   my_execution_context.notify_fork(execution_context::fork_prepare);
   if (fork() == 0)
   {
     // This is the child process.
     my_execution_context.notify_fork(execution_context::fork_child);
   }
   else
   {
     // This is the parent process.
     my_execution_context.notify_fork(execution_context::fork_parent);
   } 





[heading Remarks]
      
For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, performs `svc->notify_fork();`. When processing the fork\_prepare event, services are visited in reverse order of the beginning of service object lifetime. Otherwise, services are visited in order of the beginning of service object lifetime. 




[endsect]



[section:scheduler thread_pool::scheduler]

[indexterm2 asio.indexterm.thread_pool.scheduler..scheduler..thread_pool] 
Obtains the scheduler associated with the pool. 


  scheduler_type scheduler();



[endsect]



[section:scheduler_type thread_pool::scheduler_type]

[indexterm2 asio.indexterm.thread_pool.scheduler_type..scheduler_type..thread_pool] 
Scheduler used to schedule receivers on a thread pool. 


  typedef basic_executor_type< std::allocator< void >, 0 > scheduler_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.thread_pool__basic_executor_type.index_type [*index_type]]]
    [The bulk execution index type. ]
  
  ]

  [

    [[link asio.reference.thread_pool__basic_executor_type.sender_type [*sender_type]]]
    [The sender type, when this type is used as a scheduler. ]
  
  ]

  [

    [[link asio.reference.thread_pool__basic_executor_type.shape_type [*shape_type]]]
    [The bulk execution shape type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.thread_pool__basic_executor_type.basic_executor_type [*basic_executor_type]] [constructor]]
    [Copy constructor. 
     [hr]
     Move constructor. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.bulk_execute [*bulk_execute]]]
    [Bulk execution function. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.connect [*connect]]]
    [Connect function. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.defer [*defer]]]
    [Request the thread pool to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.dispatch [*dispatch]]]
    [Request the thread pool to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.execute [*execute]]]
    [Execution function. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.on_work_finished [*on_work_finished]]]
    [Inform the thread pool that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.on_work_started [*on_work_started]]]
    [Inform the thread pool that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.operator_eq_ [*operator=]]]
    [Assignment operator. 
     [hr]
     Move assignment operator. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.post [*post]]]
    [Request the thread pool to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.query [*query]]]
    [Query the current value of the context property. 
     [hr]
     Query the current value of the blocking property. 
     [hr]
     Query the current value of the relationship property. 
     [hr]
     Query the current value of the allocator property. 
     [hr]
     Query the occupancy (recommended number of work items) for the pool. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.query__static [*query]] [static]]
    [Query the current value of the bulk_guarantee property. 
     [hr]
     Query the current value of the mapping property. 
     [hr]
     Query the current value of the outstanding_work property. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.require [*require]]]
    [Obtain an executor with the blocking.possibly property. 
     [hr]
     Obtain an executor with the blocking.always property. 
     [hr]
     Obtain an executor with the blocking.never property. 
     [hr]
     Obtain an executor with the relationship.fork property. 
     [hr]
     Obtain an executor with the relationship.continuation property. 
     [hr]
     Obtain an executor with the outstanding_work.tracked property. 
     [hr]
     Obtain an executor with the outstanding_work.untracked property. 
     [hr]
     Obtain an executor with the specified allocator property. 
     [hr]
     Obtain an executor with the default allocator property. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the thread pool is running in the current thread. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.schedule [*schedule]]]
    [Schedule function. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type._basic_executor_type [*~basic_executor_type]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.thread_pool__basic_executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[heading Requirements]

['Header: ][^asio/thread_pool.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:shutdown thread_pool::shutdown]


['Inherited from execution_context.]

[indexterm2 asio.indexterm.thread_pool.shutdown..shutdown..thread_pool] 
Shuts down all services in the context. 


  void shutdown();


This function is implemented as follows:


* For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, in reverse order of the beginning of service object lifetime, performs `svc->shutdown()`. 




[endsect]



[section:stop thread_pool::stop]

[indexterm2 asio.indexterm.thread_pool.stop..stop..thread_pool] 
Stops the threads. 


  void stop();


This function stops the threads as soon as possible. As a result of calling `stop()`, pending function objects may be never be invoked. 


[endsect]


[section:thread_pool thread_pool::thread_pool]

[indexterm2 asio.indexterm.thread_pool.thread_pool..thread_pool..thread_pool] 
Constructs a pool with an automatically determined number of threads. 


  ``[link asio.reference.thread_pool.thread_pool.overload1 thread_pool]``();
  ``  [''''&raquo;''' [link asio.reference.thread_pool.thread_pool.overload1 more...]]``


Constructs a pool with a specified number of threads. 


  ``[link asio.reference.thread_pool.thread_pool.overload2 thread_pool]``(
      std::size_t num_threads);
  ``  [''''&raquo;''' [link asio.reference.thread_pool.thread_pool.overload2 more...]]``


[section:overload1 thread_pool::thread_pool (1 of 2 overloads)]


Constructs a pool with an automatically determined number of threads. 


  thread_pool();



[endsect]



[section:overload2 thread_pool::thread_pool (2 of 2 overloads)]


Constructs a pool with a specified number of threads. 


  thread_pool(
      std::size_t num_threads);



[endsect]


[endsect]

[section:use_service thread_pool::use_service]

[indexterm2 asio.indexterm.thread_pool.use_service..use_service..thread_pool] 
Obtain the service object corresponding to the given type. 


  template<
      typename ``[link asio.reference.Service Service]``>
  friend Service & ``[link asio.reference.thread_pool.use_service.overload1 use_service]``(
      execution_context & e);
  ``  [''''&raquo;''' [link asio.reference.thread_pool.use_service.overload1 more...]]``

  template<
      typename ``[link asio.reference.Service Service]``>
  friend Service & ``[link asio.reference.thread_pool.use_service.overload2 use_service]``(
      io_context & ioc);
  ``  [''''&raquo;''' [link asio.reference.thread_pool.use_service.overload2 more...]]``


[section:overload1 thread_pool::use_service (1 of 2 overloads)]


['Inherited from execution_context.]


Obtain the service object corresponding to the given type. 


  template<
      typename ``[link asio.reference.Service Service]``>
  friend Service & use_service(
      execution_context & e);


This function is used to locate a service object that corresponds to the given service type. If there is no existing implementation of the service, then the [link asio.reference.execution_context `execution_context`] will create a new instance of the service.


[heading Parameters]
    

[variablelist
  
[[e][The [link asio.reference.execution_context `execution_context`] object that owns the service.]]

]


[heading Return Value]
      
The service interface implementing the specified service type. Ownership of the service interface is not transferred to the caller. 



[heading Requirements]

['Header: ][^asio/thread_pool.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:overload2 thread_pool::use_service (2 of 2 overloads)]


['Inherited from execution_context.]


Obtain the service object corresponding to the given type. 


  template<
      typename ``[link asio.reference.Service Service]``>
  friend Service & use_service(
      io_context & ioc);


This function is used to locate a service object that corresponds to the given service type. If there is no existing implementation of the service, then the [link asio.reference.io_context `io_context`] will create a new instance of the service.


[heading Parameters]
    

[variablelist
  
[[ioc][The [link asio.reference.io_context `io_context`] object that owns the service.]]

]


[heading Return Value]
      
The service interface implementing the specified service type. Ownership of the service interface is not transferred to the caller.


[heading Remarks]
      
This overload is preserved for backwards compatibility with services that inherit from [link asio.reference.io_context__service `io_context::service`]. 



[heading Requirements]

['Header: ][^asio/thread_pool.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[endsect]


[section:wait thread_pool::wait]

[indexterm2 asio.indexterm.thread_pool.wait..wait..thread_pool] 
Waits for threads to complete. 


  void wait();


This function blocks until the threads in the pool have completed. If `stop()` is not called prior to `wait()`, the `wait()` call will wait until the pool has no more outstanding work. 


[endsect]



[section:_thread_pool thread_pool::~thread_pool]

[indexterm2 asio.indexterm.thread_pool._thread_pool..~thread_pool..thread_pool] 
Destructor. 


  ~thread_pool();


Automatically stops and joins the pool, if not explicitly done beforehand. 


[endsect]



[endsect]

[section:thread_pool__basic_executor_type thread_pool::basic_executor_type]


Executor implementation type used to submit functions to a thread pool. 


  template<
      typename Allocator,
      unsigned int Bits>
  class basic_executor_type


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.thread_pool__basic_executor_type.index_type [*index_type]]]
    [The bulk execution index type. ]
  
  ]

  [

    [[link asio.reference.thread_pool__basic_executor_type.sender_type [*sender_type]]]
    [The sender type, when this type is used as a scheduler. ]
  
  ]

  [

    [[link asio.reference.thread_pool__basic_executor_type.shape_type [*shape_type]]]
    [The bulk execution shape type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.thread_pool__basic_executor_type.basic_executor_type [*basic_executor_type]] [constructor]]
    [Copy constructor. 
     [hr]
     Move constructor. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.bulk_execute [*bulk_execute]]]
    [Bulk execution function. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.connect [*connect]]]
    [Connect function. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.defer [*defer]]]
    [Request the thread pool to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.dispatch [*dispatch]]]
    [Request the thread pool to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.execute [*execute]]]
    [Execution function. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.on_work_finished [*on_work_finished]]]
    [Inform the thread pool that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.on_work_started [*on_work_started]]]
    [Inform the thread pool that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.operator_eq_ [*operator=]]]
    [Assignment operator. 
     [hr]
     Move assignment operator. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.post [*post]]]
    [Request the thread pool to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.query [*query]]]
    [Query the current value of the context property. 
     [hr]
     Query the current value of the blocking property. 
     [hr]
     Query the current value of the relationship property. 
     [hr]
     Query the current value of the allocator property. 
     [hr]
     Query the occupancy (recommended number of work items) for the pool. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.query__static [*query]] [static]]
    [Query the current value of the bulk_guarantee property. 
     [hr]
     Query the current value of the mapping property. 
     [hr]
     Query the current value of the outstanding_work property. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.require [*require]]]
    [Obtain an executor with the blocking.possibly property. 
     [hr]
     Obtain an executor with the blocking.always property. 
     [hr]
     Obtain an executor with the blocking.never property. 
     [hr]
     Obtain an executor with the relationship.fork property. 
     [hr]
     Obtain an executor with the relationship.continuation property. 
     [hr]
     Obtain an executor with the outstanding_work.tracked property. 
     [hr]
     Obtain an executor with the outstanding_work.untracked property. 
     [hr]
     Obtain an executor with the specified allocator property. 
     [hr]
     Obtain an executor with the default allocator property. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the thread pool is running in the current thread. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.schedule [*schedule]]]
    [Schedule function. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type._basic_executor_type [*~basic_executor_type]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.thread_pool__basic_executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/thread_pool.hpp]

['Convenience header: ][^asio.hpp]

[section:basic_executor_type thread_pool::basic_executor_type::basic_executor_type]

[indexterm2 asio.indexterm.thread_pool__basic_executor_type.basic_executor_type..basic_executor_type..thread_pool::basic_executor_type] 
Copy constructor. 


  ``[link asio.reference.thread_pool__basic_executor_type.basic_executor_type.overload1 basic_executor_type]``(
      const basic_executor_type & other);
  ``  [''''&raquo;''' [link asio.reference.thread_pool__basic_executor_type.basic_executor_type.overload1 more...]]``


Move constructor. 


  ``[link asio.reference.thread_pool__basic_executor_type.basic_executor_type.overload2 basic_executor_type]``(
      basic_executor_type && other);
  ``  [''''&raquo;''' [link asio.reference.thread_pool__basic_executor_type.basic_executor_type.overload2 more...]]``


[section:overload1 thread_pool::basic_executor_type::basic_executor_type (1 of 2 overloads)]


Copy constructor. 


  basic_executor_type(
      const basic_executor_type & other);



[endsect]



[section:overload2 thread_pool::basic_executor_type::basic_executor_type (2 of 2 overloads)]


Move constructor. 


  basic_executor_type(
      basic_executor_type && other);



[endsect]


[endsect]


[section:bulk_execute thread_pool::basic_executor_type::bulk_execute]

[indexterm2 asio.indexterm.thread_pool__basic_executor_type.bulk_execute..bulk_execute..thread_pool::basic_executor_type] 
Bulk execution function. 


  template<
      typename Function>
  void bulk_execute(
      Function && f,
      std::size_t n) const;



[endsect]



[section:connect thread_pool::basic_executor_type::connect]

[indexterm2 asio.indexterm.thread_pool__basic_executor_type.connect..connect..thread_pool::basic_executor_type] 
Connect function. 


  template<
      typename ``[link asio.reference.Receiver Receiver]``>
  unspecified connect(
      Receiver && r) const;


Do not call this function directly. It is intended for use with the [link asio.reference.execution__connect `execution::connect`] customisation point.


[heading Return Value]
      
An object of an unspecified type that satisfies the `operation_state` concept. 




[endsect]



[section:context thread_pool::basic_executor_type::context]

[indexterm2 asio.indexterm.thread_pool__basic_executor_type.context..context..thread_pool::basic_executor_type] 
Obtain the underlying execution context. 


  thread_pool & context() const;



[endsect]



[section:defer thread_pool::basic_executor_type::defer]

[indexterm2 asio.indexterm.thread_pool__basic_executor_type.defer..defer..thread_pool::basic_executor_type] 
Request the thread pool to invoke the given function object. 


  template<
      typename Function,
      typename OtherAllocator>
  void defer(
      Function && f,
      const OtherAllocator & a) const;


This function is used to ask the thread pool to execute the given function object. The function object will never be executed inside `defer()`. Instead, it will be scheduled to run on the thread pool.

If the current thread belongs to the thread pool, `defer()` will delay scheduling the function object until the current thread returns control to the pool.


[heading Parameters]
    

[variablelist
  
[[f][The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:
``
   void function(); 
``
]]

[[a][An allocator that may be used by the executor to allocate the internal storage needed for function invocation. ]]

]




[endsect]



[section:dispatch thread_pool::basic_executor_type::dispatch]

[indexterm2 asio.indexterm.thread_pool__basic_executor_type.dispatch..dispatch..thread_pool::basic_executor_type] 
Request the thread pool to invoke the given function object. 


  template<
      typename Function,
      typename OtherAllocator>
  void dispatch(
      Function && f,
      const OtherAllocator & a) const;


This function is used to ask the thread pool to execute the given function object. If the current thread belongs to the pool, `dispatch()` executes the function before returning. Otherwise, the function will be scheduled to run on the thread pool.


[heading Parameters]
    

[variablelist
  
[[f][The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:
``
   void function(); 
``
]]

[[a][An allocator that may be used by the executor to allocate the internal storage needed for function invocation. ]]

]




[endsect]



[section:execute thread_pool::basic_executor_type::execute]

[indexterm2 asio.indexterm.thread_pool__basic_executor_type.execute..execute..thread_pool::basic_executor_type] 
Execution function. 


  template<
      typename Function>
  void execute(
      Function && f) const;


Do not call this function directly. It is intended for use with the [link asio.reference.execution__execute `execution::execute`] customisation point.

For example: 

   auto ex = my_thread_pool.executor();
   execution::execute(ex, my_function_object); 





[endsect]



[section:index_type thread_pool::basic_executor_type::index_type]

[indexterm2 asio.indexterm.thread_pool__basic_executor_type.index_type..index_type..thread_pool::basic_executor_type] 
The bulk execution index type. 


  typedef std::size_t index_type;



[heading Requirements]

['Header: ][^asio/thread_pool.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:on_work_finished thread_pool::basic_executor_type::on_work_finished]

[indexterm2 asio.indexterm.thread_pool__basic_executor_type.on_work_finished..on_work_finished..thread_pool::basic_executor_type] 
Inform the thread pool that some work is no longer outstanding. 


  void on_work_finished() const;


This function is used to inform the thread pool that some work has finished. Once the count of unfinished work reaches zero, the thread pool's `join()` function is permitted to exit. 


[endsect]



[section:on_work_started thread_pool::basic_executor_type::on_work_started]

[indexterm2 asio.indexterm.thread_pool__basic_executor_type.on_work_started..on_work_started..thread_pool::basic_executor_type] 
Inform the thread pool that it has some outstanding work to do. 


  void on_work_started() const;


This function is used to inform the thread pool that some work has begun. This ensures that the thread pool's `join()` function will not return while the work is underway. 


[endsect]



[section:operator_not__eq_ thread_pool::basic_executor_type::operator!=]

[indexterm2 asio.indexterm.thread_pool__basic_executor_type.operator_not__eq_..operator!=..thread_pool::basic_executor_type] 
Compare two executors for inequality. 


  friend bool operator!=(
      const basic_executor_type & a,
      const basic_executor_type & b);


Two executors are equal if they refer to the same underlying thread pool. 

[heading Requirements]

['Header: ][^asio/thread_pool.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:operator_eq_ thread_pool::basic_executor_type::operator=]

[indexterm2 asio.indexterm.thread_pool__basic_executor_type.operator_eq_..operator=..thread_pool::basic_executor_type] 
Assignment operator. 


  basic_executor_type & ``[link asio.reference.thread_pool__basic_executor_type.operator_eq_.overload1 operator=]``(
      const basic_executor_type & other);
  ``  [''''&raquo;''' [link asio.reference.thread_pool__basic_executor_type.operator_eq_.overload1 more...]]``


Move assignment operator. 


  basic_executor_type & ``[link asio.reference.thread_pool__basic_executor_type.operator_eq_.overload2 operator=]``(
      basic_executor_type && other);
  ``  [''''&raquo;''' [link asio.reference.thread_pool__basic_executor_type.operator_eq_.overload2 more...]]``


[section:overload1 thread_pool::basic_executor_type::operator= (1 of 2 overloads)]


Assignment operator. 


  basic_executor_type & operator=(
      const basic_executor_type & other);



[endsect]



[section:overload2 thread_pool::basic_executor_type::operator= (2 of 2 overloads)]


Move assignment operator. 


  basic_executor_type & operator=(
      basic_executor_type && other);



[endsect]


[endsect]


[section:operator_eq__eq_ thread_pool::basic_executor_type::operator==]

[indexterm2 asio.indexterm.thread_pool__basic_executor_type.operator_eq__eq_..operator==..thread_pool::basic_executor_type] 
Compare two executors for equality. 


  friend bool operator==(
      const basic_executor_type & a,
      const basic_executor_type & b);


Two executors are equal if they refer to the same underlying thread pool. 

[heading Requirements]

['Header: ][^asio/thread_pool.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:post thread_pool::basic_executor_type::post]

[indexterm2 asio.indexterm.thread_pool__basic_executor_type.post..post..thread_pool::basic_executor_type] 
Request the thread pool to invoke the given function object. 


  template<
      typename Function,
      typename OtherAllocator>
  void post(
      Function && f,
      const OtherAllocator & a) const;


This function is used to ask the thread pool to execute the given function object. The function object will never be executed inside `post()`. Instead, it will be scheduled to run on the thread pool.


[heading Parameters]
    

[variablelist
  
[[f][The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:
``
   void function(); 
``
]]

[[a][An allocator that may be used by the executor to allocate the internal storage needed for function invocation. ]]

]




[endsect]


[section:query thread_pool::basic_executor_type::query]

[indexterm2 asio.indexterm.thread_pool__basic_executor_type.query..query..thread_pool::basic_executor_type] 
Query the current value of the `context` property. 


  thread_pool & ``[link asio.reference.thread_pool__basic_executor_type.query.overload1 query]``(
      execution::context_t ) const;
  ``  [''''&raquo;''' [link asio.reference.thread_pool__basic_executor_type.query.overload1 more...]]``


Query the current value of the `blocking` property. 


  constexpr execution::blocking_t ``[link asio.reference.thread_pool__basic_executor_type.query.overload2 query]``(
      execution::blocking_t ) const;
  ``  [''''&raquo;''' [link asio.reference.thread_pool__basic_executor_type.query.overload2 more...]]``


Query the current value of the `relationship` property. 


  constexpr execution::relationship_t ``[link asio.reference.thread_pool__basic_executor_type.query.overload3 query]``(
      execution::relationship_t ) const;
  ``  [''''&raquo;''' [link asio.reference.thread_pool__basic_executor_type.query.overload3 more...]]``


Query the current value of the `allocator` property. 


  template<
      typename OtherAllocator>
  constexpr Allocator ``[link asio.reference.thread_pool__basic_executor_type.query.overload4 query]``(
      execution::allocator_t< OtherAllocator > ) const;
  ``  [''''&raquo;''' [link asio.reference.thread_pool__basic_executor_type.query.overload4 more...]]``

  constexpr Allocator ``[link asio.reference.thread_pool__basic_executor_type.query.overload5 query]``(
      execution::allocator_t< void > ) const;
  ``  [''''&raquo;''' [link asio.reference.thread_pool__basic_executor_type.query.overload5 more...]]``


Query the occupancy (recommended number of work items) for the pool. 


  std::size_t ``[link asio.reference.thread_pool__basic_executor_type.query.overload6 query]``(
      execution::occupancy_t ) const;
  ``  [''''&raquo;''' [link asio.reference.thread_pool__basic_executor_type.query.overload6 more...]]``


[section:overload1 thread_pool::basic_executor_type::query (1 of 6 overloads)]


Query the current value of the `context` property. 


  thread_pool & query(
      execution::context_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   auto ex = my_thread_pool.executor();
   asio::thread_pool& pool = asio::query(
       ex, asio::execution::context); 





[endsect]



[section:overload2 thread_pool::basic_executor_type::query (2 of 6 overloads)]


Query the current value of the `blocking` property. 


  constexpr execution::blocking_t query(
      execution::blocking_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   auto ex = my_thread_pool.executor();
   if (asio::query(ex, asio::execution::blocking)
         == asio::execution::blocking.always)
     ... 





[endsect]



[section:overload3 thread_pool::basic_executor_type::query (3 of 6 overloads)]


Query the current value of the `relationship` property. 


  constexpr execution::relationship_t query(
      execution::relationship_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   auto ex = my_thread_pool.executor();
   if (asio::query(ex, asio::execution::relationship)
         == asio::execution::relationship.continuation)
     ... 





[endsect]



[section:overload4 thread_pool::basic_executor_type::query (4 of 6 overloads)]


Query the current value of the `allocator` property. 


  template<
      typename OtherAllocator>
  constexpr Allocator query(
      execution::allocator_t< OtherAllocator > ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   auto ex = my_thread_pool.executor();
   auto alloc = asio::query(ex,
       asio::execution::allocator); 





[endsect]



[section:overload5 thread_pool::basic_executor_type::query (5 of 6 overloads)]


Query the current value of the `allocator` property. 


  constexpr Allocator query(
      execution::allocator_t< void > ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   auto ex = my_thread_pool.executor();
   auto alloc = asio::query(ex,
       asio::execution::allocator); 





[endsect]



[section:overload6 thread_pool::basic_executor_type::query (6 of 6 overloads)]


Query the occupancy (recommended number of work items) for the pool. 


  std::size_t query(
      execution::occupancy_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   auto ex = my_thread_pool.executor();
   std::size_t occupancy = asio::query(
       ex, asio::execution::occupancy); 





[endsect]


[endsect]

[section:query__static thread_pool::basic_executor_type::query]

[indexterm2 asio.indexterm.thread_pool__basic_executor_type.query__static..query..thread_pool::basic_executor_type] 
Query the current value of the `bulk_guarantee` property. 


  static constexpr execution::bulk_guarantee_t ``[link asio.reference.thread_pool__basic_executor_type.query__static.overload1 query]``(
      execution::bulk_guarantee_t );
  ``  [''''&raquo;''' [link asio.reference.thread_pool__basic_executor_type.query__static.overload1 more...]]``


Query the current value of the `mapping` property. 


  static constexpr execution::mapping_t ``[link asio.reference.thread_pool__basic_executor_type.query__static.overload2 query]``(
      execution::mapping_t );
  ``  [''''&raquo;''' [link asio.reference.thread_pool__basic_executor_type.query__static.overload2 more...]]``


Query the current value of the `outstanding_work` property. 


  static constexpr execution::outstanding_work_t ``[link asio.reference.thread_pool__basic_executor_type.query__static.overload3 query]``(
      execution::outstanding_work_t );
  ``  [''''&raquo;''' [link asio.reference.thread_pool__basic_executor_type.query__static.overload3 more...]]``


[section:overload1 thread_pool::basic_executor_type::query (1 of 3 overloads)]


Query the current value of the `bulk_guarantee` property. 


  static constexpr execution::bulk_guarantee_t query(
      execution::bulk_guarantee_t );


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   auto ex = my_thread_pool.executor();
   if (asio::query(ex, asio::execution::bulk_guarantee)
         == asio::execution::bulk_guarantee.parallel)
     ... 





[endsect]



[section:overload2 thread_pool::basic_executor_type::query (2 of 3 overloads)]


Query the current value of the `mapping` property. 


  static constexpr execution::mapping_t query(
      execution::mapping_t );


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   auto ex = my_thread_pool.executor();
   if (asio::query(ex, asio::execution::mapping)
         == asio::execution::mapping.thread)
     ... 





[endsect]



[section:overload3 thread_pool::basic_executor_type::query (3 of 3 overloads)]


Query the current value of the `outstanding_work` property. 


  static constexpr execution::outstanding_work_t query(
      execution::outstanding_work_t );


Do not call this function directly. It is intended for use with the [link asio.reference.query `query`] customisation point.

For example: 

   auto ex = my_thread_pool.executor();
   if (asio::query(ex, asio::execution::outstanding_work)
         == asio::execution::outstanding_work.tracked)
     ... 





[endsect]


[endsect]

[section:require thread_pool::basic_executor_type::require]

[indexterm2 asio.indexterm.thread_pool__basic_executor_type.require..require..thread_pool::basic_executor_type] 
Obtain an executor with the `blocking.possibly` property. 


  constexpr basic_executor_type< Allocator, unspecified > ``[link asio.reference.thread_pool__basic_executor_type.require.overload1 require]``(
      execution::blocking_t::possibly_t ) const;
  ``  [''''&raquo;''' [link asio.reference.thread_pool__basic_executor_type.require.overload1 more...]]``


Obtain an executor with the `blocking.always` property. 


  constexpr basic_executor_type< Allocator, unspecified > ``[link asio.reference.thread_pool__basic_executor_type.require.overload2 require]``(
      execution::blocking_t::always_t ) const;
  ``  [''''&raquo;''' [link asio.reference.thread_pool__basic_executor_type.require.overload2 more...]]``


Obtain an executor with the `blocking.never` property. 


  constexpr basic_executor_type< Allocator, unspecified > ``[link asio.reference.thread_pool__basic_executor_type.require.overload3 require]``(
      execution::blocking_t::never_t ) const;
  ``  [''''&raquo;''' [link asio.reference.thread_pool__basic_executor_type.require.overload3 more...]]``


Obtain an executor with the `relationship.fork` property. 


  constexpr basic_executor_type ``[link asio.reference.thread_pool__basic_executor_type.require.overload4 require]``(
      execution::relationship_t::fork_t ) const;
  ``  [''''&raquo;''' [link asio.reference.thread_pool__basic_executor_type.require.overload4 more...]]``


Obtain an executor with the `relationship.continuation` property. 


  constexpr basic_executor_type ``[link asio.reference.thread_pool__basic_executor_type.require.overload5 require]``(
      execution::relationship_t::continuation_t ) const;
  ``  [''''&raquo;''' [link asio.reference.thread_pool__basic_executor_type.require.overload5 more...]]``


Obtain an executor with the `outstanding_work.tracked` property. 


  constexpr basic_executor_type< Allocator, unspecified > ``[link asio.reference.thread_pool__basic_executor_type.require.overload6 require]``(
      execution::outstanding_work_t::tracked_t ) const;
  ``  [''''&raquo;''' [link asio.reference.thread_pool__basic_executor_type.require.overload6 more...]]``


Obtain an executor with the `outstanding_work.untracked` property. 


  constexpr basic_executor_type< Allocator, unspecified > ``[link asio.reference.thread_pool__basic_executor_type.require.overload7 require]``(
      execution::outstanding_work_t::untracked_t ) const;
  ``  [''''&raquo;''' [link asio.reference.thread_pool__basic_executor_type.require.overload7 more...]]``


Obtain an executor with the specified `allocator` property. 


  template<
      typename OtherAllocator>
  constexpr basic_executor_type< OtherAllocator, Bits > ``[link asio.reference.thread_pool__basic_executor_type.require.overload8 require]``(
      execution::allocator_t< OtherAllocator > a) const;
  ``  [''''&raquo;''' [link asio.reference.thread_pool__basic_executor_type.require.overload8 more...]]``


Obtain an executor with the default `allocator` property. 


  constexpr basic_executor_type< std::allocator< void >, Bits > ``[link asio.reference.thread_pool__basic_executor_type.require.overload9 require]``(
      execution::allocator_t< void > ) const;
  ``  [''''&raquo;''' [link asio.reference.thread_pool__basic_executor_type.require.overload9 more...]]``


[section:overload1 thread_pool::basic_executor_type::require (1 of 9 overloads)]


Obtain an executor with the `blocking.possibly` property. 


  constexpr basic_executor_type< Allocator, unspecified > require(
      execution::blocking_t::possibly_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   auto ex1 = my_thread_pool.executor();
   auto ex2 = asio::require(ex1,
       asio::execution::blocking.possibly); 





[endsect]



[section:overload2 thread_pool::basic_executor_type::require (2 of 9 overloads)]


Obtain an executor with the `blocking.always` property. 


  constexpr basic_executor_type< Allocator, unspecified > require(
      execution::blocking_t::always_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   auto ex1 = my_thread_pool.executor();
   auto ex2 = asio::require(ex1,
       asio::execution::blocking.always); 





[endsect]



[section:overload3 thread_pool::basic_executor_type::require (3 of 9 overloads)]


Obtain an executor with the `blocking.never` property. 


  constexpr basic_executor_type< Allocator, unspecified > require(
      execution::blocking_t::never_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   auto ex1 = my_thread_pool.executor();
   auto ex2 = asio::require(ex1,
       asio::execution::blocking.never); 





[endsect]



[section:overload4 thread_pool::basic_executor_type::require (4 of 9 overloads)]


Obtain an executor with the `relationship.fork` property. 


  constexpr basic_executor_type require(
      execution::relationship_t::fork_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   auto ex1 = my_thread_pool.executor();
   auto ex2 = asio::require(ex1,
       asio::execution::relationship.fork); 





[endsect]



[section:overload5 thread_pool::basic_executor_type::require (5 of 9 overloads)]


Obtain an executor with the `relationship.continuation` property. 


  constexpr basic_executor_type require(
      execution::relationship_t::continuation_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   auto ex1 = my_thread_pool.executor();
   auto ex2 = asio::require(ex1,
       asio::execution::relationship.continuation); 





[endsect]



[section:overload6 thread_pool::basic_executor_type::require (6 of 9 overloads)]


Obtain an executor with the `outstanding_work.tracked` property. 


  constexpr basic_executor_type< Allocator, unspecified > require(
      execution::outstanding_work_t::tracked_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   auto ex1 = my_thread_pool.executor();
   auto ex2 = asio::require(ex1,
       asio::execution::outstanding_work.tracked); 





[endsect]



[section:overload7 thread_pool::basic_executor_type::require (7 of 9 overloads)]


Obtain an executor with the `outstanding_work.untracked` property. 


  constexpr basic_executor_type< Allocator, unspecified > require(
      execution::outstanding_work_t::untracked_t ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   auto ex1 = my_thread_pool.executor();
   auto ex2 = asio::require(ex1,
       asio::execution::outstanding_work.untracked); 





[endsect]



[section:overload8 thread_pool::basic_executor_type::require (8 of 9 overloads)]


Obtain an executor with the specified `allocator` property. 


  template<
      typename OtherAllocator>
  constexpr basic_executor_type< OtherAllocator, Bits > require(
      execution::allocator_t< OtherAllocator > a) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   auto ex1 = my_thread_pool.executor();
   auto ex2 = asio::require(ex1,
       asio::execution::allocator(my_allocator)); 





[endsect]



[section:overload9 thread_pool::basic_executor_type::require (9 of 9 overloads)]


Obtain an executor with the default `allocator` property. 


  constexpr basic_executor_type< std::allocator< void >, Bits > require(
      execution::allocator_t< void > ) const;


Do not call this function directly. It is intended for use with the [link asio.reference.require `require`] customisation point.

For example: 

   auto ex1 = my_thread_pool.executor();
   auto ex2 = asio::require(ex1,
       asio::execution::allocator); 





[endsect]


[endsect]


[section:running_in_this_thread thread_pool::basic_executor_type::running_in_this_thread]

[indexterm2 asio.indexterm.thread_pool__basic_executor_type.running_in_this_thread..running_in_this_thread..thread_pool::basic_executor_type] 
Determine whether the thread pool is running in the current thread. 


  bool running_in_this_thread() const;



[heading Return Value]
      
`true` if the current thread is running the thread pool. Otherwise returns `false`. 




[endsect]



[section:schedule thread_pool::basic_executor_type::schedule]

[indexterm2 asio.indexterm.thread_pool__basic_executor_type.schedule..schedule..thread_pool::basic_executor_type] 
Schedule function. 


  sender_type schedule() const;


Do not call this function directly. It is intended for use with the [link asio.reference.execution__schedule `execution::schedule`] customisation point.


[heading Return Value]
      
An object that satisfies the sender concept. 




[endsect]



[section:sender_type thread_pool::basic_executor_type::sender_type]

[indexterm2 asio.indexterm.thread_pool__basic_executor_type.sender_type..sender_type..thread_pool::basic_executor_type] 
The sender type, when this type is used as a scheduler. 


  typedef basic_executor_type sender_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.thread_pool__basic_executor_type.index_type [*index_type]]]
    [The bulk execution index type. ]
  
  ]

  [

    [[link asio.reference.thread_pool__basic_executor_type.sender_type [*sender_type]]]
    [The sender type, when this type is used as a scheduler. ]
  
  ]

  [

    [[link asio.reference.thread_pool__basic_executor_type.shape_type [*shape_type]]]
    [The bulk execution shape type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.thread_pool__basic_executor_type.basic_executor_type [*basic_executor_type]] [constructor]]
    [Copy constructor. 
     [hr]
     Move constructor. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.bulk_execute [*bulk_execute]]]
    [Bulk execution function. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.connect [*connect]]]
    [Connect function. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.defer [*defer]]]
    [Request the thread pool to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.dispatch [*dispatch]]]
    [Request the thread pool to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.execute [*execute]]]
    [Execution function. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.on_work_finished [*on_work_finished]]]
    [Inform the thread pool that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.on_work_started [*on_work_started]]]
    [Inform the thread pool that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.operator_eq_ [*operator=]]]
    [Assignment operator. 
     [hr]
     Move assignment operator. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.post [*post]]]
    [Request the thread pool to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.query [*query]]]
    [Query the current value of the context property. 
     [hr]
     Query the current value of the blocking property. 
     [hr]
     Query the current value of the relationship property. 
     [hr]
     Query the current value of the allocator property. 
     [hr]
     Query the occupancy (recommended number of work items) for the pool. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.query__static [*query]] [static]]
    [Query the current value of the bulk_guarantee property. 
     [hr]
     Query the current value of the mapping property. 
     [hr]
     Query the current value of the outstanding_work property. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.require [*require]]]
    [Obtain an executor with the blocking.possibly property. 
     [hr]
     Obtain an executor with the blocking.always property. 
     [hr]
     Obtain an executor with the blocking.never property. 
     [hr]
     Obtain an executor with the relationship.fork property. 
     [hr]
     Obtain an executor with the relationship.continuation property. 
     [hr]
     Obtain an executor with the outstanding_work.tracked property. 
     [hr]
     Obtain an executor with the outstanding_work.untracked property. 
     [hr]
     Obtain an executor with the specified allocator property. 
     [hr]
     Obtain an executor with the default allocator property. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the thread pool is running in the current thread. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.schedule [*schedule]]]
    [Schedule function. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type._basic_executor_type [*~basic_executor_type]] [destructor]]
    [Destructor. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.thread_pool__basic_executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.thread_pool__basic_executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[heading Requirements]

['Header: ][^asio/thread_pool.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:shape_type thread_pool::basic_executor_type::shape_type]

[indexterm2 asio.indexterm.thread_pool__basic_executor_type.shape_type..shape_type..thread_pool::basic_executor_type] 
The bulk execution shape type. 


  typedef std::size_t shape_type;



[heading Requirements]

['Header: ][^asio/thread_pool.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:_basic_executor_type thread_pool::basic_executor_type::~basic_executor_type]

[indexterm2 asio.indexterm.thread_pool__basic_executor_type._basic_executor_type..~basic_executor_type..thread_pool::basic_executor_type] 
Destructor. 


  ~basic_executor_type();



[endsect]



[endsect]

[section:time_traits_lt__ptime__gt_ time_traits< boost::posix_time::ptime >]


Time traits specialised for posix\_time. 


  template<>
  struct time_traits< boost::posix_time::ptime >


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.time_traits_lt__ptime__gt_.duration_type [*duration_type]]]
    [The duration type. ]
  
  ]

  [

    [[link asio.reference.time_traits_lt__ptime__gt_.time_type [*time_type]]]
    [The time type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.time_traits_lt__ptime__gt_.add [*add]] [static]]
    [Add a duration to a time. ]
  ]
  
  [
    [[link asio.reference.time_traits_lt__ptime__gt_.less_than [*less_than]] [static]]
    [Test whether one time is less than another. ]
  ]
  
  [
    [[link asio.reference.time_traits_lt__ptime__gt_.now [*now]] [static]]
    [Get the current time. ]
  ]
  
  [
    [[link asio.reference.time_traits_lt__ptime__gt_.subtract [*subtract]] [static]]
    [Subtract one time from another. ]
  ]
  
  [
    [[link asio.reference.time_traits_lt__ptime__gt_.to_posix_duration [*to_posix_duration]] [static]]
    [Convert to POSIX duration type. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/time_traits.hpp]

['Convenience header: ][^asio.hpp]


[section:add time_traits< boost::posix_time::ptime >::add]

[indexterm2 asio.indexterm.time_traits_lt__ptime__gt_.add..add..time_traits< boost::posix_time::ptime >] 
Add a duration to a time. 


  static time_type add(
      const time_type & t,
      const duration_type & d);



[endsect]



[section:duration_type time_traits< boost::posix_time::ptime >::duration_type]

[indexterm2 asio.indexterm.time_traits_lt__ptime__gt_.duration_type..duration_type..time_traits< boost::posix_time::ptime >] 
The duration type. 


  typedef boost::posix_time::time_duration duration_type;



[heading Requirements]

['Header: ][^asio/time_traits.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:less_than time_traits< boost::posix_time::ptime >::less_than]

[indexterm2 asio.indexterm.time_traits_lt__ptime__gt_.less_than..less_than..time_traits< boost::posix_time::ptime >] 
Test whether one time is less than another. 


  static bool less_than(
      const time_type & t1,
      const time_type & t2);



[endsect]



[section:now time_traits< boost::posix_time::ptime >::now]

[indexterm2 asio.indexterm.time_traits_lt__ptime__gt_.now..now..time_traits< boost::posix_time::ptime >] 
Get the current time. 


  static time_type now();



[endsect]



[section:subtract time_traits< boost::posix_time::ptime >::subtract]

[indexterm2 asio.indexterm.time_traits_lt__ptime__gt_.subtract..subtract..time_traits< boost::posix_time::ptime >] 
Subtract one time from another. 


  static duration_type subtract(
      const time_type & t1,
      const time_type & t2);



[endsect]



[section:time_type time_traits< boost::posix_time::ptime >::time_type]

[indexterm2 asio.indexterm.time_traits_lt__ptime__gt_.time_type..time_type..time_traits< boost::posix_time::ptime >] 
The time type. 


  typedef boost::posix_time::ptime time_type;



[heading Requirements]

['Header: ][^asio/time_traits.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:to_posix_duration time_traits< boost::posix_time::ptime >::to_posix_duration]

[indexterm2 asio.indexterm.time_traits_lt__ptime__gt_.to_posix_duration..to_posix_duration..time_traits< boost::posix_time::ptime >] 
Convert to POSIX duration type. 


  static boost::posix_time::time_duration to_posix_duration(
      const duration_type & d);



[endsect]



[endsect]


[section:transfer_all transfer_all]

[indexterm1 asio.indexterm.transfer_all..transfer_all] 
Return a completion condition function object that indicates that a read or write operation should continue until all of the data has been transferred, or until an error occurs. 


  unspecified transfer_all();


This function is used to create an object, of unspecified type, that meets CompletionCondition requirements.


[heading Example]
  
Reading until a buffer is full: 

   boost::array<char, 128> buf;
   asio::error_code ec;
   std::size_t n = asio::read(
       sock, asio::buffer(buf),
       asio::transfer_all(), ec);
   if (ec)
   {
     // An error occurred.
   }
   else
   {
     // n == 128
   }






[heading Requirements]

['Header: ][^asio/completion_condition.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:transfer_at_least transfer_at_least]

[indexterm1 asio.indexterm.transfer_at_least..transfer_at_least] 
Return a completion condition function object that indicates that a read or write operation should continue until a minimum number of bytes has been transferred, or until an error occurs. 


  unspecified transfer_at_least(
      std::size_t minimum);


This function is used to create an object, of unspecified type, that meets CompletionCondition requirements.


[heading Example]
  
Reading until a buffer is full or contains at least 64 bytes: 

   boost::array<char, 128> buf;
   asio::error_code ec;
   std::size_t n = asio::read(
       sock, asio::buffer(buf),
       asio::transfer_at_least(64), ec);
   if (ec)
   {
     // An error occurred.
   }
   else
   {
     // n >= 64 && n <= 128
   }






[heading Requirements]

['Header: ][^asio/completion_condition.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:transfer_exactly transfer_exactly]

[indexterm1 asio.indexterm.transfer_exactly..transfer_exactly] 
Return a completion condition function object that indicates that a read or write operation should continue until an exact number of bytes has been transferred, or until an error occurs. 


  unspecified transfer_exactly(
      std::size_t size);


This function is used to create an object, of unspecified type, that meets CompletionCondition requirements.


[heading Example]
  
Reading until a buffer is full or contains exactly 64 bytes: 

   boost::array<char, 128> buf;
   asio::error_code ec;
   std::size_t n = asio::read(
       sock, asio::buffer(buf),
       asio::transfer_exactly(64), ec);
   if (ec)
   {
     // An error occurred.
   }
   else
   {
     // n == 64
   }






[heading Requirements]

['Header: ][^asio/completion_condition.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:use_awaitable use_awaitable]

[indexterm1 asio.indexterm.use_awaitable..use_awaitable] 
A completion token object that represents the currently executing coroutine. 


  constexpr use_awaitable_t use_awaitable;


See the documentation for [link asio.reference.use_awaitable_t `use_awaitable_t`] for a usage example. 

[heading Requirements]

['Header: ][^asio/use_awaitable.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:use_awaitable_t use_awaitable_t]


A completion token that represents the currently executing coroutine. 


  template<
      typename ``[link asio.reference.Executor1 Executor]`` = any_io_executor>
  struct use_awaitable_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.use_awaitable_t__executor_with_default [*executor_with_default]]]
    [Adapts an executor to add the use_awaitable_t completion token as the default. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.use_awaitable_t.as_default_on [*as_default_on]] [static]]
    [Function helper to adapt an I/O object to use use_awaitable_t as its default completion token type. ]
  ]
  
  [
    [[link asio.reference.use_awaitable_t.use_awaitable_t [*use_awaitable_t]] [constructor]]
    [Default constructor. 
     [hr]
     Constructor used to specify file name, line, and function name. ]
  ]
  
]

The `use_awaitable_t` class, with its value `use_awaitable`, is used to represent the currently executing coroutine. This completion token may be passed as a handler to an asynchronous operation. For example:



   awaitable<void> my_coroutine()
   {
     std::size_t n = co_await my_socket.async_read_some(buffer, use_awaitable);
     ...
   } 




When used with co\_await, the initiating function (`async_read_some` in the above example) suspends the current coroutine. The coroutine is resumed when the asynchronous operation completes, and the result of the operation is returned. 

[heading Requirements]

['Header: ][^asio/use_awaitable.hpp]

['Convenience header: ][^asio.hpp]


[section:as_default_on use_awaitable_t::as_default_on]

[indexterm2 asio.indexterm.use_awaitable_t.as_default_on..as_default_on..use_awaitable_t] 
Function helper to adapt an I/O object to use `use_awaitable_t` as its default completion token type. 


  template<
      typename T>
  static decay< T >::type::template rebind_executor< executor_with_default< typename decay< T >::type::executor_type > >::other as_default_on(
      T && object);



[endsect]


[section:use_awaitable_t use_awaitable_t::use_awaitable_t]

[indexterm2 asio.indexterm.use_awaitable_t.use_awaitable_t..use_awaitable_t..use_awaitable_t] 
Default constructor. 


  constexpr ``[link asio.reference.use_awaitable_t.use_awaitable_t.overload1 use_awaitable_t]``();
  ``  [''''&raquo;''' [link asio.reference.use_awaitable_t.use_awaitable_t.overload1 more...]]``


Constructor used to specify file name, line, and function name. 


  constexpr ``[link asio.reference.use_awaitable_t.use_awaitable_t.overload2 use_awaitable_t]``(
      const char * file_name,
      int line,
      const char * function_name);
  ``  [''''&raquo;''' [link asio.reference.use_awaitable_t.use_awaitable_t.overload2 more...]]``


[section:overload1 use_awaitable_t::use_awaitable_t (1 of 2 overloads)]


Default constructor. 


  constexpr use_awaitable_t();



[endsect]



[section:overload2 use_awaitable_t::use_awaitable_t (2 of 2 overloads)]


Constructor used to specify file name, line, and function name. 


  constexpr use_awaitable_t(
      const char * file_name,
      int line,
      const char * function_name);



[endsect]


[endsect]


[endsect]

[section:use_awaitable_t__executor_with_default use_awaitable_t::executor_with_default]


Adapts an executor to add the `use_awaitable_t` completion token as the default. 


  template<
      typename ``[link asio.reference.Executor1 InnerExecutor]``>
  struct executor_with_default


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.use_awaitable_t__executor_with_default.default_completion_token_type [*default_completion_token_type]]]
    [Specify use_awaitable_t as the default completion token type. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.use_awaitable_t__executor_with_default.executor_with_default [*executor_with_default]] [constructor]]
    [Construct the adapted executor from the inner executor type. 
     [hr]
     Convert the specified executor to the inner executor type, then use that to construct the adapted executor. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/use_awaitable.hpp]

['Convenience header: ][^asio.hpp]


[section:default_completion_token_type use_awaitable_t::executor_with_default::default_completion_token_type]

[indexterm2 asio.indexterm.use_awaitable_t__executor_with_default.default_completion_token_type..default_completion_token_type..use_awaitable_t::executor_with_default] 
Specify `use_awaitable_t` as the default completion token type. 


  typedef use_awaitable_t default_completion_token_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.use_awaitable_t__executor_with_default [*executor_with_default]]]
    [Adapts an executor to add the use_awaitable_t completion token as the default. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.use_awaitable_t.as_default_on [*as_default_on]] [static]]
    [Function helper to adapt an I/O object to use use_awaitable_t as its default completion token type. ]
  ]
  
  [
    [[link asio.reference.use_awaitable_t.use_awaitable_t [*use_awaitable_t]] [constructor]]
    [Default constructor. 
     [hr]
     Constructor used to specify file name, line, and function name. ]
  ]
  
]

The `use_awaitable_t` class, with its value `use_awaitable`, is used to represent the currently executing coroutine. This completion token may be passed as a handler to an asynchronous operation. For example:



   awaitable<void> my_coroutine()
   {
     std::size_t n = co_await my_socket.async_read_some(buffer, use_awaitable);
     ...
   } 




When used with co\_await, the initiating function (`async_read_some` in the above example) suspends the current coroutine. The coroutine is resumed when the asynchronous operation completes, and the result of the operation is returned. 


[heading Requirements]

['Header: ][^asio/use_awaitable.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:executor_with_default use_awaitable_t::executor_with_default::executor_with_default]

[indexterm2 asio.indexterm.use_awaitable_t__executor_with_default.executor_with_default..executor_with_default..use_awaitable_t::executor_with_default] 
Construct the adapted executor from the inner executor type. 


  ``[link asio.reference.use_awaitable_t__executor_with_default.executor_with_default.overload1 executor_with_default]``(
      const InnerExecutor & ex);
  ``  [''''&raquo;''' [link asio.reference.use_awaitable_t__executor_with_default.executor_with_default.overload1 more...]]``


Convert the specified executor to the inner executor type, then use that to construct the adapted executor. 


  template<
      typename ``[link asio.reference.Executor1 OtherExecutor]``>
  ``[link asio.reference.use_awaitable_t__executor_with_default.executor_with_default.overload2 executor_with_default]``(
      const OtherExecutor & ex,
      typename enable_if< is_convertible< OtherExecutor, InnerExecutor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.use_awaitable_t__executor_with_default.executor_with_default.overload2 more...]]``


[section:overload1 use_awaitable_t::executor_with_default::executor_with_default (1 of 2 overloads)]


Construct the adapted executor from the inner executor type. 


  executor_with_default(
      const InnerExecutor & ex);



[endsect]



[section:overload2 use_awaitable_t::executor_with_default::executor_with_default (2 of 2 overloads)]


Convert the specified executor to the inner executor type, then use that to construct the adapted executor. 


  template<
      typename ``[link asio.reference.Executor1 OtherExecutor]``>
  executor_with_default(
      const OtherExecutor & ex,
      typename enable_if< is_convertible< OtherExecutor, InnerExecutor >::value >::type *  = 0);



[endsect]


[endsect]


[endsect]


[section:use_future use_future]

[indexterm1 asio.indexterm.use_future..use_future] 
A special value, similar to std::nothrow. 


  constexpr use_future_t use_future;


See the documentation for [link asio.reference.use_future_t `use_future_t`] for a usage example. 

[heading Requirements]

['Header: ][^asio/use_future.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:use_future_t use_future_t]


Class used to specify that an asynchronous operation should return a future. 


  template<
      typename Allocator = std::allocator<void>>
  class use_future_t


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.use_future_t.allocator_type [*allocator_type]]]
    [The allocator type. The allocator is used when constructing the std::promise object for a given asynchronous operation. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.use_future_t.get_allocator [*get_allocator]]]
    [Obtain allocator. ]
  ]
  
  [
    [[link asio.reference.use_future_t.operator_lp__rp_ [*operator()]]]
    [Wrap a function object in a packaged task. ]
  ]
  
  [
    [[link asio.reference.use_future_t.operator_lb__rb_ [*operator\[\]]]]
    [(Deprecated: Use rebind().) Specify an alternate allocator. ]
  ]
  
  [
    [[link asio.reference.use_future_t.rebind [*rebind]]]
    [Specify an alternate allocator. ]
  ]
  
  [
    [[link asio.reference.use_future_t.use_future_t [*use_future_t]] [constructor]]
    [Construct using default-constructed allocator. 
     [hr]
     Construct using specified allocator. ]
  ]
  
]

The [link asio.reference.use_future_t `use_future_t`] class is used to indicate that an asynchronous operation should return a std::future object. A [link asio.reference.use_future_t `use_future_t`] object may be passed as a handler to an asynchronous operation, typically using the special value `asio::use_future`. For example:



   std::future<std::size_t> my_future
     = my_socket.async_read_some(my_buffer, asio::use_future); 




The initiating function (async\_read\_some in the above example) returns a future that will receive the result of the operation. If the operation completes with an [link asio.reference.error_code `error_code`] indicating failure, it is converted into a [link asio.reference.system_error `system_error`] and passed back to the caller via the future. 

[heading Requirements]

['Header: ][^asio/use_future.hpp]

['Convenience header: ][^asio.hpp]


[section:allocator_type use_future_t::allocator_type]

[indexterm2 asio.indexterm.use_future_t.allocator_type..allocator_type..use_future_t] 
The allocator type. The allocator is used when constructing the `std::promise` object for a given asynchronous operation. 


  typedef Allocator allocator_type;



[heading Requirements]

['Header: ][^asio/use_future.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:get_allocator use_future_t::get_allocator]

[indexterm2 asio.indexterm.use_future_t.get_allocator..get_allocator..use_future_t] 
Obtain allocator. 


  allocator_type get_allocator() const;



[endsect]



[section:operator_lp__rp_ use_future_t::operator()]

[indexterm2 asio.indexterm.use_future_t.operator_lp__rp_..operator()..use_future_t] 
Wrap a function object in a packaged task. 


  template<
      typename Function>
  unspecified operator()(
      Function && f) const;


The `package` function is used to adapt a function object as a packaged task. When this adapter is passed as a completion token to an asynchronous operation, the result of the function object is retuned via a std::future.


[heading Example]
  




   std::future<std::size_t> fut =
     my_socket.async_read_some(buffer,
       use_future([](asio::error_code ec, std::size_t n)
         {
           return ec ? 0 : n;
         }));
   ...
   std::size_t n = fut.get(); 





[endsect]



[section:operator_lb__rb_ use_future_t::operator\[\]]

[indexterm2 asio.indexterm.use_future_t.operator_lb__rb_..operator\[\]..use_future_t] 
(Deprecated: Use `rebind()`.) Specify an alternate allocator. 


  template<
      typename OtherAllocator>
  use_future_t< OtherAllocator > operator[](
      const OtherAllocator & allocator) const;



[endsect]



[section:rebind use_future_t::rebind]

[indexterm2 asio.indexterm.use_future_t.rebind..rebind..use_future_t] 
Specify an alternate allocator. 


  template<
      typename OtherAllocator>
  use_future_t< OtherAllocator > rebind(
      const OtherAllocator & allocator) const;



[endsect]


[section:use_future_t use_future_t::use_future_t]

[indexterm2 asio.indexterm.use_future_t.use_future_t..use_future_t..use_future_t] 
Construct using default-constructed allocator. 


  constexpr ``[link asio.reference.use_future_t.use_future_t.overload1 use_future_t]``();
  ``  [''''&raquo;''' [link asio.reference.use_future_t.use_future_t.overload1 more...]]``


Construct using specified allocator. 


  explicit ``[link asio.reference.use_future_t.use_future_t.overload2 use_future_t]``(
      const Allocator & allocator);
  ``  [''''&raquo;''' [link asio.reference.use_future_t.use_future_t.overload2 more...]]``


[section:overload1 use_future_t::use_future_t (1 of 2 overloads)]


Construct using default-constructed allocator. 


  constexpr use_future_t();



[endsect]



[section:overload2 use_future_t::use_future_t (2 of 2 overloads)]


Construct using specified allocator. 


  use_future_t(
      const Allocator & allocator);



[endsect]


[endsect]


[endsect]

[section:uses_executor uses_executor]


The [link asio.reference.uses_executor `uses_executor`] trait detects whether a type T has an associated executor that is convertible from type Executor. 


  template<
      typename T,
      typename ``[link asio.reference.Executor1 Executor]``>
  struct uses_executor :
    public false_type


Meets the BinaryTypeTrait requirements. The Asio library provides a definition that is derived from `false_type`. A program may specialize this template to derive from true\_type for a user-defined type T that can be constructed with an executor, where the first argument of a constructor has type [link asio.reference.executor_arg_t `executor_arg_t`] and the second argument is convertible from type Executor. 

[heading Requirements]

['Header: ][^asio/uses_executor.hpp]

['Convenience header: ][^asio.hpp]


[endsect]

[section:wait_traits wait_traits]


Wait traits suitable for use with the [link asio.reference.basic_waitable_timer `basic_waitable_timer`] class template. 


  template<
      typename Clock>
  struct wait_traits


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.wait_traits.to_wait_duration [*to_wait_duration]] [static]]
    [Convert a clock duration into a duration used for waiting. ]
  ]
  
]

[heading Requirements]

['Header: ][^asio/wait_traits.hpp]

['Convenience header: ][^asio.hpp]

[section:to_wait_duration wait_traits::to_wait_duration]

[indexterm2 asio.indexterm.wait_traits.to_wait_duration..to_wait_duration..wait_traits] 
Convert a clock duration into a duration used for waiting. 


  static Clock::duration ``[link asio.reference.wait_traits.to_wait_duration.overload1 to_wait_duration]``(
      const typename Clock::duration & d);
  ``  [''''&raquo;''' [link asio.reference.wait_traits.to_wait_duration.overload1 more...]]``

  static Clock::duration ``[link asio.reference.wait_traits.to_wait_duration.overload2 to_wait_duration]``(
      const typename Clock::time_point & t);
  ``  [''''&raquo;''' [link asio.reference.wait_traits.to_wait_duration.overload2 more...]]``


[section:overload1 wait_traits::to_wait_duration (1 of 2 overloads)]


Convert a clock duration into a duration used for waiting. 


  static Clock::duration to_wait_duration(
      const typename Clock::duration & d);



[heading Return Value]
      
`d`. 




[endsect]



[section:overload2 wait_traits::to_wait_duration (2 of 2 overloads)]


Convert a clock duration into a duration used for waiting. 


  static Clock::duration to_wait_duration(
      const typename Clock::time_point & t);



[heading Return Value]
      
`d`. 




[endsect]


[endsect]


[endsect]

[section:windows__basic_object_handle windows::basic_object_handle]


Provides object-oriented handle functionality. 


  template<
      typename ``[link asio.reference.Executor1 Executor]`` = any_io_executor>
  class basic_object_handle


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.windows__basic_object_handle__rebind_executor [*rebind_executor]]]
    [Rebinds the handle type to another executor. ]
  
  ]

  [

    [[link asio.reference.windows__basic_object_handle.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_object_handle.lowest_layer_type [*lowest_layer_type]]]
    [An object handle is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.windows__basic_object_handle.native_handle_type [*native_handle_type]]]
    [The native representation of a handle. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__basic_object_handle.assign [*assign]]]
    [Assign an existing native handle to the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.async_wait [*async_wait]]]
    [Start an asynchronous wait on the object handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.basic_object_handle [*basic_object_handle]] [constructor]]
    [Construct an object handle without opening it. 
     [hr]
     Construct an object handle on an existing native handle. 
     [hr]
     Move-construct an object handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.close [*close]]]
    [Close the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.native_handle [*native_handle]]]
    [Get the native handle representation. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.operator_eq_ [*operator=]]]
    [Move-assign an object handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.wait [*wait]]]
    [Perform a blocking wait on the object handle. ]
  ]
  
]

The [link asio.reference.windows__basic_object_handle `windows::basic_object_handle`] class provides asynchronous and blocking object-oriented handle functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/windows/basic_object_handle.hpp]

['Convenience header: ][^asio.hpp]

[section:assign windows::basic_object_handle::assign]

[indexterm2 asio.indexterm.windows__basic_object_handle.assign..assign..windows::basic_object_handle] 
Assign an existing native handle to the handle. 


  void ``[link asio.reference.windows__basic_object_handle.assign.overload1 assign]``(
      const native_handle_type & handle);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.assign.overload1 more...]]``

  void ``[link asio.reference.windows__basic_object_handle.assign.overload2 assign]``(
      const native_handle_type & handle,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.assign.overload2 more...]]``


[section:overload1 windows::basic_object_handle::assign (1 of 2 overloads)]


Assign an existing native handle to the handle. 


  void assign(
      const native_handle_type & handle);



[endsect]



[section:overload2 windows::basic_object_handle::assign (2 of 2 overloads)]


Assign an existing native handle to the handle. 


  void assign(
      const native_handle_type & handle,
      asio::error_code & ec);



[endsect]


[endsect]


[section:async_wait windows::basic_object_handle::async_wait]

[indexterm2 asio.indexterm.windows__basic_object_handle.async_wait..async_wait..windows::basic_object_handle] 
Start an asynchronous wait on the object handle. 


  template<
      typename ``[link asio.reference.WaitHandler WaitHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_wait(
      WaitHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is be used to initiate an asynchronous wait against the object handle. It always returns immediately.


[heading Parameters]
    

[variablelist
  
[[handler][The handler to be called when the object handle is set to the signalled state. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error // Result of operation.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`]. ]]

]




[endsect]


[section:basic_object_handle windows::basic_object_handle::basic_object_handle]

[indexterm2 asio.indexterm.windows__basic_object_handle.basic_object_handle..basic_object_handle..windows::basic_object_handle] 
Construct an object handle without opening it. 


  explicit ``[link asio.reference.windows__basic_object_handle.basic_object_handle.overload1 basic_object_handle]``(
      const executor_type & ex);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.basic_object_handle.overload1 more...]]``

  template<
      typename ExecutionContext>
  explicit ``[link asio.reference.windows__basic_object_handle.basic_object_handle.overload2 basic_object_handle]``(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value, basic_object_handle >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.basic_object_handle.overload2 more...]]``


Construct an object handle on an existing native handle. 


  ``[link asio.reference.windows__basic_object_handle.basic_object_handle.overload3 basic_object_handle]``(
      const executor_type & ex,
      const native_handle_type & native_handle);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.basic_object_handle.overload3 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.windows__basic_object_handle.basic_object_handle.overload4 basic_object_handle]``(
      ExecutionContext & context,
      const native_handle_type & native_handle,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.basic_object_handle.overload4 more...]]``


Move-construct an object handle from another. 


  ``[link asio.reference.windows__basic_object_handle.basic_object_handle.overload5 basic_object_handle]``(
      basic_object_handle && other);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.basic_object_handle.overload5 more...]]``


[section:overload1 windows::basic_object_handle::basic_object_handle (1 of 5 overloads)]


Construct an object handle without opening it. 


  basic_object_handle(
      const executor_type & ex);


This constructor creates an object handle without opening it.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the object handle will use, by default, to dispatch handlers for any asynchronous operations performed on the object handle. ]]

]




[endsect]



[section:overload2 windows::basic_object_handle::basic_object_handle (2 of 5 overloads)]


Construct an object handle without opening it. 


  template<
      typename ExecutionContext>
  basic_object_handle(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value, basic_object_handle >::type *  = 0);


This constructor creates an object handle without opening it.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the object handle will use, by default, to dispatch handlers for any asynchronous operations performed on the object handle. ]]

]




[endsect]



[section:overload3 windows::basic_object_handle::basic_object_handle (3 of 5 overloads)]


Construct an object handle on an existing native handle. 


  basic_object_handle(
      const executor_type & ex,
      const native_handle_type & native_handle);


This constructor creates an object handle object to hold an existing native handle.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the object handle will use, by default, to dispatch handlers for any asynchronous operations performed on the object handle.]]

[[native_handle][The new underlying handle implementation.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload4 windows::basic_object_handle::basic_object_handle (4 of 5 overloads)]


Construct an object handle on an existing native handle. 


  template<
      typename ExecutionContext>
  basic_object_handle(
      ExecutionContext & context,
      const native_handle_type & native_handle,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates an object handle object to hold an existing native handle.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the object handle will use, by default, to dispatch handlers for any asynchronous operations performed on the object handle.]]

[[native_handle][The new underlying handle implementation.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload5 windows::basic_object_handle::basic_object_handle (5 of 5 overloads)]


Move-construct an object handle from another. 


  basic_object_handle(
      basic_object_handle && other);


This constructor moves an object handle from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other object handle object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_object_handle(const executor_type&)` constructor. 




[endsect]


[endsect]

[section:cancel windows::basic_object_handle::cancel]

[indexterm2 asio.indexterm.windows__basic_object_handle.cancel..cancel..windows::basic_object_handle] 
Cancel all asynchronous operations associated with the handle. 


  void ``[link asio.reference.windows__basic_object_handle.cancel.overload1 cancel]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.cancel.overload1 more...]]``

  void ``[link asio.reference.windows__basic_object_handle.cancel.overload2 cancel]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.cancel.overload2 more...]]``


[section:overload1 windows::basic_object_handle::cancel (1 of 2 overloads)]


Cancel all asynchronous operations associated with the handle. 


  void cancel();


This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 windows::basic_object_handle::cancel (2 of 2 overloads)]


Cancel all asynchronous operations associated with the handle. 


  void cancel(
      asio::error_code & ec);


This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. ]]

]




[endsect]


[endsect]

[section:close windows::basic_object_handle::close]

[indexterm2 asio.indexterm.windows__basic_object_handle.close..close..windows::basic_object_handle] 
Close the handle. 


  void ``[link asio.reference.windows__basic_object_handle.close.overload1 close]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.close.overload1 more...]]``

  void ``[link asio.reference.windows__basic_object_handle.close.overload2 close]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.close.overload2 more...]]``


[section:overload1 windows::basic_object_handle::close (1 of 2 overloads)]


Close the handle. 


  void close();


This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 windows::basic_object_handle::close (2 of 2 overloads)]


Close the handle. 


  void close(
      asio::error_code & ec);


This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. ]]

]




[endsect]


[endsect]


[section:executor_type windows::basic_object_handle::executor_type]

[indexterm2 asio.indexterm.windows__basic_object_handle.executor_type..executor_type..windows::basic_object_handle] 
The type of the executor associated with the object. 


  typedef Executor executor_type;



[heading Requirements]

['Header: ][^asio/windows/basic_object_handle.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:get_executor windows::basic_object_handle::get_executor]

[indexterm2 asio.indexterm.windows__basic_object_handle.get_executor..get_executor..windows::basic_object_handle] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]



[section:is_open windows::basic_object_handle::is_open]

[indexterm2 asio.indexterm.windows__basic_object_handle.is_open..is_open..windows::basic_object_handle] 
Determine whether the handle is open. 


  bool is_open() const;



[endsect]


[section:lowest_layer windows::basic_object_handle::lowest_layer]

[indexterm2 asio.indexterm.windows__basic_object_handle.lowest_layer..lowest_layer..windows::basic_object_handle] 
Get a reference to the lowest layer. 


  lowest_layer_type & ``[link asio.reference.windows__basic_object_handle.lowest_layer.overload1 lowest_layer]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.lowest_layer.overload1 more...]]``


Get a const reference to the lowest layer. 


  const lowest_layer_type & ``[link asio.reference.windows__basic_object_handle.lowest_layer.overload2 lowest_layer]``() const;
  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.lowest_layer.overload2 more...]]``


[section:overload1 windows::basic_object_handle::lowest_layer (1 of 2 overloads)]


Get a reference to the lowest layer. 


  lowest_layer_type & lowest_layer();


This function returns a reference to the lowest layer in a stack of layers. Since an object handle cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]



[section:overload2 windows::basic_object_handle::lowest_layer (2 of 2 overloads)]


Get a const reference to the lowest layer. 


  const lowest_layer_type & lowest_layer() const;


This function returns a const reference to the lowest layer in a stack of layers. Since an object handle cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]


[endsect]


[section:lowest_layer_type windows::basic_object_handle::lowest_layer_type]

[indexterm2 asio.indexterm.windows__basic_object_handle.lowest_layer_type..lowest_layer_type..windows::basic_object_handle] 
An object handle is always the lowest layer. 


  typedef basic_object_handle lowest_layer_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.windows__basic_object_handle__rebind_executor [*rebind_executor]]]
    [Rebinds the handle type to another executor. ]
  
  ]

  [

    [[link asio.reference.windows__basic_object_handle.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_object_handle.lowest_layer_type [*lowest_layer_type]]]
    [An object handle is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.windows__basic_object_handle.native_handle_type [*native_handle_type]]]
    [The native representation of a handle. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__basic_object_handle.assign [*assign]]]
    [Assign an existing native handle to the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.async_wait [*async_wait]]]
    [Start an asynchronous wait on the object handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.basic_object_handle [*basic_object_handle]] [constructor]]
    [Construct an object handle without opening it. 
     [hr]
     Construct an object handle on an existing native handle. 
     [hr]
     Move-construct an object handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.close [*close]]]
    [Close the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.native_handle [*native_handle]]]
    [Get the native handle representation. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.operator_eq_ [*operator=]]]
    [Move-assign an object handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.wait [*wait]]]
    [Perform a blocking wait on the object handle. ]
  ]
  
]

The [link asio.reference.windows__basic_object_handle `windows::basic_object_handle`] class provides asynchronous and blocking object-oriented handle functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/windows/basic_object_handle.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:native_handle windows::basic_object_handle::native_handle]

[indexterm2 asio.indexterm.windows__basic_object_handle.native_handle..native_handle..windows::basic_object_handle] 
Get the native handle representation. 


  native_handle_type native_handle();


This function may be used to obtain the underlying representation of the handle. This is intended to allow access to native handle functionality that is not otherwise provided. 


[endsect]



[section:native_handle_type windows::basic_object_handle::native_handle_type]

[indexterm2 asio.indexterm.windows__basic_object_handle.native_handle_type..native_handle_type..windows::basic_object_handle] 
The native representation of a handle. 


  typedef implementation_defined native_handle_type;



[heading Requirements]

['Header: ][^asio/windows/basic_object_handle.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq_ windows::basic_object_handle::operator=]

[indexterm2 asio.indexterm.windows__basic_object_handle.operator_eq_..operator=..windows::basic_object_handle] 
Move-assign an object handle from another. 


  basic_object_handle & operator=(
      basic_object_handle && other);


This assignment operator moves an object handle from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other object handle object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_object_handle(const executor_type&)` constructor. 




[endsect]


[section:wait windows::basic_object_handle::wait]

[indexterm2 asio.indexterm.windows__basic_object_handle.wait..wait..windows::basic_object_handle] 
Perform a blocking wait on the object handle. 


  void ``[link asio.reference.windows__basic_object_handle.wait.overload1 wait]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.wait.overload1 more...]]``

  void ``[link asio.reference.windows__basic_object_handle.wait.overload2 wait]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.wait.overload2 more...]]``


[section:overload1 windows::basic_object_handle::wait (1 of 2 overloads)]


Perform a blocking wait on the object handle. 


  void wait();


This function is used to wait for the object handle to be set to the signalled state. This function blocks and does not return until the object handle has been set to the signalled state.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 windows::basic_object_handle::wait (2 of 2 overloads)]


Perform a blocking wait on the object handle. 


  void wait(
      asio::error_code & ec);


This function is used to wait for the object handle to be set to the signalled state. This function blocks and does not return until the object handle has been set to the signalled state.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. ]]

]




[endsect]


[endsect]


[endsect]

[section:windows__basic_object_handle__rebind_executor windows::basic_object_handle::rebind_executor]


Rebinds the handle type to another executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  struct rebind_executor


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.windows__basic_object_handle__rebind_executor.other [*other]]]
    [The handle type when rebound to the specified executor. ]
  
  ]

]

[heading Requirements]

['Header: ][^asio/windows/basic_object_handle.hpp]

['Convenience header: ][^asio.hpp]


[section:other windows::basic_object_handle::rebind_executor::other]

[indexterm2 asio.indexterm.windows__basic_object_handle__rebind_executor.other..other..windows::basic_object_handle::rebind_executor] 
The handle type when rebound to the specified executor. 


  typedef basic_object_handle< Executor1 > other;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.windows__basic_object_handle__rebind_executor [*rebind_executor]]]
    [Rebinds the handle type to another executor. ]
  
  ]

  [

    [[link asio.reference.windows__basic_object_handle.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_object_handle.lowest_layer_type [*lowest_layer_type]]]
    [An object handle is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.windows__basic_object_handle.native_handle_type [*native_handle_type]]]
    [The native representation of a handle. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__basic_object_handle.assign [*assign]]]
    [Assign an existing native handle to the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.async_wait [*async_wait]]]
    [Start an asynchronous wait on the object handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.basic_object_handle [*basic_object_handle]] [constructor]]
    [Construct an object handle without opening it. 
     [hr]
     Construct an object handle on an existing native handle. 
     [hr]
     Move-construct an object handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.close [*close]]]
    [Close the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.native_handle [*native_handle]]]
    [Get the native handle representation. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.operator_eq_ [*operator=]]]
    [Move-assign an object handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.wait [*wait]]]
    [Perform a blocking wait on the object handle. ]
  ]
  
]

The [link asio.reference.windows__basic_object_handle `windows::basic_object_handle`] class provides asynchronous and blocking object-oriented handle functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/windows/basic_object_handle.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:windows__basic_overlapped_handle windows::basic_overlapped_handle]


Provides Windows handle functionality for objects that support overlapped I/O. 


  template<
      typename ``[link asio.reference.Executor1 Executor]`` = any_io_executor>
  class basic_overlapped_handle


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.windows__basic_overlapped_handle__rebind_executor [*rebind_executor]]]
    [Rebinds the handle type to another executor. ]
  
  ]

  [

    [[link asio.reference.windows__basic_overlapped_handle.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_overlapped_handle.lowest_layer_type [*lowest_layer_type]]]
    [An overlapped_handle is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.windows__basic_overlapped_handle.native_handle_type [*native_handle_type]]]
    [The native representation of a handle. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__basic_overlapped_handle.assign [*assign]]]
    [Assign an existing native handle to the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.basic_overlapped_handle [*basic_overlapped_handle]] [constructor]]
    [Construct an overlapped handle without opening it. 
     [hr]
     Construct an overlapped handle on an existing native handle. 
     [hr]
     Move-construct an overlapped handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.close [*close]]]
    [Close the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.native_handle [*native_handle]]]
    [Get the native handle representation. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.operator_eq_ [*operator=]]]
    [Move-assign an overlapped handle from another. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__basic_overlapped_handle._basic_overlapped_handle [*~basic_overlapped_handle]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

The [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] class provides the ability to wrap a Windows handle. The underlying object referred to by the handle must support overlapped I/O.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/windows/basic_overlapped_handle.hpp]

['Convenience header: ][^asio.hpp]

[section:assign windows::basic_overlapped_handle::assign]

[indexterm2 asio.indexterm.windows__basic_overlapped_handle.assign..assign..windows::basic_overlapped_handle] 
Assign an existing native handle to the handle. 


  void ``[link asio.reference.windows__basic_overlapped_handle.assign.overload1 assign]``(
      const native_handle_type & handle);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_overlapped_handle.assign.overload1 more...]]``

  void ``[link asio.reference.windows__basic_overlapped_handle.assign.overload2 assign]``(
      const native_handle_type & handle,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_overlapped_handle.assign.overload2 more...]]``


[section:overload1 windows::basic_overlapped_handle::assign (1 of 2 overloads)]


Assign an existing native handle to the handle. 


  void assign(
      const native_handle_type & handle);



[endsect]



[section:overload2 windows::basic_overlapped_handle::assign (2 of 2 overloads)]


Assign an existing native handle to the handle. 


  void assign(
      const native_handle_type & handle,
      asio::error_code & ec);



[endsect]


[endsect]

[section:basic_overlapped_handle windows::basic_overlapped_handle::basic_overlapped_handle]

[indexterm2 asio.indexterm.windows__basic_overlapped_handle.basic_overlapped_handle..basic_overlapped_handle..windows::basic_overlapped_handle] 
Construct an overlapped handle without opening it. 


  explicit ``[link asio.reference.windows__basic_overlapped_handle.basic_overlapped_handle.overload1 basic_overlapped_handle]``(
      const executor_type & ex);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_overlapped_handle.basic_overlapped_handle.overload1 more...]]``

  template<
      typename ExecutionContext>
  explicit ``[link asio.reference.windows__basic_overlapped_handle.basic_overlapped_handle.overload2 basic_overlapped_handle]``(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value, basic_overlapped_handle >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_overlapped_handle.basic_overlapped_handle.overload2 more...]]``


Construct an overlapped handle on an existing native handle. 


  ``[link asio.reference.windows__basic_overlapped_handle.basic_overlapped_handle.overload3 basic_overlapped_handle]``(
      const executor_type & ex,
      const native_handle_type & native_handle);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_overlapped_handle.basic_overlapped_handle.overload3 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.windows__basic_overlapped_handle.basic_overlapped_handle.overload4 basic_overlapped_handle]``(
      ExecutionContext & context,
      const native_handle_type & native_handle,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_overlapped_handle.basic_overlapped_handle.overload4 more...]]``


Move-construct an overlapped handle from another. 


  ``[link asio.reference.windows__basic_overlapped_handle.basic_overlapped_handle.overload5 basic_overlapped_handle]``(
      basic_overlapped_handle && other);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_overlapped_handle.basic_overlapped_handle.overload5 more...]]``


[section:overload1 windows::basic_overlapped_handle::basic_overlapped_handle (1 of 5 overloads)]


Construct an overlapped handle without opening it. 


  basic_overlapped_handle(
      const executor_type & ex);


This constructor creates an overlapped handle without opening it.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the overlapped handle will use, by default, to dispatch handlers for any asynchronous operations performed on the overlapped handle. ]]

]




[endsect]



[section:overload2 windows::basic_overlapped_handle::basic_overlapped_handle (2 of 5 overloads)]


Construct an overlapped handle without opening it. 


  template<
      typename ExecutionContext>
  basic_overlapped_handle(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value, basic_overlapped_handle >::type *  = 0);


This constructor creates an overlapped handle without opening it.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the overlapped handle will use, by default, to dispatch handlers for any asynchronous operations performed on the overlapped handle. ]]

]




[endsect]



[section:overload3 windows::basic_overlapped_handle::basic_overlapped_handle (3 of 5 overloads)]


Construct an overlapped handle on an existing native handle. 


  basic_overlapped_handle(
      const executor_type & ex,
      const native_handle_type & native_handle);


This constructor creates an overlapped handle object to hold an existing native handle.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the overlapped handle will use, by default, to dispatch handlers for any asynchronous operations performed on the overlapped handle.]]

[[native_handle][The new underlying handle implementation.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload4 windows::basic_overlapped_handle::basic_overlapped_handle (4 of 5 overloads)]


Construct an overlapped handle on an existing native handle. 


  template<
      typename ExecutionContext>
  basic_overlapped_handle(
      ExecutionContext & context,
      const native_handle_type & native_handle,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates an overlapped handle object to hold an existing native handle.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the overlapped handle will use, by default, to dispatch handlers for any asynchronous operations performed on the overlapped handle.]]

[[native_handle][The new underlying handle implementation.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload5 windows::basic_overlapped_handle::basic_overlapped_handle (5 of 5 overloads)]


Move-construct an overlapped handle from another. 


  basic_overlapped_handle(
      basic_overlapped_handle && other);


This constructor moves a handle from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other overlapped handle object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `overlapped_handle(const executor_type&)` constructor. 




[endsect]


[endsect]

[section:cancel windows::basic_overlapped_handle::cancel]

[indexterm2 asio.indexterm.windows__basic_overlapped_handle.cancel..cancel..windows::basic_overlapped_handle] 
Cancel all asynchronous operations associated with the handle. 


  void ``[link asio.reference.windows__basic_overlapped_handle.cancel.overload1 cancel]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_overlapped_handle.cancel.overload1 more...]]``

  void ``[link asio.reference.windows__basic_overlapped_handle.cancel.overload2 cancel]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_overlapped_handle.cancel.overload2 more...]]``


[section:overload1 windows::basic_overlapped_handle::cancel (1 of 2 overloads)]


Cancel all asynchronous operations associated with the handle. 


  void cancel();


This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 windows::basic_overlapped_handle::cancel (2 of 2 overloads)]


Cancel all asynchronous operations associated with the handle. 


  void cancel(
      asio::error_code & ec);


This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. ]]

]




[endsect]


[endsect]

[section:close windows::basic_overlapped_handle::close]

[indexterm2 asio.indexterm.windows__basic_overlapped_handle.close..close..windows::basic_overlapped_handle] 
Close the handle. 


  void ``[link asio.reference.windows__basic_overlapped_handle.close.overload1 close]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_overlapped_handle.close.overload1 more...]]``

  void ``[link asio.reference.windows__basic_overlapped_handle.close.overload2 close]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_overlapped_handle.close.overload2 more...]]``


[section:overload1 windows::basic_overlapped_handle::close (1 of 2 overloads)]


Close the handle. 


  void close();


This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 windows::basic_overlapped_handle::close (2 of 2 overloads)]


Close the handle. 


  void close(
      asio::error_code & ec);


This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. ]]

]




[endsect]


[endsect]


[section:executor_type windows::basic_overlapped_handle::executor_type]

[indexterm2 asio.indexterm.windows__basic_overlapped_handle.executor_type..executor_type..windows::basic_overlapped_handle] 
The type of the executor associated with the object. 


  typedef Executor executor_type;



[heading Requirements]

['Header: ][^asio/windows/basic_overlapped_handle.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:get_executor windows::basic_overlapped_handle::get_executor]

[indexterm2 asio.indexterm.windows__basic_overlapped_handle.get_executor..get_executor..windows::basic_overlapped_handle] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]



[section:is_open windows::basic_overlapped_handle::is_open]

[indexterm2 asio.indexterm.windows__basic_overlapped_handle.is_open..is_open..windows::basic_overlapped_handle] 
Determine whether the handle is open. 


  bool is_open() const;



[endsect]


[section:lowest_layer windows::basic_overlapped_handle::lowest_layer]

[indexterm2 asio.indexterm.windows__basic_overlapped_handle.lowest_layer..lowest_layer..windows::basic_overlapped_handle] 
Get a reference to the lowest layer. 


  lowest_layer_type & ``[link asio.reference.windows__basic_overlapped_handle.lowest_layer.overload1 lowest_layer]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_overlapped_handle.lowest_layer.overload1 more...]]``


Get a const reference to the lowest layer. 


  const lowest_layer_type & ``[link asio.reference.windows__basic_overlapped_handle.lowest_layer.overload2 lowest_layer]``() const;
  ``  [''''&raquo;''' [link asio.reference.windows__basic_overlapped_handle.lowest_layer.overload2 more...]]``


[section:overload1 windows::basic_overlapped_handle::lowest_layer (1 of 2 overloads)]


Get a reference to the lowest layer. 


  lowest_layer_type & lowest_layer();


This function returns a reference to the lowest layer in a stack of layers. Since an overlapped\_handle cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]



[section:overload2 windows::basic_overlapped_handle::lowest_layer (2 of 2 overloads)]


Get a const reference to the lowest layer. 


  const lowest_layer_type & lowest_layer() const;


This function returns a const reference to the lowest layer in a stack of layers. Since an overlapped\_handle cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]


[endsect]


[section:lowest_layer_type windows::basic_overlapped_handle::lowest_layer_type]

[indexterm2 asio.indexterm.windows__basic_overlapped_handle.lowest_layer_type..lowest_layer_type..windows::basic_overlapped_handle] 
An overlapped\_handle is always the lowest layer. 


  typedef basic_overlapped_handle lowest_layer_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.windows__basic_overlapped_handle__rebind_executor [*rebind_executor]]]
    [Rebinds the handle type to another executor. ]
  
  ]

  [

    [[link asio.reference.windows__basic_overlapped_handle.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_overlapped_handle.lowest_layer_type [*lowest_layer_type]]]
    [An overlapped_handle is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.windows__basic_overlapped_handle.native_handle_type [*native_handle_type]]]
    [The native representation of a handle. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__basic_overlapped_handle.assign [*assign]]]
    [Assign an existing native handle to the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.basic_overlapped_handle [*basic_overlapped_handle]] [constructor]]
    [Construct an overlapped handle without opening it. 
     [hr]
     Construct an overlapped handle on an existing native handle. 
     [hr]
     Move-construct an overlapped handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.close [*close]]]
    [Close the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.native_handle [*native_handle]]]
    [Get the native handle representation. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.operator_eq_ [*operator=]]]
    [Move-assign an overlapped handle from another. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__basic_overlapped_handle._basic_overlapped_handle [*~basic_overlapped_handle]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

The [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] class provides the ability to wrap a Windows handle. The underlying object referred to by the handle must support overlapped I/O.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/windows/basic_overlapped_handle.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:native_handle windows::basic_overlapped_handle::native_handle]

[indexterm2 asio.indexterm.windows__basic_overlapped_handle.native_handle..native_handle..windows::basic_overlapped_handle] 
Get the native handle representation. 


  native_handle_type native_handle();


This function may be used to obtain the underlying representation of the handle. This is intended to allow access to native handle functionality that is not otherwise provided. 


[endsect]



[section:native_handle_type windows::basic_overlapped_handle::native_handle_type]

[indexterm2 asio.indexterm.windows__basic_overlapped_handle.native_handle_type..native_handle_type..windows::basic_overlapped_handle] 
The native representation of a handle. 


  typedef implementation_defined native_handle_type;



[heading Requirements]

['Header: ][^asio/windows/basic_overlapped_handle.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq_ windows::basic_overlapped_handle::operator=]

[indexterm2 asio.indexterm.windows__basic_overlapped_handle.operator_eq_..operator=..windows::basic_overlapped_handle] 
Move-assign an overlapped handle from another. 


  basic_overlapped_handle & operator=(
      basic_overlapped_handle && other);


This assignment operator moves a handle from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other overlapped handle object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `overlapped_handle(const executor_type&)` constructor. 




[endsect]



[section:_basic_overlapped_handle windows::basic_overlapped_handle::~basic_overlapped_handle]

[indexterm2 asio.indexterm.windows__basic_overlapped_handle._basic_overlapped_handle..~basic_overlapped_handle..windows::basic_overlapped_handle] 
Protected destructor to prevent deletion through this type. 


  ~basic_overlapped_handle();


This function destroys the handle, cancelling any outstanding asynchronous wait operations associated with the handle as if by calling `cancel`. 


[endsect]



[endsect]

[section:windows__basic_overlapped_handle__rebind_executor windows::basic_overlapped_handle::rebind_executor]


Rebinds the handle type to another executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  struct rebind_executor


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.windows__basic_overlapped_handle__rebind_executor.other [*other]]]
    [The handle type when rebound to the specified executor. ]
  
  ]

]

[heading Requirements]

['Header: ][^asio/windows/basic_overlapped_handle.hpp]

['Convenience header: ][^asio.hpp]


[section:other windows::basic_overlapped_handle::rebind_executor::other]

[indexterm2 asio.indexterm.windows__basic_overlapped_handle__rebind_executor.other..other..windows::basic_overlapped_handle::rebind_executor] 
The handle type when rebound to the specified executor. 


  typedef basic_overlapped_handle< Executor1 > other;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.windows__basic_overlapped_handle__rebind_executor [*rebind_executor]]]
    [Rebinds the handle type to another executor. ]
  
  ]

  [

    [[link asio.reference.windows__basic_overlapped_handle.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_overlapped_handle.lowest_layer_type [*lowest_layer_type]]]
    [An overlapped_handle is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.windows__basic_overlapped_handle.native_handle_type [*native_handle_type]]]
    [The native representation of a handle. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__basic_overlapped_handle.assign [*assign]]]
    [Assign an existing native handle to the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.basic_overlapped_handle [*basic_overlapped_handle]] [constructor]]
    [Construct an overlapped handle without opening it. 
     [hr]
     Construct an overlapped handle on an existing native handle. 
     [hr]
     Move-construct an overlapped handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.close [*close]]]
    [Close the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.native_handle [*native_handle]]]
    [Get the native handle representation. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.operator_eq_ [*operator=]]]
    [Move-assign an overlapped handle from another. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__basic_overlapped_handle._basic_overlapped_handle [*~basic_overlapped_handle]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

The [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] class provides the ability to wrap a Windows handle. The underlying object referred to by the handle must support overlapped I/O.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/windows/basic_overlapped_handle.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:windows__basic_random_access_handle windows::basic_random_access_handle]


Provides random-access handle functionality. 


  template<
      typename ``[link asio.reference.Executor1 Executor]`` = any_io_executor>
  class basic_random_access_handle :
    public windows::basic_overlapped_handle< Executor >


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.windows__basic_random_access_handle__rebind_executor [*rebind_executor]]]
    [Rebinds the handle type to another executor. ]
  
  ]

  [

    [[link asio.reference.windows__basic_random_access_handle.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_random_access_handle.lowest_layer_type [*lowest_layer_type]]]
    [An overlapped_handle is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.windows__basic_random_access_handle.native_handle_type [*native_handle_type]]]
    [The native representation of a handle. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__basic_random_access_handle.assign [*assign]]]
    [Assign an existing native handle to the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.async_read_some_at [*async_read_some_at]]]
    [Start an asynchronous read at the specified offset. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.async_write_some_at [*async_write_some_at]]]
    [Start an asynchronous write at the specified offset. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.basic_random_access_handle [*basic_random_access_handle]] [constructor]]
    [Construct a random-access handle without opening it. 
     [hr]
     Construct a random-access handle on an existing native handle. 
     [hr]
     Move-construct a random-access handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.close [*close]]]
    [Close the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.native_handle [*native_handle]]]
    [Get the native handle representation. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.operator_eq_ [*operator=]]]
    [Move-assign a random-access handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.read_some_at [*read_some_at]]]
    [Read some data from the handle at the specified offset. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.write_some_at [*write_some_at]]]
    [Write some data to the handle at the specified offset. ]
  ]
  
]

The [link asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] class provides asynchronous and blocking random-access handle functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/windows/basic_random_access_handle.hpp]

['Convenience header: ][^asio.hpp]

[section:assign windows::basic_random_access_handle::assign]

[indexterm2 asio.indexterm.windows__basic_random_access_handle.assign..assign..windows::basic_random_access_handle] 
Assign an existing native handle to the handle. 


  void ``[link asio.reference.windows__basic_random_access_handle.assign.overload1 assign]``(
      const native_handle_type & handle);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.assign.overload1 more...]]``

  void ``[link asio.reference.windows__basic_random_access_handle.assign.overload2 assign]``(
      const native_handle_type & handle,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.assign.overload2 more...]]``


[section:overload1 windows::basic_random_access_handle::assign (1 of 2 overloads)]


['Inherited from windows::basic_overlapped_handle.]


Assign an existing native handle to the handle. 


  void assign(
      const native_handle_type & handle);



[endsect]



[section:overload2 windows::basic_random_access_handle::assign (2 of 2 overloads)]


['Inherited from windows::basic_overlapped_handle.]


Assign an existing native handle to the handle. 


  void assign(
      const native_handle_type & handle,
      asio::error_code & ec);



[endsect]


[endsect]


[section:async_read_some_at windows::basic_random_access_handle::async_read_some_at]

[indexterm2 asio.indexterm.windows__basic_random_access_handle.async_read_some_at..async_read_some_at..windows::basic_random_access_handle] 
Start an asynchronous read at the specified offset. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_some_at(
      uint64_t offset,
      const MutableBufferSequence & buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously read data from the random-access handle. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[offset][The offset at which the data will be read.]]

[[buffers][One or more buffers into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes read.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
The read operation may not read all of the requested number of bytes. Consider using the [link asio.reference.async_read_at `async_read_at`]  function if you need to ensure that the requested amount of data is read before the asynchronous operation completes.


[heading Example]
  
To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   handle.async_read_some_at(42, asio::buffer(data, size), handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:async_write_some_at windows::basic_random_access_handle::async_write_some_at]

[indexterm2 asio.indexterm.windows__basic_random_access_handle.async_write_some_at..async_write_some_at..windows::basic_random_access_handle] 
Start an asynchronous write at the specified offset. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_write_some_at(
      uint64_t offset,
      const ConstBufferSequence & buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously write data to the random-access handle. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[offset][The offset at which the data will be written.]]

[[buffers][One or more data buffers to be written to the handle. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes written.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
The write operation may not transmit all of the data to the peer. Consider using the [link asio.reference.async_write_at `async_write_at`]  function if you need to ensure that all data is written before the asynchronous operation completes.


[heading Example]
  
To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   handle.async_write_some_at(42, asio::buffer(data, size), handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]


[section:basic_random_access_handle windows::basic_random_access_handle::basic_random_access_handle]

[indexterm2 asio.indexterm.windows__basic_random_access_handle.basic_random_access_handle..basic_random_access_handle..windows::basic_random_access_handle] 
Construct a random-access handle without opening it. 


  explicit ``[link asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload1 basic_random_access_handle]``(
      const executor_type & ex);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload1 more...]]``

  template<
      typename ExecutionContext>
  explicit ``[link asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload2 basic_random_access_handle]``(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value, basic_random_access_handle >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload2 more...]]``


Construct a random-access handle on an existing native handle. 


  ``[link asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload3 basic_random_access_handle]``(
      const executor_type & ex,
      const native_handle_type & handle);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload3 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload4 basic_random_access_handle]``(
      ExecutionContext & context,
      const native_handle_type & handle,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload4 more...]]``


Move-construct a random-access handle from another. 


  ``[link asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload5 basic_random_access_handle]``(
      basic_random_access_handle && other);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload5 more...]]``


[section:overload1 windows::basic_random_access_handle::basic_random_access_handle (1 of 5 overloads)]


Construct a random-access handle without opening it. 


  basic_random_access_handle(
      const executor_type & ex);


This constructor creates a random-access handle without opening it.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the random-access handle will use, by default, to dispatch handlers for any asynchronous operations performed on the random-access handle. ]]

]




[endsect]



[section:overload2 windows::basic_random_access_handle::basic_random_access_handle (2 of 5 overloads)]


Construct a random-access handle without opening it. 


  template<
      typename ExecutionContext>
  basic_random_access_handle(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value, basic_random_access_handle >::type *  = 0);


This constructor creates a random-access handle without opening it. The handle needs to be opened or assigned before data can be sent or received on it.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the random-access handle will use, by default, to dispatch handlers for any asynchronous operations performed on the random-access handle. ]]

]




[endsect]



[section:overload3 windows::basic_random_access_handle::basic_random_access_handle (3 of 5 overloads)]


Construct a random-access handle on an existing native handle. 


  basic_random_access_handle(
      const executor_type & ex,
      const native_handle_type & handle);


This constructor creates a random-access handle object to hold an existing native handle.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the random-access handle will use, by default, to dispatch handlers for any asynchronous operations performed on the random-access handle.]]

[[handle][The new underlying handle implementation.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload4 windows::basic_random_access_handle::basic_random_access_handle (4 of 5 overloads)]


Construct a random-access handle on an existing native handle. 


  template<
      typename ExecutionContext>
  basic_random_access_handle(
      ExecutionContext & context,
      const native_handle_type & handle,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a random-access handle object to hold an existing native handle.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the random-access handle will use, by default, to dispatch handlers for any asynchronous operations performed on the random-access handle.]]

[[handle][The new underlying handle implementation.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload5 windows::basic_random_access_handle::basic_random_access_handle (5 of 5 overloads)]


Move-construct a random-access handle from another. 


  basic_random_access_handle(
      basic_random_access_handle && other);


This constructor moves a random-access handle from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other random-access handle object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_random_access_handle(const executor_type&)` constructor. 




[endsect]


[endsect]

[section:cancel windows::basic_random_access_handle::cancel]

[indexterm2 asio.indexterm.windows__basic_random_access_handle.cancel..cancel..windows::basic_random_access_handle] 
Cancel all asynchronous operations associated with the handle. 


  void ``[link asio.reference.windows__basic_random_access_handle.cancel.overload1 cancel]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.cancel.overload1 more...]]``

  void ``[link asio.reference.windows__basic_random_access_handle.cancel.overload2 cancel]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.cancel.overload2 more...]]``


[section:overload1 windows::basic_random_access_handle::cancel (1 of 2 overloads)]


['Inherited from windows::basic_overlapped_handle.]


Cancel all asynchronous operations associated with the handle. 


  void cancel();


This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 windows::basic_random_access_handle::cancel (2 of 2 overloads)]


['Inherited from windows::basic_overlapped_handle.]


Cancel all asynchronous operations associated with the handle. 


  void cancel(
      asio::error_code & ec);


This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. ]]

]




[endsect]


[endsect]

[section:close windows::basic_random_access_handle::close]

[indexterm2 asio.indexterm.windows__basic_random_access_handle.close..close..windows::basic_random_access_handle] 
Close the handle. 


  void ``[link asio.reference.windows__basic_random_access_handle.close.overload1 close]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.close.overload1 more...]]``

  void ``[link asio.reference.windows__basic_random_access_handle.close.overload2 close]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.close.overload2 more...]]``


[section:overload1 windows::basic_random_access_handle::close (1 of 2 overloads)]


['Inherited from windows::basic_overlapped_handle.]


Close the handle. 


  void close();


This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 windows::basic_random_access_handle::close (2 of 2 overloads)]


['Inherited from windows::basic_overlapped_handle.]


Close the handle. 


  void close(
      asio::error_code & ec);


This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. ]]

]




[endsect]


[endsect]


[section:executor_type windows::basic_random_access_handle::executor_type]

[indexterm2 asio.indexterm.windows__basic_random_access_handle.executor_type..executor_type..windows::basic_random_access_handle] 
The type of the executor associated with the object. 


  typedef Executor executor_type;



[heading Requirements]

['Header: ][^asio/windows/basic_random_access_handle.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:get_executor windows::basic_random_access_handle::get_executor]


['Inherited from windows::basic_overlapped_handle.]

[indexterm2 asio.indexterm.windows__basic_random_access_handle.get_executor..get_executor..windows::basic_random_access_handle] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]



[section:is_open windows::basic_random_access_handle::is_open]


['Inherited from windows::basic_overlapped_handle.]

[indexterm2 asio.indexterm.windows__basic_random_access_handle.is_open..is_open..windows::basic_random_access_handle] 
Determine whether the handle is open. 


  bool is_open() const;



[endsect]


[section:lowest_layer windows::basic_random_access_handle::lowest_layer]

[indexterm2 asio.indexterm.windows__basic_random_access_handle.lowest_layer..lowest_layer..windows::basic_random_access_handle] 
Get a reference to the lowest layer. 


  lowest_layer_type & ``[link asio.reference.windows__basic_random_access_handle.lowest_layer.overload1 lowest_layer]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.lowest_layer.overload1 more...]]``


Get a const reference to the lowest layer. 


  const lowest_layer_type & ``[link asio.reference.windows__basic_random_access_handle.lowest_layer.overload2 lowest_layer]``() const;
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.lowest_layer.overload2 more...]]``


[section:overload1 windows::basic_random_access_handle::lowest_layer (1 of 2 overloads)]


['Inherited from windows::basic_overlapped_handle.]


Get a reference to the lowest layer. 


  lowest_layer_type & lowest_layer();


This function returns a reference to the lowest layer in a stack of layers. Since an overlapped\_handle cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]



[section:overload2 windows::basic_random_access_handle::lowest_layer (2 of 2 overloads)]


['Inherited from windows::basic_overlapped_handle.]


Get a const reference to the lowest layer. 


  const lowest_layer_type & lowest_layer() const;


This function returns a const reference to the lowest layer in a stack of layers. Since an overlapped\_handle cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]


[endsect]


[section:lowest_layer_type windows::basic_random_access_handle::lowest_layer_type]


['Inherited from windows::basic_overlapped_handle.]

[indexterm2 asio.indexterm.windows__basic_random_access_handle.lowest_layer_type..lowest_layer_type..windows::basic_random_access_handle] 
An overlapped\_handle is always the lowest layer. 


  typedef basic_overlapped_handle lowest_layer_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.windows__basic_overlapped_handle__rebind_executor [*rebind_executor]]]
    [Rebinds the handle type to another executor. ]
  
  ]

  [

    [[link asio.reference.windows__basic_overlapped_handle.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_overlapped_handle.lowest_layer_type [*lowest_layer_type]]]
    [An overlapped_handle is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.windows__basic_overlapped_handle.native_handle_type [*native_handle_type]]]
    [The native representation of a handle. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__basic_overlapped_handle.assign [*assign]]]
    [Assign an existing native handle to the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.basic_overlapped_handle [*basic_overlapped_handle]] [constructor]]
    [Construct an overlapped handle without opening it. 
     [hr]
     Construct an overlapped handle on an existing native handle. 
     [hr]
     Move-construct an overlapped handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.close [*close]]]
    [Close the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.native_handle [*native_handle]]]
    [Get the native handle representation. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.operator_eq_ [*operator=]]]
    [Move-assign an overlapped handle from another. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__basic_overlapped_handle._basic_overlapped_handle [*~basic_overlapped_handle]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

The [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] class provides the ability to wrap a Windows handle. The underlying object referred to by the handle must support overlapped I/O.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/windows/basic_random_access_handle.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:native_handle windows::basic_random_access_handle::native_handle]


['Inherited from windows::basic_overlapped_handle.]

[indexterm2 asio.indexterm.windows__basic_random_access_handle.native_handle..native_handle..windows::basic_random_access_handle] 
Get the native handle representation. 


  native_handle_type native_handle();


This function may be used to obtain the underlying representation of the handle. This is intended to allow access to native handle functionality that is not otherwise provided. 


[endsect]



[section:native_handle_type windows::basic_random_access_handle::native_handle_type]

[indexterm2 asio.indexterm.windows__basic_random_access_handle.native_handle_type..native_handle_type..windows::basic_random_access_handle] 
The native representation of a handle. 


  typedef implementation_defined native_handle_type;



[heading Requirements]

['Header: ][^asio/windows/basic_random_access_handle.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq_ windows::basic_random_access_handle::operator=]

[indexterm2 asio.indexterm.windows__basic_random_access_handle.operator_eq_..operator=..windows::basic_random_access_handle] 
Move-assign a random-access handle from another. 


  basic_random_access_handle & operator=(
      basic_random_access_handle && other);


This assignment operator moves a random-access handle from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other random-access handle object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_random_access_handle(const executor_type&)` constructor. 




[endsect]


[section:read_some_at windows::basic_random_access_handle::read_some_at]

[indexterm2 asio.indexterm.windows__basic_random_access_handle.read_some_at..read_some_at..windows::basic_random_access_handle] 
Read some data from the handle at the specified offset. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.windows__basic_random_access_handle.read_some_at.overload1 read_some_at]``(
      uint64_t offset,
      const MutableBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.read_some_at.overload1 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.windows__basic_random_access_handle.read_some_at.overload2 read_some_at]``(
      uint64_t offset,
      const MutableBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.read_some_at.overload2 more...]]``


[section:overload1 windows::basic_random_access_handle::read_some_at (1 of 2 overloads)]


Read some data from the handle at the specified offset. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_some_at(
      uint64_t offset,
      const MutableBufferSequence & buffers);


This function is used to read data from the random-access handle. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[offset][The offset at which the data will be read.]]

[[buffers][One or more buffers into which the data will be read.]]

]


[heading Return Value]
      
The number of bytes read.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]

]


[heading Remarks]
      
The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read_at `read_at`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes.


[heading Example]
  
To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   handle.read_some_at(42, asio::buffer(data, size));


See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 windows::basic_random_access_handle::read_some_at (2 of 2 overloads)]


Read some data from the handle at the specified offset. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_some_at(
      uint64_t offset,
      const MutableBufferSequence & buffers,
      asio::error_code & ec);


This function is used to read data from the random-access handle. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[offset][The offset at which the data will be read.]]

[[buffers][One or more buffers into which the data will be read.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes read. Returns 0 if an error occurred.


[heading Remarks]
      
The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read_at `read_at`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes. 




[endsect]


[endsect]

[section:write_some_at windows::basic_random_access_handle::write_some_at]

[indexterm2 asio.indexterm.windows__basic_random_access_handle.write_some_at..write_some_at..windows::basic_random_access_handle] 
Write some data to the handle at the specified offset. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.windows__basic_random_access_handle.write_some_at.overload1 write_some_at]``(
      uint64_t offset,
      const ConstBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.write_some_at.overload1 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.windows__basic_random_access_handle.write_some_at.overload2 write_some_at]``(
      uint64_t offset,
      const ConstBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.write_some_at.overload2 more...]]``


[section:overload1 windows::basic_random_access_handle::write_some_at (1 of 2 overloads)]


Write some data to the handle at the specified offset. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_some_at(
      uint64_t offset,
      const ConstBufferSequence & buffers);


This function is used to write data to the random-access handle. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[offset][The offset at which the data will be written.]]

[[buffers][One or more data buffers to be written to the handle.]]

]


[heading Return Value]
      
The number of bytes written.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]

]


[heading Remarks]
      
The write\_some\_at operation may not write all of the data. Consider using the [link asio.reference.write_at `write_at`]  function if you need to ensure that all data is written before the blocking operation completes.


[heading Example]
  
To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   handle.write_some_at(42, asio::buffer(data, size));


See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 windows::basic_random_access_handle::write_some_at (2 of 2 overloads)]


Write some data to the handle at the specified offset. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_some_at(
      uint64_t offset,
      const ConstBufferSequence & buffers,
      asio::error_code & ec);


This function is used to write data to the random-access handle. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[offset][The offset at which the data will be written.]]

[[buffers][One or more data buffers to be written to the handle.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes written. Returns 0 if an error occurred.


[heading Remarks]
      
The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write_at `write_at`]  function if you need to ensure that all data is written before the blocking operation completes. 




[endsect]


[endsect]


[endsect]

[section:windows__basic_random_access_handle__rebind_executor windows::basic_random_access_handle::rebind_executor]


Rebinds the handle type to another executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  struct rebind_executor


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.windows__basic_random_access_handle__rebind_executor.other [*other]]]
    [The handle type when rebound to the specified executor. ]
  
  ]

]

[heading Requirements]

['Header: ][^asio/windows/basic_random_access_handle.hpp]

['Convenience header: ][^asio.hpp]


[section:other windows::basic_random_access_handle::rebind_executor::other]

[indexterm2 asio.indexterm.windows__basic_random_access_handle__rebind_executor.other..other..windows::basic_random_access_handle::rebind_executor] 
The handle type when rebound to the specified executor. 


  typedef basic_random_access_handle< Executor1 > other;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.windows__basic_random_access_handle__rebind_executor [*rebind_executor]]]
    [Rebinds the handle type to another executor. ]
  
  ]

  [

    [[link asio.reference.windows__basic_random_access_handle.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_random_access_handle.lowest_layer_type [*lowest_layer_type]]]
    [An overlapped_handle is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.windows__basic_random_access_handle.native_handle_type [*native_handle_type]]]
    [The native representation of a handle. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__basic_random_access_handle.assign [*assign]]]
    [Assign an existing native handle to the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.async_read_some_at [*async_read_some_at]]]
    [Start an asynchronous read at the specified offset. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.async_write_some_at [*async_write_some_at]]]
    [Start an asynchronous write at the specified offset. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.basic_random_access_handle [*basic_random_access_handle]] [constructor]]
    [Construct a random-access handle without opening it. 
     [hr]
     Construct a random-access handle on an existing native handle. 
     [hr]
     Move-construct a random-access handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.close [*close]]]
    [Close the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.native_handle [*native_handle]]]
    [Get the native handle representation. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.operator_eq_ [*operator=]]]
    [Move-assign a random-access handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.read_some_at [*read_some_at]]]
    [Read some data from the handle at the specified offset. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.write_some_at [*write_some_at]]]
    [Write some data to the handle at the specified offset. ]
  ]
  
]

The [link asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] class provides asynchronous and blocking random-access handle functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/windows/basic_random_access_handle.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]

[section:windows__basic_stream_handle windows::basic_stream_handle]


Provides stream-oriented handle functionality. 


  template<
      typename ``[link asio.reference.Executor1 Executor]`` = any_io_executor>
  class basic_stream_handle :
    public windows::basic_overlapped_handle< Executor >


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.windows__basic_stream_handle__rebind_executor [*rebind_executor]]]
    [Rebinds the handle type to another executor. ]
  
  ]

  [

    [[link asio.reference.windows__basic_stream_handle.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_stream_handle.lowest_layer_type [*lowest_layer_type]]]
    [An overlapped_handle is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.windows__basic_stream_handle.native_handle_type [*native_handle_type]]]
    [The native representation of a handle. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__basic_stream_handle.assign [*assign]]]
    [Assign an existing native handle to the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.async_read_some [*async_read_some]]]
    [Start an asynchronous read. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.async_write_some [*async_write_some]]]
    [Start an asynchronous write. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.basic_stream_handle [*basic_stream_handle]] [constructor]]
    [Construct a stream handle without opening it. 
     [hr]
     Construct a stream handle on an existing native handle. 
     [hr]
     Move-construct a stream handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.close [*close]]]
    [Close the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.native_handle [*native_handle]]]
    [Get the native handle representation. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.operator_eq_ [*operator=]]]
    [Move-assign a stream handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.read_some [*read_some]]]
    [Read some data from the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.write_some [*write_some]]]
    [Write some data to the handle. ]
  ]
  
]

The [link asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] class provides asynchronous and blocking stream-oriented handle functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.




[heading Requirements]

['Header: ][^asio/windows/basic_stream_handle.hpp]

['Convenience header: ][^asio.hpp]

[section:assign windows::basic_stream_handle::assign]

[indexterm2 asio.indexterm.windows__basic_stream_handle.assign..assign..windows::basic_stream_handle] 
Assign an existing native handle to the handle. 


  void ``[link asio.reference.windows__basic_stream_handle.assign.overload1 assign]``(
      const native_handle_type & handle);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.assign.overload1 more...]]``

  void ``[link asio.reference.windows__basic_stream_handle.assign.overload2 assign]``(
      const native_handle_type & handle,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.assign.overload2 more...]]``


[section:overload1 windows::basic_stream_handle::assign (1 of 2 overloads)]


['Inherited from windows::basic_overlapped_handle.]


Assign an existing native handle to the handle. 


  void assign(
      const native_handle_type & handle);



[endsect]



[section:overload2 windows::basic_stream_handle::assign (2 of 2 overloads)]


['Inherited from windows::basic_overlapped_handle.]


Assign an existing native handle to the handle. 


  void assign(
      const native_handle_type & handle,
      asio::error_code & ec);



[endsect]


[endsect]


[section:async_read_some windows::basic_stream_handle::async_read_some]

[indexterm2 asio.indexterm.windows__basic_stream_handle.async_read_some..async_read_some..windows::basic_stream_handle] 
Start an asynchronous read. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_read_some(
      const MutableBufferSequence & buffers,
      ReadHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously read data from the stream handle. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes read.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
The read operation may not read all of the requested number of bytes. Consider using the [link asio.reference.async_read `async_read`]  function if you need to ensure that the requested amount of data is read before the asynchronous operation completes.


[heading Example]
  
To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   handle.async_read_some(asio::buffer(data, size), handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:async_write_some windows::basic_stream_handle::async_write_some]

[indexterm2 asio.indexterm.windows__basic_stream_handle.async_write_some..async_write_some..windows::basic_stream_handle] 
Start an asynchronous write. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]`` = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``>
  ``[link asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type ['DEDUCED]]`` async_write_some(
      const ConstBufferSequence & buffers,
      WriteHandler && handler = ``[link asio.reference.asynchronous_operations.default_completion_tokens ['DEFAULT]]``);


This function is used to asynchronously write data to the stream handle. The function call always returns immediately.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be written to the handle. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]

[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
``
   void handler(
     const asio::error_code& error, // Result of operation.
     std::size_t bytes_transferred           // Number of bytes written.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. On immediate completion, invocation of the handler will be performed in a manner equivalent to using [link asio.reference.post `post`].]]

]


[heading Remarks]
      
The write operation may not transmit all of the data to the peer. Consider using the [link asio.reference.async_write `async_write`]  function if you need to ensure that all data is written before the asynchronous operation completes.


[heading Example]
  
To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   handle.async_write_some(asio::buffer(data, size), handler);


See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]


[section:basic_stream_handle windows::basic_stream_handle::basic_stream_handle]

[indexterm2 asio.indexterm.windows__basic_stream_handle.basic_stream_handle..basic_stream_handle..windows::basic_stream_handle] 
Construct a stream handle without opening it. 


  explicit ``[link asio.reference.windows__basic_stream_handle.basic_stream_handle.overload1 basic_stream_handle]``(
      const executor_type & ex);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.basic_stream_handle.overload1 more...]]``

  template<
      typename ExecutionContext>
  explicit ``[link asio.reference.windows__basic_stream_handle.basic_stream_handle.overload2 basic_stream_handle]``(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value, basic_stream_handle >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.basic_stream_handle.overload2 more...]]``


Construct a stream handle on an existing native handle. 


  ``[link asio.reference.windows__basic_stream_handle.basic_stream_handle.overload3 basic_stream_handle]``(
      const executor_type & ex,
      const native_handle_type & handle);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.basic_stream_handle.overload3 more...]]``

  template<
      typename ExecutionContext>
  ``[link asio.reference.windows__basic_stream_handle.basic_stream_handle.overload4 basic_stream_handle]``(
      ExecutionContext & context,
      const native_handle_type & handle,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.basic_stream_handle.overload4 more...]]``


Move-construct a stream handle from another. 


  ``[link asio.reference.windows__basic_stream_handle.basic_stream_handle.overload5 basic_stream_handle]``(
      basic_stream_handle && other);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.basic_stream_handle.overload5 more...]]``


[section:overload1 windows::basic_stream_handle::basic_stream_handle (1 of 5 overloads)]


Construct a stream handle without opening it. 


  basic_stream_handle(
      const executor_type & ex);


This constructor creates a stream handle without opening it.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the stream handle will use, by default, to dispatch handlers for any asynchronous operations performed on the stream handle. ]]

]




[endsect]



[section:overload2 windows::basic_stream_handle::basic_stream_handle (2 of 5 overloads)]


Construct a stream handle without opening it. 


  template<
      typename ExecutionContext>
  basic_stream_handle(
      ExecutionContext & context,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value, basic_stream_handle >::type *  = 0);


This constructor creates a stream handle without opening it. The handle needs to be opened or assigned before data can be sent or received on it.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the stream handle will use, by default, to dispatch handlers for any asynchronous operations performed on the stream handle. ]]

]




[endsect]



[section:overload3 windows::basic_stream_handle::basic_stream_handle (3 of 5 overloads)]


Construct a stream handle on an existing native handle. 


  basic_stream_handle(
      const executor_type & ex,
      const native_handle_type & handle);


This constructor creates a stream handle object to hold an existing native handle.


[heading Parameters]
    

[variablelist
  
[[ex][The I/O executor that the stream handle will use, by default, to dispatch handlers for any asynchronous operations performed on the stream handle.]]

[[handle][The new underlying handle implementation.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload4 windows::basic_stream_handle::basic_stream_handle (4 of 5 overloads)]


Construct a stream handle on an existing native handle. 


  template<
      typename ExecutionContext>
  basic_stream_handle(
      ExecutionContext & context,
      const native_handle_type & handle,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);


This constructor creates a stream handle object to hold an existing native handle.


[heading Parameters]
    

[variablelist
  
[[context][An execution context which provides the I/O executor that the stream handle will use, by default, to dispatch handlers for any asynchronous operations performed on the stream handle.]]

[[handle][The new underlying handle implementation.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload5 windows::basic_stream_handle::basic_stream_handle (5 of 5 overloads)]


Move-construct a stream handle from another. 


  basic_stream_handle(
      basic_stream_handle && other);


This constructor moves a stream handle from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other stream handle object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_stream_handle(const executor_type&)` constructor. 




[endsect]


[endsect]

[section:cancel windows::basic_stream_handle::cancel]

[indexterm2 asio.indexterm.windows__basic_stream_handle.cancel..cancel..windows::basic_stream_handle] 
Cancel all asynchronous operations associated with the handle. 


  void ``[link asio.reference.windows__basic_stream_handle.cancel.overload1 cancel]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.cancel.overload1 more...]]``

  void ``[link asio.reference.windows__basic_stream_handle.cancel.overload2 cancel]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.cancel.overload2 more...]]``


[section:overload1 windows::basic_stream_handle::cancel (1 of 2 overloads)]


['Inherited from windows::basic_overlapped_handle.]


Cancel all asynchronous operations associated with the handle. 


  void cancel();


This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 windows::basic_stream_handle::cancel (2 of 2 overloads)]


['Inherited from windows::basic_overlapped_handle.]


Cancel all asynchronous operations associated with the handle. 


  void cancel(
      asio::error_code & ec);


This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. ]]

]




[endsect]


[endsect]

[section:close windows::basic_stream_handle::close]

[indexterm2 asio.indexterm.windows__basic_stream_handle.close..close..windows::basic_stream_handle] 
Close the handle. 


  void ``[link asio.reference.windows__basic_stream_handle.close.overload1 close]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.close.overload1 more...]]``

  void ``[link asio.reference.windows__basic_stream_handle.close.overload2 close]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.close.overload2 more...]]``


[section:overload1 windows::basic_stream_handle::close (1 of 2 overloads)]


['Inherited from windows::basic_overlapped_handle.]


Close the handle. 


  void close();


This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 windows::basic_stream_handle::close (2 of 2 overloads)]


['Inherited from windows::basic_overlapped_handle.]


Close the handle. 


  void close(
      asio::error_code & ec);


This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.


[heading Parameters]
    

[variablelist
  
[[ec][Set to indicate what error occurred, if any. ]]

]




[endsect]


[endsect]


[section:executor_type windows::basic_stream_handle::executor_type]

[indexterm2 asio.indexterm.windows__basic_stream_handle.executor_type..executor_type..windows::basic_stream_handle] 
The type of the executor associated with the object. 


  typedef Executor executor_type;



[heading Requirements]

['Header: ][^asio/windows/basic_stream_handle.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:get_executor windows::basic_stream_handle::get_executor]


['Inherited from windows::basic_overlapped_handle.]

[indexterm2 asio.indexterm.windows__basic_stream_handle.get_executor..get_executor..windows::basic_stream_handle] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]



[section:is_open windows::basic_stream_handle::is_open]


['Inherited from windows::basic_overlapped_handle.]

[indexterm2 asio.indexterm.windows__basic_stream_handle.is_open..is_open..windows::basic_stream_handle] 
Determine whether the handle is open. 


  bool is_open() const;



[endsect]


[section:lowest_layer windows::basic_stream_handle::lowest_layer]

[indexterm2 asio.indexterm.windows__basic_stream_handle.lowest_layer..lowest_layer..windows::basic_stream_handle] 
Get a reference to the lowest layer. 


  lowest_layer_type & ``[link asio.reference.windows__basic_stream_handle.lowest_layer.overload1 lowest_layer]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.lowest_layer.overload1 more...]]``


Get a const reference to the lowest layer. 


  const lowest_layer_type & ``[link asio.reference.windows__basic_stream_handle.lowest_layer.overload2 lowest_layer]``() const;
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.lowest_layer.overload2 more...]]``


[section:overload1 windows::basic_stream_handle::lowest_layer (1 of 2 overloads)]


['Inherited from windows::basic_overlapped_handle.]


Get a reference to the lowest layer. 


  lowest_layer_type & lowest_layer();


This function returns a reference to the lowest layer in a stack of layers. Since an overlapped\_handle cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]



[section:overload2 windows::basic_stream_handle::lowest_layer (2 of 2 overloads)]


['Inherited from windows::basic_overlapped_handle.]


Get a const reference to the lowest layer. 


  const lowest_layer_type & lowest_layer() const;


This function returns a const reference to the lowest layer in a stack of layers. Since an overlapped\_handle cannot contain any further layers, it simply returns a reference to itself.


[heading Return Value]
      
A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 




[endsect]


[endsect]


[section:lowest_layer_type windows::basic_stream_handle::lowest_layer_type]


['Inherited from windows::basic_overlapped_handle.]

[indexterm2 asio.indexterm.windows__basic_stream_handle.lowest_layer_type..lowest_layer_type..windows::basic_stream_handle] 
An overlapped\_handle is always the lowest layer. 


  typedef basic_overlapped_handle lowest_layer_type;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.windows__basic_overlapped_handle__rebind_executor [*rebind_executor]]]
    [Rebinds the handle type to another executor. ]
  
  ]

  [

    [[link asio.reference.windows__basic_overlapped_handle.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_overlapped_handle.lowest_layer_type [*lowest_layer_type]]]
    [An overlapped_handle is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.windows__basic_overlapped_handle.native_handle_type [*native_handle_type]]]
    [The native representation of a handle. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__basic_overlapped_handle.assign [*assign]]]
    [Assign an existing native handle to the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.basic_overlapped_handle [*basic_overlapped_handle]] [constructor]]
    [Construct an overlapped handle without opening it. 
     [hr]
     Construct an overlapped handle on an existing native handle. 
     [hr]
     Move-construct an overlapped handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.close [*close]]]
    [Close the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.native_handle [*native_handle]]]
    [Get the native handle representation. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.operator_eq_ [*operator=]]]
    [Move-assign an overlapped handle from another. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__basic_overlapped_handle._basic_overlapped_handle [*~basic_overlapped_handle]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

The [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] class provides the ability to wrap a Windows handle. The underlying object referred to by the handle must support overlapped I/O.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/windows/basic_stream_handle.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:native_handle windows::basic_stream_handle::native_handle]


['Inherited from windows::basic_overlapped_handle.]

[indexterm2 asio.indexterm.windows__basic_stream_handle.native_handle..native_handle..windows::basic_stream_handle] 
Get the native handle representation. 


  native_handle_type native_handle();


This function may be used to obtain the underlying representation of the handle. This is intended to allow access to native handle functionality that is not otherwise provided. 


[endsect]



[section:native_handle_type windows::basic_stream_handle::native_handle_type]

[indexterm2 asio.indexterm.windows__basic_stream_handle.native_handle_type..native_handle_type..windows::basic_stream_handle] 
The native representation of a handle. 


  typedef implementation_defined native_handle_type;



[heading Requirements]

['Header: ][^asio/windows/basic_stream_handle.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:operator_eq_ windows::basic_stream_handle::operator=]

[indexterm2 asio.indexterm.windows__basic_stream_handle.operator_eq_..operator=..windows::basic_stream_handle] 
Move-assign a stream handle from another. 


  basic_stream_handle & operator=(
      basic_stream_handle && other);


This assignment operator moves a stream handle from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other stream handle object from which the move will occur.]]

]


[heading Remarks]
      
Following the move, the moved-from object is in the same state as if constructed using the `basic_stream_handle(const executor_type&)` constructor. 




[endsect]


[section:read_some windows::basic_stream_handle::read_some]

[indexterm2 asio.indexterm.windows__basic_stream_handle.read_some..read_some..windows::basic_stream_handle] 
Read some data from the handle. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.windows__basic_stream_handle.read_some.overload1 read_some]``(
      const MutableBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.read_some.overload1 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.windows__basic_stream_handle.read_some.overload2 read_some]``(
      const MutableBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.read_some.overload2 more...]]``


[section:overload1 windows::basic_stream_handle::read_some (1 of 2 overloads)]


Read some data from the handle. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_some(
      const MutableBufferSequence & buffers);


This function is used to read data from the stream handle. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be read.]]

]


[heading Return Value]
      
The number of bytes read.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]

]


[heading Remarks]
      
The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes.


[heading Example]
  
To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   handle.read_some(asio::buffer(data, size));


See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 windows::basic_stream_handle::read_some (2 of 2 overloads)]


Read some data from the handle. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_some(
      const MutableBufferSequence & buffers,
      asio::error_code & ec);


This function is used to read data from the stream handle. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more buffers into which the data will be read.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes read. Returns 0 if an error occurred.


[heading Remarks]
      
The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes. 




[endsect]


[endsect]

[section:write_some windows::basic_stream_handle::write_some]

[indexterm2 asio.indexterm.windows__basic_stream_handle.write_some..write_some..windows::basic_stream_handle] 
Write some data to the handle. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.windows__basic_stream_handle.write_some.overload1 write_some]``(
      const ConstBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.write_some.overload1 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.windows__basic_stream_handle.write_some.overload2 write_some]``(
      const ConstBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.write_some.overload2 more...]]``


[section:overload1 windows::basic_stream_handle::write_some (1 of 2 overloads)]


Write some data to the handle. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_some(
      const ConstBufferSequence & buffers);


This function is used to write data to the stream handle. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be written to the handle.]]

]


[heading Return Value]
      
The number of bytes written.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]

]


[heading Remarks]
      
The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes.


[heading Example]
  
To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   handle.write_some(asio::buffer(data, size));


See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload2 windows::basic_stream_handle::write_some (2 of 2 overloads)]


Write some data to the handle. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_some(
      const ConstBufferSequence & buffers,
      asio::error_code & ec);


This function is used to write data to the stream handle. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.


[heading Parameters]
    

[variablelist
  
[[buffers][One or more data buffers to be written to the handle.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes written. Returns 0 if an error occurred.


[heading Remarks]
      
The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes. 




[endsect]


[endsect]


[endsect]

[section:windows__basic_stream_handle__rebind_executor windows::basic_stream_handle::rebind_executor]


Rebinds the handle type to another executor. 


  template<
      typename ``[link asio.reference.Executor1 Executor1]``>
  struct rebind_executor


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.windows__basic_stream_handle__rebind_executor.other [*other]]]
    [The handle type when rebound to the specified executor. ]
  
  ]

]

[heading Requirements]

['Header: ][^asio/windows/basic_stream_handle.hpp]

['Convenience header: ][^asio.hpp]


[section:other windows::basic_stream_handle::rebind_executor::other]

[indexterm2 asio.indexterm.windows__basic_stream_handle__rebind_executor.other..other..windows::basic_stream_handle::rebind_executor] 
The handle type when rebound to the specified executor. 


  typedef basic_stream_handle< Executor1 > other;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.windows__basic_stream_handle__rebind_executor [*rebind_executor]]]
    [Rebinds the handle type to another executor. ]
  
  ]

  [

    [[link asio.reference.windows__basic_stream_handle.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_stream_handle.lowest_layer_type [*lowest_layer_type]]]
    [An overlapped_handle is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.windows__basic_stream_handle.native_handle_type [*native_handle_type]]]
    [The native representation of a handle. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__basic_stream_handle.assign [*assign]]]
    [Assign an existing native handle to the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.async_read_some [*async_read_some]]]
    [Start an asynchronous read. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.async_write_some [*async_write_some]]]
    [Start an asynchronous write. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.basic_stream_handle [*basic_stream_handle]] [constructor]]
    [Construct a stream handle without opening it. 
     [hr]
     Construct a stream handle on an existing native handle. 
     [hr]
     Move-construct a stream handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.close [*close]]]
    [Close the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.native_handle [*native_handle]]]
    [Get the native handle representation. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.operator_eq_ [*operator=]]]
    [Move-assign a stream handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.read_some [*read_some]]]
    [Read some data from the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.write_some [*write_some]]]
    [Write some data to the handle. ]
  ]
  
]

The [link asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] class provides asynchronous and blocking stream-oriented handle functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.





[heading Requirements]

['Header: ][^asio/windows/basic_stream_handle.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[endsect]


[section:windows__object_handle windows::object_handle]

[indexterm1 asio.indexterm.windows__object_handle..windows::object_handle] 
Typedef for the typical usage of an object handle. 


  typedef basic_object_handle object_handle;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.windows__basic_object_handle__rebind_executor [*rebind_executor]]]
    [Rebinds the handle type to another executor. ]
  
  ]

  [

    [[link asio.reference.windows__basic_object_handle.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_object_handle.lowest_layer_type [*lowest_layer_type]]]
    [An object handle is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.windows__basic_object_handle.native_handle_type [*native_handle_type]]]
    [The native representation of a handle. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__basic_object_handle.assign [*assign]]]
    [Assign an existing native handle to the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.async_wait [*async_wait]]]
    [Start an asynchronous wait on the object handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.basic_object_handle [*basic_object_handle]] [constructor]]
    [Construct an object handle without opening it. 
     [hr]
     Construct an object handle on an existing native handle. 
     [hr]
     Move-construct an object handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.close [*close]]]
    [Close the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.native_handle [*native_handle]]]
    [Get the native handle representation. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.operator_eq_ [*operator=]]]
    [Move-assign an object handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.wait [*wait]]]
    [Perform a blocking wait on the object handle. ]
  ]
  
]

The [link asio.reference.windows__basic_object_handle `windows::basic_object_handle`] class provides asynchronous and blocking object-oriented handle functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/windows/object_handle.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:windows__overlapped_handle windows::overlapped_handle]

[indexterm1 asio.indexterm.windows__overlapped_handle..windows::overlapped_handle] 
Typedef for the typical usage of an overlapped handle. 


  typedef basic_overlapped_handle overlapped_handle;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.windows__basic_overlapped_handle__rebind_executor [*rebind_executor]]]
    [Rebinds the handle type to another executor. ]
  
  ]

  [

    [[link asio.reference.windows__basic_overlapped_handle.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_overlapped_handle.lowest_layer_type [*lowest_layer_type]]]
    [An overlapped_handle is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.windows__basic_overlapped_handle.native_handle_type [*native_handle_type]]]
    [The native representation of a handle. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__basic_overlapped_handle.assign [*assign]]]
    [Assign an existing native handle to the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.basic_overlapped_handle [*basic_overlapped_handle]] [constructor]]
    [Construct an overlapped handle without opening it. 
     [hr]
     Construct an overlapped handle on an existing native handle. 
     [hr]
     Move-construct an overlapped handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.close [*close]]]
    [Close the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.native_handle [*native_handle]]]
    [Get the native handle representation. ]
  ]
  
  [
    [[link asio.reference.windows__basic_overlapped_handle.operator_eq_ [*operator=]]]
    [Move-assign an overlapped handle from another. ]
  ]
  
]

[heading Protected Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__basic_overlapped_handle._basic_overlapped_handle [*~basic_overlapped_handle]] [destructor]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

The [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] class provides the ability to wrap a Windows handle. The underlying object referred to by the handle must support overlapped I/O.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/windows/overlapped_handle.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:windows__overlapped_ptr windows::overlapped_ptr]


Wraps a handler to create an OVERLAPPED object for use with overlapped I/O. 


  class overlapped_ptr :
    noncopyable


[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__overlapped_ptr.complete [*complete]]]
    [Post completion notification for overlapped operation. Releases ownership. ]
  ]
  
  [
    [[link asio.reference.windows__overlapped_ptr.get [*get]]]
    [Get the contained OVERLAPPED object. ]
  ]
  
  [
    [[link asio.reference.windows__overlapped_ptr.overlapped_ptr [*overlapped_ptr]] [constructor]]
    [Construct an empty overlapped_ptr. 
     [hr]
     Construct an overlapped_ptr to contain the specified handler. ]
  ]
  
  [
    [[link asio.reference.windows__overlapped_ptr.release [*release]]]
    [Release ownership of the OVERLAPPED object. ]
  ]
  
  [
    [[link asio.reference.windows__overlapped_ptr.reset [*reset]]]
    [Reset to empty. 
     [hr]
     Reset to contain the specified handler, freeing any current OVERLAPPED object. ]
  ]
  
  [
    [[link asio.reference.windows__overlapped_ptr._overlapped_ptr [*~overlapped_ptr]] [destructor]]
    [Destructor automatically frees the OVERLAPPED object unless released. ]
  ]
  
]

A special-purpose smart pointer used to wrap an application handler so that it can be passed as the LPOVERLAPPED argument to overlapped I/O functions.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/windows/overlapped_ptr.hpp]

['Convenience header: ][^asio.hpp]


[section:complete windows::overlapped_ptr::complete]

[indexterm2 asio.indexterm.windows__overlapped_ptr.complete..complete..windows::overlapped_ptr] 
Post completion notification for overlapped operation. Releases ownership. 


  void complete(
      const asio::error_code & ec,
      std::size_t bytes_transferred);



[endsect]


[section:get windows::overlapped_ptr::get]

[indexterm2 asio.indexterm.windows__overlapped_ptr.get..get..windows::overlapped_ptr] 
Get the contained OVERLAPPED object. 


  OVERLAPPED * ``[link asio.reference.windows__overlapped_ptr.get.overload1 get]``();
  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_ptr.get.overload1 more...]]``

  const OVERLAPPED * ``[link asio.reference.windows__overlapped_ptr.get.overload2 get]``() const;
  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_ptr.get.overload2 more...]]``


[section:overload1 windows::overlapped_ptr::get (1 of 2 overloads)]


Get the contained OVERLAPPED object. 


  OVERLAPPED * get();



[endsect]



[section:overload2 windows::overlapped_ptr::get (2 of 2 overloads)]


Get the contained OVERLAPPED object. 


  const OVERLAPPED * get() const;



[endsect]


[endsect]

[section:overlapped_ptr windows::overlapped_ptr::overlapped_ptr]

[indexterm2 asio.indexterm.windows__overlapped_ptr.overlapped_ptr..overlapped_ptr..windows::overlapped_ptr] 
Construct an empty [link asio.reference.windows__overlapped_ptr `windows::overlapped_ptr`]. 


  ``[link asio.reference.windows__overlapped_ptr.overlapped_ptr.overload1 overlapped_ptr]``();
  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_ptr.overlapped_ptr.overload1 more...]]``


Construct an [link asio.reference.windows__overlapped_ptr `windows::overlapped_ptr`] to contain the specified handler. 


  template<
      typename ExecutionContext,
      typename ``[link asio.reference.Handler Handler]``>
  explicit ``[link asio.reference.windows__overlapped_ptr.overlapped_ptr.overload2 overlapped_ptr]``(
      ExecutionContext & context,
      Handler && handler,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_ptr.overlapped_ptr.overload2 more...]]``

  template<
      typename ``[link asio.reference.Executor1 Executor]``,
      typename ``[link asio.reference.Handler Handler]``>
  explicit ``[link asio.reference.windows__overlapped_ptr.overlapped_ptr.overload3 overlapped_ptr]``(
      const Executor & ex,
      Handler && handler,
      typename enable_if< execution::is_executor< Executor >::value||is_executor< Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_ptr.overlapped_ptr.overload3 more...]]``


[section:overload1 windows::overlapped_ptr::overlapped_ptr (1 of 3 overloads)]


Construct an empty [link asio.reference.windows__overlapped_ptr `windows::overlapped_ptr`]. 


  overlapped_ptr();



[endsect]



[section:overload2 windows::overlapped_ptr::overlapped_ptr (2 of 3 overloads)]


Construct an [link asio.reference.windows__overlapped_ptr `windows::overlapped_ptr`] to contain the specified handler. 


  template<
      typename ExecutionContext,
      typename ``[link asio.reference.Handler Handler]``>
  overlapped_ptr(
      ExecutionContext & context,
      Handler && handler,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);



[endsect]



[section:overload3 windows::overlapped_ptr::overlapped_ptr (3 of 3 overloads)]


Construct an [link asio.reference.windows__overlapped_ptr `windows::overlapped_ptr`] to contain the specified handler. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``,
      typename ``[link asio.reference.Handler Handler]``>
  overlapped_ptr(
      const Executor & ex,
      Handler && handler,
      typename enable_if< execution::is_executor< Executor >::value||is_executor< Executor >::value >::type *  = 0);



[endsect]


[endsect]


[section:release windows::overlapped_ptr::release]

[indexterm2 asio.indexterm.windows__overlapped_ptr.release..release..windows::overlapped_ptr] 
Release ownership of the OVERLAPPED object. 


  OVERLAPPED * release();



[endsect]


[section:reset windows::overlapped_ptr::reset]

[indexterm2 asio.indexterm.windows__overlapped_ptr.reset..reset..windows::overlapped_ptr] 
Reset to empty. 


  void ``[link asio.reference.windows__overlapped_ptr.reset.overload1 reset]``();
  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_ptr.reset.overload1 more...]]``


Reset to contain the specified handler, freeing any current OVERLAPPED object. 


  template<
      typename ExecutionContext,
      typename ``[link asio.reference.Handler Handler]``>
  void ``[link asio.reference.windows__overlapped_ptr.reset.overload2 reset]``(
      ExecutionContext & context,
      Handler && handler,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_ptr.reset.overload2 more...]]``

  template<
      typename ``[link asio.reference.Executor1 Executor]``,
      typename ``[link asio.reference.Handler Handler]``>
  void ``[link asio.reference.windows__overlapped_ptr.reset.overload3 reset]``(
      const Executor & ex,
      Handler && handler,
      typename enable_if< execution::is_executor< Executor >::value||is_executor< Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_ptr.reset.overload3 more...]]``


[section:overload1 windows::overlapped_ptr::reset (1 of 3 overloads)]


Reset to empty. 


  void reset();



[endsect]



[section:overload2 windows::overlapped_ptr::reset (2 of 3 overloads)]


Reset to contain the specified handler, freeing any current OVERLAPPED object. 


  template<
      typename ExecutionContext,
      typename ``[link asio.reference.Handler Handler]``>
  void reset(
      ExecutionContext & context,
      Handler && handler,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);



[endsect]



[section:overload3 windows::overlapped_ptr::reset (3 of 3 overloads)]


Reset to contain the specified handler, freeing any current OVERLAPPED object. 


  template<
      typename ``[link asio.reference.Executor1 Executor]``,
      typename ``[link asio.reference.Handler Handler]``>
  void reset(
      const Executor & ex,
      Handler && handler,
      typename enable_if< execution::is_executor< Executor >::value||is_executor< Executor >::value >::type *  = 0);



[endsect]


[endsect]


[section:_overlapped_ptr windows::overlapped_ptr::~overlapped_ptr]

[indexterm2 asio.indexterm.windows__overlapped_ptr._overlapped_ptr..~overlapped_ptr..windows::overlapped_ptr] 
Destructor automatically frees the OVERLAPPED object unless released. 


  ~overlapped_ptr();



[endsect]



[endsect]


[section:windows__random_access_handle windows::random_access_handle]

[indexterm1 asio.indexterm.windows__random_access_handle..windows::random_access_handle] 
Typedef for the typical usage of a random-access handle. 


  typedef basic_random_access_handle random_access_handle;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.windows__basic_random_access_handle__rebind_executor [*rebind_executor]]]
    [Rebinds the handle type to another executor. ]
  
  ]

  [

    [[link asio.reference.windows__basic_random_access_handle.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_random_access_handle.lowest_layer_type [*lowest_layer_type]]]
    [An overlapped_handle is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.windows__basic_random_access_handle.native_handle_type [*native_handle_type]]]
    [The native representation of a handle. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__basic_random_access_handle.assign [*assign]]]
    [Assign an existing native handle to the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.async_read_some_at [*async_read_some_at]]]
    [Start an asynchronous read at the specified offset. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.async_write_some_at [*async_write_some_at]]]
    [Start an asynchronous write at the specified offset. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.basic_random_access_handle [*basic_random_access_handle]] [constructor]]
    [Construct a random-access handle without opening it. 
     [hr]
     Construct a random-access handle on an existing native handle. 
     [hr]
     Move-construct a random-access handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.close [*close]]]
    [Close the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.native_handle [*native_handle]]]
    [Get the native handle representation. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.operator_eq_ [*operator=]]]
    [Move-assign a random-access handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.read_some_at [*read_some_at]]]
    [Read some data from the handle at the specified offset. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.write_some_at [*write_some_at]]]
    [Write some data to the handle at the specified offset. ]
  ]
  
]

The [link asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] class provides asynchronous and blocking random-access handle functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/windows/random_access_handle.hpp]

['Convenience header: ][^asio.hpp]


[endsect]



[section:windows__stream_handle windows::stream_handle]

[indexterm1 asio.indexterm.windows__stream_handle..windows::stream_handle] 
Typedef for the typical usage of a stream-oriented handle. 


  typedef basic_stream_handle stream_handle;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.windows__basic_stream_handle__rebind_executor [*rebind_executor]]]
    [Rebinds the handle type to another executor. ]
  
  ]

  [

    [[link asio.reference.windows__basic_stream_handle.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_stream_handle.lowest_layer_type [*lowest_layer_type]]]
    [An overlapped_handle is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.windows__basic_stream_handle.native_handle_type [*native_handle_type]]]
    [The native representation of a handle. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.windows__basic_stream_handle.assign [*assign]]]
    [Assign an existing native handle to the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.async_read_some [*async_read_some]]]
    [Start an asynchronous read. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.async_write_some [*async_write_some]]]
    [Start an asynchronous write. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.basic_stream_handle [*basic_stream_handle]] [constructor]]
    [Construct a stream handle without opening it. 
     [hr]
     Construct a stream handle on an existing native handle. 
     [hr]
     Move-construct a stream handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.close [*close]]]
    [Close the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 
     [hr]
     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.native_handle [*native_handle]]]
    [Get the native handle representation. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.operator_eq_ [*operator=]]]
    [Move-assign a stream handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.read_some [*read_some]]]
    [Read some data from the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.write_some [*write_some]]]
    [Write some data to the handle. ]
  ]
  
]

The [link asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] class provides asynchronous and blocking stream-oriented handle functionality.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe.





[heading Requirements]

['Header: ][^asio/windows/stream_handle.hpp]

['Convenience header: ][^asio.hpp]


[endsect]


[section:write write]

[indexterm1 asio.indexterm.write..write] 
The `write` function is a composed operation that writes a certain amount of data to a stream before returning. 


Write all of the supplied data to a stream before returning. 

  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.write.overload1 write]``(
      SyncWriteStream & s,
      const ConstBufferSequence & buffers,
      typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.write.overload1 more...]]``

  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.write.overload2 write]``(
      SyncWriteStream & s,
      const ConstBufferSequence & buffers,
      asio::error_code & ec,
      typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.write.overload2 more...]]``

Write a certain amount of data to a stream before returning. 

  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.write.overload3 write]``(
      SyncWriteStream & s,
      const ConstBufferSequence & buffers,
      CompletionCondition completion_condition,
      typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.write.overload3 more...]]``

  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.write.overload4 write]``(
      SyncWriteStream & s,
      const ConstBufferSequence & buffers,
      CompletionCondition completion_condition,
      asio::error_code & ec,
      typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.write.overload4 more...]]``

Write all of the supplied data to a stream before returning. 

  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``>
  std::size_t ``[link asio.reference.write.overload5 write]``(
      SyncWriteStream & s,
      DynamicBuffer_v1 && buffers,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.write.overload5 more...]]``

  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``>
  std::size_t ``[link asio.reference.write.overload6 write]``(
      SyncWriteStream & s,
      DynamicBuffer_v1 && buffers,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.write.overload6 more...]]``

Write a certain amount of data to a stream before returning. 

  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.write.overload7 write]``(
      SyncWriteStream & s,
      DynamicBuffer_v1 && buffers,
      CompletionCondition completion_condition,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.write.overload7 more...]]``

  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.write.overload8 write]``(
      SyncWriteStream & s,
      DynamicBuffer_v1 && buffers,
      CompletionCondition completion_condition,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.write.overload8 more...]]``

Write all of the supplied data to a stream before returning. 

  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename Allocator>
  std::size_t ``[link asio.reference.write.overload9 write]``(
      SyncWriteStream & s,
      basic_streambuf< Allocator > & b);
  ``  [''''&raquo;''' [link asio.reference.write.overload9 more...]]``

  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename Allocator>
  std::size_t ``[link asio.reference.write.overload10 write]``(
      SyncWriteStream & s,
      basic_streambuf< Allocator > & b,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.write.overload10 more...]]``

Write a certain amount of data to a stream before returning. 

  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.write.overload11 write]``(
      SyncWriteStream & s,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition);
  ``  [''''&raquo;''' [link asio.reference.write.overload11 more...]]``

  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.write.overload12 write]``(
      SyncWriteStream & s,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.write.overload12 more...]]``

Write all of the supplied data to a stream before returning. 

  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``>
  std::size_t ``[link asio.reference.write.overload13 write]``(
      SyncWriteStream & s,
      DynamicBuffer_v2 buffers,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.write.overload13 more...]]``

  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``>
  std::size_t ``[link asio.reference.write.overload14 write]``(
      SyncWriteStream & s,
      DynamicBuffer_v2 buffers,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.write.overload14 more...]]``

Write a certain amount of data to a stream before returning. 

  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.write.overload15 write]``(
      SyncWriteStream & s,
      DynamicBuffer_v2 buffers,
      CompletionCondition completion_condition,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.write.overload15 more...]]``

  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.write.overload16 write]``(
      SyncWriteStream & s,
      DynamicBuffer_v2 buffers,
      CompletionCondition completion_condition,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.write.overload16 more...]]``

[heading Requirements]

['Header: ][^asio/write.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 write (1 of 16 overloads)]


Write all of the supplied data to a stream before returning. 


  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write(
      SyncWriteStream & s,
      const ConstBufferSequence & buffers,
      typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);


This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:


* All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's write\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the SyncWriteStream concept.]]

[[buffers][One or more buffers containing the data to be written. The sum of the buffer sizes indicates the maximum number of bytes to write to the stream.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  
To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::write(s, asio::buffer(data, size)); 


See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::write(
       s, buffers,
       asio::transfer_all()); 







[endsect]



[section:overload2 write (2 of 16 overloads)]


Write all of the supplied data to a stream before returning. 


  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write(
      SyncWriteStream & s,
      const ConstBufferSequence & buffers,
      asio::error_code & ec,
      typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);


This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:


* All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's write\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the SyncWriteStream concept.]]

[[buffers][One or more buffers containing the data to be written. The sum of the buffer sizes indicates the maximum number of bytes to write to the stream.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Example]
  
To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::write(s, asio::buffer(data, size), ec); 


See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::write(
       s, buffers,
       asio::transfer_all(), ec); 







[endsect]



[section:overload3 write (3 of 16 overloads)]


Write a certain amount of data to a stream before returning. 


  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t write(
      SyncWriteStream & s,
      const ConstBufferSequence & buffers,
      CompletionCondition completion_condition,
      typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);


This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:


* All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's write\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the SyncWriteStream concept.]]

[[buffers][One or more buffers containing the data to be written. The sum of the buffer sizes indicates the maximum number of bytes to write to the stream.]]

[[completion_condition][The function object to be called to determine whether the write operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest write_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the stream's write\_some function.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  
To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::write(s, asio::buffer(data, size),
       asio::transfer_at_least(32)); 


See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload4 write (4 of 16 overloads)]


Write a certain amount of data to a stream before returning. 


  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t write(
      SyncWriteStream & s,
      const ConstBufferSequence & buffers,
      CompletionCondition completion_condition,
      asio::error_code & ec,
      typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);


This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:


* All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's write\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the SyncWriteStream concept.]]

[[buffers][One or more buffers containing the data to be written. The sum of the buffer sizes indicates the maximum number of bytes to write to the stream.]]

[[completion_condition][The function object to be called to determine whether the write operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest write_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the stream's write\_some function.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes written. If an error occurs, returns the total number of bytes successfully transferred prior to the error. 




[endsect]



[section:overload5 write (5 of 16 overloads)]


Write all of the supplied data to a stream before returning. 


  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``>
  std::size_t write(
      SyncWriteStream & s,
      DynamicBuffer_v1 && buffers,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:


* All of the data in the supplied dynamic buffer sequence has been written.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's write\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the SyncWriteStream concept.]]

[[buffers][The dynamic buffer sequence from which data will be written. Successfully written data is automatically consumed from the buffers.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::write(
       s, buffers,
       asio::transfer_all()); 







[endsect]



[section:overload6 write (6 of 16 overloads)]


Write all of the supplied data to a stream before returning. 


  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``>
  std::size_t write(
      SyncWriteStream & s,
      DynamicBuffer_v1 && buffers,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:


* All of the data in the supplied dynamic buffer sequence has been written.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's write\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the SyncWriteStream concept.]]

[[buffers][The dynamic buffer sequence from which data will be written. Successfully written data is automatically consumed from the buffers.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::write(
       s, buffers,
       asio::transfer_all(), ec); 







[endsect]



[section:overload7 write (7 of 16 overloads)]


Write a certain amount of data to a stream before returning. 


  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t write(
      SyncWriteStream & s,
      DynamicBuffer_v1 && buffers,
      CompletionCondition completion_condition,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:


* All of the data in the supplied dynamic buffer sequence has been written.


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's write\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the SyncWriteStream concept.]]

[[buffers][The dynamic buffer sequence from which data will be written. Successfully written data is automatically consumed from the buffers.]]

[[completion_condition][The function object to be called to determine whether the write operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest write_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the stream's write\_some function.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload8 write (8 of 16 overloads)]


Write a certain amount of data to a stream before returning. 


  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v1 DynamicBuffer_v1]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t write(
      SyncWriteStream & s,
      DynamicBuffer_v1 && buffers,
      CompletionCondition completion_condition,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v1< typename decay< DynamicBuffer_v1 >::type >::value &&!is_dynamic_buffer_v2< typename decay< DynamicBuffer_v1 >::type >::value >::type *  = 0);


This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:


* All of the data in the supplied dynamic buffer sequence has been written.


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's write\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the SyncWriteStream concept.]]

[[buffers][The dynamic buffer sequence from which data will be written. Successfully written data is automatically consumed from the buffers.]]

[[completion_condition][The function object to be called to determine whether the write operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest write_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the stream's write\_some function.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes written. If an error occurs, returns the total number of bytes successfully transferred prior to the error. 




[endsect]



[section:overload9 write (9 of 16 overloads)]


Write all of the supplied data to a stream before returning. 


  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename Allocator>
  std::size_t write(
      SyncWriteStream & s,
      basic_streambuf< Allocator > & b);


This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:


* All of the data in the supplied [link asio.reference.basic_streambuf `basic_streambuf`] has been written.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's write\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the SyncWriteStream concept.]]

[[b][The [link asio.reference.basic_streambuf `basic_streambuf`] object from which data will be written.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::write(
       s, b,
       asio::transfer_all()); 







[endsect]



[section:overload10 write (10 of 16 overloads)]


Write all of the supplied data to a stream before returning. 


  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename Allocator>
  std::size_t write(
      SyncWriteStream & s,
      basic_streambuf< Allocator > & b,
      asio::error_code & ec);


This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:


* All of the data in the supplied [link asio.reference.basic_streambuf `basic_streambuf`] has been written.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's write\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the SyncWriteStream concept.]]

[[b][The [link asio.reference.basic_streambuf `basic_streambuf`] object from which data will be written.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::write(
       s, b,
       asio::transfer_all(), ec); 







[endsect]



[section:overload11 write (11 of 16 overloads)]


Write a certain amount of data to a stream before returning. 


  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t write(
      SyncWriteStream & s,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition);


This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:


* All of the data in the supplied [link asio.reference.basic_streambuf `basic_streambuf`] has been written.


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's write\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the SyncWriteStream concept.]]

[[b][The [link asio.reference.basic_streambuf `basic_streambuf`] object from which data will be written.]]

[[completion_condition][The function object to be called to determine whether the write operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest write_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the stream's write\_some function.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload12 write (12 of 16 overloads)]


Write a certain amount of data to a stream before returning. 


  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t write(
      SyncWriteStream & s,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition,
      asio::error_code & ec);


This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:


* All of the data in the supplied [link asio.reference.basic_streambuf `basic_streambuf`] has been written.


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's write\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the SyncWriteStream concept.]]

[[b][The [link asio.reference.basic_streambuf `basic_streambuf`] object from which data will be written.]]

[[completion_condition][The function object to be called to determine whether the write operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest write_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the stream's write\_some function.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes written. If an error occurs, returns the total number of bytes successfully transferred prior to the error. 




[endsect]



[section:overload13 write (13 of 16 overloads)]


Write all of the supplied data to a stream before returning. 


  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``>
  std::size_t write(
      SyncWriteStream & s,
      DynamicBuffer_v2 buffers,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:


* All of the data in the supplied dynamic buffer sequence has been written.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's write\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the SyncWriteStream concept.]]

[[buffers][The dynamic buffer sequence from which data will be written. Successfully written data is automatically consumed from the buffers.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::write(
       s, buffers,
       asio::transfer_all()); 







[endsect]



[section:overload14 write (14 of 16 overloads)]


Write all of the supplied data to a stream before returning. 


  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``>
  std::size_t write(
      SyncWriteStream & s,
      DynamicBuffer_v2 buffers,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:


* All of the data in the supplied dynamic buffer sequence has been written.


* An error occurred.

This operation is implemented in terms of zero or more calls to the stream's write\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the SyncWriteStream concept.]]

[[buffers][The dynamic buffer sequence from which data will be written. Successfully written data is automatically consumed from the buffers.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::write(
       s, buffers,
       asio::transfer_all(), ec); 







[endsect]



[section:overload15 write (15 of 16 overloads)]


Write a certain amount of data to a stream before returning. 


  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t write(
      SyncWriteStream & s,
      DynamicBuffer_v2 buffers,
      CompletionCondition completion_condition,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:


* All of the data in the supplied dynamic buffer sequence has been written.


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's write\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the SyncWriteStream concept.]]

[[buffers][The dynamic buffer sequence from which data will be written. Successfully written data is automatically consumed from the buffers.]]

[[completion_condition][The function object to be called to determine whether the write operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest write_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the stream's write\_some function.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload16 write (16 of 16 overloads)]


Write a certain amount of data to a stream before returning. 


  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBuffer_v2 DynamicBuffer_v2]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t write(
      SyncWriteStream & s,
      DynamicBuffer_v2 buffers,
      CompletionCondition completion_condition,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value >::type *  = 0);


This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:


* All of the data in the supplied dynamic buffer sequence has been written.


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's write\_some function.


[heading Parameters]
    

[variablelist
  
[[s][The stream to which the data is to be written. The type must support the SyncWriteStream concept.]]

[[buffers][The dynamic buffer sequence from which data will be written. Successfully written data is automatically consumed from the buffers.]]

[[completion_condition][The function object to be called to determine whether the write operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest write_some operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the stream's write\_some function.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes written. If an error occurs, returns the total number of bytes successfully transferred prior to the error. 




[endsect]


[endsect]

[section:write_at write_at]

[indexterm1 asio.indexterm.write_at..write_at] 
The `write_at` function is a composed operation that writes a certain amount of data at a specified offset before returning. 


Write all of the supplied data at the specified offset before returning. 

  template<
      typename ``[link asio.reference.SyncRandomAccessWriteDevice SyncRandomAccessWriteDevice]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.write_at.overload1 write_at]``(
      SyncRandomAccessWriteDevice & d,
      uint64_t offset,
      const ConstBufferSequence & buffers);
  ``  [''''&raquo;''' [link asio.reference.write_at.overload1 more...]]``

  template<
      typename ``[link asio.reference.SyncRandomAccessWriteDevice SyncRandomAccessWriteDevice]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.write_at.overload2 write_at]``(
      SyncRandomAccessWriteDevice & d,
      uint64_t offset,
      const ConstBufferSequence & buffers,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.write_at.overload2 more...]]``

Write a certain amount of data at a specified offset before returning. 

  template<
      typename ``[link asio.reference.SyncRandomAccessWriteDevice SyncRandomAccessWriteDevice]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.write_at.overload3 write_at]``(
      SyncRandomAccessWriteDevice & d,
      uint64_t offset,
      const ConstBufferSequence & buffers,
      CompletionCondition completion_condition);
  ``  [''''&raquo;''' [link asio.reference.write_at.overload3 more...]]``

  template<
      typename ``[link asio.reference.SyncRandomAccessWriteDevice SyncRandomAccessWriteDevice]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.write_at.overload4 write_at]``(
      SyncRandomAccessWriteDevice & d,
      uint64_t offset,
      const ConstBufferSequence & buffers,
      CompletionCondition completion_condition,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.write_at.overload4 more...]]``

Write all of the supplied data at the specified offset before returning. 

  template<
      typename ``[link asio.reference.SyncRandomAccessWriteDevice SyncRandomAccessWriteDevice]``,
      typename Allocator>
  std::size_t ``[link asio.reference.write_at.overload5 write_at]``(
      SyncRandomAccessWriteDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b);
  ``  [''''&raquo;''' [link asio.reference.write_at.overload5 more...]]``

  template<
      typename ``[link asio.reference.SyncRandomAccessWriteDevice SyncRandomAccessWriteDevice]``,
      typename Allocator>
  std::size_t ``[link asio.reference.write_at.overload6 write_at]``(
      SyncRandomAccessWriteDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.write_at.overload6 more...]]``

Write a certain amount of data at a specified offset before returning. 

  template<
      typename ``[link asio.reference.SyncRandomAccessWriteDevice SyncRandomAccessWriteDevice]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.write_at.overload7 write_at]``(
      SyncRandomAccessWriteDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition);
  ``  [''''&raquo;''' [link asio.reference.write_at.overload7 more...]]``

  template<
      typename ``[link asio.reference.SyncRandomAccessWriteDevice SyncRandomAccessWriteDevice]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t ``[link asio.reference.write_at.overload8 write_at]``(
      SyncRandomAccessWriteDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.write_at.overload8 more...]]``

[heading Requirements]

['Header: ][^asio/write_at.hpp]

['Convenience header: ][^asio.hpp]


[section:overload1 write_at (1 of 8 overloads)]


Write all of the supplied data at the specified offset before returning. 


  template<
      typename ``[link asio.reference.SyncRandomAccessWriteDevice SyncRandomAccessWriteDevice]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_at(
      SyncRandomAccessWriteDevice & d,
      uint64_t offset,
      const ConstBufferSequence & buffers);


This function is used to write a certain number of bytes of data to a random access device at a specified offset. The call will block until one of the following conditions is true:


* All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.


* An error occurred.

This operation is implemented in terms of zero or more calls to the device's write\_some\_at function.


[heading Parameters]
    

[variablelist
  
[[d][The device to which the data is to be written. The type must support the SyncRandomAccessWriteDevice concept.]]

[[offset][The offset at which the data will be written.]]

[[buffers][One or more buffers containing the data to be written. The sum of the buffer sizes indicates the maximum number of bytes to write to the device.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  
To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::write_at(d, 42, asio::buffer(data, size)); 


See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::write_at(
       d, offset, buffers,
       asio::transfer_all()); 







[endsect]



[section:overload2 write_at (2 of 8 overloads)]


Write all of the supplied data at the specified offset before returning. 


  template<
      typename ``[link asio.reference.SyncRandomAccessWriteDevice SyncRandomAccessWriteDevice]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_at(
      SyncRandomAccessWriteDevice & d,
      uint64_t offset,
      const ConstBufferSequence & buffers,
      asio::error_code & ec);


This function is used to write a certain number of bytes of data to a random access device at a specified offset. The call will block until one of the following conditions is true:


* All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.


* An error occurred.

This operation is implemented in terms of zero or more calls to the device's write\_some\_at function.


[heading Parameters]
    

[variablelist
  
[[d][The device to which the data is to be written. The type must support the SyncRandomAccessWriteDevice concept.]]

[[offset][The offset at which the data will be written.]]

[[buffers][One or more buffers containing the data to be written. The sum of the buffer sizes indicates the maximum number of bytes to write to the device.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Example]
  
To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::write_at(d, 42,
       asio::buffer(data, size), ec); 


See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::write_at(
       d, offset, buffers,
       asio::transfer_all(), ec); 







[endsect]



[section:overload3 write_at (3 of 8 overloads)]


Write a certain amount of data at a specified offset before returning. 


  template<
      typename ``[link asio.reference.SyncRandomAccessWriteDevice SyncRandomAccessWriteDevice]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t write_at(
      SyncRandomAccessWriteDevice & d,
      uint64_t offset,
      const ConstBufferSequence & buffers,
      CompletionCondition completion_condition);


This function is used to write a certain number of bytes of data to a random access device at a specified offset. The call will block until one of the following conditions is true:


* All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the device's write\_some\_at function.


[heading Parameters]
    

[variablelist
  
[[d][The device to which the data is to be written. The type must support the SyncRandomAccessWriteDevice concept.]]

[[offset][The offset at which the data will be written.]]

[[buffers][One or more buffers containing the data to be written. The sum of the buffer sizes indicates the maximum number of bytes to write to the device.]]

[[completion_condition][The function object to be called to determine whether the write operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest write_some_at operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the device's write\_some\_at function.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Example]
  
To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 

   asio::write_at(d, 42, asio::buffer(data, size),
       asio::transfer_at_least(32)); 


See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 




[endsect]



[section:overload4 write_at (4 of 8 overloads)]


Write a certain amount of data at a specified offset before returning. 


  template<
      typename ``[link asio.reference.SyncRandomAccessWriteDevice SyncRandomAccessWriteDevice]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t write_at(
      SyncRandomAccessWriteDevice & d,
      uint64_t offset,
      const ConstBufferSequence & buffers,
      CompletionCondition completion_condition,
      asio::error_code & ec);


This function is used to write a certain number of bytes of data to a random access device at a specified offset. The call will block until one of the following conditions is true:


* All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the device's write\_some\_at function.


[heading Parameters]
    

[variablelist
  
[[d][The device to which the data is to be written. The type must support the SyncRandomAccessWriteDevice concept.]]

[[offset][The offset at which the data will be written.]]

[[buffers][One or more buffers containing the data to be written. The sum of the buffer sizes indicates the maximum number of bytes to write to the device.]]

[[completion_condition][The function object to be called to determine whether the write operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest write_some_at operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the device's write\_some\_at function.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes written. If an error occurs, returns the total number of bytes successfully transferred prior to the error. 




[endsect]



[section:overload5 write_at (5 of 8 overloads)]


Write all of the supplied data at the specified offset before returning. 


  template<
      typename ``[link asio.reference.SyncRandomAccessWriteDevice SyncRandomAccessWriteDevice]``,
      typename Allocator>
  std::size_t write_at(
      SyncRandomAccessWriteDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b);


This function is used to write a certain number of bytes of data to a random access device at a specified offset. The call will block until one of the following conditions is true:


* All of the data in the supplied [link asio.reference.basic_streambuf `basic_streambuf`] has been written.


* An error occurred.

This operation is implemented in terms of zero or more calls to the device's write\_some\_at function.


[heading Parameters]
    

[variablelist
  
[[d][The device to which the data is to be written. The type must support the SyncRandomAccessWriteDevice concept.]]

[[offset][The offset at which the data will be written.]]

[[b][The [link asio.reference.basic_streambuf `basic_streambuf`] object from which data will be written.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::write_at(
       d, 42, b,
       asio::transfer_all()); 







[endsect]



[section:overload6 write_at (6 of 8 overloads)]


Write all of the supplied data at the specified offset before returning. 


  template<
      typename ``[link asio.reference.SyncRandomAccessWriteDevice SyncRandomAccessWriteDevice]``,
      typename Allocator>
  std::size_t write_at(
      SyncRandomAccessWriteDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      asio::error_code & ec);


This function is used to write a certain number of bytes of data to a random access device at a specified offset. The call will block until one of the following conditions is true:


* All of the data in the supplied [link asio.reference.basic_streambuf `basic_streambuf`] has been written.


* An error occurred.

This operation is implemented in terms of zero or more calls to the device's write\_some\_at function.


[heading Parameters]
    

[variablelist
  
[[d][The device to which the data is to be written. The type must support the SyncRandomAccessWriteDevice concept.]]

[[offset][The offset at which the data will be written.]]

[[b][The [link asio.reference.basic_streambuf `basic_streambuf`] object from which data will be written.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Remarks]
      
This overload is equivalent to calling: 

   asio::write_at(
       d, 42, b,
       asio::transfer_all(), ec); 







[endsect]



[section:overload7 write_at (7 of 8 overloads)]


Write a certain amount of data at a specified offset before returning. 


  template<
      typename ``[link asio.reference.SyncRandomAccessWriteDevice SyncRandomAccessWriteDevice]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t write_at(
      SyncRandomAccessWriteDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition);


This function is used to write a certain number of bytes of data to a random access device at a specified offset. The call will block until one of the following conditions is true:


* All of the data in the supplied [link asio.reference.basic_streambuf `basic_streambuf`] has been written.


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the device's write\_some\_at function.


[heading Parameters]
    

[variablelist
  
[[d][The device to which the data is to be written. The type must support the SyncRandomAccessWriteDevice concept.]]

[[offset][The offset at which the data will be written.]]

[[b][The [link asio.reference.basic_streambuf `basic_streambuf`] object from which data will be written.]]

[[completion_condition][The function object to be called to determine whether the write operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest write_some_at operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the device's write\_some\_at function.]]

]


[heading Return Value]
      
The number of bytes transferred.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload8 write_at (8 of 8 overloads)]


Write a certain amount of data at a specified offset before returning. 


  template<
      typename ``[link asio.reference.SyncRandomAccessWriteDevice SyncRandomAccessWriteDevice]``,
      typename Allocator,
      typename ``[link asio.reference.CompletionCondition CompletionCondition]``>
  std::size_t write_at(
      SyncRandomAccessWriteDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition,
      asio::error_code & ec);


This function is used to write a certain number of bytes of data to a random access device at a specified offset. The call will block until one of the following conditions is true:


* All of the data in the supplied [link asio.reference.basic_streambuf `basic_streambuf`] has been written.


* The completion\_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the device's write\_some\_at function.


[heading Parameters]
    

[variablelist
  
[[d][The device to which the data is to be written. The type must support the SyncRandomAccessWriteDevice concept.]]

[[offset][The offset at which the data will be written.]]

[[b][The [link asio.reference.basic_streambuf `basic_streambuf`] object from which data will be written.]]

[[completion_condition][The function object to be called to determine whether the write operation is complete. The signature of the function object must be: 
``
   std::size_t completion_condition(
     // Result of latest write_some_at operation.
     const asio::error_code& error,

     // Number of bytes transferred so far.
     std::size_t bytes_transferred
   ); 
``
A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the device's write\_some\_at function.]]

[[ec][Set to indicate what error occurred, if any.]]

]


[heading Return Value]
      
The number of bytes written. If an error occurs, returns the total number of bytes successfully transferred prior to the error. 




[endsect]


[endsect]


[section:yield_context yield_context]

[indexterm1 asio.indexterm.yield_context..yield_context] 
Context object that represents the currently executing coroutine. 


  typedef basic_yield_context< unspecified > yield_context;


[heading Types]
[table
  [[Name][Description]]

  [

    [[link asio.reference.basic_yield_context.callee_type [*callee_type]]]
    [The coroutine callee type, used by the implementation. ]
  
  ]

  [

    [[link asio.reference.basic_yield_context.caller_type [*caller_type]]]
    [The coroutine caller type, used by the implementation. ]
  
  ]

]

[heading Member Functions]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_yield_context.basic_yield_context [*basic_yield_context]] [constructor]]
    [Construct a yield context to represent the specified coroutine. 
     [hr]
     Construct a yield context from another yield context type. ]
  ]
  
  [
    [[link asio.reference.basic_yield_context.operator_lb__rb_ [*operator\[\]]]]
    [Return a yield context that sets the specified error_code. ]
  ]
  
]

The [link asio.reference.basic_yield_context `basic_yield_context`] class is used to represent the currently executing stackful coroutine. A [link asio.reference.basic_yield_context `basic_yield_context`] may be passed as a handler to an asynchronous operation. For example:



   template <typename Handler>
   void my_coroutine(basic_yield_context<Handler> yield)
   {
     ...
     std::size_t n = my_socket.async_read_some(buffer, yield);
     ...
   } 




The initiating function (async\_read\_some in the above example) suspends the current coroutine. The coroutine is resumed when the asynchronous operation completes, and the result of the operation is returned. 


[heading Requirements]

['Header: ][^asio/spawn.hpp]

['Convenience header: ]None


[endsect]


[endsect]
