[/
 / Copyright (c) 2003-2014 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/AcceptHandler.qbk]
[include requirements/AsyncRandomAccessReadDevice.qbk]
[include requirements/AsyncRandomAccessWriteDevice.qbk]
[include requirements/AsyncReadStream.qbk]
[include requirements/AsyncWriteStream.qbk]
[include requirements/BufferedHandshakeHandler.qbk]
[include requirements/CompletionHandler.qbk]
[include requirements/ComposedConnectHandler.qbk]
[include requirements/ConnectHandler.qbk]
[include requirements/ConstBufferSequence.qbk]
[include requirements/ConvertibleToConstBuffer.qbk]
[include requirements/ConvertibleToMutableBuffer.qbk]
[include requirements/DatagramSocketService.qbk]
[include requirements/DescriptorService.qbk]
[include requirements/DynamicBufferSequence.qbk]
[include requirements/Endpoint.qbk]
[include requirements/Executor.qbk]
[include requirements/GettableSerialPortOption.qbk]
[include requirements/GettableSocketOption.qbk]
[include requirements/Handler.qbk]
[include requirements/HandleService.qbk]
[include requirements/HandshakeHandler.qbk]
[include requirements/InternetProtocol.qbk]
[include requirements/IoControlCommand.qbk]
[include requirements/IoObjectService.qbk]
[include requirements/MutableBufferSequence.qbk]
[include requirements/ObjectHandleService.qbk]
[include requirements/Protocol.qbk]
[include requirements/RandomAccessHandleService.qbk]
[include requirements/RawSocketService.qbk]
[include requirements/ReadHandler.qbk]
[include requirements/ResolveHandler.qbk]
[include requirements/ResolverService.qbk]
[include requirements/SeqPacketSocketService.qbk]
[include requirements/SerialPortService.qbk]
[include requirements/Service.qbk]
[include requirements/SettableSerialPortOption.qbk]
[include requirements/SettableSocketOption.qbk]
[include requirements/ShutdownHandler.qbk]
[include requirements/SignalHandler.qbk]
[include requirements/SignalSetService.qbk]
[include requirements/SocketAcceptorService.qbk]
[include requirements/SocketService.qbk]
[include requirements/StreamDescriptorService.qbk]
[include requirements/StreamHandleService.qbk]
[include requirements/StreamSocketService.qbk]
[include requirements/SyncRandomAccessReadDevice.qbk]
[include requirements/SyncRandomAccessWriteDevice.qbk]
[include requirements/SyncReadStream.qbk]
[include requirements/SyncWriteStream.qbk]
[include requirements/TimeTraits.qbk]
[include requirements/TimerService.qbk]
[include requirements/WaitableTimerService.qbk]
[include requirements/WaitHandler.qbk]
[include requirements/WaitTraits.qbk]
[include requirements/WriteHandler.qbk]



[section:add_service add_service]

[indexterm1 add_service] 

  template<
      typename ``[link asio.reference.Service Service]``>
  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/impl/execution_context.hpp]

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


[endsect]



[section:asio_handler_allocate asio_handler_allocate]

[indexterm1 asio_handler_allocate] 
Default allocation function for handlers. 


  void * 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_handler_deallocate] 
Default deallocation function for handlers. 


  void 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_handler_invoke] 
Default invoke function for handlers. 

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

  template<
      typename Function>
  void ``[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_service `io_service`] 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_service `io_service`] object. Handlers may subsequently be invoked through other objects (such as [link asio.reference.io_service__strand `io_service::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>
  void 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>
  void asio_handler_invoke(
      const Function & function,
      ... );



[endsect]


[endsect]


[section:asio_handler_is_continuation asio_handler_is_continuation]

[indexterm1 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]]]
    [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 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 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.Executor 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]]]
    [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 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 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 real type of a handler, capture a local copy of the handler, and then create an [link asio.reference.async_result `async_result`] for the handler. 


  template<
      typename ``[link asio.reference.Handler Handler]``,
      typename Signature>
  struct async_completion


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

  [

    [[link asio.reference.async_completion.handler_type [*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. ]
  ]
  
]

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

  [
    [[link asio.reference.async_completion.handler [*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 async_completion..async_completion] 
Constructor. 


  async_completion(
      typename remove_reference< Handler >::type & orig_handler);


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


[endsect]



[section:handler async_completion::handler]

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


  conditional< is_same< Handler, handler_type >::value, handler_type &, handler_type >::type handler;



[endsect]



[section:handler_type async_completion::handler_type]

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


  typedef asio::handler_type< Handler, Signature >::type handler_type;


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

  [

    [[link asio.reference.handler_type.type [*type]]]
    [The handler type for the specific signature. ]
  
  ]

]

The [link asio.reference.handler_type `handler_type`] traits class is used for determining the concrete handler type to be used for an asynchronous operation. It allows the handler type 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. 


[heading Requirements]

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

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


[endsect]



[section:result async_completion::result]

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


  async_result< typename asio::handler_type< Handler, Signature >::type > result;



[endsect]



[endsect]

[section:async_connect async_connect]

[indexterm1 async_connect] 
Asynchronously establishes a socket connection by trying each endpoint in a sequence. 

      
  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator,
      typename ``[link asio.reference.ComposedConnectHandler ComposedConnectHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_connect.overload1 async_connect]``(
      basic_socket< Protocol, SocketService > & s,
      Iterator begin,
      ComposedConnectHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.async_connect.overload1 more...]]``

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator,
      typename ``[link asio.reference.ComposedConnectHandler ComposedConnectHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_connect.overload2 async_connect]``(
      basic_socket< Protocol, SocketService > & s,
      Iterator begin,
      Iterator end,
      ComposedConnectHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.async_connect.overload2 more...]]``

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator,
      typename ConnectCondition,
      typename ``[link asio.reference.ComposedConnectHandler ComposedConnectHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_connect.overload3 async_connect]``(
      basic_socket< Protocol, SocketService > & s,
      Iterator begin,
      ConnectCondition connect_condition,
      ComposedConnectHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.async_connect.overload3 more...]]``

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator,
      typename ConnectCondition,
      typename ``[link asio.reference.ComposedConnectHandler ComposedConnectHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_connect.overload4 async_connect]``(
      basic_socket< Protocol, SocketService > & s,
      Iterator begin,
      Iterator end,
      ConnectCondition connect_condition,
      ComposedConnectHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.async_connect.overload4 more...]]``

[heading Requirements]

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

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


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


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


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator,
      typename ``[link asio.reference.ComposedConnectHandler ComposedConnectHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
      basic_socket< Protocol, SocketService > & s,
      Iterator begin,
      ComposedConnectHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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`.


[heading Example]
  


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

   // ...

   r.async_resolve(q, resolve_handler);

   // ...

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

   // ...

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







[endsect]



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


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


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator,
      typename ``[link asio.reference.ComposedConnectHandler ComposedConnectHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
      basic_socket< Protocol, SocketService > & s,
      Iterator begin,
      Iterator end,
      ComposedConnectHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`.]]

]


[heading Example]
  


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

   // ...

   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, connect_handler);
     }
   }

   // ...

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







[endsect]



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


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


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator,
      typename ConnectCondition,
      typename ``[link asio.reference.ComposedConnectHandler ComposedConnectHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
      basic_socket< Protocol, SocketService > & s,
      Iterator begin,
      ConnectCondition connect_condition,
      ComposedConnectHandler && handler);


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: 
``
   Iterator connect_condition(
       const asio::error_code& ec,
       Iterator 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 an iterator pointing to the next endpoint to be tried. The function object should return the next iterator, but is permitted to return a different iterator so that endpoints may be skipped. The implementation guarantees that the function object will never be called with the end iterator.]]

[[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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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`.


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

   struct my_connect_condition
   {
     template <typename Iterator>
     Iterator operator()(
         const asio::error_code& ec,
         Iterator next)
     {
       if (ec) std::cout << "Error: " << ec.message() << std::endl;
       std::cout << "Trying: " << next->endpoint() << std::endl;
       return next;
     }
   }; 


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

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

   // ...

   r.async_resolve(q, resolve_handler);

   // ...

   void resolve_handler(
       const asio::error_code& ec,
       tcp::resolver::iterator i)
   {
     if (!ec)
     {
       asio::async_connect(s, i,
           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]



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


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


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator,
      typename ConnectCondition,
      typename ``[link asio.reference.ComposedConnectHandler ComposedConnectHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
      basic_socket< Protocol, SocketService > & s,
      Iterator begin,
      Iterator end,
      ConnectCondition connect_condition,
      ComposedConnectHandler && handler);


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: 
``
   Iterator connect_condition(
       const asio::error_code& ec,
       Iterator 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 an iterator pointing to the next endpoint to be tried. The function object should return the next iterator, but is permitted to return a different iterator so that endpoints may be skipped. The implementation guarantees that the function object will never be called with the end iterator.]]

[[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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`.]]

]


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

   struct my_connect_condition
   {
     template <typename Iterator>
     Iterator operator()(
         const asio::error_code& ec,
         Iterator next)
     {
       if (ec) std::cout << "Error: " << ec.message() << std::endl;
       std::cout << "Trying: " << next->endpoint() << std::endl;
       return next;
     }
   }; 


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

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

   // ...

   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_read async_read]

[indexterm1 async_read] 
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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_read.overload1 async_read]``(
      AsyncReadStream & s,
      const MutableBufferSequence & buffers,
      ReadHandler && handler,
      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 CompletionCondition,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_read.overload2 async_read]``(
      AsyncReadStream & s,
      const MutableBufferSequence & buffers,
      CompletionCondition completion_condition,
      ReadHandler && handler,
      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.DynamicBufferSequence DynamicBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_read.overload3 async_read]``(
      AsyncReadStream & s,
      DynamicBufferSequence && buffers,
      ReadHandler && handler,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_read.overload3 more...]]``

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``,
      typename CompletionCondition,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_read.overload4 async_read]``(
      AsyncReadStream & s,
      DynamicBufferSequence && buffers,
      CompletionCondition completion_condition,
      ReadHandler && handler,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_read.overload5 async_read]``(
      AsyncReadStream & s,
      basic_streambuf< Allocator > & b,
      ReadHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.async_read.overload5 more...]]``

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename Allocator,
      typename CompletionCondition,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_read.overload6 async_read]``(
      AsyncReadStream & s,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition,
      ReadHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.async_read.overload6 more...]]``

[heading Requirements]

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

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


[section:overload1 async_read (1 of 6 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read(
      AsyncReadStream & s,
      const MutableBufferSequence & buffers,
      ReadHandler && handler,
      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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 6 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 CompletionCondition,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read(
      AsyncReadStream & s,
      const MutableBufferSequence & buffers,
      CompletionCondition completion_condition,
      ReadHandler && handler,
      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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 6 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.DynamicBufferSequence DynamicBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read(
      AsyncReadStream & s,
      DynamicBufferSequence && buffers,
      ReadHandler && handler,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 6 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.DynamicBufferSequence DynamicBufferSequence]``,
      typename CompletionCondition,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read(
      AsyncReadStream & s,
      DynamicBufferSequence && buffers,
      CompletionCondition completion_condition,
      ReadHandler && handler,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`. ]]

]




[endsect]



[section:overload5 async_read (5 of 6 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read(
      AsyncReadStream & s,
      basic_streambuf< Allocator > & b,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 6 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 CompletionCondition,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read(
      AsyncReadStream & s,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`. ]]

]




[endsect]


[endsect]

[section:async_read_at async_read_at]

[indexterm1 async_read_at] 
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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_read_at.overload1 async_read_at]``(
      AsyncRandomAccessReadDevice & d,
      uint64_t offset,
      const MutableBufferSequence & buffers,
      ReadHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.async_read_at.overload1 more...]]``

  template<
      typename ``[link asio.reference.AsyncRandomAccessReadDevice AsyncRandomAccessReadDevice]``,
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename CompletionCondition,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_read_at.overload2 async_read_at]``(
      AsyncRandomAccessReadDevice & d,
      uint64_t offset,
      const MutableBufferSequence & buffers,
      CompletionCondition completion_condition,
      ReadHandler && handler);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_read_at.overload3 async_read_at]``(
      AsyncRandomAccessReadDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      ReadHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.async_read_at.overload3 more...]]``

  template<
      typename ``[link asio.reference.AsyncRandomAccessReadDevice AsyncRandomAccessReadDevice]``,
      typename Allocator,
      typename CompletionCondition,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-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);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_at(
      AsyncRandomAccessReadDevice & d,
      uint64_t offset,
      const MutableBufferSequence & buffers,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 CompletionCondition,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_at(
      AsyncRandomAccessReadDevice & d,
      uint64_t offset,
      const MutableBufferSequence & buffers,
      CompletionCondition completion_condition,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_at(
      AsyncRandomAccessReadDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 CompletionCondition,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_at(
      AsyncRandomAccessReadDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      CompletionCondition completion_condition,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`. ]]

]




[endsect]


[endsect]

[section:async_read_until async_read_until]

[indexterm1 async_read_until] 
Start an asynchronous operation to read 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. 

      
  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_read_until.overload1 async_read_until]``(
      AsyncReadStream & s,
      DynamicBufferSequence && buffers,
      char delim,
      ReadHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.async_read_until.overload1 more...]]``

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_read_until.overload2 async_read_until]``(
      AsyncReadStream & s,
      DynamicBufferSequence && buffers,
      const std::string & delim,
      ReadHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.async_read_until.overload2 more...]]``

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_read_until.overload3 async_read_until]``(
      AsyncReadStream & s,
      DynamicBufferSequence && buffers,
      const boost::regex & expr,
      ReadHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.async_read_until.overload3 more...]]``

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``,
      typename MatchCondition,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_read_until.overload4 async_read_until]``(
      AsyncReadStream & s,
      DynamicBufferSequence && buffers,
      MatchCondition match_condition,
      ReadHandler && handler,
      typename enable_if< is_match_condition< MatchCondition >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_read_until.overload4 more...]]``

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename Allocator,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_read_until.overload5 async_read_until]``(
      AsyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      char delim,
      ReadHandler && handler);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_read_until.overload6 async_read_until]``(
      AsyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      const std::string & delim,
      ReadHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.async_read_until.overload6 more...]]``

  template<
      typename ``[link asio.reference.AsyncReadStream AsyncReadStream]``,
      typename Allocator,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_read_until.overload7 async_read_until]``(
      AsyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      const boost::regex & expr,
      ReadHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.async_read_until.overload7 more...]]``

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

[heading Requirements]

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

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


[section:overload1 async_read_until (1 of 8 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.DynamicBufferSequence DynamicBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_until(
      AsyncReadStream & s,
      DynamicBufferSequence && buffers,
      char delim,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 8 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.DynamicBufferSequence DynamicBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_until(
      AsyncReadStream & s,
      DynamicBufferSequence && buffers,
      const std::string & delim,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 8 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.DynamicBufferSequence DynamicBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_until(
      AsyncReadStream & s,
      DynamicBufferSequence && buffers,
      const boost::regex & expr,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 8 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.DynamicBufferSequence DynamicBufferSequence]``,
      typename MatchCondition,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_until(
      AsyncReadStream & s,
      DynamicBufferSequence && buffers,
      MatchCondition match_condition,
      ReadHandler && handler,
      typename enable_if< is_match_condition< MatchCondition >::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 DynamicBufferSequence::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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 8 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_until(
      AsyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      char delim,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 delimiter, so that the string `line` contains: 

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


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 8 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_until(
      AsyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      const std::string & delim,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 delimiter, so that the string `line` contains: 

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


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 8 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_until(
      AsyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      const boost::regex & expr,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 match, so that the string `line` contains: 

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


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 8 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_until(
      AsyncReadStream & s,
      asio::basic_streambuf< Allocator > & b,
      MatchCondition match_condition,
      ReadHandler && handler,
      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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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]


[endsect]

[section:async_result async_result]


An interface for customising the behaviour of an initiating function. 


  template<
      typename ``[link asio.reference.Handler Handler]``>
  class async_result


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

  [

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

]

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

  [
    [[link asio.reference.async_result.async_result [*async_result]]]
    [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. ]
  ]
  
]

This template may be specialised for user-defined handler types. 

[heading Requirements]

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

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


[section:async_result async_result::async_result]

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


  async_result(
      Handler & );


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


[endsect]



[section:get async_result::get]

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


  type get();



[endsect]



[section:type async_result::type]

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


  typedef void type;



[heading Requirements]

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

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


[endsect]



[endsect]

[section:async_write async_write]

[indexterm1 async_write] 
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.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_write.overload1 async_write]``(
      AsyncWriteStream & s,
      const ConstBufferSequence & buffers,
      WriteHandler && handler,
      typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_write.overload1 more...]]``

  template<
      typename ``[link asio.reference.AsyncWriteStream AsyncWriteStream]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename CompletionCondition,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-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...]]``

  template<
      typename ``[link asio.reference.AsyncWriteStream AsyncWriteStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_write.overload3 async_write]``(
      AsyncWriteStream & s,
      DynamicBufferSequence && buffers,
      WriteHandler && handler,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_write.overload3 more...]]``

  template<
      typename ``[link asio.reference.AsyncWriteStream AsyncWriteStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``,
      typename CompletionCondition,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_write.overload4 async_write]``(
      AsyncWriteStream & s,
      DynamicBufferSequence && buffers,
      CompletionCondition completion_condition,
      WriteHandler && handler,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.async_write.overload4 more...]]``

  template<
      typename ``[link asio.reference.AsyncWriteStream AsyncWriteStream]``,
      typename Allocator,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_write.overload5 async_write]``(
      AsyncWriteStream & s,
      basic_streambuf< Allocator > & b,
      WriteHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.async_write.overload5 more...]]``

  template<
      typename ``[link asio.reference.AsyncWriteStream AsyncWriteStream]``,
      typename Allocator,
      typename CompletionCondition,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-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...]]``

[heading Requirements]

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

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


[section:overload1 async_write (1 of 6 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write(
      AsyncWriteStream & s,
      const ConstBufferSequence & buffers,
      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.


* 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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 6 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 CompletionCondition,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 6 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.DynamicBufferSequence DynamicBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write(
      AsyncWriteStream & s,
      DynamicBufferSequence && buffers,
      WriteHandler && handler,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`. ]]

]




[endsect]



[section:overload4 async_write (4 of 6 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.DynamicBufferSequence DynamicBufferSequence]``,
      typename CompletionCondition,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write(
      AsyncWriteStream & s,
      DynamicBufferSequence && buffers,
      CompletionCondition completion_condition,
      WriteHandler && handler,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`. ]]

]




[endsect]



[section:overload5 async_write (5 of 6 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write(
      AsyncWriteStream & s,
      basic_streambuf< Allocator > & b,
      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.


* 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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`. ]]

]




[endsect]



[section:overload6 async_write (6 of 6 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 CompletionCondition,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`. ]]

]




[endsect]


[endsect]

[section:async_write_at async_write_at]

[indexterm1 async_write_at] 
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.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_write_at.overload1 async_write_at]``(
      AsyncRandomAccessWriteDevice & d,
      uint64_t offset,
      const ConstBufferSequence & buffers,
      WriteHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.async_write_at.overload1 more...]]``

  template<
      typename ``[link asio.reference.AsyncRandomAccessWriteDevice AsyncRandomAccessWriteDevice]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename CompletionCondition,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_write_at.overload2 async_write_at]``(
      AsyncRandomAccessWriteDevice & d,
      uint64_t offset,
      const ConstBufferSequence & buffers,
      CompletionCondition completion_condition,
      WriteHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.async_write_at.overload2 more...]]``

  template<
      typename ``[link asio.reference.AsyncRandomAccessWriteDevice AsyncRandomAccessWriteDevice]``,
      typename Allocator,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_write_at.overload3 async_write_at]``(
      AsyncRandomAccessWriteDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      WriteHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.async_write_at.overload3 more...]]``

  template<
      typename ``[link asio.reference.AsyncRandomAccessWriteDevice AsyncRandomAccessWriteDevice]``,
      typename Allocator,
      typename CompletionCondition,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-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);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_at(
      AsyncRandomAccessWriteDevice & d,
      uint64_t offset,
      const ConstBufferSequence & buffers,
      WriteHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 CompletionCondition,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_at(
      AsyncRandomAccessWriteDevice & d,
      uint64_t offset,
      const ConstBufferSequence & buffers,
      CompletionCondition completion_condition,
      WriteHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_at(
      AsyncRandomAccessWriteDevice & d,
      uint64_t offset,
      basic_streambuf< Allocator > & b,
      WriteHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 CompletionCondition,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_at(
      AsyncRandomAccessWriteDevice & d,
      uint64_t offset,
      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 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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`. ]]

]




[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. ]
  ]
  
  [
    [[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 bad_executor..bad_executor] 
Constructor. 


  bad_executor();



[endsect]



[section:what bad_executor::what]

[indexterm2 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.DatagramSocketService DatagramSocketService]`` = datagram_socket_service<Protocol>>
  class basic_datagram_socket :
    public basic_socket< Protocol, DatagramSocketService >


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_datagram_socket without opening it. 

     Construct and open a basic_datagram_socket. 

     Construct a basic_datagram_socket, opening it and binding it to the given local endpoint. 

     Construct a basic_datagram_socket on an existing native socket. 

     Move-construct a basic_datagram_socket from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     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. 

     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.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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_datagram_socket.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_datagram_socket.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_peek [*message_peek]]]
    [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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 async_connect..basic_datagram_socket] 
Start an asynchronous connect. 


  template<
      typename ``[link asio.reference.ConnectHandler ConnectHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
      const endpoint_type & peer_endpoint,
      ConnectHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`.]]

]


[heading Example]
  


   void connect_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Connect succeeded.
     }
   }

   ...

   asio::ip::tcp::socket socket(io_service);
   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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.basic_datagram_socket.async_receive.overload1 async_receive]``(
      const MutableBufferSequence & buffers,
      ReadHandler && handler);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.basic_datagram_socket.async_receive.overload2 async_receive]``(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      ReadHandler && handler);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive(
      const MutableBufferSequence & buffers,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.basic_datagram_socket.async_receive_from.overload1 async_receive_from]``(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      ReadHandler && handler);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-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);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive_from(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive_from(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      socket_base::message_flags flags,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`. ]]

]




[endsect]


[endsect]

[section:async_send basic_datagram_socket::async_send]

[indexterm2 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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.basic_datagram_socket.async_send.overload1 async_send]``(
      const ConstBufferSequence & buffers,
      WriteHandler && handler);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.basic_datagram_socket.async_send.overload2 async_send]``(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      WriteHandler && handler);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send(
      const ConstBufferSequence & buffers,
      WriteHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      WriteHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.basic_datagram_socket.async_send_to.overload1 async_send_to]``(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      WriteHandler && handler);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-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);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send_to(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      WriteHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send_to(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      socket_base::message_flags flags,
      WriteHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`. ]]

]




[endsect]


[endsect]


[section:async_wait basic_datagram_socket::async_wait]


['Inherited from basic_socket.]

[indexterm2 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      wait_type w,
      WaitHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`.]]

]


[heading Example]
  


   void wait_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Wait succeeded.
     }
   }

   ...

   asio::ip::tcp::socket socket(io_service);
   ...
   socket.async_wait(asio::ip::tcp::socket::wait_read, wait_handler);







[endsect]


[section:at_mark basic_datagram_socket::at_mark]

[indexterm2 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 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 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]``(
      asio::io_service & io_service);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.basic_datagram_socket.overload1 more...]]``


Construct and open a [link asio.reference.basic_datagram_socket `basic_datagram_socket`]. 


  ``[link asio.reference.basic_datagram_socket.basic_datagram_socket.overload2 basic_datagram_socket]``(
      asio::io_service & io_service,
      const protocol_type & protocol);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.basic_datagram_socket.overload2 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.overload3 basic_datagram_socket]``(
      asio::io_service & io_service,
      const endpoint_type & endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.basic_datagram_socket.overload3 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.overload4 basic_datagram_socket]``(
      asio::io_service & io_service,
      const protocol_type & protocol,
      const native_handle_type & native_socket);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.basic_datagram_socket.overload4 more...]]``


Move-construct a [link asio.reference.basic_datagram_socket `basic_datagram_socket`] from another. 


  ``[link asio.reference.basic_datagram_socket.basic_datagram_socket.overload5 basic_datagram_socket]``(
      basic_datagram_socket && other);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.basic_datagram_socket.overload5 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.DatagramSocketService DatagramSocketService1]``>
  ``[link asio.reference.basic_datagram_socket.basic_datagram_socket.overload6 basic_datagram_socket]``(
      basic_datagram_socket< Protocol1, DatagramSocketService1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.basic_datagram_socket.overload6 more...]]``


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


Construct a [link asio.reference.basic_datagram_socket `basic_datagram_socket`] without opening it. 


  basic_datagram_socket(
      asio::io_service & io_service);


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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the datagram socket will use to dispatch handlers for any asynchronous operations performed on the socket. ]]

]




[endsect]



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


Construct and open a [link asio.reference.basic_datagram_socket `basic_datagram_socket`]. 


  basic_datagram_socket(
      asio::io_service & io_service,
      const protocol_type & protocol);


This constructor creates and opens a datagram socket.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the datagram socket will use 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:overload3 basic_datagram_socket::basic_datagram_socket (3 of 6 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(
      asio::io_service & io_service,
      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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the datagram socket will use 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:overload4 basic_datagram_socket::basic_datagram_socket (4 of 6 overloads)]


Construct a [link asio.reference.basic_datagram_socket `basic_datagram_socket`] on an existing native socket. 


  basic_datagram_socket(
      asio::io_service & io_service,
      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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the datagram socket will use 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:overload5 basic_datagram_socket::basic_datagram_socket (5 of 6 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(io_service&) constructor`. 




[endsect]



[section:overload6 basic_datagram_socket::basic_datagram_socket (6 of 6 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.DatagramSocketService DatagramSocketService1]``>
  basic_datagram_socket(
      basic_datagram_socket< Protocol1, DatagramSocketService1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::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(io_service&) constructor`. 




[endsect]


[endsect]

[section:bind basic_datagram_socket::bind]

[indexterm2 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...]]``

  asio::error_code ``[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(io_service);
   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. 


  asio::error_code 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(io_service);
   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 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(io_service); 
   ...
   asio::socket_base::broadcast option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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(io_service);
   ...
   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 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...]]``

  asio::error_code ``[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(io_service);
   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. 


  asio::error_code 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(io_service);
   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 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(io_service); 
   ...
   asio::socket_base::debug option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::do_not_route option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::enable_connection_aborted option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(io_service); 
   ...
   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 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]


['Inherited from basic_io_object.]

[indexterm2 executor_type..basic_datagram_socket] 
The type of the executor associated with the object. 


  typedef asio::io_service::executor_type executor_type;


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

  [
    [[link asio.reference.io_service__executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.defer [*defer]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.dispatch [*dispatch]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_finished [*on_work_finished]]]
    [Inform the io_service that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_started [*on_work_started]]]
    [Inform the io_service that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.post [*post]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the io_service is running in the current thread. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_service__executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[heading Requirements]

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

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


[endsect]



[section:get_executor basic_datagram_socket::get_executor]


['Inherited from basic_io_object.]

[indexterm2 get_executor..basic_datagram_socket] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_implementation basic_datagram_socket::get_implementation]

[indexterm2 get_implementation..basic_datagram_socket] 
Get the underlying implementation of the I/O object. 


  implementation_type & ``[link asio.reference.basic_datagram_socket.get_implementation.overload1 get_implementation]``();
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.get_implementation.overload1 more...]]``

  const implementation_type & ``[link asio.reference.basic_datagram_socket.get_implementation.overload2 get_implementation]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.get_implementation.overload2 more...]]``


[section:overload1 basic_datagram_socket::get_implementation (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  implementation_type & get_implementation();



[endsect]



[section:overload2 basic_datagram_socket::get_implementation (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  const implementation_type & get_implementation() const;



[endsect]


[endsect]


[section:get_io_service basic_datagram_socket::get_io_service]


['Inherited from basic_io_object.]

[indexterm2 get_io_service..basic_datagram_socket] 
(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();


This function may be used to obtain the [link asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_service `io_service`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 




[endsect]


[section:get_option basic_datagram_socket::get_option]

[indexterm2 get_option..basic_datagram_socket] 
Get an option from the socket. 


  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...]]``

  asio::error_code ``[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(io_service);
   ...
   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]``>
  asio::error_code 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(io_service);
   ...
   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:get_service basic_datagram_socket::get_service]

[indexterm2 get_service..basic_datagram_socket] 
Get the service associated with the I/O object. 


  service_type & ``[link asio.reference.basic_datagram_socket.get_service.overload1 get_service]``();
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.get_service.overload1 more...]]``

  const service_type & ``[link asio.reference.basic_datagram_socket.get_service.overload2 get_service]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.get_service.overload2 more...]]``


[section:overload1 basic_datagram_socket::get_service (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  service_type & get_service();



[endsect]



[section:overload2 basic_datagram_socket::get_service (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  const service_type & get_service() const;



[endsect]


[endsect]


[section:implementation_type basic_datagram_socket::implementation_type]


['Inherited from basic_io_object.]

[indexterm2 implementation_type..basic_datagram_socket] 
The underlying implementation type of I/O object. 


  typedef service_type::implementation_type implementation_type;



[heading Requirements]

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

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


[endsect]


[section:io_control basic_datagram_socket::io_control]

[indexterm2 io_control..basic_datagram_socket] 
Perform an IO control command on the socket. 


  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...]]``

  asio::error_code ``[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(io_service);
   ...
   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]``>
  asio::error_code 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(io_service);
   ...
   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 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 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(io_service); 
   ...
   asio::socket_base::keep_alive option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::linger option(true, 30);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service);
   ...
   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(io_service);
   ...
   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 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 lowest_layer_type..basic_datagram_socket] 
A [link asio.reference.basic_socket `basic_socket`] is always the lowest layer. 


  typedef basic_socket< Protocol, DatagramSocketService > lowest_layer_type;


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_socket without opening it. 

     Construct and open a basic_socket. 

     Construct a basic_socket, opening it and binding it to the given local endpoint. 

     Construct a basic_socket on an existing native socket. 

     Move-construct a basic_socket from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     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. 

     Move-assign a basic_socket from a socket of another protocol type. ]
  ]
  
  [
    [[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.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_socket.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_socket._basic_socket [*~basic_socket]]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_socket.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_socket.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_socket.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_socket.message_peek [*message_peek]]]
    [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 max_connections..basic_datagram_socket] 
The maximum length of the queue of pending incoming connections. 


  static const int max_connections = implementation_defined;



[endsect]



[section:message_do_not_route basic_datagram_socket::message_do_not_route]


['Inherited from socket_base.]

[indexterm2 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 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 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 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 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 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 native_handle_type..basic_datagram_socket] 
The native representation of a socket. 


  typedef DatagramSocketService::native_handle_type 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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(io_service);
   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. 


  asio::error_code 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(io_service);
   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 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.DatagramSocketService DatagramSocketService1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value, basic_datagram_socket >::type & ``[link asio.reference.basic_datagram_socket.operator_eq_.overload2 operator=]``(
      basic_datagram_socket< Protocol1, DatagramSocketService1 > && 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(io_service&) 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.DatagramSocketService DatagramSocketService1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value, basic_datagram_socket >::type & operator=(
      basic_datagram_socket< Protocol1, DatagramSocketService1 > && 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(io_service&) constructor`. 




[endsect]


[endsect]


[section:protocol_type basic_datagram_socket::protocol_type]

[indexterm2 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 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 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(io_service); 
   ...
   asio::socket_base::receive_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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 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(io_service); 
   ...
   asio::socket_base::receive_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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:remote_endpoint basic_datagram_socket::remote_endpoint]

[indexterm2 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(io_service);
   ...
   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(io_service);
   ...
   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 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(io_service); 
   ...
   asio::socket_base::reuse_address option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(io_service); 
   ...
   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 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 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(io_service); 
   ...
   asio::socket_base::send_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::send_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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:service_type basic_datagram_socket::service_type]


['Inherited from basic_io_object.]

[indexterm2 service_type..basic_datagram_socket] 
The type of the service that will be used to provide I/O operations. 


  typedef DatagramSocketService service_type;



[heading Requirements]

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

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


[endsect]


[section:set_option basic_datagram_socket::set_option]

[indexterm2 set_option..basic_datagram_socket] 
Set an option on the socket. 


  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...]]``

  asio::error_code ``[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(io_service);
   ...
   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]``>
  asio::error_code 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(io_service);
   ...
   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 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...]]``

  asio::error_code ``[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(io_service);
   ...
   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. 


  asio::error_code 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(io_service);
   ...
   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 shutdown_type..basic_datagram_socket] 
Different ways a socket may be shutdown. 


  enum shutdown_type

[indexterm2 shutdown_receive..basic_datagram_socket]
[indexterm2 shutdown_send..basic_datagram_socket]
[indexterm2 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 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...]]``

  asio::error_code ``[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(io_service);
   ...
   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. 


  asio::error_code 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(io_service);
   ...
   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 wait_type..basic_datagram_socket] 
Wait types. 


  enum wait_type

[indexterm2 wait_read..basic_datagram_socket]
[indexterm2 wait_write..basic_datagram_socket]
[indexterm2 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]



[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.TimerService TimerService]`` = deadline_timer_service<Time, TimeTraits>>
  class basic_deadline_timer :
    public basic_io_object< TimerService >


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.basic_deadline_timer.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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 to set a particular expiry time as an absolute time. 

     Constructor to set a particular expiry time relative to now. ]
  ]
  
  [
    [[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. 

     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. 

     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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.wait [*wait]]]
    [Perform a blocking wait on the timer. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_deadline_timer.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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(io_service);

   // 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(io_service,
       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 async_wait..basic_deadline_timer] 
Start an asynchronous wait on the timer. 


  template<
      typename ``[link asio.reference.WaitHandler WaitHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      WaitHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`. ]]

]




[endsect]


[section:basic_deadline_timer basic_deadline_timer::basic_deadline_timer]

[indexterm2 basic_deadline_timer..basic_deadline_timer] 
Constructor. 


  explicit ``[link asio.reference.basic_deadline_timer.basic_deadline_timer.overload1 basic_deadline_timer]``(
      asio::io_service & io_service);
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.basic_deadline_timer.overload1 more...]]``


Constructor to set a particular expiry time as an absolute time. 


  ``[link asio.reference.basic_deadline_timer.basic_deadline_timer.overload2 basic_deadline_timer]``(
      asio::io_service & io_service,
      const time_type & expiry_time);
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.basic_deadline_timer.overload2 more...]]``


Constructor to set a particular expiry time relative to now. 


  ``[link asio.reference.basic_deadline_timer.basic_deadline_timer.overload3 basic_deadline_timer]``(
      asio::io_service & io_service,
      const duration_type & expiry_time);
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.basic_deadline_timer.overload3 more...]]``


[section:overload1 basic_deadline_timer::basic_deadline_timer (1 of 3 overloads)]


Constructor. 


  basic_deadline_timer(
      asio::io_service & io_service);


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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the timer will use to dispatch handlers for any asynchronous operations performed on the timer. ]]

]




[endsect]



[section:overload2 basic_deadline_timer::basic_deadline_timer (2 of 3 overloads)]


Constructor to set a particular expiry time as an absolute time. 


  basic_deadline_timer(
      asio::io_service & io_service,
      const time_type & expiry_time);


This constructor creates a timer and sets the expiry time.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the timer will use 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:overload3 basic_deadline_timer::basic_deadline_timer (3 of 3 overloads)]


Constructor to set a particular expiry time relative to now. 


  basic_deadline_timer(
      asio::io_service & io_service,
      const duration_type & expiry_time);


This constructor creates a timer and sets the expiry time.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the timer will use 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]


[endsect]

[section:cancel basic_deadline_timer::cancel]

[indexterm2 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 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 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]


['Inherited from basic_io_object.]

[indexterm2 executor_type..basic_deadline_timer] 
The type of the executor associated with the object. 


  typedef asio::io_service::executor_type executor_type;


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

  [
    [[link asio.reference.io_service__executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.defer [*defer]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.dispatch [*dispatch]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_finished [*on_work_finished]]]
    [Inform the io_service that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_started [*on_work_started]]]
    [Inform the io_service that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.post [*post]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the io_service is running in the current thread. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_service__executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[heading Requirements]

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

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


[endsect]


[section:expires_at basic_deadline_timer::expires_at]

[indexterm2 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 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]


['Inherited from basic_io_object.]

[indexterm2 get_executor..basic_deadline_timer] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_implementation basic_deadline_timer::get_implementation]

[indexterm2 get_implementation..basic_deadline_timer] 
Get the underlying implementation of the I/O object. 


  implementation_type & ``[link asio.reference.basic_deadline_timer.get_implementation.overload1 get_implementation]``();
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.get_implementation.overload1 more...]]``

  const implementation_type & ``[link asio.reference.basic_deadline_timer.get_implementation.overload2 get_implementation]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.get_implementation.overload2 more...]]``


[section:overload1 basic_deadline_timer::get_implementation (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  implementation_type & get_implementation();



[endsect]



[section:overload2 basic_deadline_timer::get_implementation (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  const implementation_type & get_implementation() const;



[endsect]


[endsect]


[section:get_io_service basic_deadline_timer::get_io_service]


['Inherited from basic_io_object.]

[indexterm2 get_io_service..basic_deadline_timer] 
(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();


This function may be used to obtain the [link asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_service `io_service`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 




[endsect]


[section:get_service basic_deadline_timer::get_service]

[indexterm2 get_service..basic_deadline_timer] 
Get the service associated with the I/O object. 


  service_type & ``[link asio.reference.basic_deadline_timer.get_service.overload1 get_service]``();
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.get_service.overload1 more...]]``

  const service_type & ``[link asio.reference.basic_deadline_timer.get_service.overload2 get_service]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.get_service.overload2 more...]]``


[section:overload1 basic_deadline_timer::get_service (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  service_type & get_service();



[endsect]



[section:overload2 basic_deadline_timer::get_service (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  const service_type & get_service() const;



[endsect]


[endsect]


[section:implementation_type basic_deadline_timer::implementation_type]


['Inherited from basic_io_object.]

[indexterm2 implementation_type..basic_deadline_timer] 
The underlying implementation type of I/O object. 


  typedef service_type::implementation_type implementation_type;



[heading Requirements]

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

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


[endsect]



[section:service_type basic_deadline_timer::service_type]


['Inherited from basic_io_object.]

[indexterm2 service_type..basic_deadline_timer] 
The type of the service that will be used to provide I/O operations. 


  typedef TimerService service_type;



[heading Requirements]

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

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


[endsect]



[section:time_type basic_deadline_timer::time_type]

[indexterm2 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 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 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]


[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_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service associated with the object. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_io_object.basic_io_object [*basic_io_object]]]
    [Construct a basic_io_object. 

     Move-construct 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]]]
    [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 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_service & io_service);
  ``  [''''&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...]]``


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


Construct a [link asio.reference.basic_io_object `basic_io_object`]. 


  basic_io_object(
      asio::io_service & io_service);


Performs: 

   get_service().construct(get_implementation()); 





[endsect]



[section:overload2 basic_io_object::basic_io_object (2 of 2 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]


[endsect]


[section:executor_type basic_io_object::executor_type]

[indexterm2 executor_type..basic_io_object] 
The type of the executor associated with the object. 


  typedef asio::io_service::executor_type executor_type;


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

  [
    [[link asio.reference.io_service__executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.defer [*defer]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.dispatch [*dispatch]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_finished [*on_work_finished]]]
    [Inform the io_service that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_started [*on_work_started]]]
    [Inform the io_service that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.post [*post]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the io_service is running in the current thread. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_service__executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[heading Requirements]

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

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


[endsect]



[section:get_executor basic_io_object::get_executor]

[indexterm2 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 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_service basic_io_object::get_io_service]

[indexterm2 get_io_service..basic_io_object] 
(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();


This function may be used to obtain the [link asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_service `io_service`] 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 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 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 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 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 ~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.RawSocketService RawSocketService]`` = raw_socket_service<Protocol>>
  class basic_raw_socket :
    public basic_socket< Protocol, RawSocketService >


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_raw_socket without opening it. 

     Construct and open a basic_raw_socket. 

     Construct a basic_raw_socket, opening it and binding it to the given local endpoint. 

     Construct a basic_raw_socket on an existing native socket. 

     Move-construct a basic_raw_socket from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     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. 

     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.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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_raw_socket.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_raw_socket.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_peek [*message_peek]]]
    [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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 async_connect..basic_raw_socket] 
Start an asynchronous connect. 


  template<
      typename ``[link asio.reference.ConnectHandler ConnectHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
      const endpoint_type & peer_endpoint,
      ConnectHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`.]]

]


[heading Example]
  


   void connect_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Connect succeeded.
     }
   }

   ...

   asio::ip::tcp::socket socket(io_service);
   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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.basic_raw_socket.async_receive.overload1 async_receive]``(
      const MutableBufferSequence & buffers,
      ReadHandler && handler);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.basic_raw_socket.async_receive.overload2 async_receive]``(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      ReadHandler && handler);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive(
      const MutableBufferSequence & buffers,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.basic_raw_socket.async_receive_from.overload1 async_receive_from]``(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      ReadHandler && handler);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-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);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive_from(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive_from(
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      socket_base::message_flags flags,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`. ]]

]




[endsect]


[endsect]

[section:async_send basic_raw_socket::async_send]

[indexterm2 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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.basic_raw_socket.async_send.overload1 async_send]``(
      const ConstBufferSequence & buffers,
      WriteHandler && handler);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.basic_raw_socket.async_send.overload2 async_send]``(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      WriteHandler && handler);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send(
      const ConstBufferSequence & buffers,
      WriteHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      WriteHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.basic_raw_socket.async_send_to.overload1 async_send_to]``(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      WriteHandler && handler);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-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);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send_to(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      WriteHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send_to(
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      socket_base::message_flags flags,
      WriteHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`. ]]

]




[endsect]


[endsect]


[section:async_wait basic_raw_socket::async_wait]


['Inherited from basic_socket.]

[indexterm2 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      wait_type w,
      WaitHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`.]]

]


[heading Example]
  


   void wait_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Wait succeeded.
     }
   }

   ...

   asio::ip::tcp::socket socket(io_service);
   ...
   socket.async_wait(asio::ip::tcp::socket::wait_read, wait_handler);







[endsect]


[section:at_mark basic_raw_socket::at_mark]

[indexterm2 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 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 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]``(
      asio::io_service & io_service);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.basic_raw_socket.overload1 more...]]``


Construct and open a [link asio.reference.basic_raw_socket `basic_raw_socket`]. 


  ``[link asio.reference.basic_raw_socket.basic_raw_socket.overload2 basic_raw_socket]``(
      asio::io_service & io_service,
      const protocol_type & protocol);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.basic_raw_socket.overload2 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.overload3 basic_raw_socket]``(
      asio::io_service & io_service,
      const endpoint_type & endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.basic_raw_socket.overload3 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.overload4 basic_raw_socket]``(
      asio::io_service & io_service,
      const protocol_type & protocol,
      const native_handle_type & native_socket);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.basic_raw_socket.overload4 more...]]``


Move-construct a [link asio.reference.basic_raw_socket `basic_raw_socket`] from another. 


  ``[link asio.reference.basic_raw_socket.basic_raw_socket.overload5 basic_raw_socket]``(
      basic_raw_socket && other);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.basic_raw_socket.overload5 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.RawSocketService RawSocketService1]``>
  ``[link asio.reference.basic_raw_socket.basic_raw_socket.overload6 basic_raw_socket]``(
      basic_raw_socket< Protocol1, RawSocketService1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.basic_raw_socket.overload6 more...]]``


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


Construct a [link asio.reference.basic_raw_socket `basic_raw_socket`] without opening it. 


  basic_raw_socket(
      asio::io_service & io_service);


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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the raw socket will use to dispatch handlers for any asynchronous operations performed on the socket. ]]

]




[endsect]



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


Construct and open a [link asio.reference.basic_raw_socket `basic_raw_socket`]. 


  basic_raw_socket(
      asio::io_service & io_service,
      const protocol_type & protocol);


This constructor creates and opens a raw socket.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the raw socket will use 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:overload3 basic_raw_socket::basic_raw_socket (3 of 6 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(
      asio::io_service & io_service,
      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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the raw socket will use 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:overload4 basic_raw_socket::basic_raw_socket (4 of 6 overloads)]


Construct a [link asio.reference.basic_raw_socket `basic_raw_socket`] on an existing native socket. 


  basic_raw_socket(
      asio::io_service & io_service,
      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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the raw socket will use 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:overload5 basic_raw_socket::basic_raw_socket (5 of 6 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(io_service&) constructor`. 




[endsect]



[section:overload6 basic_raw_socket::basic_raw_socket (6 of 6 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.RawSocketService RawSocketService1]``>
  basic_raw_socket(
      basic_raw_socket< Protocol1, RawSocketService1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::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(io_service&) constructor`. 




[endsect]


[endsect]

[section:bind basic_raw_socket::bind]

[indexterm2 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...]]``

  asio::error_code ``[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(io_service);
   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. 


  asio::error_code 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(io_service);
   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 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(io_service); 
   ...
   asio::socket_base::broadcast option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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(io_service);
   ...
   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 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...]]``

  asio::error_code ``[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(io_service);
   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. 


  asio::error_code 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(io_service);
   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 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(io_service); 
   ...
   asio::socket_base::debug option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::do_not_route option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::enable_connection_aborted option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(io_service); 
   ...
   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 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]


['Inherited from basic_io_object.]

[indexterm2 executor_type..basic_raw_socket] 
The type of the executor associated with the object. 


  typedef asio::io_service::executor_type executor_type;


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

  [
    [[link asio.reference.io_service__executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.defer [*defer]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.dispatch [*dispatch]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_finished [*on_work_finished]]]
    [Inform the io_service that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_started [*on_work_started]]]
    [Inform the io_service that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.post [*post]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the io_service is running in the current thread. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_service__executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[heading Requirements]

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

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


[endsect]



[section:get_executor basic_raw_socket::get_executor]


['Inherited from basic_io_object.]

[indexterm2 get_executor..basic_raw_socket] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_implementation basic_raw_socket::get_implementation]

[indexterm2 get_implementation..basic_raw_socket] 
Get the underlying implementation of the I/O object. 


  implementation_type & ``[link asio.reference.basic_raw_socket.get_implementation.overload1 get_implementation]``();
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.get_implementation.overload1 more...]]``

  const implementation_type & ``[link asio.reference.basic_raw_socket.get_implementation.overload2 get_implementation]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.get_implementation.overload2 more...]]``


[section:overload1 basic_raw_socket::get_implementation (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  implementation_type & get_implementation();



[endsect]



[section:overload2 basic_raw_socket::get_implementation (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  const implementation_type & get_implementation() const;



[endsect]


[endsect]


[section:get_io_service basic_raw_socket::get_io_service]


['Inherited from basic_io_object.]

[indexterm2 get_io_service..basic_raw_socket] 
(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();


This function may be used to obtain the [link asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_service `io_service`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 




[endsect]


[section:get_option basic_raw_socket::get_option]

[indexterm2 get_option..basic_raw_socket] 
Get an option from the socket. 


  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...]]``

  asio::error_code ``[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(io_service);
   ...
   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]``>
  asio::error_code 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(io_service);
   ...
   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:get_service basic_raw_socket::get_service]

[indexterm2 get_service..basic_raw_socket] 
Get the service associated with the I/O object. 


  service_type & ``[link asio.reference.basic_raw_socket.get_service.overload1 get_service]``();
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.get_service.overload1 more...]]``

  const service_type & ``[link asio.reference.basic_raw_socket.get_service.overload2 get_service]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.get_service.overload2 more...]]``


[section:overload1 basic_raw_socket::get_service (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  service_type & get_service();



[endsect]



[section:overload2 basic_raw_socket::get_service (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  const service_type & get_service() const;



[endsect]


[endsect]


[section:implementation_type basic_raw_socket::implementation_type]


['Inherited from basic_io_object.]

[indexterm2 implementation_type..basic_raw_socket] 
The underlying implementation type of I/O object. 


  typedef service_type::implementation_type implementation_type;



[heading Requirements]

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

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


[endsect]


[section:io_control basic_raw_socket::io_control]

[indexterm2 io_control..basic_raw_socket] 
Perform an IO control command on the socket. 


  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...]]``

  asio::error_code ``[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(io_service);
   ...
   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]``>
  asio::error_code 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(io_service);
   ...
   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 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 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(io_service); 
   ...
   asio::socket_base::keep_alive option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::linger option(true, 30);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service);
   ...
   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(io_service);
   ...
   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 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 lowest_layer_type..basic_raw_socket] 
A [link asio.reference.basic_socket `basic_socket`] is always the lowest layer. 


  typedef basic_socket< Protocol, RawSocketService > lowest_layer_type;


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_socket without opening it. 

     Construct and open a basic_socket. 

     Construct a basic_socket, opening it and binding it to the given local endpoint. 

     Construct a basic_socket on an existing native socket. 

     Move-construct a basic_socket from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     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. 

     Move-assign a basic_socket from a socket of another protocol type. ]
  ]
  
  [
    [[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.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_socket.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_socket._basic_socket [*~basic_socket]]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_socket.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_socket.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_socket.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_socket.message_peek [*message_peek]]]
    [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 max_connections..basic_raw_socket] 
The maximum length of the queue of pending incoming connections. 


  static const int max_connections = implementation_defined;



[endsect]



[section:message_do_not_route basic_raw_socket::message_do_not_route]


['Inherited from socket_base.]

[indexterm2 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 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 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 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 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 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 native_handle_type..basic_raw_socket] 
The native representation of a socket. 


  typedef RawSocketService::native_handle_type 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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(io_service);
   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. 


  asio::error_code 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(io_service);
   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 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.RawSocketService RawSocketService1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value, basic_raw_socket >::type & ``[link asio.reference.basic_raw_socket.operator_eq_.overload2 operator=]``(
      basic_raw_socket< Protocol1, RawSocketService1 > && 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(io_service&) 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.RawSocketService RawSocketService1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value, basic_raw_socket >::type & operator=(
      basic_raw_socket< Protocol1, RawSocketService1 > && 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(io_service&) constructor`. 




[endsect]


[endsect]


[section:protocol_type basic_raw_socket::protocol_type]

[indexterm2 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 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 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(io_service); 
   ...
   asio::socket_base::receive_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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 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(io_service); 
   ...
   asio::socket_base::receive_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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:remote_endpoint basic_raw_socket::remote_endpoint]

[indexterm2 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(io_service);
   ...
   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(io_service);
   ...
   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 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(io_service); 
   ...
   asio::socket_base::reuse_address option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(io_service); 
   ...
   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 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 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(io_service); 
   ...
   asio::socket_base::send_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::send_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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:service_type basic_raw_socket::service_type]


['Inherited from basic_io_object.]

[indexterm2 service_type..basic_raw_socket] 
The type of the service that will be used to provide I/O operations. 


  typedef RawSocketService service_type;



[heading Requirements]

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

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


[endsect]


[section:set_option basic_raw_socket::set_option]

[indexterm2 set_option..basic_raw_socket] 
Set an option on the socket. 


  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...]]``

  asio::error_code ``[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(io_service);
   ...
   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]``>
  asio::error_code 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(io_service);
   ...
   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 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...]]``

  asio::error_code ``[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(io_service);
   ...
   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. 


  asio::error_code 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(io_service);
   ...
   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 shutdown_type..basic_raw_socket] 
Different ways a socket may be shutdown. 


  enum shutdown_type

[indexterm2 shutdown_receive..basic_raw_socket]
[indexterm2 shutdown_send..basic_raw_socket]
[indexterm2 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 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...]]``

  asio::error_code ``[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(io_service);
   ...
   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. 


  asio::error_code 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(io_service);
   ...
   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 wait_type..basic_raw_socket] 
Wait types. 


  enum wait_type

[indexterm2 wait_read..basic_raw_socket]
[indexterm2 wait_write..basic_raw_socket]
[indexterm2 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]



[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.SeqPacketSocketService SeqPacketSocketService]`` = seq_packet_socket_service<Protocol>>
  class basic_seq_packet_socket :
    public basic_socket< Protocol, SeqPacketSocketService >


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_seq_packet_socket without opening it. 

     Construct and open a basic_seq_packet_socket. 

     Construct a basic_seq_packet_socket, opening it and binding it to the given local endpoint. 

     Construct a basic_seq_packet_socket on an existing native socket. 

     Move-construct a basic_seq_packet_socket from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     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. 

     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. 

     Receive some data on a connected 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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_seq_packet_socket.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_seq_packet_socket.max_connections [*max_connections]]]
    [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]]]
    [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]]]
    [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]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_seq_packet_socket.message_peek [*message_peek]]]
    [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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 async_connect..basic_seq_packet_socket] 
Start an asynchronous connect. 


  template<
      typename ``[link asio.reference.ConnectHandler ConnectHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
      const endpoint_type & peer_endpoint,
      ConnectHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`.]]

]


[heading Example]
  


   void connect_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Connect succeeded.
     }
   }

   ...

   asio::ip::tcp::socket socket(io_service);
   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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.basic_seq_packet_socket.async_receive.overload1 async_receive]``(
      const MutableBufferSequence & buffers,
      socket_base::message_flags & out_flags,
      ReadHandler && handler);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-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);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive(
      const MutableBufferSequence & buffers,
      socket_base::message_flags & out_flags,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive(
      const MutableBufferSequence & buffers,
      socket_base::message_flags in_flags,
      socket_base::message_flags & out_flags,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      WriteHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      wait_type w,
      WaitHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`.]]

]


[heading Example]
  


   void wait_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Wait succeeded.
     }
   }

   ...

   asio::ip::tcp::socket socket(io_service);
   ...
   socket.async_wait(asio::ip::tcp::socket::wait_read, wait_handler);







[endsect]


[section:at_mark basic_seq_packet_socket::at_mark]

[indexterm2 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 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 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]``(
      asio::io_service & io_service);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload1 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.overload2 basic_seq_packet_socket]``(
      asio::io_service & io_service,
      const protocol_type & protocol);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload2 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.overload3 basic_seq_packet_socket]``(
      asio::io_service & io_service,
      const endpoint_type & endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload3 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.overload4 basic_seq_packet_socket]``(
      asio::io_service & io_service,
      const protocol_type & protocol,
      const native_handle_type & native_socket);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload4 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.overload5 basic_seq_packet_socket]``(
      basic_seq_packet_socket && other);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload5 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.SeqPacketSocketService SeqPacketSocketService1]``>
  ``[link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload6 basic_seq_packet_socket]``(
      basic_seq_packet_socket< Protocol1, SeqPacketSocketService1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload6 more...]]``


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


Construct a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] without opening it. 


  basic_seq_packet_socket(
      asio::io_service & io_service);


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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the sequenced packet socket will use to dispatch handlers for any asynchronous operations performed on the socket. ]]

]




[endsect]



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


Construct and open a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`]. 


  basic_seq_packet_socket(
      asio::io_service & io_service,
      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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the sequenced packet socket will use 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:overload3 basic_seq_packet_socket::basic_seq_packet_socket (3 of 6 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(
      asio::io_service & io_service,
      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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the sequenced packet socket will use 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:overload4 basic_seq_packet_socket::basic_seq_packet_socket (4 of 6 overloads)]


Construct a [link asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] on an existing native socket. 


  basic_seq_packet_socket(
      asio::io_service & io_service,
      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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the sequenced packet socket will use 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:overload5 basic_seq_packet_socket::basic_seq_packet_socket (5 of 6 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(io_service&) constructor`. 




[endsect]



[section:overload6 basic_seq_packet_socket::basic_seq_packet_socket (6 of 6 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.SeqPacketSocketService SeqPacketSocketService1]``>
  basic_seq_packet_socket(
      basic_seq_packet_socket< Protocol1, SeqPacketSocketService1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::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(io_service&) constructor`. 




[endsect]


[endsect]

[section:bind basic_seq_packet_socket::bind]

[indexterm2 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...]]``

  asio::error_code ``[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(io_service);
   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. 


  asio::error_code 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(io_service);
   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 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(io_service); 
   ...
   asio::socket_base::broadcast option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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(io_service);
   ...
   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 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...]]``

  asio::error_code ``[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(io_service);
   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. 


  asio::error_code 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(io_service);
   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 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(io_service); 
   ...
   asio::socket_base::debug option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::do_not_route option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::enable_connection_aborted option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(io_service); 
   ...
   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 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]


['Inherited from basic_io_object.]

[indexterm2 executor_type..basic_seq_packet_socket] 
The type of the executor associated with the object. 


  typedef asio::io_service::executor_type executor_type;


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

  [
    [[link asio.reference.io_service__executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.defer [*defer]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.dispatch [*dispatch]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_finished [*on_work_finished]]]
    [Inform the io_service that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_started [*on_work_started]]]
    [Inform the io_service that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.post [*post]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the io_service is running in the current thread. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_service__executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[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_io_object.]

[indexterm2 get_executor..basic_seq_packet_socket] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_implementation basic_seq_packet_socket::get_implementation]

[indexterm2 get_implementation..basic_seq_packet_socket] 
Get the underlying implementation of the I/O object. 


  implementation_type & ``[link asio.reference.basic_seq_packet_socket.get_implementation.overload1 get_implementation]``();
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.get_implementation.overload1 more...]]``

  const implementation_type & ``[link asio.reference.basic_seq_packet_socket.get_implementation.overload2 get_implementation]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.get_implementation.overload2 more...]]``


[section:overload1 basic_seq_packet_socket::get_implementation (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  implementation_type & get_implementation();



[endsect]



[section:overload2 basic_seq_packet_socket::get_implementation (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  const implementation_type & get_implementation() const;



[endsect]


[endsect]


[section:get_io_service basic_seq_packet_socket::get_io_service]


['Inherited from basic_io_object.]

[indexterm2 get_io_service..basic_seq_packet_socket] 
(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();


This function may be used to obtain the [link asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_service `io_service`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 




[endsect]


[section:get_option basic_seq_packet_socket::get_option]

[indexterm2 get_option..basic_seq_packet_socket] 
Get an option from the socket. 


  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...]]``

  asio::error_code ``[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(io_service);
   ...
   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]``>
  asio::error_code 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(io_service);
   ...
   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:get_service basic_seq_packet_socket::get_service]

[indexterm2 get_service..basic_seq_packet_socket] 
Get the service associated with the I/O object. 


  service_type & ``[link asio.reference.basic_seq_packet_socket.get_service.overload1 get_service]``();
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.get_service.overload1 more...]]``

  const service_type & ``[link asio.reference.basic_seq_packet_socket.get_service.overload2 get_service]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.get_service.overload2 more...]]``


[section:overload1 basic_seq_packet_socket::get_service (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  service_type & get_service();



[endsect]



[section:overload2 basic_seq_packet_socket::get_service (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  const service_type & get_service() const;



[endsect]


[endsect]


[section:implementation_type basic_seq_packet_socket::implementation_type]


['Inherited from basic_io_object.]

[indexterm2 implementation_type..basic_seq_packet_socket] 
The underlying implementation type of I/O object. 


  typedef service_type::implementation_type implementation_type;



[heading Requirements]

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

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


[endsect]


[section:io_control basic_seq_packet_socket::io_control]

[indexterm2 io_control..basic_seq_packet_socket] 
Perform an IO control command on the socket. 


  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...]]``

  asio::error_code ``[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(io_service);
   ...
   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]``>
  asio::error_code 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(io_service);
   ...
   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 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 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(io_service); 
   ...
   asio::socket_base::keep_alive option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::linger option(true, 30);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service);
   ...
   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(io_service);
   ...
   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 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 lowest_layer_type..basic_seq_packet_socket] 
A [link asio.reference.basic_socket `basic_socket`] is always the lowest layer. 


  typedef basic_socket< Protocol, SeqPacketSocketService > lowest_layer_type;


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_socket without opening it. 

     Construct and open a basic_socket. 

     Construct a basic_socket, opening it and binding it to the given local endpoint. 

     Construct a basic_socket on an existing native socket. 

     Move-construct a basic_socket from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     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. 

     Move-assign a basic_socket from a socket of another protocol type. ]
  ]
  
  [
    [[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.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_socket.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_socket._basic_socket [*~basic_socket]]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_socket.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_socket.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_socket.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_socket.message_peek [*message_peek]]]
    [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 max_connections..basic_seq_packet_socket] 
The maximum length of the queue of pending incoming connections. 


  static const int max_connections = implementation_defined;



[endsect]



[section:message_do_not_route basic_seq_packet_socket::message_do_not_route]


['Inherited from socket_base.]

[indexterm2 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 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 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 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 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 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 native_handle_type..basic_seq_packet_socket] 
The native representation of a socket. 


  typedef SeqPacketSocketService::native_handle_type 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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(io_service);
   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. 


  asio::error_code 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(io_service);
   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 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.SeqPacketSocketService SeqPacketSocketService1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value, basic_seq_packet_socket >::type & ``[link asio.reference.basic_seq_packet_socket.operator_eq_.overload2 operator=]``(
      basic_seq_packet_socket< Protocol1, SeqPacketSocketService1 > && 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(io_service&) 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.SeqPacketSocketService SeqPacketSocketService1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value, basic_seq_packet_socket >::type & operator=(
      basic_seq_packet_socket< Protocol1, SeqPacketSocketService1 > && 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(io_service&) constructor`. 




[endsect]


[endsect]


[section:protocol_type basic_seq_packet_socket::protocol_type]

[indexterm2 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 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 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(io_service); 
   ...
   asio::socket_base::receive_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::receive_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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:remote_endpoint basic_seq_packet_socket::remote_endpoint]

[indexterm2 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(io_service);
   ...
   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(io_service);
   ...
   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 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(io_service); 
   ...
   asio::socket_base::reuse_address option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(io_service); 
   ...
   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 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 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(io_service); 
   ...
   asio::socket_base::send_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::send_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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:service_type basic_seq_packet_socket::service_type]


['Inherited from basic_io_object.]

[indexterm2 service_type..basic_seq_packet_socket] 
The type of the service that will be used to provide I/O operations. 


  typedef SeqPacketSocketService service_type;



[heading Requirements]

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

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


[endsect]


[section:set_option basic_seq_packet_socket::set_option]

[indexterm2 set_option..basic_seq_packet_socket] 
Set an option on the socket. 


  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...]]``

  asio::error_code ``[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(io_service);
   ...
   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]``>
  asio::error_code 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(io_service);
   ...
   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 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...]]``

  asio::error_code ``[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(io_service);
   ...
   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. 


  asio::error_code 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(io_service);
   ...
   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 shutdown_type..basic_seq_packet_socket] 
Different ways a socket may be shutdown. 


  enum shutdown_type

[indexterm2 shutdown_receive..basic_seq_packet_socket]
[indexterm2 shutdown_send..basic_seq_packet_socket]
[indexterm2 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 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...]]``

  asio::error_code ``[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(io_service);
   ...
   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. 


  asio::error_code 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(io_service);
   ...
   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 wait_type..basic_seq_packet_socket] 
Wait types. 


  enum wait_type

[indexterm2 wait_read..basic_seq_packet_socket]
[indexterm2 wait_write..basic_seq_packet_socket]
[indexterm2 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]



[endsect]

[section:basic_serial_port basic_serial_port]


Provides serial port functionality. 


  template<
      typename ``[link asio.reference.SerialPortService SerialPortService]`` = serial_port_service>
  class basic_serial_port :
    public basic_io_object< SerialPortService >,
    public serial_port_base


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.basic_serial_port.lowest_layer_type [*lowest_layer_type]]]
    [A 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. ]
  
  ]

  [

    [[link asio.reference.basic_serial_port.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_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]]]
    [Construct a basic_serial_port without opening it. 

     Construct and open a basic_serial_port. 

     Construct a basic_serial_port on an existing native serial port. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_serial_port.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

The [link asio.reference.basic_serial_port `basic_serial_port`] class template provides functionality that is common to all serial ports.


[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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some(
      const MutableBufferSequence & buffers,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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: 

   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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some(
      const ConstBufferSequence & buffers,
      WriteHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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: 

   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 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]``(
      asio::io_service & io_service);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.basic_serial_port.overload1 more...]]``


Construct and open a [link asio.reference.basic_serial_port `basic_serial_port`]. 


  explicit ``[link asio.reference.basic_serial_port.basic_serial_port.overload2 basic_serial_port]``(
      asio::io_service & io_service,
      const char * device);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.basic_serial_port.overload2 more...]]``

  explicit ``[link asio.reference.basic_serial_port.basic_serial_port.overload3 basic_serial_port]``(
      asio::io_service & io_service,
      const std::string & device);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.basic_serial_port.overload3 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.overload4 basic_serial_port]``(
      asio::io_service & io_service,
      const native_handle_type & native_serial_port);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.basic_serial_port.overload4 more...]]``


Move-construct a [link asio.reference.basic_serial_port `basic_serial_port`] from another. 


  ``[link asio.reference.basic_serial_port.basic_serial_port.overload5 basic_serial_port]``(
      basic_serial_port && other);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.basic_serial_port.overload5 more...]]``


[section:overload1 basic_serial_port::basic_serial_port (1 of 5 overloads)]


Construct a [link asio.reference.basic_serial_port `basic_serial_port`] without opening it. 


  basic_serial_port(
      asio::io_service & io_service);


This constructor creates a serial port without opening it.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the serial port will use to dispatch handlers for any asynchronous operations performed on the port. ]]

]




[endsect]



[section:overload2 basic_serial_port::basic_serial_port (2 of 5 overloads)]


Construct and open a [link asio.reference.basic_serial_port `basic_serial_port`]. 


  basic_serial_port(
      asio::io_service & io_service,
      const char * device);


This constructor creates and opens a serial port for the specified device name.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the serial port will use to dispatch handlers for any asynchronous operations performed on the port.]]

[[device][The platform-specific device name for this serial port. ]]

]




[endsect]



[section:overload3 basic_serial_port::basic_serial_port (3 of 5 overloads)]


Construct and open a [link asio.reference.basic_serial_port `basic_serial_port`]. 


  basic_serial_port(
      asio::io_service & io_service,
      const std::string & device);


This constructor creates and opens a serial port for the specified device name.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the serial port will use to dispatch handlers for any asynchronous operations performed on the port.]]

[[device][The platform-specific device name for this serial port. ]]

]




[endsect]



[section:overload4 basic_serial_port::basic_serial_port (4 of 5 overloads)]


Construct a [link asio.reference.basic_serial_port `basic_serial_port`] on an existing native serial port. 


  basic_serial_port(
      asio::io_service & io_service,
      const native_handle_type & native_serial_port);


This constructor creates a serial port object to hold an existing native serial port.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the serial port will use to dispatch handlers for any asynchronous operations performed on the port.]]

[[native_serial_port][A native serial port.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload5 basic_serial_port::basic_serial_port (5 of 5 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(io_service&) constructor`. 




[endsect]


[endsect]

[section:cancel basic_serial_port::cancel]

[indexterm2 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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]


['Inherited from basic_io_object.]

[indexterm2 executor_type..basic_serial_port] 
The type of the executor associated with the object. 


  typedef asio::io_service::executor_type executor_type;


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

  [
    [[link asio.reference.io_service__executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.defer [*defer]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.dispatch [*dispatch]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_finished [*on_work_finished]]]
    [Inform the io_service that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_started [*on_work_started]]]
    [Inform the io_service that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.post [*post]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the io_service is running in the current thread. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_service__executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[heading Requirements]

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

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


[endsect]



[section:get_executor basic_serial_port::get_executor]


['Inherited from basic_io_object.]

[indexterm2 get_executor..basic_serial_port] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_implementation basic_serial_port::get_implementation]

[indexterm2 get_implementation..basic_serial_port] 
Get the underlying implementation of the I/O object. 


  implementation_type & ``[link asio.reference.basic_serial_port.get_implementation.overload1 get_implementation]``();
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.get_implementation.overload1 more...]]``

  const implementation_type & ``[link asio.reference.basic_serial_port.get_implementation.overload2 get_implementation]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.get_implementation.overload2 more...]]``


[section:overload1 basic_serial_port::get_implementation (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  implementation_type & get_implementation();



[endsect]



[section:overload2 basic_serial_port::get_implementation (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  const implementation_type & get_implementation() const;



[endsect]


[endsect]


[section:get_io_service basic_serial_port::get_io_service]


['Inherited from basic_io_object.]

[indexterm2 get_io_service..basic_serial_port] 
(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();


This function may be used to obtain the [link asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_service `io_service`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 




[endsect]


[section:get_option basic_serial_port::get_option]

[indexterm2 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);
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.get_option.overload1 more...]]``

  template<
      typename ``[link asio.reference.GettableSerialPortOption GettableSerialPortOption]``>
  asio::error_code ``[link asio.reference.basic_serial_port.get_option.overload2 get_option]``(
      GettableSerialPortOption & option,
      asio::error_code & ec);
  ``  [''''&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);


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]``>
  asio::error_code get_option(
      GettableSerialPortOption & option,
      asio::error_code & ec);


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 occured, if any.]]

]





[endsect]


[endsect]

[section:get_service basic_serial_port::get_service]

[indexterm2 get_service..basic_serial_port] 
Get the service associated with the I/O object. 


  service_type & ``[link asio.reference.basic_serial_port.get_service.overload1 get_service]``();
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.get_service.overload1 more...]]``

  const service_type & ``[link asio.reference.basic_serial_port.get_service.overload2 get_service]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.get_service.overload2 more...]]``


[section:overload1 basic_serial_port::get_service (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  service_type & get_service();



[endsect]



[section:overload2 basic_serial_port::get_service (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  const service_type & get_service() const;



[endsect]


[endsect]


[section:implementation_type basic_serial_port::implementation_type]


['Inherited from basic_io_object.]

[indexterm2 implementation_type..basic_serial_port] 
The underlying implementation type of I/O object. 


  typedef service_type::implementation_type implementation_type;



[heading Requirements]

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

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


[endsect]



[section:is_open basic_serial_port::is_open]

[indexterm2 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 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 lowest_layer_type..basic_serial_port] 
A [link asio.reference.basic_serial_port `basic_serial_port`] is always the lowest layer. 


  typedef basic_serial_port< SerialPortService > lowest_layer_type;


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.basic_serial_port.lowest_layer_type [*lowest_layer_type]]]
    [A 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. ]
  
  ]

  [

    [[link asio.reference.basic_serial_port.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_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]]]
    [Construct a basic_serial_port without opening it. 

     Construct and open a basic_serial_port. 

     Construct a basic_serial_port on an existing native serial port. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_serial_port.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

The [link asio.reference.basic_serial_port `basic_serial_port`] class template provides functionality that is common to all serial ports.


[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 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 native_handle_type..basic_serial_port] 
The native representation of a serial port. 


  typedef SerialPortService::native_handle_type native_handle_type;



[heading Requirements]

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

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


[endsect]


[section:open basic_serial_port::open]

[indexterm2 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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(io_service&) constructor`. 




[endsect]


[section:read_some basic_serial_port::read_some]

[indexterm2 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: 

   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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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:service_type basic_serial_port::service_type]


['Inherited from basic_io_object.]

[indexterm2 service_type..basic_serial_port] 
The type of the service that will be used to provide I/O operations. 


  typedef SerialPortService service_type;



[heading Requirements]

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

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


[endsect]


[section:set_option basic_serial_port::set_option]

[indexterm2 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]``>
  asio::error_code ``[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]``>
  asio::error_code 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 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: 

   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]


[endsect]

[section:basic_signal_set basic_signal_set]


Provides signal functionality. 


  template<
      typename ``[link asio.reference.SignalSetService SignalSetService]`` = signal_set_service>
  class basic_signal_set :
    public basic_io_object< SignalSetService >


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

  [

    [[link asio.reference.basic_signal_set.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_signal_set.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.basic_signal_set.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_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]]]
    [Construct a signal set without adding any signals. 

     Construct a signal set and add one signal. 

     Construct a signal set and add two signals. 

     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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set.remove [*remove]]]
    [Remove a signal from a signal_set. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_signal_set.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

The [link asio.reference.basic_signal_set `basic_signal_set`] class template provides the ability to perform an asynchronous wait for one or more signals to occur.

Most applications will use the [link asio.reference.signal_set `signal_set`] typedef.


[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(io_service, 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      SignalHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`. ]]

]




[endsect]


[section:basic_signal_set basic_signal_set::basic_signal_set]

[indexterm2 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]``(
      asio::io_service & io_service);
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.basic_signal_set.overload1 more...]]``


Construct a signal set and add one signal. 


  ``[link asio.reference.basic_signal_set.basic_signal_set.overload2 basic_signal_set]``(
      asio::io_service & io_service,
      int signal_number_1);
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.basic_signal_set.overload2 more...]]``


Construct a signal set and add two signals. 


  ``[link asio.reference.basic_signal_set.basic_signal_set.overload3 basic_signal_set]``(
      asio::io_service & io_service,
      int signal_number_1,
      int signal_number_2);
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.basic_signal_set.overload3 more...]]``


Construct a signal set and add three signals. 


  ``[link asio.reference.basic_signal_set.basic_signal_set.overload4 basic_signal_set]``(
      asio::io_service & io_service,
      int signal_number_1,
      int signal_number_2,
      int signal_number_3);
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.basic_signal_set.overload4 more...]]``


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


Construct a signal set without adding any signals. 


  basic_signal_set(
      asio::io_service & io_service);


This constructor creates a signal set without registering for any signals.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the signal set will use to dispatch handlers for any asynchronous operations performed on the set. ]]

]




[endsect]



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


Construct a signal set and add one signal. 


  basic_signal_set(
      asio::io_service & io_service,
      int signal_number_1);


This constructor creates a signal set and registers for one signal.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the signal set will use to dispatch handlers for any asynchronous operations performed on the set.]]

[[signal_number_1][The signal number to be added.]]

]


[heading Remarks]
      
This constructor is equivalent to performing: 

   asio::signal_set signals(io_service);
   signals.add(signal_number_1); 







[endsect]



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


Construct a signal set and add two signals. 


  basic_signal_set(
      asio::io_service & io_service,
      int signal_number_1,
      int signal_number_2);


This constructor creates a signal set and registers for two signals.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the signal set will use to dispatch handlers for any asynchronous operations performed on the 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(io_service);
   signals.add(signal_number_1);
   signals.add(signal_number_2); 







[endsect]



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


Construct a signal set and add three signals. 


  basic_signal_set(
      asio::io_service & io_service,
      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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the signal set will use to dispatch handlers for any asynchronous operations performed on the 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(io_service);
   signals.add(signal_number_1);
   signals.add(signal_number_2);
   signals.add(signal_number_3); 







[endsect]


[endsect]

[section:cancel basic_signal_set::cancel]

[indexterm2 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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]


['Inherited from basic_io_object.]

[indexterm2 executor_type..basic_signal_set] 
The type of the executor associated with the object. 


  typedef asio::io_service::executor_type executor_type;


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

  [
    [[link asio.reference.io_service__executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.defer [*defer]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.dispatch [*dispatch]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_finished [*on_work_finished]]]
    [Inform the io_service that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_started [*on_work_started]]]
    [Inform the io_service that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.post [*post]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the io_service is running in the current thread. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_service__executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[heading Requirements]

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

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


[endsect]



[section:get_executor basic_signal_set::get_executor]


['Inherited from basic_io_object.]

[indexterm2 get_executor..basic_signal_set] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_implementation basic_signal_set::get_implementation]

[indexterm2 get_implementation..basic_signal_set] 
Get the underlying implementation of the I/O object. 


  implementation_type & ``[link asio.reference.basic_signal_set.get_implementation.overload1 get_implementation]``();
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.get_implementation.overload1 more...]]``

  const implementation_type & ``[link asio.reference.basic_signal_set.get_implementation.overload2 get_implementation]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.get_implementation.overload2 more...]]``


[section:overload1 basic_signal_set::get_implementation (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  implementation_type & get_implementation();



[endsect]



[section:overload2 basic_signal_set::get_implementation (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  const implementation_type & get_implementation() const;



[endsect]


[endsect]


[section:get_io_service basic_signal_set::get_io_service]


['Inherited from basic_io_object.]

[indexterm2 get_io_service..basic_signal_set] 
(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();


This function may be used to obtain the [link asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_service `io_service`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 




[endsect]


[section:get_service basic_signal_set::get_service]

[indexterm2 get_service..basic_signal_set] 
Get the service associated with the I/O object. 


  service_type & ``[link asio.reference.basic_signal_set.get_service.overload1 get_service]``();
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.get_service.overload1 more...]]``

  const service_type & ``[link asio.reference.basic_signal_set.get_service.overload2 get_service]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.get_service.overload2 more...]]``


[section:overload1 basic_signal_set::get_service (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  service_type & get_service();



[endsect]



[section:overload2 basic_signal_set::get_service (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  const service_type & get_service() const;



[endsect]


[endsect]


[section:implementation_type basic_signal_set::implementation_type]


['Inherited from basic_io_object.]

[indexterm2 implementation_type..basic_signal_set] 
The underlying implementation type of I/O object. 


  typedef service_type::implementation_type implementation_type;



[heading Requirements]

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

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


[endsect]


[section:remove basic_signal_set::remove]

[indexterm2 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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:service_type basic_signal_set::service_type]


['Inherited from basic_io_object.]

[indexterm2 service_type..basic_signal_set] 
The type of the service that will be used to provide I/O operations. 


  typedef SignalSetService service_type;



[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.SocketService SocketService]``>
  class basic_socket :
    public basic_io_object< SocketService >,
    public socket_base


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_socket without opening it. 

     Construct and open a basic_socket. 

     Construct a basic_socket, opening it and binding it to the given local endpoint. 

     Construct a basic_socket on an existing native socket. 

     Move-construct a basic_socket from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     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. 

     Move-assign a basic_socket from a socket of another protocol type. ]
  ]
  
  [
    [[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.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_socket.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_socket._basic_socket [*~basic_socket]]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_socket.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_socket.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_socket.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_socket.message_peek [*message_peek]]]
    [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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 async_connect..basic_socket] 
Start an asynchronous connect. 


  template<
      typename ``[link asio.reference.ConnectHandler ConnectHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
      const endpoint_type & peer_endpoint,
      ConnectHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`.]]

]


[heading Example]
  


   void connect_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Connect succeeded.
     }
   }

   ...

   asio::ip::tcp::socket socket(io_service);
   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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      wait_type w,
      WaitHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`.]]

]


[heading Example]
  


   void wait_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Wait succeeded.
     }
   }

   ...

   asio::ip::tcp::socket socket(io_service);
   ...
   socket.async_wait(asio::ip::tcp::socket::wait_read, wait_handler);







[endsect]


[section:at_mark basic_socket::at_mark]

[indexterm2 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 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 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]``(
      asio::io_service & io_service);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.basic_socket.overload1 more...]]``


Construct and open a [link asio.reference.basic_socket `basic_socket`]. 


  ``[link asio.reference.basic_socket.basic_socket.overload2 basic_socket]``(
      asio::io_service & io_service,
      const protocol_type & protocol);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.basic_socket.overload2 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.overload3 basic_socket]``(
      asio::io_service & io_service,
      const endpoint_type & endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.basic_socket.overload3 more...]]``


Construct a [link asio.reference.basic_socket `basic_socket`] on an existing native socket. 


  ``[link asio.reference.basic_socket.basic_socket.overload4 basic_socket]``(
      asio::io_service & io_service,
      const protocol_type & protocol,
      const native_handle_type & native_socket);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.basic_socket.overload4 more...]]``


Move-construct a [link asio.reference.basic_socket `basic_socket`] from another. 


  ``[link asio.reference.basic_socket.basic_socket.overload5 basic_socket]``(
      basic_socket && other);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.basic_socket.overload5 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.SocketService SocketService1]``>
  ``[link asio.reference.basic_socket.basic_socket.overload6 basic_socket]``(
      basic_socket< Protocol1, SocketService1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket.basic_socket.overload6 more...]]``


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


Construct a [link asio.reference.basic_socket `basic_socket`] without opening it. 


  basic_socket(
      asio::io_service & io_service);


This constructor creates a socket without opening it.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the socket will use to dispatch handlers for any asynchronous operations performed on the socket. ]]

]




[endsect]



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


Construct and open a [link asio.reference.basic_socket `basic_socket`]. 


  basic_socket(
      asio::io_service & io_service,
      const protocol_type & protocol);


This constructor creates and opens a socket.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the socket will use 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:overload3 basic_socket::basic_socket (3 of 6 overloads)]


Construct a [link asio.reference.basic_socket `basic_socket`], opening it and binding it to the given local endpoint. 


  basic_socket(
      asio::io_service & io_service,
      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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the socket will use 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:overload4 basic_socket::basic_socket (4 of 6 overloads)]


Construct a [link asio.reference.basic_socket `basic_socket`] on an existing native socket. 


  basic_socket(
      asio::io_service & io_service,
      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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the socket will use 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:overload5 basic_socket::basic_socket (5 of 6 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(io_service&) constructor`. 




[endsect]



[section:overload6 basic_socket::basic_socket (6 of 6 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.SocketService SocketService1]``>
  basic_socket(
      basic_socket< Protocol1, SocketService1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::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(io_service&) constructor`. 




[endsect]


[endsect]

[section:bind basic_socket::bind]

[indexterm2 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...]]``

  asio::error_code ``[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(io_service);
   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. 


  asio::error_code 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(io_service);
   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 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(io_service); 
   ...
   asio::socket_base::broadcast option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 close..basic_socket] 
Close the socket. 


  void ``[link asio.reference.basic_socket.close.overload1 close]``();
  ``  [''''&raquo;''' [link asio.reference.basic_socket.close.overload1 more...]]``

  asio::error_code ``[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. 


  asio::error_code 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(io_service);
   ...
   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 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...]]``

  asio::error_code ``[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(io_service);
   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. 


  asio::error_code 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(io_service);
   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 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(io_service); 
   ...
   asio::socket_base::debug option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::do_not_route option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::enable_connection_aborted option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(io_service); 
   ...
   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 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]


['Inherited from basic_io_object.]

[indexterm2 executor_type..basic_socket] 
The type of the executor associated with the object. 


  typedef asio::io_service::executor_type executor_type;


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

  [
    [[link asio.reference.io_service__executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.defer [*defer]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.dispatch [*dispatch]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_finished [*on_work_finished]]]
    [Inform the io_service that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_started [*on_work_started]]]
    [Inform the io_service that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.post [*post]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the io_service is running in the current thread. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_service__executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[heading Requirements]

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

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


[endsect]



[section:get_executor basic_socket::get_executor]


['Inherited from basic_io_object.]

[indexterm2 get_executor..basic_socket] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_implementation basic_socket::get_implementation]

[indexterm2 get_implementation..basic_socket] 
Get the underlying implementation of the I/O object. 


  implementation_type & ``[link asio.reference.basic_socket.get_implementation.overload1 get_implementation]``();
  ``  [''''&raquo;''' [link asio.reference.basic_socket.get_implementation.overload1 more...]]``

  const implementation_type & ``[link asio.reference.basic_socket.get_implementation.overload2 get_implementation]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket.get_implementation.overload2 more...]]``


[section:overload1 basic_socket::get_implementation (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  implementation_type & get_implementation();



[endsect]



[section:overload2 basic_socket::get_implementation (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  const implementation_type & get_implementation() const;



[endsect]


[endsect]


[section:get_io_service basic_socket::get_io_service]


['Inherited from basic_io_object.]

[indexterm2 get_io_service..basic_socket] 
(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();


This function may be used to obtain the [link asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_service `io_service`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 




[endsect]


[section:get_option basic_socket::get_option]

[indexterm2 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]``>
  asio::error_code ``[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(io_service);
   ...
   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]``>
  asio::error_code 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(io_service);
   ...
   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:get_service basic_socket::get_service]

[indexterm2 get_service..basic_socket] 
Get the service associated with the I/O object. 


  service_type & ``[link asio.reference.basic_socket.get_service.overload1 get_service]``();
  ``  [''''&raquo;''' [link asio.reference.basic_socket.get_service.overload1 more...]]``

  const service_type & ``[link asio.reference.basic_socket.get_service.overload2 get_service]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket.get_service.overload2 more...]]``


[section:overload1 basic_socket::get_service (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  service_type & get_service();



[endsect]



[section:overload2 basic_socket::get_service (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  const service_type & get_service() const;



[endsect]


[endsect]


[section:implementation_type basic_socket::implementation_type]


['Inherited from basic_io_object.]

[indexterm2 implementation_type..basic_socket] 
The underlying implementation type of I/O object. 


  typedef service_type::implementation_type implementation_type;



[heading Requirements]

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

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


[endsect]


[section:io_control basic_socket::io_control]

[indexterm2 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]``>
  asio::error_code ``[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(io_service);
   ...
   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]``>
  asio::error_code 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(io_service);
   ...
   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 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 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(io_service); 
   ...
   asio::socket_base::keep_alive option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::linger option(true, 30);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service);
   ...
   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(io_service);
   ...
   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 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 lowest_layer_type..basic_socket] 
A [link asio.reference.basic_socket `basic_socket`] is always the lowest layer. 


  typedef basic_socket< Protocol, SocketService > lowest_layer_type;


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_socket without opening it. 

     Construct and open a basic_socket. 

     Construct a basic_socket, opening it and binding it to the given local endpoint. 

     Construct a basic_socket on an existing native socket. 

     Move-construct a basic_socket from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     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. 

     Move-assign a basic_socket from a socket of another protocol type. ]
  ]
  
  [
    [[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.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_socket.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_socket._basic_socket [*~basic_socket]]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_socket.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_socket.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_socket.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_socket.message_peek [*message_peek]]]
    [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 max_connections..basic_socket] 
The maximum length of the queue of pending incoming connections. 


  static const int max_connections = implementation_defined;



[endsect]



[section:message_do_not_route basic_socket::message_do_not_route]


['Inherited from socket_base.]

[indexterm2 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 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 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 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 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 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 native_handle_type..basic_socket] 
The native representation of a socket. 


  typedef SocketService::native_handle_type 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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(io_service);
   socket.open(asio::ip::tcp::v4());







[endsect]



[section:overload2 basic_socket::open (2 of 2 overloads)]


Open the socket using the specified protocol. 


  asio::error_code 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(io_service);
   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 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.SocketService SocketService1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value, basic_socket >::type & ``[link asio.reference.basic_socket.operator_eq_.overload2 operator=]``(
      basic_socket< Protocol1, SocketService1 > && 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(io_service&) 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.SocketService SocketService1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value, basic_socket >::type & operator=(
      basic_socket< Protocol1, SocketService1 > && 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(io_service&) constructor`. 




[endsect]


[endsect]


[section:protocol_type basic_socket::protocol_type]

[indexterm2 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 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(io_service); 
   ...
   asio::socket_base::receive_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::receive_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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:remote_endpoint basic_socket::remote_endpoint]

[indexterm2 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(io_service);
   ...
   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(io_service);
   ...
   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 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(io_service); 
   ...
   asio::socket_base::reuse_address option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::send_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::send_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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:service_type basic_socket::service_type]


['Inherited from basic_io_object.]

[indexterm2 service_type..basic_socket] 
The type of the service that will be used to provide I/O operations. 


  typedef SocketService service_type;



[heading Requirements]

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

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


[endsect]


[section:set_option basic_socket::set_option]

[indexterm2 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]``>
  asio::error_code ``[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(io_service);
   ...
   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]``>
  asio::error_code 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(io_service);
   ...
   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 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...]]``

  asio::error_code ``[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(io_service);
   ...
   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. 


  asio::error_code 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(io_service);
   ...
   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 shutdown_type..basic_socket] 
Different ways a socket may be shutdown. 


  enum shutdown_type

[indexterm2 shutdown_receive..basic_socket]
[indexterm2 shutdown_send..basic_socket]
[indexterm2 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 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...]]``

  asio::error_code ``[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(io_service);
   ...
   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. 


  asio::error_code 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(io_service);
   ...
   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 wait_type..basic_socket] 
Wait types. 


  enum wait_type

[indexterm2 wait_read..basic_socket]
[indexterm2 wait_write..basic_socket]
[indexterm2 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 ~basic_socket..basic_socket] 
Protected destructor to prevent deletion through this type. 


  ~basic_socket();



[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.SocketAcceptorService SocketAcceptorService]`` = socket_acceptor_service<Protocol>>
  class basic_socket_acceptor :
    public basic_io_object< SocketAcceptorService >,
    public socket_base


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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. 

     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]]]
    [Construct an acceptor without opening it. 

     Construct an open acceptor. 

     Construct an acceptor opened on the given endpoint. 

     Construct a basic_socket_acceptor on an existing native acceptor. 

     Move-construct a basic_socket_acceptor from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     Move-assign a basic_socket_acceptor from an acceptor of another protocol type. ]
  ]
  
  [
    [[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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_socket_acceptor.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_socket_acceptor.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_peek [*message_peek]]]
    [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(io_service);
   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 accept..basic_socket_acceptor] 
Accept a new connection. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.SocketService SocketService]``>
  void ``[link asio.reference.basic_socket_acceptor.accept.overload1 accept]``(
      basic_socket< Protocol1, SocketService > & 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.SocketService SocketService]``>
  asio::error_code ``[link asio.reference.basic_socket_acceptor.accept.overload2 accept]``(
      basic_socket< Protocol1, SocketService > & 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.SocketService SocketService]``>
  void ``[link asio.reference.basic_socket_acceptor.accept.overload3 accept]``(
      basic_socket< protocol_type, SocketService > & peer,
      endpoint_type & peer_endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.accept.overload3 more...]]``

  template<
      typename ``[link asio.reference.SocketService SocketService]``>
  asio::error_code ``[link asio.reference.basic_socket_acceptor.accept.overload4 accept]``(
      basic_socket< protocol_type, SocketService > & peer,
      endpoint_type & peer_endpoint,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.accept.overload4 more...]]``


[section:overload1 basic_socket_acceptor::accept (1 of 4 overloads)]


Accept a new connection. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.SocketService SocketService]``>
  void accept(
      basic_socket< Protocol1, SocketService > & 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(io_service);
   ...
   asio::ip::tcp::socket socket(io_service);
   acceptor.accept(socket);







[endsect]



[section:overload2 basic_socket_acceptor::accept (2 of 4 overloads)]


Accept a new connection. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.SocketService SocketService]``>
  asio::error_code accept(
      basic_socket< Protocol1, SocketService > & 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(io_service);
   ...
   asio::ip::tcp::soocket socket(io_service);
   asio::error_code ec;
   acceptor.accept(socket, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]



[section:overload3 basic_socket_acceptor::accept (3 of 4 overloads)]


Accept a new connection and obtain the endpoint of the peer. 


  template<
      typename ``[link asio.reference.SocketService SocketService]``>
  void accept(
      basic_socket< protocol_type, SocketService > & 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(io_service);
   ...
   asio::ip::tcp::socket socket(io_service);
   asio::ip::tcp::endpoint endpoint;
   acceptor.accept(socket, endpoint);







[endsect]



[section:overload4 basic_socket_acceptor::accept (4 of 4 overloads)]


Accept a new connection and obtain the endpoint of the peer. 


  template<
      typename ``[link asio.reference.SocketService SocketService]``>
  asio::error_code accept(
      basic_socket< protocol_type, SocketService > & 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(io_service);
   ...
   asio::ip::tcp::socket socket(io_service);
   asio::ip::tcp::endpoint endpoint;
   asio::error_code ec;
   acceptor.accept(socket, endpoint, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]

[section:assign basic_socket_acceptor::assign]

[indexterm2 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 async_accept..basic_socket_acceptor] 
Start an asynchronous accept. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename ``[link asio.reference.AcceptHandler AcceptHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.basic_socket_acceptor.async_accept.overload1 async_accept]``(
      basic_socket< Protocol1, SocketService > & peer,
      AcceptHandler && handler,
      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.SocketService SocketService]``,
      typename ``[link asio.reference.AcceptHandler AcceptHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.basic_socket_acceptor.async_accept.overload2 async_accept]``(
      basic_socket< protocol_type, SocketService > & peer,
      endpoint_type & peer_endpoint,
      AcceptHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.async_accept.overload2 more...]]``


[section:overload1 basic_socket_acceptor::async_accept (1 of 2 overloads)]


Start an asynchronous accept. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename ``[link asio.reference.AcceptHandler AcceptHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_accept(
      basic_socket< Protocol1, SocketService > & peer,
      AcceptHandler && handler,
      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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`.]]

]


[heading Example]
  


   void accept_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Accept succeeded.
     }
   }

   ...

   asio::ip::tcp::acceptor acceptor(io_service);
   ...
   asio::ip::tcp::socket socket(io_service);
   acceptor.async_accept(socket, accept_handler);







[endsect]



[section:overload2 basic_socket_acceptor::async_accept (2 of 2 overloads)]


Start an asynchronous accept. 


  template<
      typename ``[link asio.reference.SocketService SocketService]``,
      typename ``[link asio.reference.AcceptHandler AcceptHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_accept(
      basic_socket< protocol_type, SocketService > & peer,
      endpoint_type & peer_endpoint,
      AcceptHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`. ]]

]




[endsect]


[endsect]


[section:async_wait basic_socket_acceptor::async_wait]

[indexterm2 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      wait_type w,
      WaitHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`.]]

]


[heading Example]
  


   void wait_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Wait succeeded.
     }
   }

   ...

   asio::ip::tcp::acceptor acceptor(io_service);
   ...
   acceptor.async_wait(
       asio::ip::tcp::acceptor::wait_read,
       wait_handler);







[endsect]


[section:basic_socket_acceptor basic_socket_acceptor::basic_socket_acceptor]

[indexterm2 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]``(
      asio::io_service & io_service);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload1 more...]]``


Construct an open acceptor. 


  ``[link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload2 basic_socket_acceptor]``(
      asio::io_service & io_service,
      const protocol_type & protocol);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload2 more...]]``


Construct an acceptor opened on the given endpoint. 


  ``[link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload3 basic_socket_acceptor]``(
      asio::io_service & io_service,
      const endpoint_type & endpoint,
      bool reuse_addr = true);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload3 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.overload4 basic_socket_acceptor]``(
      asio::io_service & io_service,
      const protocol_type & protocol,
      const native_handle_type & native_acceptor);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload4 more...]]``


Move-construct a [link asio.reference.basic_socket_acceptor `basic_socket_acceptor`] from another. 


  ``[link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload5 basic_socket_acceptor]``(
      basic_socket_acceptor && other);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload5 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.SocketAcceptorService SocketAcceptorService1]``>
  ``[link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload6 basic_socket_acceptor]``(
      basic_socket_acceptor< Protocol1, SocketAcceptorService1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload6 more...]]``


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


Construct an acceptor without opening it. 


  basic_socket_acceptor(
      asio::io_service & io_service);


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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the acceptor will use to dispatch handlers for any asynchronous operations performed on the acceptor. ]]

]




[endsect]



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


Construct an open acceptor. 


  basic_socket_acceptor(
      asio::io_service & io_service,
      const protocol_type & protocol);


This constructor creates an acceptor and automatically opens it.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the acceptor will use 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:overload3 basic_socket_acceptor::basic_socket_acceptor (3 of 6 overloads)]


Construct an acceptor opened on the given endpoint. 


  basic_socket_acceptor(
      asio::io_service & io_service,
      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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the acceptor will use 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(io_service);
   acceptor.open(endpoint.protocol());
   if (reuse_addr)
     acceptor.set_option(socket_base::reuse_address(true));
   acceptor.bind(endpoint);
   acceptor.listen(listen_backlog);







[endsect]



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


Construct a [link asio.reference.basic_socket_acceptor `basic_socket_acceptor`] on an existing native acceptor. 


  basic_socket_acceptor(
      asio::io_service & io_service,
      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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the acceptor will use 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:overload5 basic_socket_acceptor::basic_socket_acceptor (5 of 6 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(io_service&) constructor`. 




[endsect]



[section:overload6 basic_socket_acceptor::basic_socket_acceptor (6 of 6 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.SocketAcceptorService SocketAcceptorService1]``>
  basic_socket_acceptor(
      basic_socket_acceptor< Protocol1, SocketAcceptorService1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::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(io_service&) constructor`. 




[endsect]


[endsect]

[section:bind basic_socket_acceptor::bind]

[indexterm2 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...]]``

  asio::error_code ``[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(io_service);
   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. 


  asio::error_code 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(io_service);
   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 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(io_service); 
   ...
   asio::socket_base::broadcast option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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(io_service);
   ...
   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 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(io_service); 
   ...
   asio::socket_base::debug option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::do_not_route option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::enable_connection_aborted option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(io_service); 
   ...
   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 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]


['Inherited from basic_io_object.]

[indexterm2 executor_type..basic_socket_acceptor] 
The type of the executor associated with the object. 


  typedef asio::io_service::executor_type executor_type;


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

  [
    [[link asio.reference.io_service__executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.defer [*defer]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.dispatch [*dispatch]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_finished [*on_work_finished]]]
    [Inform the io_service that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_started [*on_work_started]]]
    [Inform the io_service that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.post [*post]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the io_service is running in the current thread. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_service__executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[heading Requirements]

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

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


[endsect]



[section:get_executor basic_socket_acceptor::get_executor]


['Inherited from basic_io_object.]

[indexterm2 get_executor..basic_socket_acceptor] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_implementation basic_socket_acceptor::get_implementation]

[indexterm2 get_implementation..basic_socket_acceptor] 
Get the underlying implementation of the I/O object. 


  implementation_type & ``[link asio.reference.basic_socket_acceptor.get_implementation.overload1 get_implementation]``();
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.get_implementation.overload1 more...]]``

  const implementation_type & ``[link asio.reference.basic_socket_acceptor.get_implementation.overload2 get_implementation]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.get_implementation.overload2 more...]]``


[section:overload1 basic_socket_acceptor::get_implementation (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  implementation_type & get_implementation();



[endsect]



[section:overload2 basic_socket_acceptor::get_implementation (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  const implementation_type & get_implementation() const;



[endsect]


[endsect]


[section:get_io_service basic_socket_acceptor::get_io_service]


['Inherited from basic_io_object.]

[indexterm2 get_io_service..basic_socket_acceptor] 
(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();


This function may be used to obtain the [link asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_service `io_service`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 




[endsect]


[section:get_option basic_socket_acceptor::get_option]

[indexterm2 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);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.get_option.overload1 more...]]``

  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  asio::error_code ``[link asio.reference.basic_socket_acceptor.get_option.overload2 get_option]``(
      GettableSocketOption & option,
      asio::error_code & ec);
  ``  [''''&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);


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(io_service);
   ...
   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]``>
  asio::error_code get_option(
      GettableSocketOption & option,
      asio::error_code & ec);


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(io_service);
   ...
   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:get_service basic_socket_acceptor::get_service]

[indexterm2 get_service..basic_socket_acceptor] 
Get the service associated with the I/O object. 


  service_type & ``[link asio.reference.basic_socket_acceptor.get_service.overload1 get_service]``();
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.get_service.overload1 more...]]``

  const service_type & ``[link asio.reference.basic_socket_acceptor.get_service.overload2 get_service]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.get_service.overload2 more...]]``


[section:overload1 basic_socket_acceptor::get_service (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  service_type & get_service();



[endsect]



[section:overload2 basic_socket_acceptor::get_service (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  const service_type & get_service() const;



[endsect]


[endsect]


[section:implementation_type basic_socket_acceptor::implementation_type]


['Inherited from basic_io_object.]

[indexterm2 implementation_type..basic_socket_acceptor] 
The underlying implementation type of I/O object. 


  typedef service_type::implementation_type implementation_type;



[heading Requirements]

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

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


[endsect]


[section:io_control basic_socket_acceptor::io_control]

[indexterm2 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]``>
  asio::error_code ``[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(io_service);
   ...
   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]``>
  asio::error_code 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(io_service);
   ...
   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 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 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(io_service); 
   ...
   asio::socket_base::keep_alive option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::linger option(true, 30);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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_connections);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.listen.overload1 more...]]``

  asio::error_code ``[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_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. 


  asio::error_code 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(io_service);
   ...
   asio::error_code ec;
   acceptor.listen(asio::socket_base::max_connections, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]

[section:local_endpoint basic_socket_acceptor::local_endpoint]

[indexterm2 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(io_service);
   ...
   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(io_service);
   ...
   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 max_connections..basic_socket_acceptor] 
The maximum length of the queue of pending incoming connections. 


  static const int max_connections = implementation_defined;



[endsect]



[section:message_do_not_route basic_socket_acceptor::message_do_not_route]


['Inherited from socket_base.]

[indexterm2 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 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 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 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 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 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 native_handle_type..basic_socket_acceptor] 
The native representation of an acceptor. 


  typedef SocketAcceptorService::native_handle_type 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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(io_service);
   acceptor.open(asio::ip::tcp::v4());







[endsect]



[section:overload2 basic_socket_acceptor::open (2 of 2 overloads)]


Open the acceptor using the specified protocol. 


  asio::error_code 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(io_service);
   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 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.SocketAcceptorService SocketAcceptorService1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value, basic_socket_acceptor >::type & ``[link asio.reference.basic_socket_acceptor.operator_eq_.overload2 operator=]``(
      basic_socket_acceptor< Protocol1, SocketAcceptorService1 > && 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(io_service&) 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.SocketAcceptorService SocketAcceptorService1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value, basic_socket_acceptor >::type & operator=(
      basic_socket_acceptor< Protocol1, SocketAcceptorService1 > && 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(io_service&) constructor`. 




[endsect]


[endsect]


[section:protocol_type basic_socket_acceptor::protocol_type]

[indexterm2 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 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(io_service); 
   ...
   asio::socket_base::receive_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::receive_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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:reuse_address basic_socket_acceptor::reuse_address]


['Inherited from socket_base.]

[indexterm2 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(io_service); 
   ...
   asio::socket_base::reuse_address option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::send_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::send_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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:service_type basic_socket_acceptor::service_type]


['Inherited from basic_io_object.]

[indexterm2 service_type..basic_socket_acceptor] 
The type of the service that will be used to provide I/O operations. 


  typedef SocketAcceptorService service_type;



[heading Requirements]

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

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


[endsect]


[section:set_option basic_socket_acceptor::set_option]

[indexterm2 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]``>
  asio::error_code ``[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(io_service);
   ...
   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]``>
  asio::error_code 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(io_service);
   ...
   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 shutdown_type..basic_socket_acceptor] 
Different ways a socket may be shutdown. 


  enum shutdown_type

[indexterm2 shutdown_receive..basic_socket_acceptor]
[indexterm2 shutdown_send..basic_socket_acceptor]
[indexterm2 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 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...]]``

  asio::error_code ``[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(io_service);
   ...
   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. 


  asio::error_code 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(io_service);
   ...
   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 wait_type..basic_socket_acceptor] 
Wait types. 


  enum wait_type

[indexterm2 wait_read..basic_socket_acceptor]
[indexterm2 wait_write..basic_socket_acceptor]
[indexterm2 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]



[endsect]

[section:basic_socket_iostream basic_socket_iostream]


Iostream interface for a socket. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.StreamSocketService StreamSocketService]`` = stream_socket_service<Protocol>,
      typename Time = boost::posix_time::ptime,
      typename ``[link asio.reference.TimeTraits TimeTraits]`` = asio::time_traits<Time>,
      typename ``[link asio.reference.TimerService TimerService]`` = deadline_timer_service<Time, TimeTraits>>
  class basic_socket_iostream


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

  [

    [[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.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]]]
    [Construct a basic_socket_iostream without establishing a connection. 

     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. 

     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. 

     (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.rdbuf [*rdbuf]]]
    [Return a pointer to the underlying streambuf. ]
  ]
  
]

[heading Requirements]

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

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

[section:basic_socket_iostream basic_socket_iostream::basic_socket_iostream]

[indexterm2 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...]]``


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.overload2 basic_socket_iostream]``(
      T1 t1,
      ... ,
      TN tn);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_iostream.basic_socket_iostream.overload2 more...]]``


[section:overload1 basic_socket_iostream::basic_socket_iostream (1 of 2 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 2 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:close basic_socket_iostream::close]

[indexterm2 close..basic_socket_iostream] 
Close the connection. 


  void close();



[endsect]



[section:connect basic_socket_iostream::connect]

[indexterm2 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 duration..basic_socket_iostream] 
The duration type. 


  typedef TimeTraits::duration duration;



[heading Requirements]

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

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


[endsect]



[section:duration_type basic_socket_iostream::duration_type]

[indexterm2 duration_type..basic_socket_iostream] 
(Deprecated: Use duration.) The duration type. 


  typedef TimeTraits::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 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 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 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 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 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 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:rdbuf basic_socket_iostream::rdbuf]

[indexterm2 rdbuf..basic_socket_iostream] 
Return a pointer to the underlying streambuf. 


  basic_socket_streambuf< Protocol, StreamSocketService, Time, TimeTraits, TimerService > * rdbuf() const;



[endsect]



[section:time_point basic_socket_iostream::time_point]

[indexterm2 time_point..basic_socket_iostream] 
The time type. 


  typedef TimeTraits::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 time_type..basic_socket_iostream] 
(Deprecated: Use time\_point.) The time type. 


  typedef TimeTraits::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 ``[link asio.reference.StreamSocketService StreamSocketService]`` = stream_socket_service<Protocol>,
      typename Time = boost::posix_time::ptime,
      typename ``[link asio.reference.TimeTraits TimeTraits]`` = asio::time_traits<Time>,
      typename ``[link asio.reference.TimerService TimerService]`` = deadline_timer_service<Time, TimeTraits>>
  class basic_socket_streambuf :
    public basic_socket< Protocol, StreamSocketService >


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

  [

    [[link asio.reference.basic_socket_streambuf.broadcast [*broadcast]]]
    [Socket option to permit sending of broadcast messages. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.bytes_readable [*bytes_readable]]]
    [IO control command to get the amount of data that can be read without blocking. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.debug [*debug]]]
    [Socket option to enable socket-level debugging. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.do_not_route [*do_not_route]]]
    [Socket option to prevent routing, use local interfaces only. ]
  
  ]

  [

    [[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.enable_connection_aborted [*enable_connection_aborted]]]
    [Socket option to report aborted connections on accept. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.keep_alive [*keep_alive]]]
    [Socket option to send keep-alives. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.linger [*linger]]]
    [Socket option to specify whether the socket lingers on close if unsent data is present. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.lowest_layer_type [*lowest_layer_type]]]
    [A basic_socket is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.message_flags [*message_flags]]]
    [Bitmask type for flags that can be passed to send and receive operations. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.native_handle_type [*native_handle_type]]]
    [The native representation of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.receive_buffer_size [*receive_buffer_size]]]
    [Socket option for the receive buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.receive_low_watermark [*receive_low_watermark]]]
    [Socket option for the receive low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.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_streambuf.send_buffer_size [*send_buffer_size]]]
    [Socket option for the send buffer size of a socket. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.send_low_watermark [*send_low_watermark]]]
    [Socket option for the send low watermark. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.shutdown_type [*shutdown_type]]]
    [Different ways a socket may be shutdown. ]
  
  ]

  [

    [[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. ]
  
  ]

  [

    [[link asio.reference.basic_socket_streambuf.wait_type [*wait_type]]]
    [Wait types. ]
  
  ]

]

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

  [
    [[link asio.reference.basic_socket_streambuf.assign [*assign]]]
    [Assign an existing native socket to the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.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_streambuf.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.basic_socket_streambuf [*basic_socket_streambuf]]]
    [Construct a basic_socket_streambuf without establishing a connection. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.bind [*bind]]]
    [Bind the socket to the given local endpoint. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.close [*close]]]
    [Close the connection. 

     Close the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.connect [*connect]]]
    [Establish a connection. 

     Connect the socket to the specified endpoint. ]
  ]
  
  [
    [[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. 

     Set the stream buffer's expiry time as an absolute time. 

     Set the stream buffer's expiry time relative to now. ]
  ]
  
  [
    [[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. 

     (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.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.get_option [*get_option]]]
    [Get an option from the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.local_endpoint [*local_endpoint]]]
    [Get the local endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 

     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.native_handle [*native_handle]]]
    [Get the native socket representation. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 

     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 

     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.open [*open]]]
    [Open the socket using the specified protocol. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.puberror [*puberror]]]
    [Get the last error associated with the stream buffer. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint of the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.set_option [*set_option]]]
    [Set an option on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf._basic_socket_streambuf [*~basic_socket_streambuf]]]
    [Destructor flushes buffered data. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_socket_streambuf.error [*error]]]
    [Get the last error associated with the stream buffer. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
  [
    [[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 Data Members]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket_streambuf.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket_streambuf.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_socket_streambuf.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_socket_streambuf.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_socket_streambuf.message_peek [*message_peek]]]
    [Peek at incoming data without removing it from the input queue. ]
  ]

]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.basic_socket_streambuf.io_handler [*io_handler]]]
    []
  ]
  
  [
    [[link asio.reference.basic_socket_streambuf.timer_handler [*timer_handler]]]
    []
  ]
  
]

[heading Requirements]

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

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

[section:assign basic_socket_streambuf::assign]

[indexterm2 assign..basic_socket_streambuf] 
Assign an existing native socket to the socket. 


  void ``[link asio.reference.basic_socket_streambuf.assign.overload1 assign]``(
      const protocol_type & protocol,
      const native_handle_type & native_socket);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.assign.overload1 more...]]``

  asio::error_code ``[link asio.reference.basic_socket_streambuf.assign.overload2 assign]``(
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.assign.overload2 more...]]``


[section:overload1 basic_socket_streambuf::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_socket_streambuf::assign (2 of 2 overloads)]


['Inherited from basic_socket.]


Assign an existing native socket to the socket. 


  asio::error_code assign(
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      asio::error_code & ec);



[endsect]


[endsect]


[section:async_connect basic_socket_streambuf::async_connect]


['Inherited from basic_socket.]

[indexterm2 async_connect..basic_socket_streambuf] 
Start an asynchronous connect. 


  template<
      typename ``[link asio.reference.ConnectHandler ConnectHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
      const endpoint_type & peer_endpoint,
      ConnectHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`.]]

]


[heading Example]
  


   void connect_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Connect succeeded.
     }
   }

   ...

   asio::ip::tcp::socket socket(io_service);
   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_streambuf::async_wait]


['Inherited from basic_socket.]

[indexterm2 async_wait..basic_socket_streambuf] 
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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      wait_type w,
      WaitHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`.]]

]


[heading Example]
  


   void wait_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Wait succeeded.
     }
   }

   ...

   asio::ip::tcp::socket socket(io_service);
   ...
   socket.async_wait(asio::ip::tcp::socket::wait_read, wait_handler);







[endsect]


[section:at_mark basic_socket_streambuf::at_mark]

[indexterm2 at_mark..basic_socket_streambuf] 
Determine whether the socket is at the out-of-band data mark. 


  bool ``[link asio.reference.basic_socket_streambuf.at_mark.overload1 at_mark]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.at_mark.overload1 more...]]``

  bool ``[link asio.reference.basic_socket_streambuf.at_mark.overload2 at_mark]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.at_mark.overload2 more...]]``


[section:overload1 basic_socket_streambuf::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_socket_streambuf::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_socket_streambuf::available]

[indexterm2 available..basic_socket_streambuf] 
Determine the number of bytes available for reading. 


  std::size_t ``[link asio.reference.basic_socket_streambuf.available.overload1 available]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.available.overload1 more...]]``

  std::size_t ``[link asio.reference.basic_socket_streambuf.available.overload2 available]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.available.overload2 more...]]``


[section:overload1 basic_socket_streambuf::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_socket_streambuf::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_socket_streambuf basic_socket_streambuf::basic_socket_streambuf]

[indexterm2 basic_socket_streambuf..basic_socket_streambuf] 
Construct a [link asio.reference.basic_socket_streambuf `basic_socket_streambuf`] without establishing a connection. 


  basic_socket_streambuf();



[endsect]


[section:bind basic_socket_streambuf::bind]

[indexterm2 bind..basic_socket_streambuf] 
Bind the socket to the given local endpoint. 


  void ``[link asio.reference.basic_socket_streambuf.bind.overload1 bind]``(
      const endpoint_type & endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.bind.overload1 more...]]``

  asio::error_code ``[link asio.reference.basic_socket_streambuf.bind.overload2 bind]``(
      const endpoint_type & endpoint,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.bind.overload2 more...]]``


[section:overload1 basic_socket_streambuf::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(io_service);
   socket.open(asio::ip::tcp::v4());
   socket.bind(asio::ip::tcp::endpoint(
         asio::ip::tcp::v4(), 12345));







[endsect]



[section:overload2 basic_socket_streambuf::bind (2 of 2 overloads)]


['Inherited from basic_socket.]


Bind the socket to the given local endpoint. 


  asio::error_code 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(io_service);
   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_streambuf::broadcast]


['Inherited from socket_base.]

[indexterm2 broadcast..basic_socket_streambuf] 
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(io_service); 
   ...
   asio::socket_base::broadcast option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(io_service); 
   ...
   asio::socket_base::broadcast option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

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

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


[endsect]



[section:bytes_readable basic_socket_streambuf::bytes_readable]


['Inherited from socket_base.]

[indexterm2 bytes_readable..basic_socket_streambuf] 
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(io_service); 
   ...
   asio::socket_base::bytes_readable command(true);
   socket.io_control(command);
   std::size_t bytes_readable = command.get();







[heading Requirements]

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

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


[endsect]


[section:cancel basic_socket_streambuf::cancel]

[indexterm2 cancel..basic_socket_streambuf] 
Cancel all asynchronous operations associated with the socket. 


  void ``[link asio.reference.basic_socket_streambuf.cancel.overload1 cancel]``();
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.cancel.overload1 more...]]``

  asio::error_code ``[link asio.reference.basic_socket_streambuf.cancel.overload2 cancel]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.cancel.overload2 more...]]``


[section:overload1 basic_socket_streambuf::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_socket_streambuf::cancel (2 of 2 overloads)]


['Inherited from basic_socket.]


Cancel all asynchronous operations associated with the socket. 


  asio::error_code 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_streambuf::close]

[indexterm2 close..basic_socket_streambuf] 
Close the connection. 


  basic_socket_streambuf< Protocol, StreamSocketService, Time, TimeTraits, TimerService > * ``[link asio.reference.basic_socket_streambuf.close.overload1 close]``();
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.close.overload1 more...]]``


Close the socket. 


  asio::error_code ``[link asio.reference.basic_socket_streambuf.close.overload2 close]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.close.overload2 more...]]``


[section:overload1 basic_socket_streambuf::close (1 of 2 overloads)]


Close the connection. 


  basic_socket_streambuf< Protocol, StreamSocketService, Time, TimeTraits, TimerService > * close();



[heading Return Value]
      
`this` if a connection was successfully established, a null pointer otherwise. 




[endsect]



[section:overload2 basic_socket_streambuf::close (2 of 2 overloads)]


['Inherited from basic_socket.]


Close the socket. 


  asio::error_code 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(io_service);
   ...
   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_streambuf::connect]

[indexterm2 connect..basic_socket_streambuf] 
Establish a connection. 


  basic_socket_streambuf< Protocol, StreamSocketService, Time, TimeTraits, TimerService > * ``[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< Protocol, StreamSocketService > * ``[link asio.reference.basic_socket_streambuf.connect.overload2 connect]``(
      T1 t1,
      ... ,
      TN tn);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.connect.overload2 more...]]``


Connect the socket to the specified endpoint. 


  asio::error_code ``[link asio.reference.basic_socket_streambuf.connect.overload3 connect]``(
      const endpoint_type & peer_endpoint,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.connect.overload3 more...]]``


[section:overload1 basic_socket_streambuf::connect (1 of 3 overloads)]


Establish a connection. 


  basic_socket_streambuf< Protocol, StreamSocketService, Time, TimeTraits, TimerService > * 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 3 overloads)]


Establish a connection. 


  template<
      typename T1,
      ... ,
      typename TN>
  basic_socket_streambuf< Protocol, StreamSocketService > * 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]



[section:overload3 basic_socket_streambuf::connect (3 of 3 overloads)]


['Inherited from basic_socket.]


Connect the socket to the specified endpoint. 


  asio::error_code 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(io_service);
   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_streambuf::debug]


['Inherited from socket_base.]

[indexterm2 debug..basic_socket_streambuf] 
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(io_service); 
   ...
   asio::socket_base::debug option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   asio::socket_base::debug option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

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

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


[endsect]



[section:do_not_route basic_socket_streambuf::do_not_route]


['Inherited from socket_base.]

[indexterm2 do_not_route..basic_socket_streambuf] 
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(io_service); 
   ...
   asio::socket_base::do_not_route option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(io_service); 
   ...
   asio::socket_base::do_not_route option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

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

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


[endsect]



[section:duration basic_socket_streambuf::duration]

[indexterm2 duration..basic_socket_streambuf] 
The duration type. 


  typedef TimeTraits::duration duration;



[heading Requirements]

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

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


[endsect]



[section:duration_type basic_socket_streambuf::duration_type]

[indexterm2 duration_type..basic_socket_streambuf] 
(Deprecated: Use duration.) The duration type. 


  typedef TimeTraits::duration_type duration_type;



[heading Requirements]

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

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


[endsect]



[section:enable_connection_aborted basic_socket_streambuf::enable_connection_aborted]


['Inherited from socket_base.]

[indexterm2 enable_connection_aborted..basic_socket_streambuf] 
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(io_service); 
   ...
   asio::socket_base::enable_connection_aborted option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(io_service); 
   ...
   asio::socket_base::enable_connection_aborted option;
   acceptor.get_option(option);
   bool is_set = option.value();







[heading Requirements]

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

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


[endsect]



[section:endpoint_type basic_socket_streambuf::endpoint_type]

[indexterm2 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 error..basic_socket_streambuf] 
Get the last error associated with the stream buffer. 


  virtual const asio::error_code & error() const;



[heading Return Value]
      
An `error_code` corresponding to the last error from the stream buffer. 




[endsect]



[section:executor_type basic_socket_streambuf::executor_type]


['Inherited from basic_io_object.]

[indexterm2 executor_type..basic_socket_streambuf] 
The type of the executor associated with the object. 


  typedef asio::io_service::executor_type executor_type;


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

  [
    [[link asio.reference.io_service__executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.defer [*defer]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.dispatch [*dispatch]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_finished [*on_work_finished]]]
    [Inform the io_service that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_started [*on_work_started]]]
    [Inform the io_service that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.post [*post]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the io_service is running in the current thread. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_service__executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[heading Requirements]

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

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


[endsect]



[section:expires_after basic_socket_streambuf::expires_after]

[indexterm2 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 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...]]``


Set the stream buffer's expiry time relative to now. 


  void ``[link asio.reference.basic_socket_streambuf.expires_at.overload3 expires_at]``(
      const duration & expiry_time);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.expires_at.overload3 more...]]``


[section:overload1 basic_socket_streambuf::expires_at (1 of 3 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 3 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]



[section:overload3 basic_socket_streambuf::expires_at (3 of 3 overloads)]


Set the stream buffer's expiry time relative to now. 


  void expires_at(
      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:expires_from_now basic_socket_streambuf::expires_from_now]

[indexterm2 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 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:get_executor basic_socket_streambuf::get_executor]


['Inherited from basic_io_object.]

[indexterm2 get_executor..basic_socket_streambuf] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_implementation basic_socket_streambuf::get_implementation]

[indexterm2 get_implementation..basic_socket_streambuf] 
Get the underlying implementation of the I/O object. 


  implementation_type & ``[link asio.reference.basic_socket_streambuf.get_implementation.overload1 get_implementation]``();
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.get_implementation.overload1 more...]]``

  const implementation_type & ``[link asio.reference.basic_socket_streambuf.get_implementation.overload2 get_implementation]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.get_implementation.overload2 more...]]``


[section:overload1 basic_socket_streambuf::get_implementation (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  implementation_type & get_implementation();



[endsect]



[section:overload2 basic_socket_streambuf::get_implementation (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  const implementation_type & get_implementation() const;



[endsect]


[endsect]


[section:get_io_service basic_socket_streambuf::get_io_service]


['Inherited from basic_io_object.]

[indexterm2 get_io_service..basic_socket_streambuf] 
(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();


This function may be used to obtain the [link asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_service `io_service`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 




[endsect]


[section:get_option basic_socket_streambuf::get_option]

[indexterm2 get_option..basic_socket_streambuf] 
Get an option from the socket. 


  void ``[link asio.reference.basic_socket_streambuf.get_option.overload1 get_option]``(
      GettableSocketOption & option) const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.get_option.overload1 more...]]``

  asio::error_code ``[link asio.reference.basic_socket_streambuf.get_option.overload2 get_option]``(
      GettableSocketOption & option,
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.get_option.overload2 more...]]``


[section:overload1 basic_socket_streambuf::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(io_service);
   ...
   asio::ip::tcp::socket::keep_alive option;
   socket.get_option(option);
   bool is_set = option.value();







[endsect]



[section:overload2 basic_socket_streambuf::get_option (2 of 2 overloads)]


['Inherited from basic_socket.]


Get an option from the socket. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  asio::error_code 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(io_service);
   ...
   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:get_service basic_socket_streambuf::get_service]

[indexterm2 get_service..basic_socket_streambuf] 
Get the service associated with the I/O object. 


  service_type & ``[link asio.reference.basic_socket_streambuf.get_service.overload1 get_service]``();
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.get_service.overload1 more...]]``

  const service_type & ``[link asio.reference.basic_socket_streambuf.get_service.overload2 get_service]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.get_service.overload2 more...]]``


[section:overload1 basic_socket_streambuf::get_service (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  service_type & get_service();



[endsect]



[section:overload2 basic_socket_streambuf::get_service (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  const service_type & get_service() const;



[endsect]


[endsect]


[section:implementation_type basic_socket_streambuf::implementation_type]


['Inherited from basic_io_object.]

[indexterm2 implementation_type..basic_socket_streambuf] 
The underlying implementation type of I/O object. 


  typedef service_type::implementation_type implementation_type;



[heading Requirements]

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

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


[endsect]


[section:io_control basic_socket_streambuf::io_control]

[indexterm2 io_control..basic_socket_streambuf] 
Perform an IO control command on the socket. 


  void ``[link asio.reference.basic_socket_streambuf.io_control.overload1 io_control]``(
      IoControlCommand & command);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.io_control.overload1 more...]]``

  asio::error_code ``[link asio.reference.basic_socket_streambuf.io_control.overload2 io_control]``(
      IoControlCommand & command,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.io_control.overload2 more...]]``


[section:overload1 basic_socket_streambuf::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(io_service);
   ...
   asio::ip::tcp::socket::bytes_readable command;
   socket.io_control(command);
   std::size_t bytes_readable = command.get();







[endsect]



[section:overload2 basic_socket_streambuf::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]``>
  asio::error_code 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(io_service);
   ...
   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:io_handler basic_socket_streambuf::io_handler]

[indexterm2 io_handler..basic_socket_streambuf] 

  friend struct io_handler();


[heading Requirements]

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

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


[endsect]



[section:is_open basic_socket_streambuf::is_open]


['Inherited from basic_socket.]

[indexterm2 is_open..basic_socket_streambuf] 
Determine whether the socket is open. 


  bool is_open() const;



[endsect]



[section:keep_alive basic_socket_streambuf::keep_alive]


['Inherited from socket_base.]

[indexterm2 keep_alive..basic_socket_streambuf] 
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(io_service); 
   ...
   asio::socket_base::keep_alive option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   asio::socket_base::keep_alive option;
   socket.get_option(option);
   bool is_set = option.value();







[heading Requirements]

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

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


[endsect]



[section:linger basic_socket_streambuf::linger]


['Inherited from socket_base.]

[indexterm2 linger..basic_socket_streambuf] 
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(io_service); 
   ...
   asio::socket_base::linger option(true, 30);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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_streambuf.hpp]

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


[endsect]


[section:local_endpoint basic_socket_streambuf::local_endpoint]

[indexterm2 local_endpoint..basic_socket_streambuf] 
Get the local endpoint of the socket. 


  endpoint_type ``[link asio.reference.basic_socket_streambuf.local_endpoint.overload1 local_endpoint]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.local_endpoint.overload1 more...]]``

  endpoint_type ``[link asio.reference.basic_socket_streambuf.local_endpoint.overload2 local_endpoint]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.local_endpoint.overload2 more...]]``


[section:overload1 basic_socket_streambuf::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(io_service);
   ...
   asio::ip::tcp::endpoint endpoint = socket.local_endpoint();







[endsect]



[section:overload2 basic_socket_streambuf::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(io_service);
   ...
   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_streambuf::lowest_layer]

[indexterm2 lowest_layer..basic_socket_streambuf] 
Get a reference to the lowest layer. 


  lowest_layer_type & ``[link asio.reference.basic_socket_streambuf.lowest_layer.overload1 lowest_layer]``();
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.lowest_layer.overload1 more...]]``


Get a const reference to the lowest layer. 


  const lowest_layer_type & ``[link asio.reference.basic_socket_streambuf.lowest_layer.overload2 lowest_layer]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.lowest_layer.overload2 more...]]``


[section:overload1 basic_socket_streambuf::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_socket_streambuf::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_socket_streambuf::lowest_layer_type]


['Inherited from basic_socket.]

[indexterm2 lowest_layer_type..basic_socket_streambuf] 
A [link asio.reference.basic_socket `basic_socket`] is always the lowest layer. 


  typedef basic_socket< Protocol, StreamSocketService > lowest_layer_type;


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_socket without opening it. 

     Construct and open a basic_socket. 

     Construct a basic_socket, opening it and binding it to the given local endpoint. 

     Construct a basic_socket on an existing native socket. 

     Move-construct a basic_socket from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     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. 

     Move-assign a basic_socket from a socket of another protocol type. ]
  ]
  
  [
    [[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.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_socket.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_socket._basic_socket [*~basic_socket]]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_socket.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_socket.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_socket.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_socket.message_peek [*message_peek]]]
    [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_streambuf.hpp]

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


[endsect]



[section:max_connections basic_socket_streambuf::max_connections]


['Inherited from socket_base.]

[indexterm2 max_connections..basic_socket_streambuf] 
The maximum length of the queue of pending incoming connections. 


  static const int max_connections = implementation_defined;



[endsect]



[section:message_do_not_route basic_socket_streambuf::message_do_not_route]


['Inherited from socket_base.]

[indexterm2 message_do_not_route..basic_socket_streambuf] 
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_streambuf::message_end_of_record]


['Inherited from socket_base.]

[indexterm2 message_end_of_record..basic_socket_streambuf] 
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_streambuf::message_flags]


['Inherited from socket_base.]

[indexterm2 message_flags..basic_socket_streambuf] 
Bitmask type for flags that can be passed to send and receive operations. 


  typedef int message_flags;



[heading Requirements]

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

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


[endsect]



[section:message_out_of_band basic_socket_streambuf::message_out_of_band]


['Inherited from socket_base.]

[indexterm2 message_out_of_band..basic_socket_streambuf] 
Process out-of-band data. 


  static const int message_out_of_band = implementation_defined;



[endsect]



[section:message_peek basic_socket_streambuf::message_peek]


['Inherited from socket_base.]

[indexterm2 message_peek..basic_socket_streambuf] 
Peek at incoming data without removing it from the input queue. 


  static const int message_peek = implementation_defined;



[endsect]



[section:native_handle basic_socket_streambuf::native_handle]


['Inherited from basic_socket.]

[indexterm2 native_handle..basic_socket_streambuf] 
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_streambuf::native_handle_type]


['Inherited from basic_socket.]

[indexterm2 native_handle_type..basic_socket_streambuf] 
The native representation of a socket. 


  typedef StreamSocketService::native_handle_type native_handle_type;



[heading Requirements]

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

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


[endsect]


[section:native_non_blocking basic_socket_streambuf::native_non_blocking]

[indexterm2 native_non_blocking..basic_socket_streambuf] 
Gets the non-blocking mode of the native socket implementation. 


  bool ``[link asio.reference.basic_socket_streambuf.native_non_blocking.overload1 native_non_blocking]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.native_non_blocking.overload1 more...]]``


Sets the non-blocking mode of the native socket implementation. 


  void ``[link asio.reference.basic_socket_streambuf.native_non_blocking.overload2 native_non_blocking]``(
      bool mode);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.native_non_blocking.overload2 more...]]``

  asio::error_code ``[link asio.reference.basic_socket_streambuf.native_non_blocking.overload3 native_non_blocking]``(
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.native_non_blocking.overload3 more...]]``


[section:overload1 basic_socket_streambuf::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_socket_streambuf::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_socket_streambuf::native_non_blocking (3 of 3 overloads)]


['Inherited from basic_socket.]


Sets the non-blocking mode of the native socket implementation. 


  asio::error_code 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_streambuf::non_blocking]

[indexterm2 non_blocking..basic_socket_streambuf] 
Gets the non-blocking mode of the socket. 


  bool ``[link asio.reference.basic_socket_streambuf.non_blocking.overload1 non_blocking]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.non_blocking.overload1 more...]]``


Sets the non-blocking mode of the socket. 


  void ``[link asio.reference.basic_socket_streambuf.non_blocking.overload2 non_blocking]``(
      bool mode);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.non_blocking.overload2 more...]]``

  asio::error_code ``[link asio.reference.basic_socket_streambuf.non_blocking.overload3 non_blocking]``(
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.non_blocking.overload3 more...]]``


[section:overload1 basic_socket_streambuf::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_socket_streambuf::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_socket_streambuf::non_blocking (3 of 3 overloads)]


['Inherited from basic_socket.]


Sets the non-blocking mode of the socket. 


  asio::error_code 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_streambuf::open]

[indexterm2 open..basic_socket_streambuf] 
Open the socket using the specified protocol. 


  void ``[link asio.reference.basic_socket_streambuf.open.overload1 open]``(
      const protocol_type & protocol = protocol_type());
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.open.overload1 more...]]``

  asio::error_code ``[link asio.reference.basic_socket_streambuf.open.overload2 open]``(
      const protocol_type & protocol,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.open.overload2 more...]]``


[section:overload1 basic_socket_streambuf::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(io_service);
   socket.open(asio::ip::tcp::v4());







[endsect]



[section:overload2 basic_socket_streambuf::open (2 of 2 overloads)]


['Inherited from basic_socket.]


Open the socket using the specified protocol. 


  asio::error_code 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(io_service);
   asio::error_code ec;
   socket.open(asio::ip::tcp::v4(), ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:overflow basic_socket_streambuf::overflow]

[indexterm2 overflow..basic_socket_streambuf] 

  int_type overflow(
      int_type c);



[endsect]



[section:protocol_type basic_socket_streambuf::protocol_type]


['Inherited from basic_socket.]

[indexterm2 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 puberror..basic_socket_streambuf] 
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:receive_buffer_size basic_socket_streambuf::receive_buffer_size]


['Inherited from socket_base.]

[indexterm2 receive_buffer_size..basic_socket_streambuf] 
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(io_service); 
   ...
   asio::socket_base::receive_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   asio::socket_base::receive_buffer_size option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

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

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


[endsect]



[section:receive_low_watermark basic_socket_streambuf::receive_low_watermark]


['Inherited from socket_base.]

[indexterm2 receive_low_watermark..basic_socket_streambuf] 
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(io_service); 
   ...
   asio::socket_base::receive_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   asio::socket_base::receive_low_watermark option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

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

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


[endsect]


[section:remote_endpoint basic_socket_streambuf::remote_endpoint]

[indexterm2 remote_endpoint..basic_socket_streambuf] 
Get the remote endpoint of the socket. 


  endpoint_type ``[link asio.reference.basic_socket_streambuf.remote_endpoint.overload1 remote_endpoint]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.remote_endpoint.overload1 more...]]``

  endpoint_type ``[link asio.reference.basic_socket_streambuf.remote_endpoint.overload2 remote_endpoint]``(
      asio::error_code & ec) const;
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.remote_endpoint.overload2 more...]]``


[section:overload1 basic_socket_streambuf::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(io_service);
   ...
   asio::ip::tcp::endpoint endpoint = socket.remote_endpoint();







[endsect]



[section:overload2 basic_socket_streambuf::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(io_service);
   ...
   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_streambuf::reuse_address]


['Inherited from socket_base.]

[indexterm2 reuse_address..basic_socket_streambuf] 
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(io_service); 
   ...
   asio::socket_base::reuse_address option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(io_service); 
   ...
   asio::socket_base::reuse_address option;
   acceptor.get_option(option);
   bool is_set = option.value();







[heading Requirements]

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

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


[endsect]



[section:send_buffer_size basic_socket_streambuf::send_buffer_size]


['Inherited from socket_base.]

[indexterm2 send_buffer_size..basic_socket_streambuf] 
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(io_service); 
   ...
   asio::socket_base::send_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   asio::socket_base::send_buffer_size option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

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

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


[endsect]



[section:send_low_watermark basic_socket_streambuf::send_low_watermark]


['Inherited from socket_base.]

[indexterm2 send_low_watermark..basic_socket_streambuf] 
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(io_service); 
   ...
   asio::socket_base::send_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   asio::socket_base::send_low_watermark option;
   socket.get_option(option);
   int size = option.value();







[heading Requirements]

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

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


[endsect]



[section:service_type basic_socket_streambuf::service_type]


['Inherited from basic_io_object.]

[indexterm2 service_type..basic_socket_streambuf] 
The type of the service that will be used to provide I/O operations. 


  typedef StreamSocketService service_type;



[heading Requirements]

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

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


[endsect]


[section:set_option basic_socket_streambuf::set_option]

[indexterm2 set_option..basic_socket_streambuf] 
Set an option on the socket. 


  void ``[link asio.reference.basic_socket_streambuf.set_option.overload1 set_option]``(
      const SettableSocketOption & option);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.set_option.overload1 more...]]``

  asio::error_code ``[link asio.reference.basic_socket_streambuf.set_option.overload2 set_option]``(
      const SettableSocketOption & option,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.set_option.overload2 more...]]``


[section:overload1 basic_socket_streambuf::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(io_service);
   ...
   asio::ip::tcp::no_delay option(true);
   socket.set_option(option);







[endsect]



[section:overload2 basic_socket_streambuf::set_option (2 of 2 overloads)]


['Inherited from basic_socket.]


Set an option on the socket. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  asio::error_code 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(io_service);
   ...
   asio::ip::tcp::no_delay option(true);
   asio::error_code ec;
   socket.set_option(option, ec);
   if (ec)
   {
     // An error occurred.
   }







[endsect]


[endsect]


[section:setbuf basic_socket_streambuf::setbuf]

[indexterm2 setbuf..basic_socket_streambuf] 

  std::streambuf * setbuf(
      char_type * s,
      std::streamsize n);



[endsect]


[section:shutdown basic_socket_streambuf::shutdown]

[indexterm2 shutdown..basic_socket_streambuf] 
Disable sends or receives on the socket. 


  void ``[link asio.reference.basic_socket_streambuf.shutdown.overload1 shutdown]``(
      shutdown_type what);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.shutdown.overload1 more...]]``

  asio::error_code ``[link asio.reference.basic_socket_streambuf.shutdown.overload2 shutdown]``(
      shutdown_type what,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.shutdown.overload2 more...]]``


[section:overload1 basic_socket_streambuf::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(io_service);
   ...
   socket.shutdown(asio::ip::tcp::socket::shutdown_send);







[endsect]



[section:overload2 basic_socket_streambuf::shutdown (2 of 2 overloads)]


['Inherited from basic_socket.]


Disable sends or receives on the socket. 


  asio::error_code 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(io_service);
   ...
   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_streambuf::shutdown_type]


['Inherited from socket_base.]

[indexterm2 shutdown_type..basic_socket_streambuf] 
Different ways a socket may be shutdown. 


  enum shutdown_type

[indexterm2 shutdown_receive..basic_socket_streambuf]
[indexterm2 shutdown_send..basic_socket_streambuf]
[indexterm2 shutdown_both..basic_socket_streambuf]

[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:sync basic_socket_streambuf::sync]

[indexterm2 sync..basic_socket_streambuf] 

  int sync();



[endsect]



[section:time_point basic_socket_streambuf::time_point]

[indexterm2 time_point..basic_socket_streambuf] 
The time type. 


  typedef TimeTraits::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 time_type..basic_socket_streambuf] 
(Deprecated: Use time\_point.) The time type. 


  typedef TimeTraits::time_type time_type;



[heading Requirements]

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

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


[endsect]



[section:timer_handler basic_socket_streambuf::timer_handler]

[indexterm2 timer_handler..basic_socket_streambuf] 

  friend struct timer_handler();


[heading Requirements]

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

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


[endsect]



[section:underflow basic_socket_streambuf::underflow]

[indexterm2 underflow..basic_socket_streambuf] 

  int_type underflow();



[endsect]


[section:wait basic_socket_streambuf::wait]

[indexterm2 wait..basic_socket_streambuf] 
Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  void ``[link asio.reference.basic_socket_streambuf.wait.overload1 wait]``(
      wait_type w);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.wait.overload1 more...]]``

  asio::error_code ``[link asio.reference.basic_socket_streambuf.wait.overload2 wait]``(
      wait_type w,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.wait.overload2 more...]]``


[section:overload1 basic_socket_streambuf::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(io_service);
   ...
   socket.wait(asio::ip::tcp::socket::wait_read);







[endsect]



[section:overload2 basic_socket_streambuf::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. 


  asio::error_code 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(io_service);
   ...
   asio::error_code ec;
   socket.wait(asio::ip::tcp::socket::wait_read, ec);







[endsect]


[endsect]


[section:wait_type basic_socket_streambuf::wait_type]


['Inherited from socket_base.]

[indexterm2 wait_type..basic_socket_streambuf] 
Wait types. 


  enum wait_type

[indexterm2 wait_read..basic_socket_streambuf]
[indexterm2 wait_write..basic_socket_streambuf]
[indexterm2 wait_error..basic_socket_streambuf]

[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_streambuf basic_socket_streambuf::~basic_socket_streambuf]

[indexterm2 ~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.StreamSocketService StreamSocketService]`` = stream_socket_service<Protocol>>
  class basic_stream_socket :
    public basic_socket< Protocol, StreamSocketService >


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_stream_socket without opening it. 

     Construct and open a basic_stream_socket. 

     Construct a basic_stream_socket, opening it and binding it to the given local endpoint. 

     Construct a basic_stream_socket on an existing native socket. 

     Move-construct a basic_stream_socket from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     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. 

     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. 

     Receive some data on a connected 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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_stream_socket.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_stream_socket.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_peek [*message_peek]]]
    [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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 async_connect..basic_stream_socket] 
Start an asynchronous connect. 


  template<
      typename ``[link asio.reference.ConnectHandler ConnectHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
      const endpoint_type & peer_endpoint,
      ConnectHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`.]]

]


[heading Example]
  


   void connect_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Connect succeeded.
     }
   }

   ...

   asio::ip::tcp::socket socket(io_service);
   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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some(
      const MutableBufferSequence & buffers,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.basic_stream_socket.async_receive.overload1 async_receive]``(
      const MutableBufferSequence & buffers,
      ReadHandler && handler);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.basic_stream_socket.async_receive.overload2 async_receive]``(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      ReadHandler && handler);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive(
      const MutableBufferSequence & buffers,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive(
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.basic_stream_socket.async_send.overload1 async_send]``(
      const ConstBufferSequence & buffers,
      WriteHandler && handler);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.basic_stream_socket.async_send.overload2 async_send]``(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      WriteHandler && handler);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send(
      const ConstBufferSequence & buffers,
      WriteHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send(
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      WriteHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      wait_type w,
      WaitHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`.]]

]


[heading Example]
  


   void wait_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Wait succeeded.
     }
   }

   ...

   asio::ip::tcp::socket socket(io_service);
   ...
   socket.async_wait(asio::ip::tcp::socket::wait_read, wait_handler);







[endsect]



[section:async_write_some basic_stream_socket::async_write_some]

[indexterm2 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some(
      const ConstBufferSequence & buffers,
      WriteHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 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 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 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]``(
      asio::io_service & io_service);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.basic_stream_socket.overload1 more...]]``


Construct and open a [link asio.reference.basic_stream_socket `basic_stream_socket`]. 


  ``[link asio.reference.basic_stream_socket.basic_stream_socket.overload2 basic_stream_socket]``(
      asio::io_service & io_service,
      const protocol_type & protocol);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.basic_stream_socket.overload2 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.overload3 basic_stream_socket]``(
      asio::io_service & io_service,
      const endpoint_type & endpoint);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.basic_stream_socket.overload3 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.overload4 basic_stream_socket]``(
      asio::io_service & io_service,
      const protocol_type & protocol,
      const native_handle_type & native_socket);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.basic_stream_socket.overload4 more...]]``


Move-construct a [link asio.reference.basic_stream_socket `basic_stream_socket`] from another. 


  ``[link asio.reference.basic_stream_socket.basic_stream_socket.overload5 basic_stream_socket]``(
      basic_stream_socket && other);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.basic_stream_socket.overload5 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.StreamSocketService StreamSocketService1]``>
  ``[link asio.reference.basic_stream_socket.basic_stream_socket.overload6 basic_stream_socket]``(
      basic_stream_socket< Protocol1, StreamSocketService1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.basic_stream_socket.overload6 more...]]``


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


Construct a [link asio.reference.basic_stream_socket `basic_stream_socket`] without opening it. 


  basic_stream_socket(
      asio::io_service & io_service);


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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the stream socket will use to dispatch handlers for any asynchronous operations performed on the socket. ]]

]




[endsect]



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


Construct and open a [link asio.reference.basic_stream_socket `basic_stream_socket`]. 


  basic_stream_socket(
      asio::io_service & io_service,
      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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the stream socket will use 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:overload3 basic_stream_socket::basic_stream_socket (3 of 6 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(
      asio::io_service & io_service,
      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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the stream socket will use 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:overload4 basic_stream_socket::basic_stream_socket (4 of 6 overloads)]


Construct a [link asio.reference.basic_stream_socket `basic_stream_socket`] on an existing native socket. 


  basic_stream_socket(
      asio::io_service & io_service,
      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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the stream socket will use 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:overload5 basic_stream_socket::basic_stream_socket (5 of 6 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(io_service&) constructor`. 




[endsect]



[section:overload6 basic_stream_socket::basic_stream_socket (6 of 6 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.StreamSocketService StreamSocketService1]``>
  basic_stream_socket(
      basic_stream_socket< Protocol1, StreamSocketService1 > && other,
      typename enable_if< is_convertible< Protocol1, Protocol >::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(io_service&) constructor`. 




[endsect]


[endsect]

[section:bind basic_stream_socket::bind]

[indexterm2 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...]]``

  asio::error_code ``[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(io_service);
   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. 


  asio::error_code 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(io_service);
   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 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(io_service); 
   ...
   asio::socket_base::broadcast option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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(io_service);
   ...
   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 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...]]``

  asio::error_code ``[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(io_service);
   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. 


  asio::error_code 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(io_service);
   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 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(io_service); 
   ...
   asio::socket_base::debug option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::do_not_route option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::enable_connection_aborted option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(io_service); 
   ...
   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 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]


['Inherited from basic_io_object.]

[indexterm2 executor_type..basic_stream_socket] 
The type of the executor associated with the object. 


  typedef asio::io_service::executor_type executor_type;


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

  [
    [[link asio.reference.io_service__executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.defer [*defer]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.dispatch [*dispatch]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_finished [*on_work_finished]]]
    [Inform the io_service that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_started [*on_work_started]]]
    [Inform the io_service that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.post [*post]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the io_service is running in the current thread. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_service__executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[heading Requirements]

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

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


[endsect]



[section:get_executor basic_stream_socket::get_executor]


['Inherited from basic_io_object.]

[indexterm2 get_executor..basic_stream_socket] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_implementation basic_stream_socket::get_implementation]

[indexterm2 get_implementation..basic_stream_socket] 
Get the underlying implementation of the I/O object. 


  implementation_type & ``[link asio.reference.basic_stream_socket.get_implementation.overload1 get_implementation]``();
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.get_implementation.overload1 more...]]``

  const implementation_type & ``[link asio.reference.basic_stream_socket.get_implementation.overload2 get_implementation]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.get_implementation.overload2 more...]]``


[section:overload1 basic_stream_socket::get_implementation (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  implementation_type & get_implementation();



[endsect]



[section:overload2 basic_stream_socket::get_implementation (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  const implementation_type & get_implementation() const;



[endsect]


[endsect]


[section:get_io_service basic_stream_socket::get_io_service]


['Inherited from basic_io_object.]

[indexterm2 get_io_service..basic_stream_socket] 
(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();


This function may be used to obtain the [link asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_service `io_service`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 




[endsect]


[section:get_option basic_stream_socket::get_option]

[indexterm2 get_option..basic_stream_socket] 
Get an option from the socket. 


  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...]]``

  asio::error_code ``[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(io_service);
   ...
   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]``>
  asio::error_code 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(io_service);
   ...
   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:get_service basic_stream_socket::get_service]

[indexterm2 get_service..basic_stream_socket] 
Get the service associated with the I/O object. 


  service_type & ``[link asio.reference.basic_stream_socket.get_service.overload1 get_service]``();
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.get_service.overload1 more...]]``

  const service_type & ``[link asio.reference.basic_stream_socket.get_service.overload2 get_service]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.get_service.overload2 more...]]``


[section:overload1 basic_stream_socket::get_service (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  service_type & get_service();



[endsect]



[section:overload2 basic_stream_socket::get_service (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  const service_type & get_service() const;



[endsect]


[endsect]


[section:implementation_type basic_stream_socket::implementation_type]


['Inherited from basic_io_object.]

[indexterm2 implementation_type..basic_stream_socket] 
The underlying implementation type of I/O object. 


  typedef service_type::implementation_type implementation_type;



[heading Requirements]

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

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


[endsect]


[section:io_control basic_stream_socket::io_control]

[indexterm2 io_control..basic_stream_socket] 
Perform an IO control command on the socket. 


  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...]]``

  asio::error_code ``[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(io_service);
   ...
   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]``>
  asio::error_code 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(io_service);
   ...
   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 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 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(io_service); 
   ...
   asio::socket_base::keep_alive option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::linger option(true, 30);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service);
   ...
   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(io_service);
   ...
   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 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 lowest_layer_type..basic_stream_socket] 
A [link asio.reference.basic_socket `basic_socket`] is always the lowest layer. 


  typedef basic_socket< Protocol, StreamSocketService > lowest_layer_type;


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_socket without opening it. 

     Construct and open a basic_socket. 

     Construct a basic_socket, opening it and binding it to the given local endpoint. 

     Construct a basic_socket on an existing native socket. 

     Move-construct a basic_socket from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     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. 

     Move-assign a basic_socket from a socket of another protocol type. ]
  ]
  
  [
    [[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.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_socket.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_socket._basic_socket [*~basic_socket]]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_socket.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_socket.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_socket.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_socket.message_peek [*message_peek]]]
    [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 max_connections..basic_stream_socket] 
The maximum length of the queue of pending incoming connections. 


  static const int max_connections = implementation_defined;



[endsect]



[section:message_do_not_route basic_stream_socket::message_do_not_route]


['Inherited from socket_base.]

[indexterm2 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 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 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 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 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 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 native_handle_type..basic_stream_socket] 
The native representation of a socket. 


  typedef StreamSocketService::native_handle_type 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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(io_service);
   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. 


  asio::error_code 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(io_service);
   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 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.StreamSocketService StreamSocketService1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value, basic_stream_socket >::type & ``[link asio.reference.basic_stream_socket.operator_eq_.overload2 operator=]``(
      basic_stream_socket< Protocol1, StreamSocketService1 > && 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(io_service&) 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.StreamSocketService StreamSocketService1]``>
  enable_if< is_convertible< Protocol1, Protocol >::value, basic_stream_socket >::type & operator=(
      basic_stream_socket< Protocol1, StreamSocketService1 > && 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(io_service&) constructor`. 




[endsect]


[endsect]


[section:protocol_type basic_stream_socket::protocol_type]

[indexterm2 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 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 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 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(io_service); 
   ...
   asio::socket_base::receive_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::receive_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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:remote_endpoint basic_stream_socket::remote_endpoint]

[indexterm2 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(io_service);
   ...
   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(io_service);
   ...
   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 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(io_service); 
   ...
   asio::socket_base::reuse_address option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(io_service); 
   ...
   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 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 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(io_service); 
   ...
   asio::socket_base::send_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::send_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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:service_type basic_stream_socket::service_type]


['Inherited from basic_io_object.]

[indexterm2 service_type..basic_stream_socket] 
The type of the service that will be used to provide I/O operations. 


  typedef StreamSocketService service_type;



[heading Requirements]

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

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


[endsect]


[section:set_option basic_stream_socket::set_option]

[indexterm2 set_option..basic_stream_socket] 
Set an option on the socket. 


  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...]]``

  asio::error_code ``[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(io_service);
   ...
   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]``>
  asio::error_code 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(io_service);
   ...
   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 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...]]``

  asio::error_code ``[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(io_service);
   ...
   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. 


  asio::error_code 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(io_service);
   ...
   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 shutdown_type..basic_stream_socket] 
Different ways a socket may be shutdown. 


  enum shutdown_type

[indexterm2 shutdown_receive..basic_stream_socket]
[indexterm2 shutdown_send..basic_stream_socket]
[indexterm2 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 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...]]``

  asio::error_code ``[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(io_service);
   ...
   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. 


  asio::error_code 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(io_service);
   ...
   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 wait_type..basic_stream_socket] 
Wait types. 


  enum wait_type

[indexterm2 wait_read..basic_stream_socket]
[indexterm2 wait_write..basic_stream_socket]
[indexterm2 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 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]


[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]]]
    [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 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 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 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 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 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 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 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 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 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 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 reserve..basic_streambuf] 

  void reserve(
      std::size_t n);



[endsect]



[section:size basic_streambuf::size]

[indexterm2 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 += buffer_size(buf);
   }







[endsect]



[section:underflow basic_streambuf::underflow]

[indexterm2 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]]]
    [Construct a basic_streambuf_ref for the given basic_streambuf object. 

     Copy construct a basic_streambuf_ref. 

     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 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 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 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 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]]]
    [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 consume..basic_streambuf_ref] 
Remove characters from the input sequence. 


  void consume(
      std::size_t n);



[endsect]



[section:data basic_streambuf_ref::data]

[indexterm2 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 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 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]]]
    [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 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 size..basic_streambuf_ref] 
Get the size of the input sequence. 


  std::size_t size() const;



[endsect]



[endsect]

[section:basic_waitable_timer basic_waitable_timer]


Provides waitable timer functionality. 


  template<
      typename Clock,
      typename ``[link asio.reference.WaitTraits WaitTraits]`` = asio::wait_traits<Clock>,
      typename ``[link asio.reference.WaitableTimerService WaitableTimerService]`` = waitable_timer_service<Clock, WaitTraits>>
  class basic_waitable_timer :
    public basic_io_object< WaitableTimerService >


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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 to set a particular expiry time as an absolute time. 

     Constructor to set a particular expiry time relative to now. 

     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. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.cancel_one [*cancel_one]]]
    [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. 

     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. 

     (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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_waitable_timer.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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(io_service);

   // 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(io_service,
       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 async_wait..basic_waitable_timer] 
Start an asynchronous wait on the timer. 


  template<
      typename ``[link asio.reference.WaitHandler WaitHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      WaitHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`. ]]

]




[endsect]


[section:basic_waitable_timer basic_waitable_timer::basic_waitable_timer]

[indexterm2 basic_waitable_timer..basic_waitable_timer] 
Constructor. 


  explicit ``[link asio.reference.basic_waitable_timer.basic_waitable_timer.overload1 basic_waitable_timer]``(
      asio::io_service & io_service);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.basic_waitable_timer.overload1 more...]]``


Constructor to set a particular expiry time as an absolute time. 


  ``[link asio.reference.basic_waitable_timer.basic_waitable_timer.overload2 basic_waitable_timer]``(
      asio::io_service & io_service,
      const time_point & expiry_time);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.basic_waitable_timer.overload2 more...]]``


Constructor to set a particular expiry time relative to now. 


  ``[link asio.reference.basic_waitable_timer.basic_waitable_timer.overload3 basic_waitable_timer]``(
      asio::io_service & io_service,
      const duration & expiry_time);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.basic_waitable_timer.overload3 more...]]``


Move-construct a [link asio.reference.basic_waitable_timer `basic_waitable_timer`] from another. 


  ``[link asio.reference.basic_waitable_timer.basic_waitable_timer.overload4 basic_waitable_timer]``(
      basic_waitable_timer && other);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.basic_waitable_timer.overload4 more...]]``


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


Constructor. 


  basic_waitable_timer(
      asio::io_service & io_service);


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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the timer will use to dispatch handlers for any asynchronous operations performed on the timer. ]]

]




[endsect]



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


Constructor to set a particular expiry time as an absolute time. 


  basic_waitable_timer(
      asio::io_service & io_service,
      const time_point & expiry_time);


This constructor creates a timer and sets the expiry time.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the timer will use 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:overload3 basic_waitable_timer::basic_waitable_timer (3 of 4 overloads)]


Constructor to set a particular expiry time relative to now. 


  basic_waitable_timer(
      asio::io_service & io_service,
      const duration & expiry_time);


This constructor creates a timer and sets the expiry time.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the timer will use 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:overload4 basic_waitable_timer::basic_waitable_timer (4 of 4 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(io_service&) constructor`. 




[endsect]


[endsect]

[section:cancel basic_waitable_timer::cancel]

[indexterm2 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...]]``

  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)]


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 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...]]``

  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)]


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 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 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]


['Inherited from basic_io_object.]

[indexterm2 executor_type..basic_waitable_timer] 
The type of the executor associated with the object. 


  typedef asio::io_service::executor_type executor_type;


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

  [
    [[link asio.reference.io_service__executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.defer [*defer]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.dispatch [*dispatch]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_finished [*on_work_finished]]]
    [Inform the io_service that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_started [*on_work_started]]]
    [Inform the io_service that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.post [*post]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the io_service is running in the current thread. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_service__executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[heading Requirements]

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

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


[endsect]


[section:expires_after basic_waitable_timer::expires_after]

[indexterm2 expires_after..basic_waitable_timer] 
Set the timer's expiry time relative to now. 


  std::size_t ``[link asio.reference.basic_waitable_timer.expires_after.overload1 expires_after]``(
      const duration & expiry_time);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.expires_after.overload1 more...]]``

  std::size_t ``[link asio.reference.basic_waitable_timer.expires_after.overload2 expires_after]``(
      const duration & expiry_time,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.expires_after.overload2 more...]]``


[section:overload1 basic_waitable_timer::expires_after (1 of 2 overloads)]


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:overload2 basic_waitable_timer::expires_after (2 of 2 overloads)]


Set the timer's expiry time relative to now. 


  std::size_t expires_after(
      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_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]


[endsect]

[section:expires_at basic_waitable_timer::expires_at]

[indexterm2 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...]]``

  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)]


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 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 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]


['Inherited from basic_io_object.]

[indexterm2 get_executor..basic_waitable_timer] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_implementation basic_waitable_timer::get_implementation]

[indexterm2 get_implementation..basic_waitable_timer] 
Get the underlying implementation of the I/O object. 


  implementation_type & ``[link asio.reference.basic_waitable_timer.get_implementation.overload1 get_implementation]``();
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.get_implementation.overload1 more...]]``

  const implementation_type & ``[link asio.reference.basic_waitable_timer.get_implementation.overload2 get_implementation]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.get_implementation.overload2 more...]]``


[section:overload1 basic_waitable_timer::get_implementation (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  implementation_type & get_implementation();



[endsect]



[section:overload2 basic_waitable_timer::get_implementation (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  const implementation_type & get_implementation() const;



[endsect]


[endsect]


[section:get_io_service basic_waitable_timer::get_io_service]


['Inherited from basic_io_object.]

[indexterm2 get_io_service..basic_waitable_timer] 
(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();


This function may be used to obtain the [link asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_service `io_service`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 




[endsect]


[section:get_service basic_waitable_timer::get_service]

[indexterm2 get_service..basic_waitable_timer] 
Get the service associated with the I/O object. 


  service_type & ``[link asio.reference.basic_waitable_timer.get_service.overload1 get_service]``();
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.get_service.overload1 more...]]``

  const service_type & ``[link asio.reference.basic_waitable_timer.get_service.overload2 get_service]``() const;
  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.get_service.overload2 more...]]``


[section:overload1 basic_waitable_timer::get_service (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  service_type & get_service();



[endsect]



[section:overload2 basic_waitable_timer::get_service (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  const service_type & get_service() const;



[endsect]


[endsect]


[section:implementation_type basic_waitable_timer::implementation_type]


['Inherited from basic_io_object.]

[indexterm2 implementation_type..basic_waitable_timer] 
The underlying implementation type of I/O object. 


  typedef service_type::implementation_type implementation_type;



[heading Requirements]

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

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


[endsect]



[section:operator_eq_ basic_waitable_timer::operator=]

[indexterm2 operator=..basic_waitable_timer] 
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.


[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(io_service&) constructor`. 




[endsect]



[section:service_type basic_waitable_timer::service_type]


['Inherited from basic_io_object.]

[indexterm2 service_type..basic_waitable_timer] 
The type of the service that will be used to provide I/O operations. 


  typedef WaitableTimerService service_type;



[heading Requirements]

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

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


[endsect]



[section:time_point basic_waitable_timer::time_point]

[indexterm2 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 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 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]


[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]]]
    [Construct a yield context to represent the specified coroutine. 

     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 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 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 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 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:buffer buffer]

[indexterm1 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. 

      
  mutable_buffers_1 ``[link asio.reference.buffer.overload1 buffer]``(
      const mutable_buffer & b);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload1 more...]]``

  mutable_buffers_1 ``[link asio.reference.buffer.overload2 buffer]``(
      const mutable_buffer & b,
      std::size_t max_size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload2 more...]]``

  const_buffers_1 ``[link asio.reference.buffer.overload3 buffer]``(
      const const_buffer & b);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload3 more...]]``

  const_buffers_1 ``[link asio.reference.buffer.overload4 buffer]``(
      const const_buffer & b,
      std::size_t max_size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload4 more...]]``

  mutable_buffers_1 ``[link asio.reference.buffer.overload5 buffer]``(
      void * data,
      std::size_t size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload5 more...]]``

  const_buffers_1 ``[link asio.reference.buffer.overload6 buffer]``(
      const void * data,
      std::size_t size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload6 more...]]``

  template<
      typename PodType,
      std::size_t N>
  mutable_buffers_1 ``[link asio.reference.buffer.overload7 buffer]``(
      PodType (&data)[N]);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload7 more...]]``

  template<
      typename PodType,
      std::size_t N>
  mutable_buffers_1 ``[link asio.reference.buffer.overload8 buffer]``(
      PodType (&data)[N],
      std::size_t max_size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload8 more...]]``

  template<
      typename PodType,
      std::size_t N>
  const_buffers_1 ``[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_buffers_1 ``[link asio.reference.buffer.overload10 buffer]``(
      const PodType (&data)[N],
      std::size_t max_size_in_bytes);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload10 more...]]``

  template<
      typename PodType,
      std::size_t N>
  mutable_buffers_1 ``[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_buffers_1 ``[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...]]``

  template<
      typename PodType,
      std::size_t N>
  const_buffers_1 ``[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_buffers_1 ``[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_buffers_1 ``[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_buffers_1 ``[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...]]``

  template<
      typename PodType,
      std::size_t N>
  mutable_buffers_1 ``[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_buffers_1 ``[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...]]``

  template<
      typename PodType,
      std::size_t N>
  const_buffers_1 ``[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_buffers_1 ``[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_buffers_1 ``[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_buffers_1 ``[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...]]``

  template<
      typename PodType,
      typename Allocator>
  mutable_buffers_1 ``[link asio.reference.buffer.overload23 buffer]``(
      std::vector< PodType, Allocator > & data);
  ``  [''''&raquo;''' [link asio.reference.buffer.overload23 more...]]``

  template<
      typename PodType,
      typename Allocator>
  mutable_buffers_1 ``[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...]]``

  template<
      typename PodType,
      typename Allocator>
  const_buffers_1 ``[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_buffers_1 ``[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...]]``

  template<
      typename Elem,
      typename Traits,
      typename Allocator>
  mutable_buffers_1 ``[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_buffers_1 ``[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...]]``

  template<
      typename Elem,
      typename Traits,
      typename Allocator>
  const_buffers_1 ``[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_buffers_1 ``[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...]]``

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 [link asio.reference.buffer_size `buffer_size`]  and [link asio.reference.buffer_cast `buffer_cast`]  functions:



   asio::mutable_buffer b1 = ...;
   std::size_t s1 = asio::buffer_size(b1);
   unsigned char* p1 = asio::buffer_cast<unsigned char*>(b1);

   asio::const_buffer b2 = ...;
   std::size_t s2 = asio::buffer_size(b2);
   const void* p2 = asio::buffer_cast<const void*>(b2); 




The `asio::buffer_cast` function permits violations of type safety, so uses of it in application code should be carefully considered.

For convenience, the [link asio.reference.buffer_size `buffer_size`]  function also works on 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`] , 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 30 overloads)]


Create a new modifiable buffer from an existing buffer. 


  mutable_buffers_1 buffer(
      const mutable_buffer & b);



[heading Return Value]
      
`mutable_buffers_1(b)`. 




[endsect]



[section:overload2 buffer (2 of 30 overloads)]


Create a new modifiable buffer from an existing buffer. 


  mutable_buffers_1 buffer(
      const mutable_buffer & b,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.mutable_buffers_1 `mutable_buffers_1`] value equivalent to: 

   mutable_buffers_1(
       buffer_cast<void*>(b),
       min(buffer_size(b), max_size_in_bytes)); 







[endsect]



[section:overload3 buffer (3 of 30 overloads)]


Create a new non-modifiable buffer from an existing buffer. 


  const_buffers_1 buffer(
      const const_buffer & b);



[heading Return Value]
      
`const_buffers_1(b)`. 




[endsect]



[section:overload4 buffer (4 of 30 overloads)]


Create a new non-modifiable buffer from an existing buffer. 


  const_buffers_1 buffer(
      const const_buffer & b,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.const_buffers_1 `const_buffers_1`] value equivalent to: 

   const_buffers_1(
       buffer_cast<const void*>(b),
       min(buffer_size(b), max_size_in_bytes)); 







[endsect]



[section:overload5 buffer (5 of 30 overloads)]


Create a new modifiable buffer that represents the given memory range. 


  mutable_buffers_1 buffer(
      void * data,
      std::size_t size_in_bytes);



[heading Return Value]
      
`mutable_buffers_1(data, size_in_bytes)`. 




[endsect]



[section:overload6 buffer (6 of 30 overloads)]


Create a new non-modifiable buffer that represents the given memory range. 


  const_buffers_1 buffer(
      const void * data,
      std::size_t size_in_bytes);



[heading Return Value]
      
`const_buffers_1(data, size_in_bytes)`. 




[endsect]



[section:overload7 buffer (7 of 30 overloads)]


Create a new modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  mutable_buffers_1 buffer(
      PodType (&data)[N]);



[heading Return Value]
      
A [link asio.reference.mutable_buffers_1 `mutable_buffers_1`] value equivalent to: 

   mutable_buffers_1(
       static_cast<void*>(data),
       N * sizeof(PodType)); 







[endsect]



[section:overload8 buffer (8 of 30 overloads)]


Create a new modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  mutable_buffers_1 buffer(
      PodType (&data)[N],
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.mutable_buffers_1 `mutable_buffers_1`] value equivalent to: 

   mutable_buffers_1(
       static_cast<void*>(data),
       min(N * sizeof(PodType), max_size_in_bytes)); 







[endsect]



[section:overload9 buffer (9 of 30 overloads)]


Create a new non-modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  const_buffers_1 buffer(
      const PodType (&data)[N]);



[heading Return Value]
      
A [link asio.reference.const_buffers_1 `const_buffers_1`] value equivalent to: 

   const_buffers_1(
       static_cast<const void*>(data),
       N * sizeof(PodType)); 







[endsect]



[section:overload10 buffer (10 of 30 overloads)]


Create a new non-modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  const_buffers_1 buffer(
      const PodType (&data)[N],
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.const_buffers_1 `const_buffers_1`] value equivalent to: 

   const_buffers_1(
       static_cast<const void*>(data),
       min(N * sizeof(PodType), max_size_in_bytes)); 







[endsect]



[section:overload11 buffer (11 of 30 overloads)]


Create a new modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  mutable_buffers_1 buffer(
      boost::array< PodType, N > & data);



[heading Return Value]
      
A [link asio.reference.mutable_buffers_1 `mutable_buffers_1`] value equivalent to: 

   mutable_buffers_1(
       data.data(),
       data.size() * sizeof(PodType)); 







[endsect]



[section:overload12 buffer (12 of 30 overloads)]


Create a new modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  mutable_buffers_1 buffer(
      boost::array< PodType, N > & data,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.mutable_buffers_1 `mutable_buffers_1`] value equivalent to: 

   mutable_buffers_1(
       data.data(),
       min(data.size() * sizeof(PodType), max_size_in_bytes)); 







[endsect]



[section:overload13 buffer (13 of 30 overloads)]


Create a new non-modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  const_buffers_1 buffer(
      boost::array< const PodType, N > & data);



[heading Return Value]
      
A [link asio.reference.const_buffers_1 `const_buffers_1`] value equivalent to: 

   const_buffers_1(
       data.data(),
       data.size() * sizeof(PodType)); 







[endsect]



[section:overload14 buffer (14 of 30 overloads)]


Create a new non-modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  const_buffers_1 buffer(
      boost::array< const PodType, N > & data,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.const_buffers_1 `const_buffers_1`] value equivalent to: 

   const_buffers_1(
       data.data(),
       min(data.size() * sizeof(PodType), max_size_in_bytes)); 







[endsect]



[section:overload15 buffer (15 of 30 overloads)]


Create a new non-modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  const_buffers_1 buffer(
      const boost::array< PodType, N > & data);



[heading Return Value]
      
A [link asio.reference.const_buffers_1 `const_buffers_1`] value equivalent to: 

   const_buffers_1(
       data.data(),
       data.size() * sizeof(PodType)); 







[endsect]



[section:overload16 buffer (16 of 30 overloads)]


Create a new non-modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  const_buffers_1 buffer(
      const boost::array< PodType, N > & data,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.const_buffers_1 `const_buffers_1`] value equivalent to: 

   const_buffers_1(
       data.data(),
       min(data.size() * sizeof(PodType), max_size_in_bytes)); 







[endsect]



[section:overload17 buffer (17 of 30 overloads)]


Create a new modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  mutable_buffers_1 buffer(
      std::array< PodType, N > & data);



[heading Return Value]
      
A [link asio.reference.mutable_buffers_1 `mutable_buffers_1`] value equivalent to: 

   mutable_buffers_1(
       data.data(),
       data.size() * sizeof(PodType)); 







[endsect]



[section:overload18 buffer (18 of 30 overloads)]


Create a new modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  mutable_buffers_1 buffer(
      std::array< PodType, N > & data,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.mutable_buffers_1 `mutable_buffers_1`] value equivalent to: 

   mutable_buffers_1(
       data.data(),
       min(data.size() * sizeof(PodType), max_size_in_bytes)); 







[endsect]



[section:overload19 buffer (19 of 30 overloads)]


Create a new non-modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  const_buffers_1 buffer(
      std::array< const PodType, N > & data);



[heading Return Value]
      
A [link asio.reference.const_buffers_1 `const_buffers_1`] value equivalent to: 

   const_buffers_1(
       data.data(),
       data.size() * sizeof(PodType)); 







[endsect]



[section:overload20 buffer (20 of 30 overloads)]


Create a new non-modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  const_buffers_1 buffer(
      std::array< const PodType, N > & data,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.const_buffers_1 `const_buffers_1`] value equivalent to: 

   const_buffers_1(
       data.data(),
       min(data.size() * sizeof(PodType), max_size_in_bytes)); 







[endsect]



[section:overload21 buffer (21 of 30 overloads)]


Create a new non-modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  const_buffers_1 buffer(
      const std::array< PodType, N > & data);



[heading Return Value]
      
A [link asio.reference.const_buffers_1 `const_buffers_1`] value equivalent to: 

   const_buffers_1(
       data.data(),
       data.size() * sizeof(PodType)); 







[endsect]



[section:overload22 buffer (22 of 30 overloads)]


Create a new non-modifiable buffer that represents the given POD array. 


  template<
      typename PodType,
      std::size_t N>
  const_buffers_1 buffer(
      const std::array< PodType, N > & data,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.const_buffers_1 `const_buffers_1`] value equivalent to: 

   const_buffers_1(
       data.data(),
       min(data.size() * sizeof(PodType), max_size_in_bytes)); 







[endsect]



[section:overload23 buffer (23 of 30 overloads)]


Create a new modifiable buffer that represents the given POD vector. 


  template<
      typename PodType,
      typename Allocator>
  mutable_buffers_1 buffer(
      std::vector< PodType, Allocator > & data);



[heading Return Value]
      
A [link asio.reference.mutable_buffers_1 `mutable_buffers_1`] value equivalent to: 

   mutable_buffers_1(
       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 30 overloads)]


Create a new modifiable buffer that represents the given POD vector. 


  template<
      typename PodType,
      typename Allocator>
  mutable_buffers_1 buffer(
      std::vector< PodType, Allocator > & data,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.mutable_buffers_1 `mutable_buffers_1`] value equivalent to: 

   mutable_buffers_1(
       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 30 overloads)]


Create a new non-modifiable buffer that represents the given POD vector. 


  template<
      typename PodType,
      typename Allocator>
  const_buffers_1 buffer(
      const std::vector< PodType, Allocator > & data);



[heading Return Value]
      
A [link asio.reference.const_buffers_1 `const_buffers_1`] value equivalent to: 

   const_buffers_1(
       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 30 overloads)]


Create a new non-modifiable buffer that represents the given POD vector. 


  template<
      typename PodType,
      typename Allocator>
  const_buffers_1 buffer(
      const std::vector< PodType, Allocator > & data,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.const_buffers_1 `const_buffers_1`] value equivalent to: 

   const_buffers_1(
       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 30 overloads)]


Create a new modifiable buffer that represents the given string. 


  template<
      typename Elem,
      typename Traits,
      typename Allocator>
  mutable_buffers_1 buffer(
      std::basic_string< Elem, Traits, Allocator > & data);



[heading Return Value]
      
`mutable_buffers_1(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 30 overloads)]


Create a new non-modifiable buffer that represents the given string. 


  template<
      typename Elem,
      typename Traits,
      typename Allocator>
  mutable_buffers_1 buffer(
      std::basic_string< Elem, Traits, Allocator > & data,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.mutable_buffers_1 `mutable_buffers_1`] value equivalent to: 

   mutable_buffers_1(
       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 30 overloads)]


Create a new non-modifiable buffer that represents the given string. 


  template<
      typename Elem,
      typename Traits,
      typename Allocator>
  const_buffers_1 buffer(
      const std::basic_string< Elem, Traits, Allocator > & data);



[heading Return Value]
      
`const_buffers_1(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 30 overloads)]


Create a new non-modifiable buffer that represents the given string. 


  template<
      typename Elem,
      typename Traits,
      typename Allocator>
  const_buffers_1 buffer(
      const std::basic_string< Elem, Traits, Allocator > & data,
      std::size_t max_size_in_bytes);



[heading Return Value]
      
A [link asio.reference.const_buffers_1 `const_buffers_1`] value equivalent to: 

   const_buffers_1(
       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]


[endsect]

[section:buffer_cast buffer_cast]

[indexterm1 buffer_cast] 
The `asio::buffer_cast` function is used to obtain a pointer to the underlying memory region associated with a buffer. 

      
  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 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). 

      
  std::size_t ``[link asio.reference.buffer_copy.overload1 buffer_copy]``(
      const mutable_buffer & target,
      const const_buffer & source);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload1 more...]]``

  std::size_t ``[link asio.reference.buffer_copy.overload2 buffer_copy]``(
      const mutable_buffer & target,
      const const_buffers_1 & source);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload2 more...]]``

  std::size_t ``[link asio.reference.buffer_copy.overload3 buffer_copy]``(
      const mutable_buffer & target,
      const mutable_buffer & source);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload3 more...]]``

  std::size_t ``[link asio.reference.buffer_copy.overload4 buffer_copy]``(
      const mutable_buffer & target,
      const mutable_buffers_1 & source);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload4 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.buffer_copy.overload5 buffer_copy]``(
      const mutable_buffer & target,
      const ConstBufferSequence & source,
      typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload5 more...]]``

  std::size_t ``[link asio.reference.buffer_copy.overload6 buffer_copy]``(
      const mutable_buffers_1 & target,
      const const_buffer & source);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload6 more...]]``

  std::size_t ``[link asio.reference.buffer_copy.overload7 buffer_copy]``(
      const mutable_buffers_1 & target,
      const const_buffers_1 & source);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload7 more...]]``

  std::size_t ``[link asio.reference.buffer_copy.overload8 buffer_copy]``(
      const mutable_buffers_1 & target,
      const mutable_buffer & source);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload8 more...]]``

  std::size_t ``[link asio.reference.buffer_copy.overload9 buffer_copy]``(
      const mutable_buffers_1 & target,
      const mutable_buffers_1 & source);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload9 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.buffer_copy.overload10 buffer_copy]``(
      const mutable_buffers_1 & target,
      const ConstBufferSequence & source,
      typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload10 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.buffer_copy.overload11 buffer_copy]``(
      const MutableBufferSequence & target,
      const const_buffer & source,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload11 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.buffer_copy.overload12 buffer_copy]``(
      const MutableBufferSequence & target,
      const const_buffers_1 & source,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload12 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.buffer_copy.overload13 buffer_copy]``(
      const MutableBufferSequence & target,
      const mutable_buffer & source,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload13 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.buffer_copy.overload14 buffer_copy]``(
      const MutableBufferSequence & target,
      const mutable_buffers_1 & source,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload14 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.buffer_copy.overload15 buffer_copy]``(
      const MutableBufferSequence & target,
      const ConstBufferSequence & source,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value &&is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload15 more...]]``

  std::size_t ``[link asio.reference.buffer_copy.overload16 buffer_copy]``(
      const mutable_buffer & target,
      const const_buffer & source,
      std::size_t max_bytes_to_copy);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload16 more...]]``

  std::size_t ``[link asio.reference.buffer_copy.overload17 buffer_copy]``(
      const mutable_buffer & target,
      const const_buffers_1 & source,
      std::size_t max_bytes_to_copy);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload17 more...]]``

  std::size_t ``[link asio.reference.buffer_copy.overload18 buffer_copy]``(
      const mutable_buffer & target,
      const mutable_buffer & source,
      std::size_t max_bytes_to_copy);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload18 more...]]``

  std::size_t ``[link asio.reference.buffer_copy.overload19 buffer_copy]``(
      const mutable_buffer & target,
      const mutable_buffers_1 & source,
      std::size_t max_bytes_to_copy);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload19 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.buffer_copy.overload20 buffer_copy]``(
      const mutable_buffer & target,
      const ConstBufferSequence & source,
      std::size_t max_bytes_to_copy,
      typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload20 more...]]``

  std::size_t ``[link asio.reference.buffer_copy.overload21 buffer_copy]``(
      const mutable_buffers_1 & target,
      const const_buffer & source,
      std::size_t max_bytes_to_copy);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload21 more...]]``

  std::size_t ``[link asio.reference.buffer_copy.overload22 buffer_copy]``(
      const mutable_buffers_1 & target,
      const const_buffers_1 & source,
      std::size_t max_bytes_to_copy);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload22 more...]]``

  std::size_t ``[link asio.reference.buffer_copy.overload23 buffer_copy]``(
      const mutable_buffers_1 & target,
      const mutable_buffer & source,
      std::size_t max_bytes_to_copy);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload23 more...]]``

  std::size_t ``[link asio.reference.buffer_copy.overload24 buffer_copy]``(
      const mutable_buffers_1 & target,
      const mutable_buffers_1 & source,
      std::size_t max_bytes_to_copy);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload24 more...]]``

  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.buffer_copy.overload25 buffer_copy]``(
      const mutable_buffers_1 & target,
      const ConstBufferSequence & source,
      std::size_t max_bytes_to_copy,
      typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload25 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.buffer_copy.overload26 buffer_copy]``(
      const MutableBufferSequence & target,
      const const_buffer & source,
      std::size_t max_bytes_to_copy,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload26 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.buffer_copy.overload27 buffer_copy]``(
      const MutableBufferSequence & target,
      const const_buffers_1 & source,
      std::size_t max_bytes_to_copy,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload27 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.buffer_copy.overload28 buffer_copy]``(
      const MutableBufferSequence & target,
      const mutable_buffer & source,
      std::size_t max_bytes_to_copy,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload28 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t ``[link asio.reference.buffer_copy.overload29 buffer_copy]``(
      const MutableBufferSequence & target,
      const mutable_buffers_1 & source,
      std::size_t max_bytes_to_copy,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload29 more...]]``

  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t ``[link asio.reference.buffer_copy.overload30 buffer_copy]``(
      const MutableBufferSequence & target,
      const ConstBufferSequence & source,
      std::size_t max_bytes_to_copy,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value &&is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_copy.overload30 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 30 overloads)]


Copies bytes from a source buffer to a target buffer. 


  std::size_t buffer_copy(
      const mutable_buffer & target,
      const const_buffer & source);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer representing the memory region to which the bytes will be copied.]]

[[source][A non-modifiable buffer representing the memory region 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 30 overloads)]


Copies bytes from a source buffer to a target buffer. 


  std::size_t buffer_copy(
      const mutable_buffer & target,
      const const_buffers_1 & source);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer representing the memory region to which the bytes will be copied.]]

[[source][A non-modifiable buffer representing the memory region 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:overload3 buffer_copy (3 of 30 overloads)]


Copies bytes from a source buffer to a target buffer. 


  std::size_t buffer_copy(
      const mutable_buffer & target,
      const mutable_buffer & source);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer representing the memory region to which the bytes will be copied.]]

[[source][A modifiable buffer representing the memory region from which the bytes will be copied. The contents of the source buffer will not be modified.]]

]


[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:overload4 buffer_copy (4 of 30 overloads)]


Copies bytes from a source buffer to a target buffer. 


  std::size_t buffer_copy(
      const mutable_buffer & target,
      const mutable_buffers_1 & source);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer representing the memory region to which the bytes will be copied.]]

[[source][A modifiable buffer representing the memory region from which the bytes will be copied. The contents of the source buffer will not be modified.]]

]


[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:overload5 buffer_copy (5 of 30 overloads)]


Copies bytes from a source buffer sequence to a target buffer. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t buffer_copy(
      const mutable_buffer & target,
      const ConstBufferSequence & source,
      typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer representing the memory region 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:overload6 buffer_copy (6 of 30 overloads)]


Copies bytes from a source buffer to a target buffer. 


  std::size_t buffer_copy(
      const mutable_buffers_1 & target,
      const const_buffer & source);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer representing the memory region to which the bytes will be copied.]]

[[source][A non-modifiable buffer representing the memory region 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:overload7 buffer_copy (7 of 30 overloads)]


Copies bytes from a source buffer to a target buffer. 


  std::size_t buffer_copy(
      const mutable_buffers_1 & target,
      const const_buffers_1 & source);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer representing the memory region to which the bytes will be copied.]]

[[source][A non-modifiable buffer representing the memory region 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:overload8 buffer_copy (8 of 30 overloads)]


Copies bytes from a source buffer to a target buffer. 


  std::size_t buffer_copy(
      const mutable_buffers_1 & target,
      const mutable_buffer & source);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer representing the memory region to which the bytes will be copied.]]

[[source][A modifiable buffer representing the memory region from which the bytes will be copied. The contents of the source buffer will not be modified.]]

]


[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:overload9 buffer_copy (9 of 30 overloads)]


Copies bytes from a source buffer to a target buffer. 


  std::size_t buffer_copy(
      const mutable_buffers_1 & target,
      const mutable_buffers_1 & source);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer representing the memory region to which the bytes will be copied.]]

[[source][A modifiable buffer representing the memory region from which the bytes will be copied. The contents of the source buffer will not be modified.]]

]


[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:overload10 buffer_copy (10 of 30 overloads)]


Copies bytes from a source buffer sequence to a target buffer. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t buffer_copy(
      const mutable_buffers_1 & target,
      const ConstBufferSequence & source,
      typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer representing the memory region 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:overload11 buffer_copy (11 of 30 overloads)]


Copies bytes from a source buffer to a target buffer sequence. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t buffer_copy(
      const MutableBufferSequence & target,
      const const_buffer & source,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer sequence representing the memory regions to which the bytes will be copied.]]

[[source][A non-modifiable buffer representing the memory region 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:overload12 buffer_copy (12 of 30 overloads)]


Copies bytes from a source buffer to a target buffer sequence. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t buffer_copy(
      const MutableBufferSequence & target,
      const const_buffers_1 & source,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer sequence representing the memory regions to which the bytes will be copied.]]

[[source][A non-modifiable buffer representing the memory region 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:overload13 buffer_copy (13 of 30 overloads)]


Copies bytes from a source buffer to a target buffer sequence. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t buffer_copy(
      const MutableBufferSequence & target,
      const mutable_buffer & source,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer sequence representing the memory regions to which the bytes will be copied.]]

[[source][A modifiable buffer representing the memory region from which the bytes will be copied. The contents of the source buffer will not be modified.]]

]


[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:overload14 buffer_copy (14 of 30 overloads)]


Copies bytes from a source buffer to a target buffer sequence. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t buffer_copy(
      const MutableBufferSequence & target,
      const mutable_buffers_1 & source,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer sequence representing the memory regions to which the bytes will be copied.]]

[[source][A modifiable buffer representing the memory region from which the bytes will be copied. The contents of the source buffer will not be modified.]]

]


[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:overload15 buffer_copy (15 of 30 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,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value &&is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);



[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:overload16 buffer_copy (16 of 30 overloads)]


Copies a limited number of bytes from a source buffer to a target buffer. 


  std::size_t buffer_copy(
      const mutable_buffer & target,
      const const_buffer & source,
      std::size_t max_bytes_to_copy);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer representing the memory region to which the bytes will be copied.]]

[[source][A non-modifiable buffer representing the memory region 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]



[section:overload17 buffer_copy (17 of 30 overloads)]


Copies a limited number of bytes from a source buffer to a target buffer. 


  std::size_t buffer_copy(
      const mutable_buffer & target,
      const const_buffers_1 & source,
      std::size_t max_bytes_to_copy);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer representing the memory region to which the bytes will be copied.]]

[[source][A non-modifiable buffer representing the memory region 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]



[section:overload18 buffer_copy (18 of 30 overloads)]


Copies a limited number of bytes from a source buffer to a target buffer. 


  std::size_t buffer_copy(
      const mutable_buffer & target,
      const mutable_buffer & source,
      std::size_t max_bytes_to_copy);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer representing the memory region to which the bytes will be copied.]]

[[source][A modifiable buffer representing the memory region from which the bytes will be copied. The contents of the source buffer will not be modified.]]

[[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]



[section:overload19 buffer_copy (19 of 30 overloads)]


Copies a limited number of bytes from a source buffer to a target buffer. 


  std::size_t buffer_copy(
      const mutable_buffer & target,
      const mutable_buffers_1 & source,
      std::size_t max_bytes_to_copy);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer representing the memory region to which the bytes will be copied.]]

[[source][A modifiable buffer representing the memory region from which the bytes will be copied. The contents of the source buffer will not be modified.]]

[[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]



[section:overload20 buffer_copy (20 of 30 overloads)]


Copies a limited number of bytes from a source buffer sequence to a target buffer. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t buffer_copy(
      const mutable_buffer & target,
      const ConstBufferSequence & source,
      std::size_t max_bytes_to_copy,
      typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer representing the memory region 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]



[section:overload21 buffer_copy (21 of 30 overloads)]


Copies a limited number of bytes from a source buffer to a target buffer. 


  std::size_t buffer_copy(
      const mutable_buffers_1 & target,
      const const_buffer & source,
      std::size_t max_bytes_to_copy);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer representing the memory region to which the bytes will be copied.]]

[[source][A non-modifiable buffer representing the memory region 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]



[section:overload22 buffer_copy (22 of 30 overloads)]


Copies a limited number of bytes from a source buffer to a target buffer. 


  std::size_t buffer_copy(
      const mutable_buffers_1 & target,
      const const_buffers_1 & source,
      std::size_t max_bytes_to_copy);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer representing the memory region to which the bytes will be copied.]]

[[source][A non-modifiable buffer representing the memory region 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]



[section:overload23 buffer_copy (23 of 30 overloads)]


Copies a limited number of bytes from a source buffer to a target buffer. 


  std::size_t buffer_copy(
      const mutable_buffers_1 & target,
      const mutable_buffer & source,
      std::size_t max_bytes_to_copy);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer representing the memory region to which the bytes will be copied.]]

[[source][A modifiable buffer representing the memory region from which the bytes will be copied. The contents of the source buffer will not be modified.]]

[[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]



[section:overload24 buffer_copy (24 of 30 overloads)]


Copies a limited number of bytes from a source buffer to a target buffer. 


  std::size_t buffer_copy(
      const mutable_buffers_1 & target,
      const mutable_buffers_1 & source,
      std::size_t max_bytes_to_copy);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer representing the memory region to which the bytes will be copied.]]

[[source][A modifiable buffer representing the memory region from which the bytes will be copied. The contents of the source buffer will not be modified.]]

[[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]



[section:overload25 buffer_copy (25 of 30 overloads)]


Copies a limited number of bytes from a source buffer sequence to a target buffer. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t buffer_copy(
      const mutable_buffers_1 & target,
      const ConstBufferSequence & source,
      std::size_t max_bytes_to_copy,
      typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer representing the memory region 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]



[section:overload26 buffer_copy (26 of 30 overloads)]


Copies a limited number of bytes from a source buffer to a target buffer sequence. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t buffer_copy(
      const MutableBufferSequence & target,
      const const_buffer & source,
      std::size_t max_bytes_to_copy,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer sequence representing the memory regions to which the bytes will be copied.]]

[[source][A non-modifiable buffer representing the memory region 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]



[section:overload27 buffer_copy (27 of 30 overloads)]


Copies a limited number of bytes from a source buffer to a target buffer sequence. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t buffer_copy(
      const MutableBufferSequence & target,
      const const_buffers_1 & source,
      std::size_t max_bytes_to_copy,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer sequence representing the memory regions to which the bytes will be copied.]]

[[source][A non-modifiable buffer representing the memory region 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]



[section:overload28 buffer_copy (28 of 30 overloads)]


Copies a limited number of bytes from a source buffer to a target buffer sequence. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t buffer_copy(
      const MutableBufferSequence & target,
      const mutable_buffer & source,
      std::size_t max_bytes_to_copy,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer sequence representing the memory regions to which the bytes will be copied.]]

[[source][A modifiable buffer representing the memory region from which the bytes will be copied. The contents of the source buffer will not be modified.]]

[[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]



[section:overload29 buffer_copy (29 of 30 overloads)]


Copies a limited number of bytes from a source buffer to a target buffer sequence. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t buffer_copy(
      const MutableBufferSequence & target,
      const mutable_buffers_1 & source,
      std::size_t max_bytes_to_copy,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);



[heading Parameters]
    

[variablelist
  
[[target][A modifiable buffer sequence representing the memory regions to which the bytes will be copied.]]

[[source][A modifiable buffer representing the memory region from which the bytes will be copied. The contents of the source buffer will not be modified.]]

[[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]



[section:overload30 buffer_copy (30 of 30 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,
      typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value &&is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);



[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_size buffer_size]

[indexterm1 buffer_size] 
The `asio::buffer_size` function determines the total number of bytes in a buffer or buffer sequence. 

      
  std::size_t ``[link asio.reference.buffer_size.overload1 buffer_size]``(
      const mutable_buffer & b);
  ``  [''''&raquo;''' [link asio.reference.buffer_size.overload1 more...]]``

  std::size_t ``[link asio.reference.buffer_size.overload2 buffer_size]``(
      const mutable_buffers_1 & b);
  ``  [''''&raquo;''' [link asio.reference.buffer_size.overload2 more...]]``

  std::size_t ``[link asio.reference.buffer_size.overload3 buffer_size]``(
      const const_buffer & b);
  ``  [''''&raquo;''' [link asio.reference.buffer_size.overload3 more...]]``

  std::size_t ``[link asio.reference.buffer_size.overload4 buffer_size]``(
      const const_buffers_1 & b);
  ``  [''''&raquo;''' [link asio.reference.buffer_size.overload4 more...]]``

  template<
      typename BufferSequence>
  std::size_t ``[link asio.reference.buffer_size.overload5 buffer_size]``(
      const BufferSequence & b,
      typename enable_if< is_const_buffer_sequence< BufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.buffer_size.overload5 more...]]``

[heading Requirements]

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

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


[section:overload1 buffer_size (1 of 5 overloads)]


Get the number of bytes in a modifiable buffer. 


  std::size_t buffer_size(
      const mutable_buffer & b);



[endsect]



[section:overload2 buffer_size (2 of 5 overloads)]


Get the number of bytes in a modifiable buffer. 


  std::size_t buffer_size(
      const mutable_buffers_1 & b);



[endsect]



[section:overload3 buffer_size (3 of 5 overloads)]


Get the number of bytes in a non-modifiable buffer. 


  std::size_t buffer_size(
      const const_buffer & b);



[endsect]



[section:overload4 buffer_size (4 of 5 overloads)]


Get the number of bytes in a non-modifiable buffer. 


  std::size_t buffer_size(
      const const_buffers_1 & b);



[endsect]



[section:overload5 buffer_size (5 of 5 overloads)]


Get the total number of bytes in a buffer sequence. 


  template<
      typename BufferSequence>
  std::size_t buffer_size(
      const BufferSequence & b,
      typename enable_if< is_const_buffer_sequence< BufferSequence >::value >::type *  = 0);


The `BufferSequence` template parameter may meet either of the `ConstBufferSequence` or `MutableBufferSequence` type requirements. 


[endsect]


[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.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]]]
    [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. 

     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_io_service [*get_io_service]]]
    [Get the io_service 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. 

     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. 

     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. 

     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. 

     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]]]
    [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 async_fill..buffered_read_stream] 
Start an asynchronous fill. 


  template<
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_fill(
      ReadHandler && handler);



[endsect]



[section:async_read_some buffered_read_stream::async_read_some]

[indexterm2 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some(
      const MutableBufferSequence & buffers,
      ReadHandler && handler);



[endsect]



[section:async_write_some buffered_read_stream::async_write_some]

[indexterm2 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some(
      const ConstBufferSequence & buffers,
      WriteHandler && handler);



[endsect]


[section:buffered_read_stream buffered_read_stream::buffered_read_stream]

[indexterm2 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code close(
      asio::error_code & ec);



[endsect]


[endsect]


[section:default_buffer_size buffered_read_stream::default_buffer_size]

[indexterm2 default_buffer_size..buffered_read_stream] 
The default buffer size. 


  static const std::size_t default_buffer_size = implementation_defined;



[endsect]


[section:fill buffered_read_stream::fill]

[indexterm2 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_io_service buffered_read_stream::get_io_service]

[indexterm2 get_io_service..buffered_read_stream] 
Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();



[endsect]


[section:in_avail buffered_read_stream::in_avail]

[indexterm2 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 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 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 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 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 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 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 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.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]]]
    [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. 

     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. 

     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_io_service [*get_io_service]]]
    [Get the io_service 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. 

     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. 

     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. 

     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. 

     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 async_fill..buffered_stream] 
Start an asynchronous fill. 


  template<
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_fill(
      ReadHandler && handler);



[endsect]



[section:async_flush buffered_stream::async_flush]

[indexterm2 async_flush..buffered_stream] 
Start an asynchronous flush. 


  template<
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_flush(
      WriteHandler && handler);



[endsect]



[section:async_read_some buffered_stream::async_read_some]

[indexterm2 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some(
      const MutableBufferSequence & buffers,
      ReadHandler && handler);



[endsect]



[section:async_write_some buffered_stream::async_write_some]

[indexterm2 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some(
      const ConstBufferSequence & buffers,
      WriteHandler && handler);



[endsect]


[section:buffered_stream buffered_stream::buffered_stream]

[indexterm2 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 close..buffered_stream] 
Close the stream. 


  void ``[link asio.reference.buffered_stream.close.overload1 close]``();
  ``  [''''&raquo;''' [link asio.reference.buffered_stream.close.overload1 more...]]``

  asio::error_code ``[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. 


  asio::error_code close(
      asio::error_code & ec);



[endsect]


[endsect]

[section:fill buffered_stream::fill]

[indexterm2 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 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_io_service buffered_stream::get_io_service]

[indexterm2 get_io_service..buffered_stream] 
Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();



[endsect]


[section:in_avail buffered_stream::in_avail]

[indexterm2 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 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 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 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 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 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 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 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.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]]]
    [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. 

     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_io_service [*get_io_service]]]
    [Get the io_service 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. 

     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. 

     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. 

     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. 

     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]]]
    [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 async_flush..buffered_write_stream] 
Start an asynchronous flush. 


  template<
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_flush(
      WriteHandler && handler);



[endsect]



[section:async_read_some buffered_write_stream::async_read_some]

[indexterm2 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some(
      const MutableBufferSequence & buffers,
      ReadHandler && handler);



[endsect]



[section:async_write_some buffered_write_stream::async_write_some]

[indexterm2 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some(
      const ConstBufferSequence & buffers,
      WriteHandler && handler);



[endsect]


[section:buffered_write_stream buffered_write_stream::buffered_write_stream]

[indexterm2 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code close(
      asio::error_code & ec);



[endsect]


[endsect]


[section:default_buffer_size buffered_write_stream::default_buffer_size]

[indexterm2 default_buffer_size..buffered_write_stream] 
The default buffer size. 


  static const std::size_t default_buffer_size = implementation_defined;



[endsect]


[section:flush buffered_write_stream::flush]

[indexterm2 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_io_service buffered_write_stream::get_io_service]

[indexterm2 get_io_service..buffered_write_stream] 
Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();



[endsect]


[section:in_avail buffered_write_stream::in_avail]

[indexterm2 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 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 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 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 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 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 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 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 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 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]]]
    [Construct an iterator representing the beginning of the buffers' data. ]
  ]
  
  [
    [[link asio.reference.buffers_iterator.buffers_iterator [*buffers_iterator]]]
    [Default constructor. Creates an iterator in an undefined state. ]
  ]
  
  [
    [[link asio.reference.buffers_iterator.end [*end]]]
    [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). 

     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). 

     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 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 buffers_iterator..buffers_iterator] 
Default constructor. Creates an iterator in an undefined state. 


  buffers_iterator();



[endsect]



[section:difference_type buffers_iterator::difference_type]

[indexterm2 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 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 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 operator *..buffers_iterator] 
Dereference an iterator. 


  reference operator *() const;



[endsect]



[section:operator_not__eq_ buffers_iterator::operator!=]

[indexterm2 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 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 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 operator+=..buffers_iterator] 
Addition operator. 


  buffers_iterator & operator+=(
      std::ptrdiff_t difference);



[endsect]


[section:operator_minus_ buffers_iterator::operator-]

[indexterm2 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 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 operator-=..buffers_iterator] 
Subtraction operator. 


  buffers_iterator & operator-=(
      std::ptrdiff_t difference);



[endsect]



[section:operator_arrow_ buffers_iterator::operator->]

[indexterm2 operator->..buffers_iterator] 
Dereference an iterator. 


  pointer operator->() const;



[endsect]



[section:operator_lt_ buffers_iterator::operator<]

[indexterm2 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 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 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 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 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 operator\[\]..buffers_iterator] 
Access an individual element. 


  reference operator[](
      std::ptrdiff_t difference) const;



[endsect]



[section:pointer buffers_iterator::pointer]

[indexterm2 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 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 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:connect connect]

[indexterm1 connect] 
Establishes a socket connection by trying each endpoint in a sequence. 

      
  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator>
  Iterator ``[link asio.reference.connect.overload1 connect]``(
      basic_socket< Protocol, SocketService > & s,
      Iterator begin);
  ``  [''''&raquo;''' [link asio.reference.connect.overload1 more...]]``

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator>
  Iterator ``[link asio.reference.connect.overload2 connect]``(
      basic_socket< Protocol, SocketService > & s,
      Iterator begin,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.connect.overload2 more...]]``

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator>
  Iterator ``[link asio.reference.connect.overload3 connect]``(
      basic_socket< Protocol, SocketService > & s,
      Iterator begin,
      Iterator end);
  ``  [''''&raquo;''' [link asio.reference.connect.overload3 more...]]``

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator>
  Iterator ``[link asio.reference.connect.overload4 connect]``(
      basic_socket< Protocol, SocketService > & s,
      Iterator begin,
      Iterator end,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.connect.overload4 more...]]``

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator,
      typename ConnectCondition>
  Iterator ``[link asio.reference.connect.overload5 connect]``(
      basic_socket< Protocol, SocketService > & s,
      Iterator begin,
      ConnectCondition connect_condition);
  ``  [''''&raquo;''' [link asio.reference.connect.overload5 more...]]``

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator,
      typename ConnectCondition>
  Iterator ``[link asio.reference.connect.overload6 connect]``(
      basic_socket< Protocol, SocketService > & s,
      Iterator begin,
      ConnectCondition connect_condition,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.connect.overload6 more...]]``

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator,
      typename ConnectCondition>
  Iterator ``[link asio.reference.connect.overload7 connect]``(
      basic_socket< Protocol, SocketService > & s,
      Iterator begin,
      Iterator end,
      ConnectCondition connect_condition);
  ``  [''''&raquo;''' [link asio.reference.connect.overload7 more...]]``

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator,
      typename ConnectCondition>
  Iterator ``[link asio.reference.connect.overload8 connect]``(
      basic_socket< Protocol, SocketService > & s,
      Iterator begin,
      Iterator end,
      ConnectCondition connect_condition,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.connect.overload8 more...]]``

[heading Requirements]

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

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


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


Establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator>
  Iterator connect(
      basic_socket< Protocol, SocketService > & s,
      Iterator begin);


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`.


[heading Example]
  


   tcp::resolver r(io_service);
   tcp::resolver::query q("host", "service");
   tcp::socket s(io_service);
   asio::connect(s, r.resolve(q)); 







[endsect]



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


Establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator>
  Iterator connect(
      basic_socket< Protocol, SocketService > & s,
      Iterator begin,
      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.]]

[[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`.


[heading Example]
  


   tcp::resolver r(io_service);
   tcp::resolver::query q("host", "service");
   tcp::socket s(io_service);
   asio::error_code ec;
   asio::connect(s, r.resolve(q), ec);
   if (ec)
   {
     // An error occurred.
   } 







[endsect]



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


Establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator>
  Iterator connect(
      basic_socket< Protocol, SocketService > & 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]
      
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 Example]
  


   tcp::resolver r(io_service);
   tcp::resolver::query q("host", "service");
   tcp::resolver::iterator i = r.resolve(q), end;
   tcp::socket s(io_service);
   asio::connect(s, i, end); 







[endsect]



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


Establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator>
  Iterator connect(
      basic_socket< Protocol, SocketService > & 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(io_service);
   tcp::resolver::query q("host", "service");
   tcp::resolver::iterator i = r.resolve(q), end;
   tcp::socket s(io_service);
   asio::error_code ec;
   asio::connect(s, i, end, ec);
   if (ec)
   {
     // An error occurred.
   } 







[endsect]



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


Establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator,
      typename ConnectCondition>
  Iterator connect(
      basic_socket< Protocol, SocketService > & s,
      Iterator begin,
      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.]]

[[connect_condition][A function object that is called prior to each connection attempt. The signature of the function object must be: 
``
   Iterator connect_condition(
       const asio::error_code& ec,
       Iterator 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 an iterator pointing to the next endpoint to be tried. The function object should return the next iterator, but is permitted to return a different iterator so that endpoints may be skipped. The implementation guarantees that the function object will never be called with the end iterator.]]

]


[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`.


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

   struct my_connect_condition
   {
     template <typename Iterator>
     Iterator operator()(
         const asio::error_code& ec,
         Iterator next)
     {
       if (ec) std::cout << "Error: " << ec.message() << std::endl;
       std::cout << "Trying: " << next->endpoint() << std::endl;
       return next;
     }
   }; 


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

   tcp::resolver r(io_service);
   tcp::resolver::query q("host", "service");
   tcp::socket s(io_service);
   tcp::resolver::iterator i = asio::connect(
       s, r.resolve(q), my_connect_condition());
   std::cout << "Connected to: " << i->endpoint() << std::endl; 







[endsect]



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


Establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator,
      typename ConnectCondition>
  Iterator connect(
      basic_socket< Protocol, SocketService > & s,
      Iterator begin,
      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.]]

[[connect_condition][A function object that is called prior to each connection attempt. The signature of the function object must be: 
``
   Iterator connect_condition(
       const asio::error_code& ec,
       Iterator 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 an iterator pointing to the next endpoint to be tried. The function object should return the next iterator, but is permitted to return a different iterator so that endpoints may be skipped. The implementation guarantees that the function object will never be called with the end iterator.]]

[[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`.


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

   struct my_connect_condition
   {
     template <typename Iterator>
     Iterator operator()(
         const asio::error_code& ec,
         Iterator next)
     {
       if (ec) std::cout << "Error: " << ec.message() << std::endl;
       std::cout << "Trying: " << next->endpoint() << std::endl;
       return next;
     }
   }; 


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

   tcp::resolver r(io_service);
   tcp::resolver::query q("host", "service");
   tcp::socket s(io_service);
   asio::error_code ec;
   tcp::resolver::iterator i = asio::connect(
       s, r.resolve(q), my_connect_condition(), ec);
   if (ec)
   {
     // An error occurred.
   }
   else
   {
     std::cout << "Connected to: " << i->endpoint() << std::endl;
   } 







[endsect]



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


Establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator,
      typename ConnectCondition>
  Iterator connect(
      basic_socket< Protocol, SocketService > & 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: 
``
   Iterator connect_condition(
       const asio::error_code& ec,
       Iterator 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 an iterator pointing to the next endpoint to be tried. The function object should return the next iterator, but is permitted to return a different iterator so that endpoints may be skipped. The implementation guarantees that the function object will never be called with the end iterator.]]

]


[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 Example]
  
The following connect condition function object can be used to output information about the individual connection attempts: 

   struct my_connect_condition
   {
     template <typename Iterator>
     Iterator operator()(
         const asio::error_code& ec,
         Iterator next)
     {
       if (ec) std::cout << "Error: " << ec.message() << std::endl;
       std::cout << "Trying: " << next->endpoint() << std::endl;
       return next;
     }
   }; 


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

   tcp::resolver r(io_service);
   tcp::resolver::query q("host", "service");
   tcp::resolver::iterator i = r.resolve(q), end;
   tcp::socket s(io_service);
   i = asio::connect(s, i, end, my_connect_condition());
   std::cout << "Connected to: " << i->endpoint() << std::endl; 







[endsect]



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


Establishes a socket connection by trying each endpoint in a sequence. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename Iterator,
      typename ConnectCondition>
  Iterator connect(
      basic_socket< Protocol, SocketService > & 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: 
``
   Iterator connect_condition(
       const asio::error_code& ec,
       Iterator 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 an iterator pointing to the next endpoint to be tried. The function object should return the next iterator, but is permitted to return a different iterator so that endpoints may be skipped. The implementation guarantees that the function object will never be called with the end iterator.]]

[[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
   {
     template <typename Iterator>
     Iterator operator()(
         const asio::error_code& ec,
         Iterator next)
     {
       if (ec) std::cout << "Error: " << ec.message() << std::endl;
       std::cout << "Trying: " << next->endpoint() << std::endl;
       return next;
     }
   }; 


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

   tcp::resolver r(io_service);
   tcp::resolver::query q("host", "service");
   tcp::resolver::iterator i = r.resolve(q), end;
   tcp::socket s(io_service);
   asio::error_code ec;
   i = asio::connect(s, i, end, my_connect_condition(), ec);
   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]]]
    [Construct an empty buffer. 

     Construct a buffer to represent a given memory range. 

     Construct a non-modifiable buffer from a modifiable one. ]
  ]
  
]

[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 [link asio.reference.buffer_size `buffer_size`]  and [link asio.reference.buffer_cast `buffer_cast`]  functions:



   asio::const_buffer b1 = ...;
   std::size_t s1 = asio::buffer_size(b1);
   const unsigned char* p1 = asio::buffer_cast<const unsigned char*>(b1);




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:const_buffer const_buffer::const_buffer]

[indexterm2 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:operator_plus_ const_buffer::operator+]

[indexterm2 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 start);
  ``  [''''&raquo;''' [link asio.reference.const_buffer.operator_plus_.overload1 more...]]``

  const_buffer ``[link asio.reference.const_buffer.operator_plus_.overload2 operator+]``(
      std::size_t start,
      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 start);



[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 start,
      const const_buffer & b);



[endsect]


[endsect]


[endsect]

[section:const_buffers_1 const_buffers_1]


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]]]
    [Construct to represent a given memory range. 

     Construct to represent a single non-modifiable buffer. ]
  ]
  
  [
    [[link asio.reference.const_buffers_1.end [*end]]]
    [Get a random-access iterator for one past the last element. ]
  ]
  
]

[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 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 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 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:end const_buffers_1::end]

[indexterm2 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 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 start);
  ``  [''''&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 start,
      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 start);



[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 start,
      const const_buffer & b);



[endsect]


[endsect]


[section:value_type const_buffers_1::value_type]

[indexterm2 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]]]
    [Construct an empty buffer. 

     Construct a buffer to represent a given memory range. 

     Construct a non-modifiable buffer from a modifiable one. ]
  ]
  
]

[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 [link asio.reference.buffer_size `buffer_size`]  and [link asio.reference.buffer_cast `buffer_cast`]  functions:



   asio::const_buffer b1 = ...;
   std::size_t s1 = asio::buffer_size(b1);
   const unsigned char* p1 = asio::buffer_cast<const unsigned char*>(b1);




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]


[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]]]
    [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(io_service_));
       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 `io_service::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 coroutine..coroutine] 
Constructs a coroutine in its initial state. 


  coroutine();



[endsect]



[section:is_child coroutine::is_child]

[indexterm2 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 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 is_parent..coroutine] 
Returns true if the coroutine is the parent of a fork. 


  bool is_parent() const;



[endsect]



[endsect]

[section:datagram_socket_service datagram_socket_service]


Default service implementation for a datagram socket. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``>
  class datagram_socket_service :
    public io_service::service


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

  [

    [[link asio.reference.datagram_socket_service.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.datagram_socket_service.implementation_type [*implementation_type]]]
    [The type of a datagram socket. ]
  
  ]

  [

    [[link asio.reference.datagram_socket_service.native_handle_type [*native_handle_type]]]
    [The native socket type. ]
  
  ]

  [

    [[link asio.reference.datagram_socket_service.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

]

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

  [
    [[link asio.reference.datagram_socket_service.assign [*assign]]]
    [Assign an existing native socket to a datagram socket. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.async_receive [*async_receive]]]
    [Start an asynchronous receive. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.async_receive_from [*async_receive_from]]]
    [Start an asynchronous receive that will get the endpoint of the sender. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.async_send [*async_send]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.async_send_to [*async_send_to]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.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.datagram_socket_service.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.bind [*bind]]]
    []
  ]
  
  [
    [[link asio.reference.datagram_socket_service.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.close [*close]]]
    [Close a datagram socket implementation. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.connect [*connect]]]
    [Connect the datagram socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.construct [*construct]]]
    [Construct a new datagram socket implementation. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.converting_move_construct [*converting_move_construct]]]
    [Move-construct a new datagram socket implementation from another protocol type. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.datagram_socket_service [*datagram_socket_service]]]
    [Construct a new datagram socket service for the specified io_service. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.destroy [*destroy]]]
    [Destroy a datagram socket implementation. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.get_io_service [*get_io_service]]]
    [Get the io_service object that owns the service. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.get_option [*get_option]]]
    [Get a socket option. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.local_endpoint [*local_endpoint]]]
    [Get the local endpoint. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.move_assign [*move_assign]]]
    [Move-assign from another datagram socket implementation. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.move_construct [*move_construct]]]
    [Move-construct a new datagram socket implementation. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.native_handle [*native_handle]]]
    [Get the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 

     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 

     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.open [*open]]]
    []
  ]
  
  [
    [[link asio.reference.datagram_socket_service.receive [*receive]]]
    [Receive some data from the peer. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.receive_from [*receive_from]]]
    [Receive a datagram with the endpoint of the sender. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.send [*send]]]
    [Send the given data to the peer. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.send_to [*send_to]]]
    [Send a datagram to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.set_option [*set_option]]]
    [Set a socket option. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.datagram_socket_service.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
]

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

  [
    [[link asio.reference.datagram_socket_service.id [*id]]]
    [The unique service identifier. ]
  ]

]

[heading Requirements]

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

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


[section:assign datagram_socket_service::assign]

[indexterm2 assign..datagram_socket_service] 
Assign an existing native socket to a datagram socket. 


  asio::error_code assign(
      implementation_type & impl,
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      asio::error_code & ec);



[endsect]



[section:async_connect datagram_socket_service::async_connect]

[indexterm2 async_connect..datagram_socket_service] 
Start an asynchronous connect. 


  template<
      typename ``[link asio.reference.ConnectHandler ConnectHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
      implementation_type & impl,
      const endpoint_type & peer_endpoint,
      ConnectHandler && handler);



[endsect]



[section:async_receive datagram_socket_service::async_receive]

[indexterm2 async_receive..datagram_socket_service] 
Start an asynchronous receive. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive(
      implementation_type & impl,
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      ReadHandler && handler);



[endsect]



[section:async_receive_from datagram_socket_service::async_receive_from]

[indexterm2 async_receive_from..datagram_socket_service] 
Start an asynchronous receive that will get the endpoint of the sender. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive_from(
      implementation_type & impl,
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      socket_base::message_flags flags,
      ReadHandler && handler);



[endsect]



[section:async_send datagram_socket_service::async_send]

[indexterm2 async_send..datagram_socket_service] 
Start an asynchronous send. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send(
      implementation_type & impl,
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      WriteHandler && handler);



[endsect]



[section:async_send_to datagram_socket_service::async_send_to]

[indexterm2 async_send_to..datagram_socket_service] 
Start an asynchronous send. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send_to(
      implementation_type & impl,
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      socket_base::message_flags flags,
      WriteHandler && handler);



[endsect]



[section:async_wait datagram_socket_service::async_wait]

[indexterm2 async_wait..datagram_socket_service] 
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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      implementation_type & impl,
      socket_base::wait_type w,
      WaitHandler && handler);



[endsect]



[section:at_mark datagram_socket_service::at_mark]

[indexterm2 at_mark..datagram_socket_service] 
Determine whether the socket is at the out-of-band data mark. 


  bool at_mark(
      const implementation_type & impl,
      asio::error_code & ec) const;



[endsect]



[section:available datagram_socket_service::available]

[indexterm2 available..datagram_socket_service] 
Determine the number of bytes available for reading. 


  std::size_t available(
      const implementation_type & impl,
      asio::error_code & ec) const;



[endsect]



[section:bind datagram_socket_service::bind]

[indexterm2 bind..datagram_socket_service] 

  asio::error_code bind(
      implementation_type & impl,
      const endpoint_type & endpoint,
      asio::error_code & ec);



[endsect]



[section:cancel datagram_socket_service::cancel]

[indexterm2 cancel..datagram_socket_service] 
Cancel all asynchronous operations associated with the socket. 


  asio::error_code cancel(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:close datagram_socket_service::close]

[indexterm2 close..datagram_socket_service] 
Close a datagram socket implementation. 


  asio::error_code close(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:connect datagram_socket_service::connect]

[indexterm2 connect..datagram_socket_service] 
Connect the datagram socket to the specified endpoint. 


  asio::error_code connect(
      implementation_type & impl,
      const endpoint_type & peer_endpoint,
      asio::error_code & ec);



[endsect]



[section:construct datagram_socket_service::construct]

[indexterm2 construct..datagram_socket_service] 
Construct a new datagram socket implementation. 


  void construct(
      implementation_type & impl);



[endsect]



[section:converting_move_construct datagram_socket_service::converting_move_construct]

[indexterm2 converting_move_construct..datagram_socket_service] 
Move-construct a new datagram socket implementation from another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``>
  void converting_move_construct(
      implementation_type & impl,
      typename datagram_socket_service< Protocol1 >::implementation_type & other_impl,
      typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);



[endsect]



[section:datagram_socket_service datagram_socket_service::datagram_socket_service]

[indexterm2 datagram_socket_service..datagram_socket_service] 
Construct a new datagram socket service for the specified [link asio.reference.io_service `io_service`]. 


  datagram_socket_service(
      asio::io_service & io_service);



[endsect]



[section:destroy datagram_socket_service::destroy]

[indexterm2 destroy..datagram_socket_service] 
Destroy a datagram socket implementation. 


  void destroy(
      implementation_type & impl);



[endsect]



[section:endpoint_type datagram_socket_service::endpoint_type]

[indexterm2 endpoint_type..datagram_socket_service] 
The endpoint type. 


  typedef Protocol::endpoint endpoint_type;



[heading Requirements]

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

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


[endsect]



[section:get_io_service datagram_socket_service::get_io_service]


['Inherited from io_service.]

[indexterm2 get_io_service..datagram_socket_service] 
Get the [link asio.reference.io_service `io_service`] object that owns the service. 


  asio::io_service & get_io_service();



[endsect]



[section:get_option datagram_socket_service::get_option]

[indexterm2 get_option..datagram_socket_service] 
Get a socket option. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  asio::error_code get_option(
      const implementation_type & impl,
      GettableSocketOption & option,
      asio::error_code & ec) const;



[endsect]



[section:id datagram_socket_service::id]

[indexterm2 id..datagram_socket_service] 
The unique service identifier. 


  static asio::io_service::id id;



[endsect]



[section:implementation_type datagram_socket_service::implementation_type]

[indexterm2 implementation_type..datagram_socket_service] 
The type of a datagram socket. 


  typedef implementation_defined implementation_type;



[heading Requirements]

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

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


[endsect]



[section:io_control datagram_socket_service::io_control]

[indexterm2 io_control..datagram_socket_service] 
Perform an IO control command on the socket. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  asio::error_code io_control(
      implementation_type & impl,
      IoControlCommand & command,
      asio::error_code & ec);



[endsect]



[section:is_open datagram_socket_service::is_open]

[indexterm2 is_open..datagram_socket_service] 
Determine whether the socket is open. 


  bool is_open(
      const implementation_type & impl) const;



[endsect]



[section:local_endpoint datagram_socket_service::local_endpoint]

[indexterm2 local_endpoint..datagram_socket_service] 
Get the local endpoint. 


  endpoint_type local_endpoint(
      const implementation_type & impl,
      asio::error_code & ec) const;



[endsect]



[section:move_assign datagram_socket_service::move_assign]

[indexterm2 move_assign..datagram_socket_service] 
Move-assign from another datagram socket implementation. 


  void move_assign(
      implementation_type & impl,
      datagram_socket_service & other_service,
      implementation_type & other_impl);



[endsect]



[section:move_construct datagram_socket_service::move_construct]

[indexterm2 move_construct..datagram_socket_service] 
Move-construct a new datagram socket implementation. 


  void move_construct(
      implementation_type & impl,
      implementation_type & other_impl);



[endsect]



[section:native_handle datagram_socket_service::native_handle]

[indexterm2 native_handle..datagram_socket_service] 
Get the native socket implementation. 


  native_handle_type native_handle(
      implementation_type & impl);



[endsect]



[section:native_handle_type datagram_socket_service::native_handle_type]

[indexterm2 native_handle_type..datagram_socket_service] 
The native socket type. 


  typedef implementation_defined native_handle_type;



[heading Requirements]

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

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


[endsect]


[section:native_non_blocking datagram_socket_service::native_non_blocking]

[indexterm2 native_non_blocking..datagram_socket_service] 
Gets the non-blocking mode of the native socket implementation. 


  bool ``[link asio.reference.datagram_socket_service.native_non_blocking.overload1 native_non_blocking]``(
      const implementation_type & impl) const;
  ``  [''''&raquo;''' [link asio.reference.datagram_socket_service.native_non_blocking.overload1 more...]]``


Sets the non-blocking mode of the native socket implementation. 


  asio::error_code ``[link asio.reference.datagram_socket_service.native_non_blocking.overload2 native_non_blocking]``(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.datagram_socket_service.native_non_blocking.overload2 more...]]``


[section:overload1 datagram_socket_service::native_non_blocking (1 of 2 overloads)]


Gets the non-blocking mode of the native socket implementation. 


  bool native_non_blocking(
      const implementation_type & impl) const;



[endsect]



[section:overload2 datagram_socket_service::native_non_blocking (2 of 2 overloads)]


Sets the non-blocking mode of the native socket implementation. 


  asio::error_code native_non_blocking(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);



[endsect]


[endsect]

[section:non_blocking datagram_socket_service::non_blocking]

[indexterm2 non_blocking..datagram_socket_service] 
Gets the non-blocking mode of the socket. 


  bool ``[link asio.reference.datagram_socket_service.non_blocking.overload1 non_blocking]``(
      const implementation_type & impl) const;
  ``  [''''&raquo;''' [link asio.reference.datagram_socket_service.non_blocking.overload1 more...]]``


Sets the non-blocking mode of the socket. 


  asio::error_code ``[link asio.reference.datagram_socket_service.non_blocking.overload2 non_blocking]``(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.datagram_socket_service.non_blocking.overload2 more...]]``


[section:overload1 datagram_socket_service::non_blocking (1 of 2 overloads)]


Gets the non-blocking mode of the socket. 


  bool non_blocking(
      const implementation_type & impl) const;



[endsect]



[section:overload2 datagram_socket_service::non_blocking (2 of 2 overloads)]


Sets the non-blocking mode of the socket. 


  asio::error_code non_blocking(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);



[endsect]


[endsect]


[section:open datagram_socket_service::open]

[indexterm2 open..datagram_socket_service] 

  asio::error_code open(
      implementation_type & impl,
      const protocol_type & protocol,
      asio::error_code & ec);



[endsect]



[section:protocol_type datagram_socket_service::protocol_type]

[indexterm2 protocol_type..datagram_socket_service] 
The protocol type. 


  typedef Protocol protocol_type;



[heading Requirements]

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

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


[endsect]



[section:receive datagram_socket_service::receive]

[indexterm2 receive..datagram_socket_service] 
Receive some data from the peer. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive(
      implementation_type & impl,
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      asio::error_code & ec);



[endsect]



[section:receive_from datagram_socket_service::receive_from]

[indexterm2 receive_from..datagram_socket_service] 
Receive a datagram with the endpoint of the sender. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive_from(
      implementation_type & impl,
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      socket_base::message_flags flags,
      asio::error_code & ec);



[endsect]



[section:remote_endpoint datagram_socket_service::remote_endpoint]

[indexterm2 remote_endpoint..datagram_socket_service] 
Get the remote endpoint. 


  endpoint_type remote_endpoint(
      const implementation_type & impl,
      asio::error_code & ec) const;



[endsect]



[section:send datagram_socket_service::send]

[indexterm2 send..datagram_socket_service] 
Send the given data to the peer. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send(
      implementation_type & impl,
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      asio::error_code & ec);



[endsect]



[section:send_to datagram_socket_service::send_to]

[indexterm2 send_to..datagram_socket_service] 
Send a datagram to the specified endpoint. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send_to(
      implementation_type & impl,
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      socket_base::message_flags flags,
      asio::error_code & ec);



[endsect]



[section:set_option datagram_socket_service::set_option]

[indexterm2 set_option..datagram_socket_service] 
Set a socket option. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  asio::error_code set_option(
      implementation_type & impl,
      const SettableSocketOption & option,
      asio::error_code & ec);



[endsect]



[section:shutdown datagram_socket_service::shutdown]

[indexterm2 shutdown..datagram_socket_service] 
Disable sends or receives on the socket. 


  asio::error_code shutdown(
      implementation_type & impl,
      socket_base::shutdown_type what,
      asio::error_code & ec);



[endsect]



[section:wait datagram_socket_service::wait]

[indexterm2 wait..datagram_socket_service] 
Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  asio::error_code wait(
      implementation_type & impl,
      socket_base::wait_type w,
      asio::error_code & ec);



[endsect]



[endsect]


[section:deadline_timer deadline_timer]

[indexterm1 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.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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.basic_deadline_timer.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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 to set a particular expiry time as an absolute time. 

     Constructor to set a particular expiry time relative to now. ]
  ]
  
  [
    [[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. 

     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. 

     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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.wait [*wait]]]
    [Perform a blocking wait on the timer. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_deadline_timer.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_deadline_timer.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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(io_service);

   // 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(io_service,
       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:deadline_timer_service deadline_timer_service]


Default service implementation for a timer. 


  template<
      typename TimeType,
      typename ``[link asio.reference.TimeTraits TimeTraits]`` = asio::time_traits<TimeType>>
  class deadline_timer_service :
    public io_service::service


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

  [

    [[link asio.reference.deadline_timer_service.duration_type [*duration_type]]]
    [The duration type. ]
  
  ]

  [

    [[link asio.reference.deadline_timer_service.implementation_type [*implementation_type]]]
    [The implementation type of the deadline timer. ]
  
  ]

  [

    [[link asio.reference.deadline_timer_service.time_type [*time_type]]]
    [The time type. ]
  
  ]

  [

    [[link asio.reference.deadline_timer_service.traits_type [*traits_type]]]
    [The time traits type. ]
  
  ]

]

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

  [
    [[link asio.reference.deadline_timer_service.async_wait [*async_wait]]]
    []
  ]
  
  [
    [[link asio.reference.deadline_timer_service.cancel [*cancel]]]
    [Cancel any asynchronous wait operations associated with the timer. ]
  ]
  
  [
    [[link asio.reference.deadline_timer_service.cancel_one [*cancel_one]]]
    [Cancels one asynchronous wait operation associated with the timer. ]
  ]
  
  [
    [[link asio.reference.deadline_timer_service.construct [*construct]]]
    [Construct a new timer implementation. ]
  ]
  
  [
    [[link asio.reference.deadline_timer_service.deadline_timer_service [*deadline_timer_service]]]
    [Construct a new timer service for the specified io_service. ]
  ]
  
  [
    [[link asio.reference.deadline_timer_service.destroy [*destroy]]]
    [Destroy a timer implementation. ]
  ]
  
  [
    [[link asio.reference.deadline_timer_service.expires_at [*expires_at]]]
    [Get the expiry time for the timer as an absolute time. 

     Set the expiry time for the timer as an absolute time. ]
  ]
  
  [
    [[link asio.reference.deadline_timer_service.expires_from_now [*expires_from_now]]]
    [Get the expiry time for the timer relative to now. 

     Set the expiry time for the timer relative to now. ]
  ]
  
  [
    [[link asio.reference.deadline_timer_service.get_io_service [*get_io_service]]]
    [Get the io_service object that owns the service. ]
  ]
  
  [
    [[link asio.reference.deadline_timer_service.wait [*wait]]]
    []
  ]
  
]

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

  [
    [[link asio.reference.deadline_timer_service.id [*id]]]
    [The unique service identifier. ]
  ]

]

[heading Requirements]

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

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


[section:async_wait deadline_timer_service::async_wait]

[indexterm2 async_wait..deadline_timer_service] 

  template<
      typename ``[link asio.reference.WaitHandler WaitHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      implementation_type & impl,
      WaitHandler && handler);



[endsect]



[section:cancel deadline_timer_service::cancel]

[indexterm2 cancel..deadline_timer_service] 
Cancel any asynchronous wait operations associated with the timer. 


  std::size_t cancel(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:cancel_one deadline_timer_service::cancel_one]

[indexterm2 cancel_one..deadline_timer_service] 
Cancels one asynchronous wait operation associated with the timer. 


  std::size_t cancel_one(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:construct deadline_timer_service::construct]

[indexterm2 construct..deadline_timer_service] 
Construct a new timer implementation. 


  void construct(
      implementation_type & impl);



[endsect]



[section:deadline_timer_service deadline_timer_service::deadline_timer_service]

[indexterm2 deadline_timer_service..deadline_timer_service] 
Construct a new timer service for the specified [link asio.reference.io_service `io_service`]. 


  deadline_timer_service(
      asio::io_service & io_service);



[endsect]



[section:destroy deadline_timer_service::destroy]

[indexterm2 destroy..deadline_timer_service] 
Destroy a timer implementation. 


  void destroy(
      implementation_type & impl);



[endsect]



[section:duration_type deadline_timer_service::duration_type]

[indexterm2 duration_type..deadline_timer_service] 
The duration type. 


  typedef traits_type::duration_type duration_type;



[heading Requirements]

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

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


[endsect]


[section:expires_at deadline_timer_service::expires_at]

[indexterm2 expires_at..deadline_timer_service] 
Get the expiry time for the timer as an absolute time. 


  time_type ``[link asio.reference.deadline_timer_service.expires_at.overload1 expires_at]``(
      const implementation_type & impl) const;
  ``  [''''&raquo;''' [link asio.reference.deadline_timer_service.expires_at.overload1 more...]]``


Set the expiry time for the timer as an absolute time. 


  std::size_t ``[link asio.reference.deadline_timer_service.expires_at.overload2 expires_at]``(
      implementation_type & impl,
      const time_type & expiry_time,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.deadline_timer_service.expires_at.overload2 more...]]``


[section:overload1 deadline_timer_service::expires_at (1 of 2 overloads)]


Get the expiry time for the timer as an absolute time. 


  time_type expires_at(
      const implementation_type & impl) const;



[endsect]



[section:overload2 deadline_timer_service::expires_at (2 of 2 overloads)]


Set the expiry time for the timer as an absolute time. 


  std::size_t expires_at(
      implementation_type & impl,
      const time_type & expiry_time,
      asio::error_code & ec);



[endsect]


[endsect]

[section:expires_from_now deadline_timer_service::expires_from_now]

[indexterm2 expires_from_now..deadline_timer_service] 
Get the expiry time for the timer relative to now. 


  duration_type ``[link asio.reference.deadline_timer_service.expires_from_now.overload1 expires_from_now]``(
      const implementation_type & impl) const;
  ``  [''''&raquo;''' [link asio.reference.deadline_timer_service.expires_from_now.overload1 more...]]``


Set the expiry time for the timer relative to now. 


  std::size_t ``[link asio.reference.deadline_timer_service.expires_from_now.overload2 expires_from_now]``(
      implementation_type & impl,
      const duration_type & expiry_time,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.deadline_timer_service.expires_from_now.overload2 more...]]``


[section:overload1 deadline_timer_service::expires_from_now (1 of 2 overloads)]


Get the expiry time for the timer relative to now. 


  duration_type expires_from_now(
      const implementation_type & impl) const;



[endsect]



[section:overload2 deadline_timer_service::expires_from_now (2 of 2 overloads)]


Set the expiry time for the timer relative to now. 


  std::size_t expires_from_now(
      implementation_type & impl,
      const duration_type & expiry_time,
      asio::error_code & ec);



[endsect]


[endsect]


[section:get_io_service deadline_timer_service::get_io_service]


['Inherited from io_service.]

[indexterm2 get_io_service..deadline_timer_service] 
Get the [link asio.reference.io_service `io_service`] object that owns the service. 


  asio::io_service & get_io_service();



[endsect]



[section:id deadline_timer_service::id]

[indexterm2 id..deadline_timer_service] 
The unique service identifier. 


  static asio::io_service::id id;



[endsect]



[section:implementation_type deadline_timer_service::implementation_type]

[indexterm2 implementation_type..deadline_timer_service] 
The implementation type of the deadline timer. 


  typedef implementation_defined implementation_type;



[heading Requirements]

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

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


[endsect]



[section:time_type deadline_timer_service::time_type]

[indexterm2 time_type..deadline_timer_service] 
The time type. 


  typedef traits_type::time_type time_type;



[heading Requirements]

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

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


[endsect]



[section:traits_type deadline_timer_service::traits_type]

[indexterm2 traits_type..deadline_timer_service] 
The time traits type. 


  typedef TimeTraits traits_type;



[heading Requirements]

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

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


[endsect]



[section:wait deadline_timer_service::wait]

[indexterm2 wait..deadline_timer_service] 

  void wait(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[endsect]

[section:defer defer]

[indexterm1 defer] 
Submits a completion token or function object for execution. 

    
  template<
      typename CompletionToken>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.defer.overload1 defer]``(
      CompletionToken && token);
  ``  [''''&raquo;''' [link asio.reference.defer.overload1 more...]]``

  template<
      typename ``[link asio.reference.Executor Executor]``,
      typename CompletionToken>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.defer.overload2 defer]``(
      const Executor & ex,
      CompletionToken && token,
      typename enable_if< is_executor< Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.defer.overload2 more...]]``

  template<
      typename ExecutionContext,
      typename CompletionToken>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.defer.overload3 defer]``(
      ExecutionContext & ctx,
      CompletionToken && token,
      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.return_type_of_an_initiating_function ['void-or-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()`.

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.Executor Executor]``,
      typename CompletionToken>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` defer(
      const Executor & ex,
      CompletionToken && token,
      typename enable_if< 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()`.

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.return_type_of_an_initiating_function ['void-or-deduced]]`` defer(
      ExecutionContext & ctx,
      CompletionToken && token,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);



[heading Return Value]
      
`defer(ctx.get_executor(), forward<CompletionToken>(token))`. 




[endsect]


[endsect]

[section:dispatch dispatch]

[indexterm1 dispatch] 
Submits a completion token or function object for execution. 

    
  template<
      typename CompletionToken>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.dispatch.overload1 dispatch]``(
      CompletionToken && token);
  ``  [''''&raquo;''' [link asio.reference.dispatch.overload1 more...]]``

  template<
      typename ``[link asio.reference.Executor Executor]``,
      typename CompletionToken>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.dispatch.overload2 dispatch]``(
      const Executor & ex,
      CompletionToken && token,
      typename enable_if< is_executor< Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.dispatch.overload2 more...]]``

  template<
      typename ExecutionContext,
      typename CompletionToken>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.dispatch.overload3 dispatch]``(
      ExecutionContext & ctx,
      CompletionToken && token,
      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.return_type_of_an_initiating_function ['void-or-deduced]]`` dispatch(
      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 `dispatch()`.

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.Executor Executor]``,
      typename CompletionToken>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` dispatch(
      const Executor & ex,
      CompletionToken && token,
      typename enable_if< 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 `dispatch()`.

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.return_type_of_an_initiating_function ['void-or-deduced]]`` dispatch(
      ExecutionContext & ctx,
      CompletionToken && token,
      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 dynamic_buffer] 
The `asio::dynamic_buffer` function is used to create a dynamically resized buffer from a `std::basic_string` or `std::vector`. 

      
  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...]]``

  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 DynamicBufferSequence 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 the input sequence as a list of buffers. ]
  
  ]

  [

    [[link asio.reference.dynamic_string_buffer.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.dynamic_string_buffer.capacity [*capacity]]]
    [Get the current capacity of the dynamic buffer. ]
  ]
  
  [
    [[link asio.reference.dynamic_string_buffer.commit [*commit]]]
    [Move bytes from the output sequence to the input sequence. ]
  ]
  
  [
    [[link asio.reference.dynamic_string_buffer.consume [*consume]]]
    [Remove characters from the input sequence. ]
  ]
  
  [
    [[link asio.reference.dynamic_string_buffer.data [*data]]]
    [Get a list of buffers that represents the input sequence. ]
  ]
  
  [
    [[link asio.reference.dynamic_string_buffer.dynamic_string_buffer [*dynamic_string_buffer]]]
    [Construct a dynamic buffer from a string. 

     Move construct a dynamic buffer. ]
  ]
  
  [
    [[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]]]
    [Get a list of buffers that represents the output sequence, with the given size. ]
  ]
  
  [
    [[link asio.reference.dynamic_string_buffer.size [*size]]]
    [Get the size of the input sequence. ]
  ]
  
]

Requires that `sizeof(Elem) == 1`. 

[heading Requirements]

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

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


[section:capacity dynamic_string_buffer::capacity]

[indexterm2 capacity..dynamic_string_buffer] 
Get the current capacity of the dynamic buffer. 


  std::size_t capacity() const;



[heading Return Value]
      
The current total capacity of the buffer, i.e. for both the input sequence and output sequence. 




[endsect]



[section:commit dynamic_string_buffer::commit]

[indexterm2 commit..dynamic_string_buffer] 
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 const_buffers_type..dynamic_string_buffer] 
The type used to represent the input sequence as a list of buffers. 


  typedef const_buffers_1 const_buffers_type;


[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]]]
    [Construct to represent a given memory range. 

     Construct to represent a single non-modifiable buffer. ]
  ]
  
  [
    [[link asio.reference.const_buffers_1.end [*end]]]
    [Get a random-access iterator for one past the last element. ]
  ]
  
]

[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]


[endsect]



[section:consume dynamic_string_buffer::consume]

[indexterm2 consume..dynamic_string_buffer] 
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 dynamic_string_buffer::data]

[indexterm2 data..dynamic_string_buffer] 
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 input sequence.


[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:dynamic_string_buffer dynamic_string_buffer::dynamic_string_buffer]

[indexterm2 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...]]``


Move construct a dynamic buffer. 


  ``[link asio.reference.dynamic_string_buffer.dynamic_string_buffer.overload2 dynamic_string_buffer]``(
      dynamic_string_buffer && other);
  ``  [''''&raquo;''' [link asio.reference.dynamic_string_buffer.dynamic_string_buffer.overload2 more...]]``


[section:overload1 dynamic_string_buffer::dynamic_string_buffer (1 of 2 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. Any existing data in the string is treated as the dynamic buffer's input sequence. The object stores a reference to the string and the user is responsible for ensuring that the string object remains valid until the [link asio.reference.dynamic_string_buffer `dynamic_string_buffer`] object is destroyed.]]

[[maximum_size][Specifies a maximum size for the buffer, in bytes. ]]

]




[endsect]



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


Move construct a dynamic buffer. 


  dynamic_string_buffer(
      dynamic_string_buffer && other);



[endsect]


[endsect]


[section:max_size dynamic_string_buffer::max_size]

[indexterm2 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 of the sum of the sizes of the input sequence and output sequence. 




[endsect]



[section:mutable_buffers_type dynamic_string_buffer::mutable_buffers_type]

[indexterm2 mutable_buffers_type..dynamic_string_buffer] 
The type used to represent the output sequence as a list of buffers. 


  typedef mutable_buffers_1 mutable_buffers_type;


[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.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]]]
    [Construct to represent a given memory range. 

     Construct to represent a single modifiable buffer. ]
  ]
  
]

[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]


[endsect]



[section:prepare dynamic_string_buffer::prepare]

[indexterm2 prepare..dynamic_string_buffer] 
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:size dynamic_string_buffer::size]

[indexterm2 size..dynamic_string_buffer] 
Get the size of the input sequence. 


  std::size_t size() const;



[endsect]



[endsect]

[section:dynamic_vector_buffer dynamic_vector_buffer]


Adapt a vector to the DynamicBufferSequence 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 the input sequence as a list of buffers. ]
  
  ]

  [

    [[link asio.reference.dynamic_vector_buffer.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.dynamic_vector_buffer.capacity [*capacity]]]
    [Get the current capacity of the dynamic buffer. ]
  ]
  
  [
    [[link asio.reference.dynamic_vector_buffer.commit [*commit]]]
    [Move bytes from the output sequence to the input sequence. ]
  ]
  
  [
    [[link asio.reference.dynamic_vector_buffer.consume [*consume]]]
    [Remove characters from the input sequence. ]
  ]
  
  [
    [[link asio.reference.dynamic_vector_buffer.data [*data]]]
    [Get a list of buffers that represents the input sequence. ]
  ]
  
  [
    [[link asio.reference.dynamic_vector_buffer.dynamic_vector_buffer [*dynamic_vector_buffer]]]
    [Construct a dynamic buffer from a string. 

     Move construct a dynamic buffer. ]
  ]
  
  [
    [[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]]]
    [Get a list of buffers that represents the output sequence, with the given size. ]
  ]
  
  [
    [[link asio.reference.dynamic_vector_buffer.size [*size]]]
    [Get the size of the input sequence. ]
  ]
  
]

Requires that `sizeof(Elem) == 1`. 

[heading Requirements]

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

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


[section:capacity dynamic_vector_buffer::capacity]

[indexterm2 capacity..dynamic_vector_buffer] 
Get the current capacity of the dynamic buffer. 


  std::size_t capacity() const;



[heading Return Value]
      
The current total capacity of the buffer, i.e. for both the input sequence and output sequence. 




[endsect]



[section:commit dynamic_vector_buffer::commit]

[indexterm2 commit..dynamic_vector_buffer] 
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 const_buffers_type..dynamic_vector_buffer] 
The type used to represent the input sequence as a list of buffers. 


  typedef const_buffers_1 const_buffers_type;


[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]]]
    [Construct to represent a given memory range. 

     Construct to represent a single non-modifiable buffer. ]
  ]
  
  [
    [[link asio.reference.const_buffers_1.end [*end]]]
    [Get a random-access iterator for one past the last element. ]
  ]
  
]

[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]


[endsect]



[section:consume dynamic_vector_buffer::consume]

[indexterm2 consume..dynamic_vector_buffer] 
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 dynamic_vector_buffer::data]

[indexterm2 data..dynamic_vector_buffer] 
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 input sequence.


[heading Remarks]
      
The returned object is invalidated by any `dynamic_vector_buffer` or `basic_string` member function that modifies the input sequence or output sequence. 




[endsect]


[section:dynamic_vector_buffer dynamic_vector_buffer::dynamic_vector_buffer]

[indexterm2 dynamic_vector_buffer..dynamic_vector_buffer] 
Construct a dynamic buffer from a string. 


  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...]]``


Move construct a dynamic buffer. 


  ``[link asio.reference.dynamic_vector_buffer.dynamic_vector_buffer.overload2 dynamic_vector_buffer]``(
      dynamic_vector_buffer && other);
  ``  [''''&raquo;''' [link asio.reference.dynamic_vector_buffer.dynamic_vector_buffer.overload2 more...]]``


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


Construct a dynamic buffer from a string. 


  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. Any existing data in the vector is treated as the dynamic buffer's input sequence. The object stores a reference to the vector and the user is responsible for ensuring that the vector object remains valid until the [link asio.reference.dynamic_vector_buffer `dynamic_vector_buffer`] object is destroyed.]]

[[maximum_size][Specifies a maximum size for the buffer, in bytes. ]]

]




[endsect]



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


Move construct a dynamic buffer. 


  dynamic_vector_buffer(
      dynamic_vector_buffer && other);



[endsect]


[endsect]


[section:max_size dynamic_vector_buffer::max_size]

[indexterm2 max_size..dynamic_vector_buffer] 
Get the maximum size of the dynamic buffer. 


  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 dynamic_vector_buffer::mutable_buffers_type]

[indexterm2 mutable_buffers_type..dynamic_vector_buffer] 
The type used to represent the output sequence as a list of buffers. 


  typedef mutable_buffers_1 mutable_buffers_type;


[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.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]]]
    [Construct to represent a given memory range. 

     Construct to represent a single modifiable buffer. ]
  ]
  
]

[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]


[endsect]



[section:prepare dynamic_vector_buffer::prepare]

[indexterm2 prepare..dynamic_vector_buffer] 
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_vector_buffer` or `basic_string` member function that modifies the input sequence or output sequence. 




[endsect]



[section:size dynamic_vector_buffer::size]

[indexterm2 size..dynamic_vector_buffer] 
Get the size of the input sequence. 


  std::size_t size() const;



[endsect]



[endsect]


[section:error__addrinfo_category error::addrinfo_category]

[indexterm1 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 error::addrinfo_errors] 

  enum addrinfo_errors

[indexterm2 service_not_found..error::addrinfo_errors]
[indexterm2 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 error::basic_errors] 

  enum basic_errors

[indexterm2 access_denied..error::basic_errors]
[indexterm2 address_family_not_supported..error::basic_errors]
[indexterm2 address_in_use..error::basic_errors]
[indexterm2 already_connected..error::basic_errors]
[indexterm2 already_started..error::basic_errors]
[indexterm2 broken_pipe..error::basic_errors]
[indexterm2 connection_aborted..error::basic_errors]
[indexterm2 connection_refused..error::basic_errors]
[indexterm2 connection_reset..error::basic_errors]
[indexterm2 bad_descriptor..error::basic_errors]
[indexterm2 fault..error::basic_errors]
[indexterm2 host_unreachable..error::basic_errors]
[indexterm2 in_progress..error::basic_errors]
[indexterm2 interrupted..error::basic_errors]
[indexterm2 invalid_argument..error::basic_errors]
[indexterm2 message_size..error::basic_errors]
[indexterm2 name_too_long..error::basic_errors]
[indexterm2 network_down..error::basic_errors]
[indexterm2 network_reset..error::basic_errors]
[indexterm2 network_unreachable..error::basic_errors]
[indexterm2 no_descriptors..error::basic_errors]
[indexterm2 no_buffer_space..error::basic_errors]
[indexterm2 no_memory..error::basic_errors]
[indexterm2 no_permission..error::basic_errors]
[indexterm2 no_protocol_option..error::basic_errors]
[indexterm2 no_such_device..error::basic_errors]
[indexterm2 not_connected..error::basic_errors]
[indexterm2 not_socket..error::basic_errors]
[indexterm2 operation_aborted..error::basic_errors]
[indexterm2 operation_not_supported..error::basic_errors]
[indexterm2 shut_down..error::basic_errors]
[indexterm2 timed_out..error::basic_errors]
[indexterm2 try_again..error::basic_errors]
[indexterm2 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 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 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 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 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 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 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 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 error::misc_errors] 

  enum misc_errors

[indexterm2 already_open..error::misc_errors]
[indexterm2 eof..error::misc_errors]
[indexterm2 not_found..error::misc_errors]
[indexterm2 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 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 error::netdb_errors] 

  enum netdb_errors

[indexterm2 host_not_found..error::netdb_errors]
[indexterm2 host_not_found_try_again..error::netdb_errors]
[indexterm2 no_data..error::netdb_errors]
[indexterm2 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 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 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 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. ]
  ]
  
]

[heading Requirements]

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

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


[section:message error_category::message]

[indexterm2 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 name..error_category] 
Returns a string naming the error gategory. 


  const char * name() const;



[endsect]



[section:operator_not__eq_ error_category::operator!=]

[indexterm2 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 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 ~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.category [*category]]]
    [Get the error category. ]
  ]
  
  [
    [[link asio.reference.error_code.error_code [*error_code]]]
    [Default constructor. 

     Construct with specific error code and category. 

     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]]]
    []
  ]
  
  [
    [[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:category error_code::category]

[indexterm2 category..error_code] 
Get the error category. 


  const error_category & category() const;



[endsect]


[section:error_code error_code::error_code]

[indexterm2 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 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 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 operator!..error_code] 
Operator to test if the error represents success. 


  bool operator!() const;



[endsect]



[section:operator_not__eq_ error_code::operator!=]

[indexterm2 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 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 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 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 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_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_service 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.notify_fork [*notify_fork]]]
    [Notify the execution_context of a fork-related event. ]
  ]
  
]

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

  [
    [[link asio.reference.execution_context.destroy_context [*destroy_context]]]
    [Destroys all services in the context. ]
  ]
  
  [
    [[link asio.reference.execution_context.execution_context [*execution_context]]]
    [Constructor. ]
  ]
  
  [
    [[link asio.reference.execution_context.shutdown_context [*shutdown_context]]]
    [Shuts down all services in the context. ]
  ]
  
  [
    [[link asio.reference.execution_context._execution_context [*~execution_context]]]
    [Destructor. ]
  ]
  
]

[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_service` 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_service` 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_context()` followed by `execution_context::destroy_context()`.

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_service `io_service`] function stop() is called to terminate any run() calls as soon as possible. The [link asio.reference.io_service `io_service`] destructor calls `shutdown_context()` and `destroy_context()` 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.hpp]


[section:add_service execution_context::add_service]

[indexterm2 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.hpp]


[endsect]



[section:destroy_context execution_context::destroy_context]

[indexterm2 destroy_context..execution_context] 
Destroys all services in the context. 


  void destroy_context();


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 execution_context..execution_context] 
Constructor. 


  execution_context();



[endsect]



[section:fork_event execution_context::fork_event]

[indexterm2 fork_event..execution_context] 
Fork-related event notifications. 


  enum fork_event

[indexterm2 fork_prepare..execution_context]
[indexterm2 fork_parent..execution_context]
[indexterm2 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 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.hpp]


[endsect]



[section:make_service execution_context::make_service]

[indexterm2 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.hpp]


[endsect]



[section:notify_fork execution_context::notify_fork]

[indexterm2 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->fork_service();`. 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_context execution_context::shutdown_context]

[indexterm2 shutdown_context..execution_context] 
Shuts down all services in the context. 


  void shutdown_context();


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_service()`. 




[endsect]


[section:use_service execution_context::use_service]

[indexterm2 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_service & ios);
  ``  [''''&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.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_service & ios);


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_service `io_service`] will create a new instance of the service.


[heading Parameters]
    

[variablelist
  
[[ios][The [link asio.reference.io_service `io_service`] 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_service__service `io_service::service`]. 



[heading Requirements]

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

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


[endsect]


[endsect]


[section:_execution_context execution_context::~execution_context]

[indexterm2 ~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. ]
  ]
  
]

[heading Requirements]

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

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


[section:id execution_context::id::id]

[indexterm2 id..execution_context::id] 
Constructor. 


  id();



[endsect]



[endsect]

[section:execution_context__service execution_context::service]


Base class for all [link asio.reference.io_service `io_service`] 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. ]
  ]
  
  [
    [[link asio.reference.execution_context__service._service [*~service]]]
    [Destructor. ]
  ]
  
]

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

  [
    [[link asio.reference.execution_context__service.fork_service [*fork_service]]]
    [Handle notification of a fork-related event to perform any necessary housekeeping. ]
  ]
  
  [
    [[link asio.reference.execution_context__service.shutdown_service [*shutdown_service]]]
    [Destroy all user-defined handler objects owned by the service. ]
  ]
  
]

[heading Requirements]

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

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


[section:context execution_context::service::context]

[indexterm2 context..execution_context::service] 
Get the context object that owns the service. 


  execution_context & context();



[endsect]



[section:service execution_context::service::service]

[indexterm2 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 ~service..execution_context::service] 
Destructor. 


  virtual ~service();



[endsect]



[section:fork_service execution_context::service::fork_service]

[indexterm2 fork_service..execution_context::service] 
Handle notification of a fork-related event to perform any necessary housekeeping. 


  virtual void fork_service(
      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_service execution_context::service::shutdown_service]

[indexterm2 shutdown_service..execution_context::service] 
Destroy all user-defined handler objects owned by the service. 


  void shutdown_service();



[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]]]
    [Default constructor. 

     Construct from nullptr. 

     Copy constructor. 

     Move constructor. 

     Construct a polymorphic wrapper for the specified executor. 

     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. 

     

     Assignment operator for nullptr_t. 

     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]]]
    []
  ]
  
  [
    [[link asio.reference.executor._executor [*~executor]]]
    [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 context..executor] 
Obtain the underlying execution context. 


  execution_context & context();



[endsect]



[section:defer executor::defer]

[indexterm2 defer..executor] 
Request the executor to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void defer(
      Function && f,
      const Allocator & a);


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 dispatch..executor] 
Request the executor to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void dispatch(
      Function && f,
      const Allocator & a);


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 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.Executor 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.Executor 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.Executor 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.Executor Executor]``,
      typename Allocator>
  executor(
      allocator_arg_t ,
      const Allocator & a,
      Executor e);



[endsect]


[endsect]


[section:on_work_finished executor::on_work_finished]

[indexterm2 on_work_finished..executor] 
Inform the executor that some work is no longer outstanding. 


  void on_work_finished();



[endsect]



[section:on_work_started executor::on_work_started]

[indexterm2 on_work_started..executor] 
Inform the executor that it has some outstanding work to do. 


  void on_work_started();



[endsect]



[section:operator_unspecified_bool_type executor::operator unspecified_bool_type]

[indexterm2 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 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 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.Executor 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.Executor Executor]``>
  executor & operator=(
      Executor && e);



[endsect]


[endsect]


[section:operator_eq__eq_ executor::operator==]

[indexterm2 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 post..executor] 
Request the executor to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void post(
      Function && f,
      const Allocator & a);


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 target..executor] 
Obtain a pointer to the target executor object. 


  template<
      typename ``[link asio.reference.Executor Executor]``>
  Executor * ``[link asio.reference.executor.target.overload1 target]``();
  ``  [''''&raquo;''' [link asio.reference.executor.target.overload1 more...]]``

  template<
      typename ``[link asio.reference.Executor 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.Executor 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.Executor 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 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 unspecified_bool_true..executor] 

  static void unspecified_bool_true(
      unspecified_bool_type_t );



[endsect]



[section:unspecified_bool_type executor::unspecified_bool_type]

[indexterm2 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 ~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 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. ]
  ]
  
]

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 executor_arg_t..executor_arg_t] 
Constructor. 


  constexpr executor_arg_t();



[endsect]



[endsect]

[section:executor_work executor_work]


An object of type `executor_work` controls ownership of executor work within a scope. 


  template<
      typename ``[link asio.reference.Executor Executor]``>
  class executor_work


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

  [

    [[link asio.reference.executor_work.executor_type [*executor_type]]]
    [The underlying executor type. ]
  
  ]

]

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

  [
    [[link asio.reference.executor_work.executor_work [*executor_work]]]
    [Constructs a executor_work object for the specified executor. 

     Copy constructor. 

     Move constructor. ]
  ]
  
  [
    [[link asio.reference.executor_work.get_executor [*get_executor]]]
    [Obtain the associated executor. ]
  ]
  
  [
    [[link asio.reference.executor_work.owns_work [*owns_work]]]
    [Whether the executor_work object owns some outstanding work. ]
  ]
  
  [
    [[link asio.reference.executor_work.reset [*reset]]]
    [Indicate that the work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.executor_work._executor_work [*~executor_work]]]
    [Destructor. ]
  ]
  
]

[heading Requirements]

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

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


[section:executor_type executor_work::executor_type]

[indexterm2 executor_type..executor_work] 
The underlying executor type. 


  typedef Executor executor_type;



[heading Requirements]

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

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


[endsect]


[section:executor_work executor_work::executor_work]

[indexterm2 executor_work..executor_work] 
Constructs a `executor_work` object for the specified executor. 


  explicit ``[link asio.reference.executor_work.executor_work.overload1 executor_work]``(
      const executor_type & e);
  ``  [''''&raquo;''' [link asio.reference.executor_work.executor_work.overload1 more...]]``


Copy constructor. 


  ``[link asio.reference.executor_work.executor_work.overload2 executor_work]``(
      const executor_work & other);
  ``  [''''&raquo;''' [link asio.reference.executor_work.executor_work.overload2 more...]]``


Move constructor. 


  ``[link asio.reference.executor_work.executor_work.overload3 executor_work]``(
      executor_work && other);
  ``  [''''&raquo;''' [link asio.reference.executor_work.executor_work.overload3 more...]]``


[section:overload1 executor_work::executor_work (1 of 3 overloads)]


Constructs a `executor_work` object for the specified executor. 


  executor_work(
      const executor_type & e);


Stores a copy of `e` and calls `on_work_started()` on it. 


[endsect]



[section:overload2 executor_work::executor_work (2 of 3 overloads)]


Copy constructor. 


  executor_work(
      const executor_work & other);



[endsect]



[section:overload3 executor_work::executor_work (3 of 3 overloads)]


Move constructor. 


  executor_work(
      executor_work && other);



[endsect]


[endsect]


[section:get_executor executor_work::get_executor]

[indexterm2 get_executor..executor_work] 
Obtain the associated executor. 


  executor_type get_executor() const;



[endsect]



[section:owns_work executor_work::owns_work]

[indexterm2 owns_work..executor_work] 
Whether the [link asio.reference.executor_work `executor_work`] object owns some outstanding work. 


  bool owns_work() const;



[endsect]



[section:reset executor_work::reset]

[indexterm2 reset..executor_work] 
Indicate that the work is no longer outstanding. 


  void reset();



[endsect]



[section:_executor_work executor_work::~executor_work]

[indexterm2 ~executor_work..executor_work] 
Destructor. 


  ~executor_work();


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:executor_wrapper executor_wrapper]


A call wrapper type to associate an object of type `T` with an executor of type `Executor`. 


  template<
      typename T,
      typename ``[link asio.reference.Executor Executor]``>
  class executor_wrapper


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

  [

    [[link asio.reference.executor_wrapper.argument_type [*argument_type]]]
    [The type of the function's argument. ]
  
  ]

  [

    [[link asio.reference.executor_wrapper.executor_type [*executor_type]]]
    [The type of the associated executor. ]
  
  ]

  [

    [[link asio.reference.executor_wrapper.first_argument_type [*first_argument_type]]]
    [The type of the function's first argument. ]
  
  ]

  [

    [[link asio.reference.executor_wrapper.result_type [*result_type]]]
    [The return type if a function. ]
  
  ]

  [

    [[link asio.reference.executor_wrapper.second_argument_type [*second_argument_type]]]
    [The type of the function's second argument. ]
  
  ]

  [

    [[link asio.reference.executor_wrapper.wrapped_type [*wrapped_type]]]
    [The type of the wrapped object. ]
  
  ]

]

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

  [
    [[link asio.reference.executor_wrapper.executor_wrapper [*executor_wrapper]]]
    [Construct an executor wrapper for the specified object. 

     Copy constructor. 

     Construct a copy, but specify a different executor. 

     Construct a copy of a different executor wrapper type. 

     Construct a copy of a different executor wrapper type, but specify a different executor. 

     Move constructor. 

     Move construct the wrapped object, but specify a different executor. 

     Move construct from a different executor wrapper type. 

     Move construct from a different executor wrapper type, but specify a different executor. ]
  ]
  
  [
    [[link asio.reference.executor_wrapper.get_executor [*get_executor]]]
    [Obtain the associated executor. ]
  ]
  
  [
    [[link asio.reference.executor_wrapper.operator_lp__rp_ [*operator()]]]
    []
  ]
  
  [
    [[link asio.reference.executor_wrapper.unwrap [*unwrap]]]
    [Obtain a reference to the wrapped object. ]
  ]
  
  [
    [[link asio.reference.executor_wrapper._executor_wrapper [*~executor_wrapper]]]
    [Destructor. ]
  ]
  
]

[heading Requirements]

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

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


[section:argument_type executor_wrapper::argument_type]

[indexterm2 argument_type..executor_wrapper] 
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/wrap.hpp]

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


[endsect]



[section:executor_type executor_wrapper::executor_type]

[indexterm2 executor_type..executor_wrapper] 
The type of the associated executor. 


  typedef Executor executor_type;



[heading Requirements]

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

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


[endsect]


[section:executor_wrapper executor_wrapper::executor_wrapper]

[indexterm2 executor_wrapper..executor_wrapper] 
Construct an executor wrapper for the specified object. 


  template<
      typename U>
  ``[link asio.reference.executor_wrapper.executor_wrapper.overload1 executor_wrapper]``(
      executor_arg_t ,
      const executor_type & e,
      U && u);
  ``  [''''&raquo;''' [link asio.reference.executor_wrapper.executor_wrapper.overload1 more...]]``


Copy constructor. 


  ``[link asio.reference.executor_wrapper.executor_wrapper.overload2 executor_wrapper]``(
      const executor_wrapper & other);
  ``  [''''&raquo;''' [link asio.reference.executor_wrapper.executor_wrapper.overload2 more...]]``


Construct a copy, but specify a different executor. 


  ``[link asio.reference.executor_wrapper.executor_wrapper.overload3 executor_wrapper]``(
      executor_arg_t ,
      const executor_type & e,
      const executor_wrapper & other);
  ``  [''''&raquo;''' [link asio.reference.executor_wrapper.executor_wrapper.overload3 more...]]``


Construct a copy of a different executor wrapper type. 


  template<
      typename U,
      typename ``[link asio.reference.Executor OtherExecutor]``>
  ``[link asio.reference.executor_wrapper.executor_wrapper.overload4 executor_wrapper]``(
      const executor_wrapper< U, OtherExecutor > & other);
  ``  [''''&raquo;''' [link asio.reference.executor_wrapper.executor_wrapper.overload4 more...]]``


Construct a copy of a different executor wrapper type, but specify a different executor. 


  template<
      typename U,
      typename ``[link asio.reference.Executor OtherExecutor]``>
  ``[link asio.reference.executor_wrapper.executor_wrapper.overload5 executor_wrapper]``(
      executor_arg_t ,
      const executor_type & e,
      const executor_wrapper< U, OtherExecutor > & other);
  ``  [''''&raquo;''' [link asio.reference.executor_wrapper.executor_wrapper.overload5 more...]]``


Move constructor. 


  ``[link asio.reference.executor_wrapper.executor_wrapper.overload6 executor_wrapper]``(
      executor_wrapper && other);
  ``  [''''&raquo;''' [link asio.reference.executor_wrapper.executor_wrapper.overload6 more...]]``


Move construct the wrapped object, but specify a different executor. 


  ``[link asio.reference.executor_wrapper.executor_wrapper.overload7 executor_wrapper]``(
      executor_arg_t ,
      const executor_type & e,
      executor_wrapper && other);
  ``  [''''&raquo;''' [link asio.reference.executor_wrapper.executor_wrapper.overload7 more...]]``


Move construct from a different executor wrapper type. 


  template<
      typename U,
      typename ``[link asio.reference.Executor OtherExecutor]``>
  ``[link asio.reference.executor_wrapper.executor_wrapper.overload8 executor_wrapper]``(
      executor_wrapper< U, OtherExecutor > && other);
  ``  [''''&raquo;''' [link asio.reference.executor_wrapper.executor_wrapper.overload8 more...]]``


Move construct from a different executor wrapper type, but specify a different executor. 


  template<
      typename U,
      typename ``[link asio.reference.Executor OtherExecutor]``>
  ``[link asio.reference.executor_wrapper.executor_wrapper.overload9 executor_wrapper]``(
      executor_arg_t ,
      const executor_type & e,
      executor_wrapper< U, OtherExecutor > && other);
  ``  [''''&raquo;''' [link asio.reference.executor_wrapper.executor_wrapper.overload9 more...]]``


[section:overload1 executor_wrapper::executor_wrapper (1 of 9 overloads)]


Construct an executor wrapper for the specified object. 


  template<
      typename U>
  executor_wrapper(
      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_wrapper::executor_wrapper (2 of 9 overloads)]


Copy constructor. 


  executor_wrapper(
      const executor_wrapper & other);



[endsect]



[section:overload3 executor_wrapper::executor_wrapper (3 of 9 overloads)]


Construct a copy, but specify a different executor. 


  executor_wrapper(
      executor_arg_t ,
      const executor_type & e,
      const executor_wrapper & other);



[endsect]



[section:overload4 executor_wrapper::executor_wrapper (4 of 9 overloads)]


Construct a copy of a different executor wrapper type. 


  template<
      typename U,
      typename ``[link asio.reference.Executor OtherExecutor]``>
  executor_wrapper(
      const executor_wrapper< 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_wrapper::executor_wrapper (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.Executor OtherExecutor]``>
  executor_wrapper(
      executor_arg_t ,
      const executor_type & e,
      const executor_wrapper< U, OtherExecutor > & other);


This constructor is only valid if the type `T` is constructible from type `U`. 


[endsect]



[section:overload6 executor_wrapper::executor_wrapper (6 of 9 overloads)]


Move constructor. 


  executor_wrapper(
      executor_wrapper && other);



[endsect]



[section:overload7 executor_wrapper::executor_wrapper (7 of 9 overloads)]


Move construct the wrapped object, but specify a different executor. 


  executor_wrapper(
      executor_arg_t ,
      const executor_type & e,
      executor_wrapper && other);



[endsect]



[section:overload8 executor_wrapper::executor_wrapper (8 of 9 overloads)]


Move construct from a different executor wrapper type. 


  template<
      typename U,
      typename ``[link asio.reference.Executor OtherExecutor]``>
  executor_wrapper(
      executor_wrapper< U, OtherExecutor > && other);



[endsect]



[section:overload9 executor_wrapper::executor_wrapper (9 of 9 overloads)]


Move construct from a different executor wrapper type, but specify a different executor. 


  template<
      typename U,
      typename ``[link asio.reference.Executor OtherExecutor]``>
  executor_wrapper(
      executor_arg_t ,
      const executor_type & e,
      executor_wrapper< U, OtherExecutor > && other);



[endsect]


[endsect]


[section:first_argument_type executor_wrapper::first_argument_type]

[indexterm2 first_argument_type..executor_wrapper] 
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/wrap.hpp]

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


[endsect]



[section:get_executor executor_wrapper::get_executor]

[indexterm2 get_executor..executor_wrapper] 
Obtain the associated executor. 


  executor_type get_executor() const;



[endsect]


[section:operator_lp__rp_ executor_wrapper::operator()]

[indexterm2 operator()..executor_wrapper] 

  template<
      typename... Args>
  auto ``[link asio.reference.executor_wrapper.operator_lp__rp_.overload1 operator()]``(
      Args && ...);
  ``  [''''&raquo;''' [link asio.reference.executor_wrapper.operator_lp__rp_.overload1 more...]]``

  template<
      typename... Args>
  auto ``[link asio.reference.executor_wrapper.operator_lp__rp_.overload2 operator()]``(
      Args && ...) const;
  ``  [''''&raquo;''' [link asio.reference.executor_wrapper.operator_lp__rp_.overload2 more...]]``


[section:overload1 executor_wrapper::operator() (1 of 2 overloads)]



  template<
      typename... Args>
  auto operator()(
      Args && ...);



[endsect]



[section:overload2 executor_wrapper::operator() (2 of 2 overloads)]



  template<
      typename... Args>
  auto operator()(
      Args && ...) const;



[endsect]


[endsect]


[section:result_type executor_wrapper::result_type]

[indexterm2 result_type..executor_wrapper] 
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/wrap.hpp]

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


[endsect]



[section:second_argument_type executor_wrapper::second_argument_type]

[indexterm2 second_argument_type..executor_wrapper] 
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/wrap.hpp]

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


[endsect]


[section:unwrap executor_wrapper::unwrap]

[indexterm2 unwrap..executor_wrapper] 
Obtain a reference to the wrapped object. 


  wrapped_type & ``[link asio.reference.executor_wrapper.unwrap.overload1 unwrap]``();
  ``  [''''&raquo;''' [link asio.reference.executor_wrapper.unwrap.overload1 more...]]``

  const wrapped_type & ``[link asio.reference.executor_wrapper.unwrap.overload2 unwrap]``() const;
  ``  [''''&raquo;''' [link asio.reference.executor_wrapper.unwrap.overload2 more...]]``


[section:overload1 executor_wrapper::unwrap (1 of 2 overloads)]


Obtain a reference to the wrapped object. 


  wrapped_type & unwrap();



[endsect]



[section:overload2 executor_wrapper::unwrap (2 of 2 overloads)]


Obtain a reference to the wrapped object. 


  const wrapped_type & unwrap() const;



[endsect]


[endsect]


[section:wrapped_type executor_wrapper::wrapped_type]

[indexterm2 wrapped_type..executor_wrapper] 
The type of the wrapped object. 


  typedef T wrapped_type;



[heading Requirements]

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

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


[endsect]



[section:_executor_wrapper executor_wrapper::~executor_wrapper]

[indexterm2 ~executor_wrapper..executor_wrapper] 
Destructor. 


  ~executor_wrapper();



[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]]]
    [Default constructor. 

     Construct an endpoint from the specified socket address. 

     Construct an endpoint from the specific endpoint type. 

     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 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 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 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 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 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 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 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 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 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 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 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 protocol..generic::basic_endpoint] 
The protocol associated with the endpoint. 


  protocol_type protocol() const;



[endsect]



[section:protocol_type generic::basic_endpoint::protocol_type]

[indexterm2 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 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 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]]]
    [Construct a protocol object for a specific address family and protocol. 

     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 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 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]]]
    [Default constructor. 

     Construct an endpoint from the specified socket address. 

     Construct an endpoint from the specific endpoint type. 

     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 family..generic::datagram_protocol] 
Obtain an identifier for the protocol family. 


  int family() const;



[endsect]



[section:operator_not__eq_ generic::datagram_protocol::operator!=]

[indexterm2 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 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 protocol..generic::datagram_protocol] 
Obtain an identifier for the protocol. 


  int protocol() const;



[endsect]



[section:socket generic::datagram_protocol::socket]

[indexterm2 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.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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_datagram_socket without opening it. 

     Construct and open a basic_datagram_socket. 

     Construct a basic_datagram_socket, opening it and binding it to the given local endpoint. 

     Construct a basic_datagram_socket on an existing native socket. 

     Move-construct a basic_datagram_socket from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     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. 

     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.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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_datagram_socket.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_datagram_socket.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_peek [*message_peek]]]
    [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 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]]]
    [Construct a protocol object for a specific address family and protocol. 

     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 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]]]
    [Default constructor. 

     Construct an endpoint from the specified socket address. 

     Construct an endpoint from the specific endpoint type. 

     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 family..generic::raw_protocol] 
Obtain an identifier for the protocol family. 


  int family() const;



[endsect]



[section:operator_not__eq_ generic::raw_protocol::operator!=]

[indexterm2 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 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 protocol..generic::raw_protocol] 
Obtain an identifier for the protocol. 


  int protocol() const;



[endsect]


[section:raw_protocol generic::raw_protocol::raw_protocol]

[indexterm2 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 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.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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_raw_socket without opening it. 

     Construct and open a basic_raw_socket. 

     Construct a basic_raw_socket, opening it and binding it to the given local endpoint. 

     Construct a basic_raw_socket on an existing native socket. 

     Move-construct a basic_raw_socket from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     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. 

     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.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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_raw_socket.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_raw_socket.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_peek [*message_peek]]]
    [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 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]]]
    [Construct a protocol object for a specific address family and protocol. 

     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 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]]]
    [Default constructor. 

     Construct an endpoint from the specified socket address. 

     Construct an endpoint from the specific endpoint type. 

     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 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 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 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 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 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 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.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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_seq_packet_socket without opening it. 

     Construct and open a basic_seq_packet_socket. 

     Construct a basic_seq_packet_socket, opening it and binding it to the given local endpoint. 

     Construct a basic_seq_packet_socket on an existing native socket. 

     Move-construct a basic_seq_packet_socket from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     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. 

     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. 

     Receive some data on a connected 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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_seq_packet_socket.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_seq_packet_socket.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_seq_packet_socket.max_connections [*max_connections]]]
    [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]]]
    [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]]]
    [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]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_seq_packet_socket.message_peek [*message_peek]]]
    [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 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]]]
    [Construct a protocol object for a specific address family and protocol. 

     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 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]]]
    [Default constructor. 

     Construct an endpoint from the specified socket address. 

     Construct an endpoint from the specific endpoint type. 

     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 family..generic::stream_protocol] 
Obtain an identifier for the protocol family. 


  int family() const;



[endsect]



[section:iostream generic::stream_protocol::iostream]

[indexterm2 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.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.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]]]
    [Construct a basic_socket_iostream without establishing a connection. 

     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. 

     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. 

     (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.rdbuf [*rdbuf]]]
    [Return a pointer to the underlying streambuf. ]
  ]
  
]


[heading Requirements]

['Header: ][^asio/generic/stream_protocol.hpp]

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


[endsect]



[section:operator_not__eq_ generic::stream_protocol::operator!=]

[indexterm2 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 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 protocol..generic::stream_protocol] 
Obtain an identifier for the protocol. 


  int protocol() const;



[endsect]



[section:socket generic::stream_protocol::socket]

[indexterm2 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.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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_stream_socket without opening it. 

     Construct and open a basic_stream_socket. 

     Construct a basic_stream_socket, opening it and binding it to the given local endpoint. 

     Construct a basic_stream_socket on an existing native socket. 

     Move-construct a basic_stream_socket from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     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. 

     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. 

     Receive some data on a connected 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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_stream_socket.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_stream_socket.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_peek [*message_peek]]]
    [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 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 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 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 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.Executor 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 >::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.Executor Executor]``>
  associated_executor< T, Executor >::type get_associated_executor(
      const T & t,
      const Executor & ex,
      typename enable_if< 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:handler_type handler_type]


Default handler type traits provided for all completion token types. 


  template<
      typename CompletionToken,
      typename Signature,
      typename  = void>
  struct handler_type


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

  [

    [[link asio.reference.handler_type.type [*type]]]
    [The handler type for the specific signature. ]
  
  ]

]

The [link asio.reference.handler_type `handler_type`] traits class is used for determining the concrete handler type to be used for an asynchronous operation. It allows the handler type 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. 

[heading Requirements]

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

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


[section:type handler_type::type]

[indexterm2 type..handler_type] 
The handler type for the specific signature. 


  typedef conditional< is_same< CompletionToken, typename decay< CompletionToken >::type >::value, decay< CompletionToken >, handler_type< typename decay< CompletionToken >::type, Signature > >::type::type type;



[heading Requirements]

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

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


[endsect]



[endsect]


[section:has_service has_service]

[indexterm1 has_service] 

  template<
      typename ``[link asio.reference.Service Service]``>
  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/impl/execution_context.hpp]

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


[endsect]



[section:high_resolution_timer high_resolution_timer]

[indexterm1 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.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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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 to set a particular expiry time as an absolute time. 

     Constructor to set a particular expiry time relative to now. 

     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. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.cancel_one [*cancel_one]]]
    [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. 

     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. 

     (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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_waitable_timer.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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(io_service);

   // 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(io_service,
       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: ]None


[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]]]
    []
  ]
  
]

[heading Requirements]

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

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


[section:invalid_service_owner invalid_service_owner::invalid_service_owner]

[indexterm2 invalid_service_owner..invalid_service_owner] 

  invalid_service_owner();



[endsect]



[endsect]

[section:io_service io_service]


Provides core I/O functionality. 


  class io_service :
    public execution_context


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

  [

    [[link asio.reference.io_service__executor_type [*executor_type]]]
    [Executor used to submit functions to an io_service. ]
  
  ]

  [

    [[link asio.reference.io_service__service [*service]]]
    [Base class for all io_service services. ]
  
  ]

  [

    [[link asio.reference.io_service__strand [*strand]]]
    [Provides serialised handler execution. ]
  
  ]

  [

    [[link asio.reference.io_service__work [*work]]]
    [(Deprecated: Use executor_work.) Class to inform the io_service when it has work to do. ]
  
  ]

  [

    [[link asio.reference.io_service.fork_event [*fork_event]]]
    [Fork-related event notifications. ]
  
  ]

]

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

  [
    [[link asio.reference.io_service.dispatch [*dispatch]]]
    [(Deprecated: Use asio::dispatch().) Request the io_service to invoke the given handler. ]
  ]
  
  [
    [[link asio.reference.io_service.get_executor [*get_executor]]]
    [Obtains the executor associated with the io_service. ]
  ]
  
  [
    [[link asio.reference.io_service.io_service [*io_service]]]
    [Constructor. ]
  ]
  
  [
    [[link asio.reference.io_service.notify_fork [*notify_fork]]]
    [Notify the execution_context of a fork-related event. ]
  ]
  
  [
    [[link asio.reference.io_service.poll [*poll]]]
    [Run the io_service object's event processing loop to execute ready handlers. ]
  ]
  
  [
    [[link asio.reference.io_service.poll_one [*poll_one]]]
    [Run the io_service object's event processing loop to execute one ready handler. ]
  ]
  
  [
    [[link asio.reference.io_service.post [*post]]]
    [(Deprecated: Use asio::post().) Request the io_service to invoke the given handler and return immediately. ]
  ]
  
  [
    [[link asio.reference.io_service.reset [*reset]]]
    [(Deprecated: Use restart().) Reset the io_service in preparation for a subsequent run() invocation. ]
  ]
  
  [
    [[link asio.reference.io_service.restart [*restart]]]
    [Restart the io_service in preparation for a subsequent run() invocation. ]
  ]
  
  [
    [[link asio.reference.io_service.run [*run]]]
    [Run the io_service object's event processing loop. ]
  ]
  
  [
    [[link asio.reference.io_service.run_one [*run_one]]]
    [Run the io_service object's event processing loop to execute at most one handler. ]
  ]
  
  [
    [[link asio.reference.io_service.stop [*stop]]]
    [Stop the io_service object's event processing loop. ]
  ]
  
  [
    [[link asio.reference.io_service.stopped [*stopped]]]
    [Determine whether the io_service object has been stopped. ]
  ]
  
  [
    [[link asio.reference.io_service.wrap [*wrap]]]
    [(Deprecated: Use asio::wrap().) Create a new handler that automatically dispatches the wrapped handler on the io_service. ]
  ]
  
  [
    [[link asio.reference.io_service._io_service [*~io_service]]]
    [Destructor. ]
  ]
  
]

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

  [
    [[link asio.reference.io_service.destroy_context [*destroy_context]]]
    [Destroys all services in the context. ]
  ]
  
  [
    [[link asio.reference.io_service.shutdown_context [*shutdown_context]]]
    [Shuts down all services in the context. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_service.add_service [*add_service]]]
    [(Deprecated: Use make_service().) Add a service object to the execution_context. ]
  ]
  
  [
    [[link asio.reference.io_service.has_service [*has_service]]]
    [Determine if an execution_context contains a specified service type. ]
  ]
  
  [
    [[link asio.reference.io_service.make_service [*make_service]]]
    [Creates a service object and adds it to the execution_context. ]
  ]
  
  [
    [[link asio.reference.io_service.use_service [*use_service]]]
    [

     Obtain the service object corresponding to the given type. ]
  ]
  
]

The [link asio.reference.io_service `io_service`] 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_service `io_service`] 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()`, `poll()` or `poll_one()` calls results in undefined behaviour. The `notify_fork()` function should not be called while any [link asio.reference.io_service `io_service`] function, or any function on an I/O object that is associated with the [link asio.reference.io_service `io_service`], is being called in another thread.



[heading Synchronous and asynchronous operations]
  


Synchronous operations on I/O objects implicitly run the [link asio.reference.io_service `io_service`] object for an individual operation. The [link asio.reference.io_service `io_service`] functions `run()`, `run_one()`, `poll()` or `poll_one()` must be called for the [link asio.reference.io_service `io_service`] 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()`, `poll()` or `poll_one()` for the [link asio.reference.io_service `io_service`].


[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()`, `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()`, `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_service `io_service`] object's thread pool without impacting any other threads in the pool.

For example:



   asio::io_service io_service;
   ...
   for (;;)
   {
     try
     {
       io_service.run();
       break; // run() exited normally
     }
     catch (my_exception& e)
     {
       // Deal with exception as appropriate.
     }
   }





[heading Stopping the io_service from running out of work]
  


Some applications may need to prevent an [link asio.reference.io_service `io_service`] object's `run()` call from returning when there is no more work to do. For example, the [link asio.reference.io_service `io_service`] 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 object of type [link asio.reference.io_service__work `io_service::work`]:



   asio::io_service io_service;
   asio::io_service::work work(io_service);
   ... 




To effect a shutdown, the application will then need to call the [link asio.reference.io_service `io_service`] object's `stop()` member function. This will cause the [link asio.reference.io_service `io_service`] `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, the work object may be explicitly destroyed.



   asio::io_service io_service;
   auto_ptr<asio::io_service::work> work(
       new asio::io_service::work(io_service));
   ...
   work.reset(); // Allow run() to exit. 




[heading Requirements]

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

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


[section:add_service io_service::add_service]


['Inherited from execution_context.]

[indexterm2 add_service..io_service] 
(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_service.hpp]

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


[endsect]



[section:destroy_context io_service::destroy_context]


['Inherited from execution_context.]

[indexterm2 destroy_context..io_service] 
Destroys all services in the context. 


  void destroy_context();


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_service::dispatch]

[indexterm2 dispatch..io_service] 
(Deprecated: Use [link asio.reference.dispatch `dispatch`].) Request the [link asio.reference.io_service `io_service`] to invoke the given handler. 


  template<
      typename ``[link asio.reference.CompletionHandler CompletionHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` dispatch(
      CompletionHandler && handler);


This function is used to ask the [link asio.reference.io_service `io_service`] to execute the given handler.

The [link asio.reference.io_service `io_service`] 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_service `io_service`] 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:fork_event io_service::fork_event]


['Inherited from execution_context.]

[indexterm2 fork_event..io_service] 
Fork-related event notifications. 


  enum fork_event

[indexterm2 fork_prepare..io_service]
[indexterm2 fork_parent..io_service]
[indexterm2 fork_child..io_service]

[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_service::get_executor]

[indexterm2 get_executor..io_service] 
Obtains the executor associated with the [link asio.reference.io_service `io_service`]. 


  executor_type get_executor();



[endsect]



[section:has_service io_service::has_service]


['Inherited from execution_context.]

[indexterm2 has_service..io_service] 
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_service.hpp]

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


[endsect]


[section:io_service io_service::io_service]

[indexterm2 io_service..io_service] 
Constructor. 


  ``[link asio.reference.io_service.io_service.overload1 io_service]``();
  ``  [''''&raquo;''' [link asio.reference.io_service.io_service.overload1 more...]]``

  explicit ``[link asio.reference.io_service.io_service.overload2 io_service]``(
      std::size_t concurrency_hint);
  ``  [''''&raquo;''' [link asio.reference.io_service.io_service.overload2 more...]]``


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


Constructor. 


  io_service();



[endsect]



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


Constructor. 


  io_service(
      std::size_t 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_service::make_service]


['Inherited from execution_context.]

[indexterm2 make_service..io_service] 
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_service.hpp]

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


[endsect]



[section:notify_fork io_service::notify_fork]


['Inherited from execution_context.]

[indexterm2 notify_fork..io_service] 
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->fork_service();`. 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_service::poll]

[indexterm2 poll..io_service] 
Run the [link asio.reference.io_service `io_service`] object's event processing loop to execute ready handlers. 


  std::size_t ``[link asio.reference.io_service.poll.overload1 poll]``();
  ``  [''''&raquo;''' [link asio.reference.io_service.poll.overload1 more...]]``

  std::size_t ``[link asio.reference.io_service.poll.overload2 poll]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.io_service.poll.overload2 more...]]``


[section:overload1 io_service::poll (1 of 2 overloads)]


Run the [link asio.reference.io_service `io_service`] object's event processing loop to execute ready handlers. 


  std::size_t poll();


The `poll()` function runs handlers that are ready to run, without blocking, until the [link asio.reference.io_service `io_service`] has been stopped or there are no more ready handlers.


[heading Return Value]
      
The number of handlers that were executed.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 io_service::poll (2 of 2 overloads)]


Run the [link asio.reference.io_service `io_service`] object's event processing loop to execute ready handlers. 


  std::size_t poll(
      asio::error_code & ec);


The `poll()` function runs handlers that are ready to run, without blocking, until the [link asio.reference.io_service `io_service`] 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_service::poll_one]

[indexterm2 poll_one..io_service] 
Run the [link asio.reference.io_service `io_service`] object's event processing loop to execute one ready handler. 


  std::size_t ``[link asio.reference.io_service.poll_one.overload1 poll_one]``();
  ``  [''''&raquo;''' [link asio.reference.io_service.poll_one.overload1 more...]]``

  std::size_t ``[link asio.reference.io_service.poll_one.overload2 poll_one]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.io_service.poll_one.overload2 more...]]``


[section:overload1 io_service::poll_one (1 of 2 overloads)]


Run the [link asio.reference.io_service `io_service`] object's event processing loop to execute one ready handler. 


  std::size_t 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.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 io_service::poll_one (2 of 2 overloads)]


Run the [link asio.reference.io_service `io_service`] object's event processing loop to execute one ready handler. 


  std::size_t 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_service::post]

[indexterm2 post..io_service] 
(Deprecated: Use [link asio.reference.post `post`].) Request the [link asio.reference.io_service `io_service`] to invoke the given handler and return immediately. 


  template<
      typename ``[link asio.reference.CompletionHandler CompletionHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` post(
      CompletionHandler && handler);


This function is used to ask the [link asio.reference.io_service `io_service`] to execute the given handler, but without allowing the [link asio.reference.io_service `io_service`] to call the handler from inside this function.

The [link asio.reference.io_service `io_service`] 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_service `io_service`] 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_service::reset]

[indexterm2 reset..io_service] 
(Deprecated: Use `restart()`.) Reset the [link asio.reference.io_service `io_service`] 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_service `io_service`] being stopped or running out of work. After a call to `restart()`, the [link asio.reference.io_service `io_service`] 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_service::restart]

[indexterm2 restart..io_service] 
Restart the [link asio.reference.io_service `io_service`] 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_service `io_service`] being stopped or running out of work. After a call to `restart()`, the [link asio.reference.io_service `io_service`] 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_service::run]

[indexterm2 run..io_service] 
Run the [link asio.reference.io_service `io_service`] object's event processing loop. 


  std::size_t ``[link asio.reference.io_service.run.overload1 run]``();
  ``  [''''&raquo;''' [link asio.reference.io_service.run.overload1 more...]]``

  std::size_t ``[link asio.reference.io_service.run.overload2 run]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.io_service.run.overload2 more...]]``


[section:overload1 io_service::run (1 of 2 overloads)]


Run the [link asio.reference.io_service `io_service`] object's event processing loop. 


  std::size_t 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_service `io_service`] has been stopped.

Multiple threads may call the `run()` function to set up a pool of threads from which the [link asio.reference.io_service `io_service`] may execute handlers. All threads that are waiting in the pool are equivalent and the [link asio.reference.io_service `io_service`] may choose any one of them to invoke a handler.

A normal exit from the `run()` function implies that the [link asio.reference.io_service `io_service`] 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 Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
The `run()` function must not be called from a thread that is currently calling one of `run()`, `run_one()`, `poll()` or `poll_one()` on the same [link asio.reference.io_service `io_service`] object.

The `poll()` function may also be used to dispatch ready handlers, but without blocking. 


[endsect]



[section:overload2 io_service::run (2 of 2 overloads)]


Run the [link asio.reference.io_service `io_service`] object's event processing loop. 


  std::size_t 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_service `io_service`] has been stopped.

Multiple threads may call the `run()` function to set up a pool of threads from which the [link asio.reference.io_service `io_service`] may execute handlers. All threads that are waiting in the pool are equivalent and the [link asio.reference.io_service `io_service`] may choose any one of them to invoke a handler.

A normal exit from the `run()` function implies that the [link asio.reference.io_service `io_service`] 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]
      
The `run()` function must not be called from a thread that is currently calling one of `run()`, `run_one()`, `poll()` or `poll_one()` on the same [link asio.reference.io_service `io_service`] object.

The `poll()` function may also be used to dispatch ready handlers, but without blocking. 


[endsect]


[endsect]

[section:run_one io_service::run_one]

[indexterm2 run_one..io_service] 
Run the [link asio.reference.io_service `io_service`] object's event processing loop to execute at most one handler. 


  std::size_t ``[link asio.reference.io_service.run_one.overload1 run_one]``();
  ``  [''''&raquo;''' [link asio.reference.io_service.run_one.overload1 more...]]``

  std::size_t ``[link asio.reference.io_service.run_one.overload2 run_one]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.io_service.run_one.overload2 more...]]``


[section:overload1 io_service::run_one (1 of 2 overloads)]


Run the [link asio.reference.io_service `io_service`] object's event processing loop to execute at most one handler. 


  std::size_t run_one();


The `run_one()` function blocks until one handler has been dispatched, or until the [link asio.reference.io_service `io_service`] has been stopped.


[heading Return Value]
      
The number of handlers that were executed. A zero return value implies that the [link asio.reference.io_service `io_service`] 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 Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload2 io_service::run_one (2 of 2 overloads)]


Run the [link asio.reference.io_service `io_service`] object's event processing loop to execute at most one handler. 


  std::size_t run_one(
      asio::error_code & ec);


The `run_one()` function blocks until one handler has been dispatched, or until the [link asio.reference.io_service `io_service`] has been stopped.


[heading Return Value]
      
The number of handlers that were executed. A zero return value implies that the [link asio.reference.io_service `io_service`] 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. 




[endsect]


[endsect]


[section:shutdown_context io_service::shutdown_context]


['Inherited from execution_context.]

[indexterm2 shutdown_context..io_service] 
Shuts down all services in the context. 


  void shutdown_context();


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_service()`. 




[endsect]



[section:stop io_service::stop]

[indexterm2 stop..io_service] 
Stop the [link asio.reference.io_service `io_service`] object's event processing loop. 


  void stop();


This function does not block, but instead simply signals the [link asio.reference.io_service `io_service`] 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_service::stopped]

[indexterm2 stopped..io_service] 
Determine whether the [link asio.reference.io_service `io_service`] object has been stopped. 


  bool stopped() const;


This function is used to determine whether an [link asio.reference.io_service `io_service`] object has been stopped, either through an explicit call to `stop()`, or due to running out of work. When an [link asio.reference.io_service `io_service`] 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_service `io_service`] object is stopped, otherwise `false`. 




[endsect]


[section:use_service io_service::use_service]

[indexterm2 use_service..io_service] 

  template<
      typename ``[link asio.reference.Service Service]``>
  friend Service & ``[link asio.reference.io_service.use_service.overload1 use_service]``(
      io_service & ios);
  ``  [''''&raquo;''' [link asio.reference.io_service.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_service.use_service.overload2 use_service]``(
      execution_context & e);
  ``  [''''&raquo;''' [link asio.reference.io_service.use_service.overload2 more...]]``


[section:overload1 io_service::use_service (1 of 2 overloads)]



  template<
      typename ``[link asio.reference.Service Service]``>
  friend Service & use_service(
      io_service & ios);


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_service `io_service`] will create a new instance of the service.


[heading Parameters]
    

[variablelist
  
[[ios][The [link asio.reference.io_service `io_service`] 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_service__service `io_service::service`]. 



[heading Requirements]

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

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


[endsect]



[section:overload2 io_service::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_service.hpp]

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


[endsect]


[endsect]


[section:wrap io_service::wrap]

[indexterm2 wrap..io_service] 
(Deprecated: Use [link asio.reference.wrap `wrap`].) Create a new handler that automatically dispatches the wrapped handler on the [link asio.reference.io_service `io_service`]. 


  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_service `io_service`] object's dispatch function.


[heading Parameters]
    

[variablelist
  
[[handler][The handler to be wrapped. The [link asio.reference.io_service `io_service`] 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_service `io_service`] 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_service.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_service.dispatch(boost::bind(f, a1, ... an)); 







[endsect]



[section:_io_service io_service::~io_service]

[indexterm2 ~io_service..io_service] 
Destructor. 


  ~io_service();


On destruction, the [link asio.reference.io_service `io_service`] performs the following sequence of operations:


* For each service object `svc` in the [link asio.reference.io_service `io_service`] set, in reverse order of the beginning of service object lifetime, performs `svc->shutdown_service()`.


* Uninvoked handler objects that were scheduled for deferred invocation on the [link asio.reference.io_service `io_service`], or any associated strand, are destroyed.


* For each service object `svc` in the [link asio.reference.io_service `io_service`] set, in reverse order of the beginning of service object lifetime, performs `delete static_cast<io_service::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_service `io_service`] function `stop()` is called to terminate any `run()` calls as soon as possible. The [link asio.reference.io_service `io_service`] destructor defined above destroys all handlers, causing all `shared_ptr` references to all connection objects to be destroyed. 




[endsect]



[endsect]

[section:io_service__executor_type io_service::executor_type]


Executor used to submit functions to an [link asio.reference.io_service `io_service`]. 


  class executor_type


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

  [
    [[link asio.reference.io_service__executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.defer [*defer]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.dispatch [*dispatch]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_finished [*on_work_finished]]]
    [Inform the io_service that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_started [*on_work_started]]]
    [Inform the io_service that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.post [*post]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the io_service is running in the current thread. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_service__executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]

[heading Requirements]

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

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


[section:context io_service::executor_type::context]

[indexterm2 context..io_service::executor_type] 
Obtain the underlying execution context. 


  io_service & context();



[endsect]



[section:defer io_service::executor_type::defer]

[indexterm2 defer..io_service::executor_type] 
Request the [link asio.reference.io_service `io_service`] to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void defer(
      Function && f,
      const Allocator & a);


This function is used to ask the [link asio.reference.io_service `io_service`] 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_service `io_service`].

If the current thread belongs to the [link asio.reference.io_service `io_service`], `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_service::executor_type::dispatch]

[indexterm2 dispatch..io_service::executor_type] 
Request the [link asio.reference.io_service `io_service`] to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void dispatch(
      Function && f,
      const Allocator & a);


This function is used to ask the [link asio.reference.io_service `io_service`] to execute the given function object. If the current thread is running the [link asio.reference.io_service `io_service`], `dispatch()` executes the function before returning. Otherwise, the function will be scheduled to run on the [link asio.reference.io_service `io_service`].


[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:on_work_finished io_service::executor_type::on_work_finished]

[indexterm2 on_work_finished..io_service::executor_type] 
Inform the [link asio.reference.io_service `io_service`] that some work is no longer outstanding. 


  void on_work_finished();


This function is used to inform the [link asio.reference.io_service `io_service`] that some work has finished. Once the count of unfinished work reaches zero, the [link asio.reference.io_service `io_service`] is stopped and the `run()` and `run_one()` functions may exit. 


[endsect]



[section:on_work_started io_service::executor_type::on_work_started]

[indexterm2 on_work_started..io_service::executor_type] 
Inform the [link asio.reference.io_service `io_service`] that it has some outstanding work to do. 


  void on_work_started();


This function is used to inform the [link asio.reference.io_service `io_service`] that some work has begun. This ensures that the io\_service's `run()` and `run_one()` functions do not exit while the work is underway. 


[endsect]



[section:operator_not__eq_ io_service::executor_type::operator!=]

[indexterm2 operator!=..io_service::executor_type] 
Compare two executors for inequality. 


  friend bool operator!=(
      const executor_type & a,
      const executor_type & b);


Two executors are equal if they refer to the same underlying [link asio.reference.io_service `io_service`]. 

[heading Requirements]

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

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


[endsect]



[section:operator_eq__eq_ io_service::executor_type::operator==]

[indexterm2 operator==..io_service::executor_type] 
Compare two executors for equality. 


  friend bool operator==(
      const executor_type & a,
      const executor_type & b);


Two executors are equal if they refer to the same underlying [link asio.reference.io_service `io_service`]. 

[heading Requirements]

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

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


[endsect]



[section:post io_service::executor_type::post]

[indexterm2 post..io_service::executor_type] 
Request the [link asio.reference.io_service `io_service`] to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void post(
      Function && f,
      const Allocator & a);


This function is used to ask the [link asio.reference.io_service `io_service`] 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_service `io_service`].


[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:running_in_this_thread io_service::executor_type::running_in_this_thread]

[indexterm2 running_in_this_thread..io_service::executor_type] 
Determine whether the [link asio.reference.io_service `io_service`] 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_service `io_service`]. Otherwise returns `false`. 




[endsect]



[endsect]

[section:io_service__service io_service::service]


Base class for all [link asio.reference.io_service `io_service`] services. 


  class service


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

  [
    [[link asio.reference.io_service__service.get_io_service [*get_io_service]]]
    [Get the io_service object that owns the service. ]
  ]
  
]

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

  [
    [[link asio.reference.io_service__service.service [*service]]]
    [Constructor. ]
  ]
  
  [
    [[link asio.reference.io_service__service._service [*~service]]]
    [Destructor. ]
  ]
  
]

[heading Requirements]

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

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


[section:get_io_service io_service::service::get_io_service]

[indexterm2 get_io_service..io_service::service] 
Get the [link asio.reference.io_service `io_service`] object that owns the service. 


  asio::io_service & get_io_service();



[endsect]



[section:service io_service::service::service]

[indexterm2 service..io_service::service] 
Constructor. 


  service(
      asio::io_service & owner);



[heading Parameters]
    

[variablelist
  
[[owner][The [link asio.reference.io_service `io_service`] object that owns the service. ]]

]




[endsect]



[section:_service io_service::service::~service]

[indexterm2 ~service..io_service::service] 
Destructor. 


  virtual ~service();



[endsect]



[endsect]

[section:io_service__strand io_service::strand]


Provides serialised handler execution. 


  class strand


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

  [
    [[link asio.reference.io_service__strand.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_service__strand.defer [*defer]]]
    [Request the strand to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__strand.dispatch [*dispatch]]]
    [Request the strand to invoke the given function object. 

     (Deprecated: Use asio::dispatch().) Request the strand to invoke the given handler. ]
  ]
  
  [
    [[link asio.reference.io_service__strand.get_io_service [*get_io_service]]]
    [(Deprecated: Use context().) Get the io_service associated with the strand. ]
  ]
  
  [
    [[link asio.reference.io_service__strand.on_work_finished [*on_work_finished]]]
    [Inform the strand that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_service__strand.on_work_started [*on_work_started]]]
    [Inform the strand that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_service__strand.post [*post]]]
    [Request the strand to invoke the given function object. 

     (Deprecated: Use asio::post().) Request the strand to invoke the given handler and return immediately. ]
  ]
  
  [
    [[link asio.reference.io_service__strand.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the strand is running in the current thread. ]
  ]
  
  [
    [[link asio.reference.io_service__strand.strand [*strand]]]
    [Constructor. ]
  ]
  
  [
    [[link asio.reference.io_service__strand.wrap [*wrap]]]
    [(Deprecated: Use asio::wrap().) Create a new handler that automatically dispatches the wrapped handler on the strand. ]
  ]
  
  [
    [[link asio.reference.io_service__strand._strand [*~strand]]]
    [Destructor. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_service__strand.operator_not__eq_ [*operator!=]]]
    [Compare two strands for inequality. ]
  ]
  
  [
    [[link asio.reference.io_service__strand.operator_eq__eq_ [*operator==]]]
    [Compare two strands for equality. ]
  ]
  
]

The [link asio.reference.io_service__strand `io_service::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_service_strand.hpp]

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


[section:context io_service::strand::context]

[indexterm2 context..io_service::strand] 
Obtain the underlying execution context. 


  asio::io_service & context();



[endsect]



[section:defer io_service::strand::defer]

[indexterm2 defer..io_service::strand] 
Request the strand to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void defer(
      Function && f,
      const Allocator & a);


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_service `io_service`].


[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_service::strand::dispatch]

[indexterm2 dispatch..io_service::strand] 
Request the strand to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void ``[link asio.reference.io_service__strand.dispatch.overload1 dispatch]``(
      Function && f,
      const Allocator & a);
  ``  [''''&raquo;''' [link asio.reference.io_service__strand.dispatch.overload1 more...]]``


(Deprecated: Use [link asio.reference.dispatch `dispatch`].) Request the strand to invoke the given handler. 


  template<
      typename ``[link asio.reference.CompletionHandler CompletionHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.io_service__strand.dispatch.overload2 dispatch]``(
      CompletionHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.io_service__strand.dispatch.overload2 more...]]``


[section:overload1 io_service::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);


This function is used to ask the strand to execute the given function object on its underlying [link asio.reference.io_service `io_service`]. The function object will be executed inside this function if the strand is not otherwise busy and if the underlying io\_service'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_service::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.CompletionHandler CompletionHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` dispatch(
      CompletionHandler && 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_service `io_service`]. The [link asio.reference.io_service `io_service`] guarantees that the handler will only be called in a thread in which the io\_service'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:get_io_service io_service::strand::get_io_service]

[indexterm2 get_io_service..io_service::strand] 
(Deprecated: Use `context()`.) Get the [link asio.reference.io_service `io_service`] associated with the strand. 


  asio::io_service & get_io_service();


This function may be used to obtain the [link asio.reference.io_service `io_service`] object that the strand uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_service `io_service`] object that the strand will use to dispatch handlers. Ownership is not transferred to the caller. 




[endsect]



[section:on_work_finished io_service::strand::on_work_finished]

[indexterm2 on_work_finished..io_service::strand] 
Inform the strand that some work is no longer outstanding. 


  void on_work_finished();


The strand delegates this call to its underlying [link asio.reference.io_service `io_service`]. 


[endsect]



[section:on_work_started io_service::strand::on_work_started]

[indexterm2 on_work_started..io_service::strand] 
Inform the strand that it has some outstanding work to do. 


  void on_work_started();


The strand delegates this call to its underlying [link asio.reference.io_service `io_service`]. 


[endsect]



[section:operator_not__eq_ io_service::strand::operator!=]

[indexterm2 operator!=..io_service::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_service_strand.hpp]

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


[endsect]



[section:operator_eq__eq_ io_service::strand::operator==]

[indexterm2 operator==..io_service::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_service_strand.hpp]

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


[endsect]


[section:post io_service::strand::post]

[indexterm2 post..io_service::strand] 
Request the strand to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void ``[link asio.reference.io_service__strand.post.overload1 post]``(
      Function && f,
      const Allocator & a);
  ``  [''''&raquo;''' [link asio.reference.io_service__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.CompletionHandler CompletionHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.io_service__strand.post.overload2 post]``(
      CompletionHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.io_service__strand.post.overload2 more...]]``


[section:overload1 io_service::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);


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_service `io_service`].


[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_service::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.CompletionHandler CompletionHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` post(
      CompletionHandler && 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_service `io_service`]. The [link asio.reference.io_service `io_service`] guarantees that the handler will only be called in a thread in which the io\_service'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_service::strand::running_in_this_thread]

[indexterm2 running_in_this_thread..io_service::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_service::strand::strand]

[indexterm2 strand..io_service::strand] 
Constructor. 


  strand(
      asio::io_service & io_service);


Constructs the strand.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the strand will use to dispatch handlers that are ready to be run. ]]

]




[endsect]



[section:wrap io_service::strand::wrap]

[indexterm2 wrap..io_service::strand] 
(Deprecated: Use [link asio.reference.wrap `wrap`].) 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_service::strand::~strand]

[indexterm2 ~strand..io_service::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_service__work io_service::work]


(Deprecated: Use [link asio.reference.executor_work `executor_work`].) Class to inform the [link asio.reference.io_service `io_service`] when it has work to do. 


  class work


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

  [
    [[link asio.reference.io_service__work.get_io_service [*get_io_service]]]
    [Get the io_service associated with the work. ]
  ]
  
  [
    [[link asio.reference.io_service__work.work [*work]]]
    [Constructor notifies the io_service that work is starting. 

     Copy constructor notifies the io_service that work is starting. ]
  ]
  
  [
    [[link asio.reference.io_service__work._work [*~work]]]
    [Destructor notifies the io_service that the work is complete. ]
  ]
  
]

The work class is used to inform the [link asio.reference.io_service `io_service`] when work starts and finishes. This ensures that the [link asio.reference.io_service `io_service`] 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_service.hpp]

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


[section:get_io_service io_service::work::get_io_service]

[indexterm2 get_io_service..io_service::work] 
Get the [link asio.reference.io_service `io_service`] associated with the work. 


  asio::io_service & get_io_service();



[endsect]


[section:work io_service::work::work]

[indexterm2 work..io_service::work] 
Constructor notifies the [link asio.reference.io_service `io_service`] that work is starting. 


  explicit ``[link asio.reference.io_service__work.work.overload1 work]``(
      asio::io_service & io_service);
  ``  [''''&raquo;''' [link asio.reference.io_service__work.work.overload1 more...]]``


Copy constructor notifies the [link asio.reference.io_service `io_service`] that work is starting. 


  ``[link asio.reference.io_service__work.work.overload2 work]``(
      const work & other);
  ``  [''''&raquo;''' [link asio.reference.io_service__work.work.overload2 more...]]``


[section:overload1 io_service::work::work (1 of 2 overloads)]


Constructor notifies the [link asio.reference.io_service `io_service`] that work is starting. 


  work(
      asio::io_service & io_service);


The constructor is used to inform the [link asio.reference.io_service `io_service`] that some work has begun. This ensures that the [link asio.reference.io_service `io_service`] object's `run()` function will not exit while the work is underway. 


[endsect]



[section:overload2 io_service::work::work (2 of 2 overloads)]


Copy constructor notifies the [link asio.reference.io_service `io_service`] that work is starting. 


  work(
      const work & other);


The constructor is used to inform the [link asio.reference.io_service `io_service`] that some work has begun. This ensures that the [link asio.reference.io_service `io_service`] object's `run()` function will not exit while the work is underway. 


[endsect]


[endsect]


[section:_work io_service::work::~work]

[indexterm2 ~work..io_service::work] 
Destructor notifies the [link asio.reference.io_service `io_service`] that the work is complete. 


  ~work();


The destructor is used to inform the [link asio.reference.io_service `io_service`] that some work has finished. Once the count of unfinished work reaches zero, the [link asio.reference.io_service `io_service`] object's `run()` function is permitted to exit. 


[endsect]



[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]]]
    [Default constructor. 

     Construct an address from an IPv4 address. 

     Construct an address from an IPv6 address. 

     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__address.from_string [*from_string]]]
    [(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. 

     Assign from an IPv4 address. 

     Assign from an IPv6 address. ]
  ]
  
  [
    [[link asio.reference.ip__address.to_string [*to_string]]]
    [Get the address as a string in dotted decimal format. ]
  ]
  
  [
    [[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 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 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 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 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 is_unspecified..ip::address] 
Determine whether the address is unspecified. 


  bool is_unspecified() const;



[endsect]



[section:is_v4 ip::address::is_v4]

[indexterm2 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 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 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...]]``


[section:overload1 ip::address::make_address (1 of 4 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 4 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 4 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 4 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]


[endsect]


[section:operator_not__eq_ ip::address::operator!=]

[indexterm2 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 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 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 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 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 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 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 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 to_string..ip::address] 
Get the address as a string in dotted decimal format. 


  std::string ``[link asio.reference.ip__address.to_string.overload1 to_string]``() const;
  ``  [''''&raquo;''' [link asio.reference.ip__address.to_string.overload1 more...]]``

  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 in dotted decimal format. 


  std::string to_string() const;



[endsect]



[section:overload2 ip::address::to_string (2 of 2 overloads)]


Get the address as a string in dotted decimal format. 


  std::string to_string(
      asio::error_code & ec) const;



[endsect]


[endsect]


[section:to_v4 ip::address::to_v4]

[indexterm2 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 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_cast ip::address_cast]

[indexterm1 ip::address_cast] 
Cast a version-independent address to itself. 

    
  template<
      typename T>
  T ``[link asio.reference.ip__address_cast.overload1 address_cast]``(
      const address & addr,
      typename enable_if< is_same< T, address >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.ip__address_cast.overload1 more...]]``

  template<
      typename T>
  T ``[link asio.reference.ip__address_cast.overload2 address_cast]``(
      const address & addr,
      typename enable_if< is_same< T, address_v4 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.ip__address_cast.overload2 more...]]``

  template<
      typename T>
  T ``[link asio.reference.ip__address_cast.overload3 address_cast]``(
      const address & addr,
      typename enable_if< is_same< T, address_v6 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.ip__address_cast.overload3 more...]]``

  template<
      typename T>
  T ``[link asio.reference.ip__address_cast.overload4 address_cast]``(
      const address_v4 & addr,
      typename enable_if< is_same< T, address >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.ip__address_cast.overload4 more...]]``

  template<
      typename T>
  T ``[link asio.reference.ip__address_cast.overload5 address_cast]``(
      const address_v4 & addr,
      typename enable_if< is_same< T, address_v4 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.ip__address_cast.overload5 more...]]``

  template<
      typename T>
  bad_address_cast ``[link asio.reference.ip__address_cast.overload6 address_cast]``(
      const address_v4 & ,
      typename enable_if< is_same< T, address_v6 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.ip__address_cast.overload6 more...]]``

  template<
      typename T>
  T ``[link asio.reference.ip__address_cast.overload7 address_cast]``(
      const address_v6 & addr,
      typename enable_if< is_same< T, address >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.ip__address_cast.overload7 more...]]``

  template<
      typename T>
  T ``[link asio.reference.ip__address_cast.overload8 address_cast]``(
      const address_v6 & addr,
      typename enable_if< is_same< T, address_v6 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.ip__address_cast.overload8 more...]]``

  template<
      typename T>
  bad_address_cast ``[link asio.reference.ip__address_cast.overload9 address_cast]``(
      const address_v6 & ,
      typename enable_if< is_same< T, address_v4 >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.ip__address_cast.overload9 more...]]``

[heading Requirements]

['Header: ][^asio/ip/address.hpp]

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


[section:overload1 ip::address_cast (1 of 9 overloads)]


Cast a version-independent address to itself. 


  template<
      typename T>
  T address_cast(
      const address & addr,
      typename enable_if< is_same< T, address >::value >::type *  = 0);



[endsect]



[section:overload2 ip::address_cast (2 of 9 overloads)]


Cast a version-independent address to an IPv4 address. 


  template<
      typename T>
  T address_cast(
      const address & addr,
      typename enable_if< is_same< T, address_v4 >::value >::type *  = 0);



[heading Exceptions]
    

[variablelist
  
[[bad_address_cast][if `a` does not represent an IPv4 address. ]]

]




[endsect]



[section:overload3 ip::address_cast (3 of 9 overloads)]


Cast a version-independent address to an IPv6 address. 


  template<
      typename T>
  T address_cast(
      const address & addr,
      typename enable_if< is_same< T, address_v6 >::value >::type *  = 0);



[heading Exceptions]
    

[variablelist
  
[[bad_address_cast][if `a` does not represent an IPv6 address. ]]

]




[endsect]



[section:overload4 ip::address_cast (4 of 9 overloads)]


Cast an IPv4 address to a version-independent address. 


  template<
      typename T>
  T address_cast(
      const address_v4 & addr,
      typename enable_if< is_same< T, address >::value >::type *  = 0);



[endsect]



[section:overload5 ip::address_cast (5 of 9 overloads)]


Cast an IPv4 address to itself. 


  template<
      typename T>
  T address_cast(
      const address_v4 & addr,
      typename enable_if< is_same< T, address_v4 >::value >::type *  = 0);



[endsect]



[section:overload6 ip::address_cast (6 of 9 overloads)]


Cast from IPv4 to IPV6 address is not permitted. 


  template<
      typename T>
  bad_address_cast address_cast(
      const address_v4 & ,
      typename enable_if< is_same< T, address_v6 >::value >::type *  = 0);



[endsect]



[section:overload7 ip::address_cast (7 of 9 overloads)]


Cast an IPv6 address to a version-independent address. 


  template<
      typename T>
  T address_cast(
      const address_v6 & addr,
      typename enable_if< is_same< T, address >::value >::type *  = 0);



[endsect]



[section:overload8 ip::address_cast (8 of 9 overloads)]


Cast an IPv6 address to itself. 


  template<
      typename T>
  T address_cast(
      const address_v6 & addr,
      typename enable_if< is_same< T, address_v6 >::value >::type *  = 0);



[endsect]



[section:overload9 ip::address_cast (9 of 9 overloads)]


Cast from IPv6 to IPv4 address is not permitted. 


  template<
      typename T>
  bad_address_cast address_cast(
      const address_v6 & ,
      typename enable_if< is_same< T, address_v4 >::value >::type *  = 0);



[endsect]


[endsect]

[section:ip__address_iterator_v4 ip::address_iterator_v4]


An input iterator that can be used for traversing IPv4 addresses. 


  class address_iterator_v4


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

  [

    [[link asio.reference.ip__address_iterator_v4.difference_type [*difference_type]]]
    [Distance between two iterators. ]
  
  ]

  [

    [[link asio.reference.ip__address_iterator_v4.iterator_category [*iterator_category]]]
    [Denotes that the iterator satisfies the input iterator requirements. ]
  
  ]

  [

    [[link asio.reference.ip__address_iterator_v4.pointer [*pointer]]]
    [The type of a pointer to an element pointed to by the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__address_iterator_v4.reference [*reference]]]
    [The type of a reference to an element pointed to by the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__address_iterator_v4.value_type [*value_type]]]
    [The type of the elements pointed to by the iterator. ]
  
  ]

]

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

  [
    [[link asio.reference.ip__address_iterator_v4.address_iterator_v4 [*address_iterator_v4]]]
    [Construct an iterator that points to the specified address. 

     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v4.operator__star_ [*operator *]]]
    [Dereference the iterator. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v4.operator_plus__plus_ [*operator++]]]
    [Pre-increment operator. 

     Post-increment operator. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v4.operator_minus__minus_ [*operator--]]]
    [Pre-decrement operator. 

     Post-decrement operator. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v4.operator_arrow_ [*operator->]]]
    [Dereference the iterator. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v4.operator_eq_ [*operator=]]]
    [Assignment operator. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address_iterator_v4.operator_not__eq_ [*operator!=]]]
    [Compare two addresses for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v4.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_iterator_v4.hpp]

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

[section:address_iterator_v4 ip::address_iterator_v4::address_iterator_v4]

[indexterm2 address_iterator_v4..ip::address_iterator_v4] 
Construct an iterator that points to the specified address. 


  ``[link asio.reference.ip__address_iterator_v4.address_iterator_v4.overload1 address_iterator_v4]``(
      const address_v4 & addr);
  ``  [''''&raquo;''' [link asio.reference.ip__address_iterator_v4.address_iterator_v4.overload1 more...]]``


Copy constructor. 


  ``[link asio.reference.ip__address_iterator_v4.address_iterator_v4.overload2 address_iterator_v4]``(
      const address_iterator_v4 & other);
  ``  [''''&raquo;''' [link asio.reference.ip__address_iterator_v4.address_iterator_v4.overload2 more...]]``


[section:overload1 ip::address_iterator_v4::address_iterator_v4 (1 of 2 overloads)]


Construct an iterator that points to the specified address. 


  address_iterator_v4(
      const address_v4 & addr);



[endsect]



[section:overload2 ip::address_iterator_v4::address_iterator_v4 (2 of 2 overloads)]


Copy constructor. 


  address_iterator_v4(
      const address_iterator_v4 & other);



[endsect]


[endsect]


[section:difference_type ip::address_iterator_v4::difference_type]

[indexterm2 difference_type..ip::address_iterator_v4] 
Distance between two iterators. 


  typedef std::ptrdiff_t difference_type;



[heading Requirements]

['Header: ][^asio/ip/address_iterator_v4.hpp]

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


[endsect]



[section:iterator_category ip::address_iterator_v4::iterator_category]

[indexterm2 iterator_category..ip::address_iterator_v4] 
Denotes that the iterator satisfies the input iterator requirements. 


  typedef std::input_iterator_tag iterator_category;



[heading Requirements]

['Header: ][^asio/ip/address_iterator_v4.hpp]

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


[endsect]



[section:operator__star_ ip::address_iterator_v4::operator *]

[indexterm2 operator *..ip::address_iterator_v4] 
Dereference the iterator. 


  const address_v4 & operator *() const;



[endsect]



[section:operator_not__eq_ ip::address_iterator_v4::operator!=]

[indexterm2 operator!=..ip::address_iterator_v4] 
Compare two addresses for inequality. 


  friend bool operator!=(
      const address_iterator_v4 & a,
      const address_iterator_v4 & b);


[heading Requirements]

['Header: ][^asio/ip/address_iterator_v4.hpp]

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


[endsect]


[section:operator_plus__plus_ ip::address_iterator_v4::operator++]

[indexterm2 operator++..ip::address_iterator_v4] 
Pre-increment operator. 


  address_iterator_v4 & ``[link asio.reference.ip__address_iterator_v4.operator_plus__plus_.overload1 operator++]``();
  ``  [''''&raquo;''' [link asio.reference.ip__address_iterator_v4.operator_plus__plus_.overload1 more...]]``


Post-increment operator. 


  address_iterator_v4 ``[link asio.reference.ip__address_iterator_v4.operator_plus__plus_.overload2 operator++]``(
      int );
  ``  [''''&raquo;''' [link asio.reference.ip__address_iterator_v4.operator_plus__plus_.overload2 more...]]``


[section:overload1 ip::address_iterator_v4::operator++ (1 of 2 overloads)]


Pre-increment operator. 


  address_iterator_v4 & operator++();



[endsect]



[section:overload2 ip::address_iterator_v4::operator++ (2 of 2 overloads)]


Post-increment operator. 


  address_iterator_v4 operator++(
      int );



[endsect]


[endsect]

[section:operator_minus__minus_ ip::address_iterator_v4::operator--]

[indexterm2 operator--..ip::address_iterator_v4] 
Pre-decrement operator. 


  address_iterator_v4 & ``[link asio.reference.ip__address_iterator_v4.operator_minus__minus_.overload1 operator--]``();
  ``  [''''&raquo;''' [link asio.reference.ip__address_iterator_v4.operator_minus__minus_.overload1 more...]]``


Post-decrement operator. 


  address_iterator_v4 ``[link asio.reference.ip__address_iterator_v4.operator_minus__minus_.overload2 operator--]``(
      int );
  ``  [''''&raquo;''' [link asio.reference.ip__address_iterator_v4.operator_minus__minus_.overload2 more...]]``


[section:overload1 ip::address_iterator_v4::operator-- (1 of 2 overloads)]


Pre-decrement operator. 


  address_iterator_v4 & operator--();



[endsect]



[section:overload2 ip::address_iterator_v4::operator-- (2 of 2 overloads)]


Post-decrement operator. 


  address_iterator_v4 operator--(
      int );



[endsect]


[endsect]


[section:operator_arrow_ ip::address_iterator_v4::operator->]

[indexterm2 operator->..ip::address_iterator_v4] 
Dereference the iterator. 


  const address_v4 * operator->() const;



[endsect]



[section:operator_eq_ ip::address_iterator_v4::operator=]

[indexterm2 operator=..ip::address_iterator_v4] 
Assignment operator. 


  address_iterator_v4 & operator=(
      const address_iterator_v4 & other);



[endsect]



[section:operator_eq__eq_ ip::address_iterator_v4::operator==]

[indexterm2 operator==..ip::address_iterator_v4] 
Compare two addresses for equality. 


  friend bool operator==(
      const address_iterator_v4 & a,
      const address_iterator_v4 & b);


[heading Requirements]

['Header: ][^asio/ip/address_iterator_v4.hpp]

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


[endsect]



[section:pointer ip::address_iterator_v4::pointer]

[indexterm2 pointer..ip::address_iterator_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_iterator_v4.hpp]

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


[endsect]



[section:reference ip::address_iterator_v4::reference]

[indexterm2 reference..ip::address_iterator_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. ]
  
  ]

]

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

  [
    [[link asio.reference.ip__address_v4.address_v4 [*address_v4]]]
    [Default constructor. 

     Construct an address from raw bytes. 

     Construct an address from an unsigned long in host byte order. 

     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.any [*any]]]
    [Obtain an address object that represents any address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.broadcast [*broadcast]]]
    [Obtain an address object that represents the broadcast address. 

     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]]]
    [(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]]]
    [Determine whether the address is a class A address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_class_b [*is_class_b]]]
    [Determine whether the address is a class B address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_class_c [*is_class_c]]]
    [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]]]
    [Obtain an address object that represents the loopback address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.netmask [*netmask]]]
    [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. ]
  ]
  
  [
    [[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 long 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_iterator_v4.hpp]

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


[endsect]



[section:value_type ip::address_iterator_v4::value_type]

[indexterm2 value_type..ip::address_iterator_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. ]
  
  ]

]

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

  [
    [[link asio.reference.ip__address_v4.address_v4 [*address_v4]]]
    [Default constructor. 

     Construct an address from raw bytes. 

     Construct an address from an unsigned long in host byte order. 

     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.any [*any]]]
    [Obtain an address object that represents any address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.broadcast [*broadcast]]]
    [Obtain an address object that represents the broadcast address. 

     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]]]
    [(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]]]
    [Determine whether the address is a class A address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_class_b [*is_class_b]]]
    [Determine whether the address is a class B address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_class_c [*is_class_c]]]
    [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]]]
    [Obtain an address object that represents the loopback address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.netmask [*netmask]]]
    [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. ]
  ]
  
  [
    [[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 long 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_iterator_v4.hpp]

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


[endsect]



[endsect]

[section:ip__address_iterator_v6 ip::address_iterator_v6]


An input iterator that can be used for traversing IPv6 addresses. 


  class address_iterator_v6


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

  [

    [[link asio.reference.ip__address_iterator_v6.difference_type [*difference_type]]]
    [Distance between two iterators. ]
  
  ]

  [

    [[link asio.reference.ip__address_iterator_v6.iterator_category [*iterator_category]]]
    [Denotes that the iterator satisfies the input iterator requirements. ]
  
  ]

  [

    [[link asio.reference.ip__address_iterator_v6.pointer [*pointer]]]
    [The type of a pointer to an element pointed to by the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__address_iterator_v6.reference [*reference]]]
    [The type of a reference to an element pointed to by the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__address_iterator_v6.value_type [*value_type]]]
    [The type of the elements pointed to by the iterator. ]
  
  ]

]

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

  [
    [[link asio.reference.ip__address_iterator_v6.address_iterator_v6 [*address_iterator_v6]]]
    [Construct an iterator that points to the specified address. 

     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v6.operator__star_ [*operator *]]]
    [Dereference the iterator. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v6.operator_plus__plus_ [*operator++]]]
    [Pre-increment operator. 

     Post-increment operator. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v6.operator_minus__minus_ [*operator--]]]
    [Pre-decrement operator. 

     Post-decrement operator. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v6.operator_arrow_ [*operator->]]]
    [Dereference the iterator. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v6.operator_eq_ [*operator=]]]
    [Assignment operator. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address_iterator_v6.operator_not__eq_ [*operator!=]]]
    [Compare two addresses for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v6.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_iterator_v6.hpp]

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

[section:address_iterator_v6 ip::address_iterator_v6::address_iterator_v6]

[indexterm2 address_iterator_v6..ip::address_iterator_v6] 
Construct an iterator that points to the specified address. 


  ``[link asio.reference.ip__address_iterator_v6.address_iterator_v6.overload1 address_iterator_v6]``(
      const address_v6 & addr);
  ``  [''''&raquo;''' [link asio.reference.ip__address_iterator_v6.address_iterator_v6.overload1 more...]]``


Copy constructor. 


  ``[link asio.reference.ip__address_iterator_v6.address_iterator_v6.overload2 address_iterator_v6]``(
      const address_iterator_v6 & other);
  ``  [''''&raquo;''' [link asio.reference.ip__address_iterator_v6.address_iterator_v6.overload2 more...]]``


[section:overload1 ip::address_iterator_v6::address_iterator_v6 (1 of 2 overloads)]


Construct an iterator that points to the specified address. 


  address_iterator_v6(
      const address_v6 & addr);



[endsect]



[section:overload2 ip::address_iterator_v6::address_iterator_v6 (2 of 2 overloads)]


Copy constructor. 


  address_iterator_v6(
      const address_iterator_v6 & other);



[endsect]


[endsect]


[section:difference_type ip::address_iterator_v6::difference_type]

[indexterm2 difference_type..ip::address_iterator_v6] 
Distance between two iterators. 


  typedef std::ptrdiff_t difference_type;



[heading Requirements]

['Header: ][^asio/ip/address_iterator_v6.hpp]

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


[endsect]



[section:iterator_category ip::address_iterator_v6::iterator_category]

[indexterm2 iterator_category..ip::address_iterator_v6] 
Denotes that the iterator satisfies the input iterator requirements. 


  typedef std::input_iterator_tag iterator_category;



[heading Requirements]

['Header: ][^asio/ip/address_iterator_v6.hpp]

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


[endsect]



[section:operator__star_ ip::address_iterator_v6::operator *]

[indexterm2 operator *..ip::address_iterator_v6] 
Dereference the iterator. 


  const address_v6 & operator *() const;



[endsect]



[section:operator_not__eq_ ip::address_iterator_v6::operator!=]

[indexterm2 operator!=..ip::address_iterator_v6] 
Compare two addresses for inequality. 


  friend bool operator!=(
      const address_iterator_v6 & a,
      const address_iterator_v6 & b);


[heading Requirements]

['Header: ][^asio/ip/address_iterator_v6.hpp]

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


[endsect]


[section:operator_plus__plus_ ip::address_iterator_v6::operator++]

[indexterm2 operator++..ip::address_iterator_v6] 
Pre-increment operator. 


  address_iterator_v6 & ``[link asio.reference.ip__address_iterator_v6.operator_plus__plus_.overload1 operator++]``();
  ``  [''''&raquo;''' [link asio.reference.ip__address_iterator_v6.operator_plus__plus_.overload1 more...]]``


Post-increment operator. 


  address_iterator_v6 ``[link asio.reference.ip__address_iterator_v6.operator_plus__plus_.overload2 operator++]``(
      int );
  ``  [''''&raquo;''' [link asio.reference.ip__address_iterator_v6.operator_plus__plus_.overload2 more...]]``


[section:overload1 ip::address_iterator_v6::operator++ (1 of 2 overloads)]


Pre-increment operator. 


  address_iterator_v6 & operator++();



[endsect]



[section:overload2 ip::address_iterator_v6::operator++ (2 of 2 overloads)]


Post-increment operator. 


  address_iterator_v6 operator++(
      int );



[endsect]


[endsect]

[section:operator_minus__minus_ ip::address_iterator_v6::operator--]

[indexterm2 operator--..ip::address_iterator_v6] 
Pre-decrement operator. 


  address_iterator_v6 & ``[link asio.reference.ip__address_iterator_v6.operator_minus__minus_.overload1 operator--]``();
  ``  [''''&raquo;''' [link asio.reference.ip__address_iterator_v6.operator_minus__minus_.overload1 more...]]``


Post-decrement operator. 


  address_iterator_v6 ``[link asio.reference.ip__address_iterator_v6.operator_minus__minus_.overload2 operator--]``(
      int );
  ``  [''''&raquo;''' [link asio.reference.ip__address_iterator_v6.operator_minus__minus_.overload2 more...]]``


[section:overload1 ip::address_iterator_v6::operator-- (1 of 2 overloads)]


Pre-decrement operator. 


  address_iterator_v6 & operator--();



[endsect]



[section:overload2 ip::address_iterator_v6::operator-- (2 of 2 overloads)]


Post-decrement operator. 


  address_iterator_v6 operator--(
      int );



[endsect]


[endsect]


[section:operator_arrow_ ip::address_iterator_v6::operator->]

[indexterm2 operator->..ip::address_iterator_v6] 
Dereference the iterator. 


  const address_v6 * operator->() const;



[endsect]



[section:operator_eq_ ip::address_iterator_v6::operator=]

[indexterm2 operator=..ip::address_iterator_v6] 
Assignment operator. 


  address_iterator_v6 & operator=(
      const address_iterator_v6 & other);



[endsect]



[section:operator_eq__eq_ ip::address_iterator_v6::operator==]

[indexterm2 operator==..ip::address_iterator_v6] 
Compare two addresses for equality. 


  friend bool operator==(
      const address_iterator_v6 & a,
      const address_iterator_v6 & b);


[heading Requirements]

['Header: ][^asio/ip/address_iterator_v6.hpp]

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


[endsect]



[section:pointer ip::address_iterator_v6::pointer]

[indexterm2 pointer..ip::address_iterator_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_iterator_v6.hpp]

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


[endsect]



[section:reference ip::address_iterator_v6::reference]

[indexterm2 reference..ip::address_iterator_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]]]
    [Default constructor. 

     Construct an address from raw bytes and scope ID. 

     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.any [*any]]]
    [Obtain an address object that represents any address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.from_string [*from_string]]]
    [(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]]]
    [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. ]
  ]
  
  [
    [[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]]]
    [(Deprecated: No replacement.) Create an IPv4-compatible IPv6 address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.v4_mapped [*v4_mapped]]]
    [(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_iterator_v6.hpp]

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


[endsect]



[section:value_type ip::address_iterator_v6::value_type]

[indexterm2 value_type..ip::address_iterator_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]]]
    [Default constructor. 

     Construct an address from raw bytes and scope ID. 

     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.any [*any]]]
    [Obtain an address object that represents any address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.from_string [*from_string]]]
    [(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]]]
    [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. ]
  ]
  
  [
    [[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]]]
    [(Deprecated: No replacement.) Create an IPv4-compatible IPv6 address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.v4_mapped [*v4_mapped]]]
    [(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_iterator_v6.hpp]

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


[endsect]



[endsect]

[section:ip__address_range_v4 ip::address_range_v4]


Represents a range of IPv4 addresses. 


  class address_range_v4


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

  [

    [[link asio.reference.ip__address_range_v4.iterator [*iterator]]]
    [The type of an iterator that points into the range. ]
  
  ]

]

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

  [
    [[link asio.reference.ip__address_range_v4.address_range_v4 [*address_range_v4]]]
    [Construct an empty range. 

     Construct an range that represents the given range of addresses. 

     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__address_range_v4.begin [*begin]]]
    [Obtain an iterator that points to the start of the range. ]
  ]
  
  [
    [[link asio.reference.ip__address_range_v4.empty [*empty]]]
    [Determine whether the range is empty. ]
  ]
  
  [
    [[link asio.reference.ip__address_range_v4.end [*end]]]
    [Obtain an iterator that points to the end of the range. ]
  ]
  
  [
    [[link asio.reference.ip__address_range_v4.find [*find]]]
    [Find an address in the range. ]
  ]
  
  [
    [[link asio.reference.ip__address_range_v4.operator_eq_ [*operator=]]]
    [Assignment operator. ]
  ]
  
  [
    [[link asio.reference.ip__address_range_v4.size [*size]]]
    [Return the size of the range. ]
  ]
  
]


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/ip/address_range_v4.hpp]

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

[section:address_range_v4 ip::address_range_v4::address_range_v4]

[indexterm2 address_range_v4..ip::address_range_v4] 
Construct an empty range. 


  ``[link asio.reference.ip__address_range_v4.address_range_v4.overload1 address_range_v4]``();
  ``  [''''&raquo;''' [link asio.reference.ip__address_range_v4.address_range_v4.overload1 more...]]``


Construct an range that represents the given range of addresses. 


  explicit ``[link asio.reference.ip__address_range_v4.address_range_v4.overload2 address_range_v4]``(
      const address_iterator_v4 & first,
      const address_iterator_v4 & last);
  ``  [''''&raquo;''' [link asio.reference.ip__address_range_v4.address_range_v4.overload2 more...]]``


Copy constructor. 


  ``[link asio.reference.ip__address_range_v4.address_range_v4.overload3 address_range_v4]``(
      const address_range_v4 & other);
  ``  [''''&raquo;''' [link asio.reference.ip__address_range_v4.address_range_v4.overload3 more...]]``


[section:overload1 ip::address_range_v4::address_range_v4 (1 of 3 overloads)]


Construct an empty range. 


  address_range_v4();



[endsect]



[section:overload2 ip::address_range_v4::address_range_v4 (2 of 3 overloads)]


Construct an range that represents the given range of addresses. 


  address_range_v4(
      const address_iterator_v4 & first,
      const address_iterator_v4 & last);



[endsect]



[section:overload3 ip::address_range_v4::address_range_v4 (3 of 3 overloads)]


Copy constructor. 


  address_range_v4(
      const address_range_v4 & other);



[endsect]


[endsect]


[section:begin ip::address_range_v4::begin]

[indexterm2 begin..ip::address_range_v4] 
Obtain an iterator that points to the start of the range. 


  iterator begin() const;



[endsect]



[section:empty ip::address_range_v4::empty]

[indexterm2 empty..ip::address_range_v4] 
Determine whether the range is empty. 


  bool empty() const;



[endsect]



[section:end ip::address_range_v4::end]

[indexterm2 end..ip::address_range_v4] 
Obtain an iterator that points to the end of the range. 


  iterator end() const;



[endsect]



[section:find ip::address_range_v4::find]

[indexterm2 find..ip::address_range_v4] 
Find an address in the range. 


  iterator find(
      const address_v4 & addr) const;



[endsect]



[section:iterator ip::address_range_v4::iterator]

[indexterm2 iterator..ip::address_range_v4] 
The type of an iterator that points into the range. 


  typedef address_iterator_v4 iterator;


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

  [

    [[link asio.reference.ip__address_iterator_v4.difference_type [*difference_type]]]
    [Distance between two iterators. ]
  
  ]

  [

    [[link asio.reference.ip__address_iterator_v4.iterator_category [*iterator_category]]]
    [Denotes that the iterator satisfies the input iterator requirements. ]
  
  ]

  [

    [[link asio.reference.ip__address_iterator_v4.pointer [*pointer]]]
    [The type of a pointer to an element pointed to by the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__address_iterator_v4.reference [*reference]]]
    [The type of a reference to an element pointed to by the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__address_iterator_v4.value_type [*value_type]]]
    [The type of the elements pointed to by the iterator. ]
  
  ]

]

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

  [
    [[link asio.reference.ip__address_iterator_v4.address_iterator_v4 [*address_iterator_v4]]]
    [Construct an iterator that points to the specified address. 

     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v4.operator__star_ [*operator *]]]
    [Dereference the iterator. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v4.operator_plus__plus_ [*operator++]]]
    [Pre-increment operator. 

     Post-increment operator. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v4.operator_minus__minus_ [*operator--]]]
    [Pre-decrement operator. 

     Post-decrement operator. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v4.operator_arrow_ [*operator->]]]
    [Dereference the iterator. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v4.operator_eq_ [*operator=]]]
    [Assignment operator. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address_iterator_v4.operator_not__eq_ [*operator!=]]]
    [Compare two addresses for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v4.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_range_v4.hpp]

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


[endsect]



[section:operator_eq_ ip::address_range_v4::operator=]

[indexterm2 operator=..ip::address_range_v4] 
Assignment operator. 


  address_range_v4 & operator=(
      const address_range_v4 & other);



[endsect]



[section:size ip::address_range_v4::size]

[indexterm2 size..ip::address_range_v4] 
Return the size of the range. 


  std::size_t size() const;



[endsect]



[endsect]

[section:ip__address_range_v6 ip::address_range_v6]


Represents a range of IPv6 addresses. 


  class address_range_v6


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

  [

    [[link asio.reference.ip__address_range_v6.iterator [*iterator]]]
    [The type of an iterator that points into the range. ]
  
  ]

]

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

  [
    [[link asio.reference.ip__address_range_v6.address_range_v6 [*address_range_v6]]]
    [Construct an empty range. 

     Construct an range that represents the given range of addresses. 

     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__address_range_v6.begin [*begin]]]
    [Obtain an iterator that points to the start of the range. ]
  ]
  
  [
    [[link asio.reference.ip__address_range_v6.empty [*empty]]]
    [Determine whether the range is empty. ]
  ]
  
  [
    [[link asio.reference.ip__address_range_v6.end [*end]]]
    [Obtain an iterator that points to the end of the range. ]
  ]
  
  [
    [[link asio.reference.ip__address_range_v6.find [*find]]]
    [Find an address in the range. ]
  ]
  
  [
    [[link asio.reference.ip__address_range_v6.operator_eq_ [*operator=]]]
    [Assignment operator. ]
  ]
  
]


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/ip/address_range_v6.hpp]

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

[section:address_range_v6 ip::address_range_v6::address_range_v6]

[indexterm2 address_range_v6..ip::address_range_v6] 
Construct an empty range. 


  ``[link asio.reference.ip__address_range_v6.address_range_v6.overload1 address_range_v6]``();
  ``  [''''&raquo;''' [link asio.reference.ip__address_range_v6.address_range_v6.overload1 more...]]``


Construct an range that represents the given range of addresses. 


  explicit ``[link asio.reference.ip__address_range_v6.address_range_v6.overload2 address_range_v6]``(
      const address_iterator_v6 & first,
      const address_iterator_v6 & last);
  ``  [''''&raquo;''' [link asio.reference.ip__address_range_v6.address_range_v6.overload2 more...]]``


Copy constructor. 


  ``[link asio.reference.ip__address_range_v6.address_range_v6.overload3 address_range_v6]``(
      const address_range_v6 & other);
  ``  [''''&raquo;''' [link asio.reference.ip__address_range_v6.address_range_v6.overload3 more...]]``


[section:overload1 ip::address_range_v6::address_range_v6 (1 of 3 overloads)]


Construct an empty range. 


  address_range_v6();



[endsect]



[section:overload2 ip::address_range_v6::address_range_v6 (2 of 3 overloads)]


Construct an range that represents the given range of addresses. 


  address_range_v6(
      const address_iterator_v6 & first,
      const address_iterator_v6 & last);



[endsect]



[section:overload3 ip::address_range_v6::address_range_v6 (3 of 3 overloads)]


Copy constructor. 


  address_range_v6(
      const address_range_v6 & other);



[endsect]


[endsect]


[section:begin ip::address_range_v6::begin]

[indexterm2 begin..ip::address_range_v6] 
Obtain an iterator that points to the start of the range. 


  iterator begin() const;



[endsect]



[section:empty ip::address_range_v6::empty]

[indexterm2 empty..ip::address_range_v6] 
Determine whether the range is empty. 


  bool empty() const;



[endsect]



[section:end ip::address_range_v6::end]

[indexterm2 end..ip::address_range_v6] 
Obtain an iterator that points to the end of the range. 


  iterator end() const;



[endsect]



[section:find ip::address_range_v6::find]

[indexterm2 find..ip::address_range_v6] 
Find an address in the range. 


  iterator find(
      const address_v6 & addr) const;



[endsect]



[section:iterator ip::address_range_v6::iterator]

[indexterm2 iterator..ip::address_range_v6] 
The type of an iterator that points into the range. 


  typedef address_iterator_v6 iterator;


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

  [

    [[link asio.reference.ip__address_iterator_v6.difference_type [*difference_type]]]
    [Distance between two iterators. ]
  
  ]

  [

    [[link asio.reference.ip__address_iterator_v6.iterator_category [*iterator_category]]]
    [Denotes that the iterator satisfies the input iterator requirements. ]
  
  ]

  [

    [[link asio.reference.ip__address_iterator_v6.pointer [*pointer]]]
    [The type of a pointer to an element pointed to by the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__address_iterator_v6.reference [*reference]]]
    [The type of a reference to an element pointed to by the iterator. ]
  
  ]

  [

    [[link asio.reference.ip__address_iterator_v6.value_type [*value_type]]]
    [The type of the elements pointed to by the iterator. ]
  
  ]

]

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

  [
    [[link asio.reference.ip__address_iterator_v6.address_iterator_v6 [*address_iterator_v6]]]
    [Construct an iterator that points to the specified address. 

     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v6.operator__star_ [*operator *]]]
    [Dereference the iterator. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v6.operator_plus__plus_ [*operator++]]]
    [Pre-increment operator. 

     Post-increment operator. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v6.operator_minus__minus_ [*operator--]]]
    [Pre-decrement operator. 

     Post-decrement operator. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v6.operator_arrow_ [*operator->]]]
    [Dereference the iterator. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v6.operator_eq_ [*operator=]]]
    [Assignment operator. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.ip__address_iterator_v6.operator_not__eq_ [*operator!=]]]
    [Compare two addresses for inequality. ]
  ]
  
  [
    [[link asio.reference.ip__address_iterator_v6.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_range_v6.hpp]

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


[endsect]



[section:operator_eq_ ip::address_range_v6::operator=]

[indexterm2 operator=..ip::address_range_v6] 
Assignment operator. 


  address_range_v6 & operator=(
      const address_range_v6 & other);



[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. ]
  
  ]

]

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

  [
    [[link asio.reference.ip__address_v4.address_v4 [*address_v4]]]
    [Default constructor. 

     Construct an address from raw bytes. 

     Construct an address from an unsigned long in host byte order. 

     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.any [*any]]]
    [Obtain an address object that represents any address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.broadcast [*broadcast]]]
    [Obtain an address object that represents the broadcast address. 

     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]]]
    [(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]]]
    [Determine whether the address is a class A address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_class_b [*is_class_b]]]
    [Determine whether the address is a class B address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.is_class_c [*is_class_c]]]
    [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]]]
    [Obtain an address object that represents the loopback address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v4.netmask [*netmask]]]
    [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. ]
  ]
  
  [
    [[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 long 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 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 long in host byte order. 


  explicit ``[link asio.reference.ip__address_v4.address_v4.overload3 address_v4]``(
      unsigned long 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 long in host byte order. 


  address_v4(
      unsigned long 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 any..ip::address_v4] 
Obtain an address object that represents any address. 


  static address_v4 any();



[endsect]


[section:broadcast ip::address_v4::broadcast]

[indexterm2 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...]]``


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)]


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 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 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 is_class_a..ip::address_v4] 
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 is_class_b..ip::address_v4] 
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 is_class_c..ip::address_v4] 
Determine whether the address is a class C address. 


  bool is_class_c() const;



[endsect]



[section:is_loopback ip::address_v4::is_loopback]

[indexterm2 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 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 is_unspecified..ip::address_v4] 
Determine whether the address is unspecified. 


  bool is_unspecified() const;



[endsect]



[section:loopback ip::address_v4::loopback]

[indexterm2 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 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 long in host byte order. 


  address_v4 ``[link asio.reference.ip__address_v4.make_address_v4.overload2 make_address_v4]``(
      unsigned long 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...]]``


Create an IPv4 address from a IPv4-mapped IPv6 address. 


  address_v4 ``[link asio.reference.ip__address_v4.make_address_v4.overload7 make_address_v4]``(
      v4_mapped_t ,
      const address_v6 & v6_addr);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v4.make_address_v4.overload7 more...]]``


[section:overload1 ip::address_v4::make_address_v4 (1 of 7 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 7 overloads)]


Create an IPv4 address from an unsigned long in host byte order. 


  address_v4 make_address_v4(
      unsigned long addr);



[endsect]



[section:overload3 ip::address_v4::make_address_v4 (3 of 7 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 7 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 7 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 7 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 7 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 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 netmask..ip::address_v4] 
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 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 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 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 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 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 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 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 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 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 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...]]``

  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)]


Get the address as a string in dotted decimal format. 


  std::string to_string(
      asio::error_code & ec) const;



[endsect]


[endsect]


[section:to_ulong ip::address_v4::to_ulong]

[indexterm2 to_ulong..ip::address_v4] 
Get the address as an unsigned long in host byte order. 


  unsigned long to_ulong() const;



[endsect]



[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]]]
    [Default constructor. 

     Construct an address from raw bytes and scope ID. 

     Copy constructor. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.any [*any]]]
    [Obtain an address object that represents any address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.from_string [*from_string]]]
    [(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]]]
    [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. ]
  ]
  
  [
    [[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]]]
    [(Deprecated: No replacement.) Create an IPv4-compatible IPv6 address. ]
  ]
  
  [
    [[link asio.reference.ip__address_v6.v4_mapped [*v4_mapped]]]
    [(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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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...]]``


Create an IPv4-mapped IPv6 address from an IPv4 address. 


  address_v6 ``[link asio.reference.ip__address_v6.make_address_v6.overload6 make_address_v6]``(
      v4_mapped_t ,
      const address_v4 & v4_addr);
  ``  [''''&raquo;''' [link asio.reference.ip__address_v6.make_address_v6.overload6 more...]]``


[section:overload1 ip::address_v6::make_address_v6 (1 of 6 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 6 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 6 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 6 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 6 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 6 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 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 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 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 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 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 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 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 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 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 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 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 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...]]``

  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)]


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 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 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 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__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]]]
    [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. ]
  ]
  
]

[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 bad_address_cast..ip::bad_address_cast] 
Default constructor. 


  bad_address_cast();



[endsect]



[section:what ip::bad_address_cast::what]

[indexterm2 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 ~bad_address_cast..ip::bad_address_cast] 
Destructor. 


  virtual ~bad_address_cast();



[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. 

     Set the IP address associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.basic_endpoint [*basic_endpoint]]]
    [Default constructor. 

     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. 

     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. 

     Copy 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. ]
  ]
  
  [
    [[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. 

     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 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 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...]]``


[section:overload1 ip::basic_endpoint::basic_endpoint (1 of 4 overloads)]


Default constructor. 


  basic_endpoint();



[endsect]



[section:overload2 ip::basic_endpoint::basic_endpoint (2 of 4 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 4 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 4 overloads)]


Copy constructor. 


  basic_endpoint(
      const basic_endpoint & other);



[endsect]


[endsect]


[section:capacity ip::basic_endpoint::capacity]

[indexterm2 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 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 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 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 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 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 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 operator=..ip::basic_endpoint] 
Assign from another endpoint. 


  basic_endpoint & operator=(
      const basic_endpoint & other);



[endsect]



[section:operator_eq__eq_ ip::basic_endpoint::operator==]

[indexterm2 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 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 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 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 protocol..ip::basic_endpoint] 
The protocol associated with the endpoint. 


  protocol_type protocol() const;



[endsect]



[section:protocol_type ip::basic_endpoint::protocol_type]

[indexterm2 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 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 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.ResolverService ResolverService]`` = resolver_service<InternetProtocol>>
  class basic_resolver :
    public basic_io_object< ResolverService >


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.iterator [*iterator]]]
    [The iterator type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.query [*query]]]
    [The query type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.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.ip__basic_resolver.async_resolve [*async_resolve]]]
    [Asynchronously perform forward resolution of a query to a list of entries. 

     Asynchronously perform reverse resolution of an endpoint to a list of entries. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.basic_resolver [*basic_resolver]]]
    [Constructor. ]
  ]
  
  [
    [[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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service associated with the object. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.resolve [*resolve]]]
    [Perform forward resolution of a query to a list of entries. 

     Perform reverse resolution of an endpoint to a list of entries. ]
  ]
  
]

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

  [
    [[link asio.reference.ip__basic_resolver.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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:async_resolve ip::basic_resolver::async_resolve]

[indexterm2 async_resolve..ip::basic_resolver] 
Asynchronously perform forward resolution of a query to a list of entries. 


  template<
      typename ``[link asio.reference.ResolveHandler ResolveHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.ip__basic_resolver.async_resolve.overload1 async_resolve]``(
      const query & q,
      ResolveHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.async_resolve.overload1 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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.ip__basic_resolver.async_resolve.overload2 async_resolve]``(
      const endpoint_type & e,
      ResolveHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.async_resolve.overload2 more...]]``


[section:overload1 ip::basic_resolver::async_resolve (1 of 2 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_resolve(
      const query & q,
      ResolveHandler && handler);


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::iterator iterator             // Forward-only iterator that can
                                             // be used to traverse the list
                                             // of endpoint entries.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`.]]

]


[heading Remarks]
      
A default constructed iterator represents the end of the list.

A successful resolve operation is guaranteed to pass at least one entry to the handler. 


[endsect]



[section:overload2 ip::basic_resolver::async_resolve (2 of 2 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_resolve(
      const endpoint_type & e,
      ResolveHandler && handler);


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::iterator iterator             // Forward-only iterator that can
                                             // be used to traverse the list
                                             // of endpoint entries.
   ); 
``
Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`.]]

]


[heading Remarks]
      
A default constructed iterator represents the end of the list.

A successful resolve operation is guaranteed to pass at least one entry to the handler. 


[endsect]


[endsect]


[section:basic_resolver ip::basic_resolver::basic_resolver]

[indexterm2 basic_resolver..ip::basic_resolver] 
Constructor. 


  basic_resolver(
      asio::io_service & io_service);


This constructor creates a [link asio.reference.ip__basic_resolver `ip::basic_resolver`].


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the resolver will use to dispatch handlers for any asynchronous operations performed on the timer. ]]

]




[endsect]



[section:cancel ip::basic_resolver::cancel]

[indexterm2 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:endpoint_type ip::basic_resolver::endpoint_type]

[indexterm2 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]


['Inherited from basic_io_object.]

[indexterm2 executor_type..ip::basic_resolver] 
The type of the executor associated with the object. 


  typedef asio::io_service::executor_type executor_type;


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

  [
    [[link asio.reference.io_service__executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.defer [*defer]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.dispatch [*dispatch]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_finished [*on_work_finished]]]
    [Inform the io_service that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_started [*on_work_started]]]
    [Inform the io_service that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.post [*post]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the io_service is running in the current thread. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_service__executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[heading Requirements]

['Header: ][^asio/ip/basic_resolver.hpp]

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


[endsect]



[section:get_executor ip::basic_resolver::get_executor]


['Inherited from basic_io_object.]

[indexterm2 get_executor..ip::basic_resolver] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_implementation ip::basic_resolver::get_implementation]

[indexterm2 get_implementation..ip::basic_resolver] 
Get the underlying implementation of the I/O object. 


  implementation_type & ``[link asio.reference.ip__basic_resolver.get_implementation.overload1 get_implementation]``();
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.get_implementation.overload1 more...]]``

  const implementation_type & ``[link asio.reference.ip__basic_resolver.get_implementation.overload2 get_implementation]``() const;
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.get_implementation.overload2 more...]]``


[section:overload1 ip::basic_resolver::get_implementation (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  implementation_type & get_implementation();



[endsect]



[section:overload2 ip::basic_resolver::get_implementation (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  const implementation_type & get_implementation() const;



[endsect]


[endsect]


[section:get_io_service ip::basic_resolver::get_io_service]


['Inherited from basic_io_object.]

[indexterm2 get_io_service..ip::basic_resolver] 
(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();


This function may be used to obtain the [link asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_service `io_service`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 




[endsect]


[section:get_service ip::basic_resolver::get_service]

[indexterm2 get_service..ip::basic_resolver] 
Get the service associated with the I/O object. 


  service_type & ``[link asio.reference.ip__basic_resolver.get_service.overload1 get_service]``();
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.get_service.overload1 more...]]``

  const service_type & ``[link asio.reference.ip__basic_resolver.get_service.overload2 get_service]``() const;
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.get_service.overload2 more...]]``


[section:overload1 ip::basic_resolver::get_service (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  service_type & get_service();



[endsect]



[section:overload2 ip::basic_resolver::get_service (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  const service_type & get_service() const;



[endsect]


[endsect]


[section:implementation_type ip::basic_resolver::implementation_type]


['Inherited from basic_io_object.]

[indexterm2 implementation_type..ip::basic_resolver] 
The underlying implementation type of I/O object. 


  typedef service_type::implementation_type implementation_type;



[heading Requirements]

['Header: ][^asio/ip/basic_resolver.hpp]

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


[endsect]



[section:iterator ip::basic_resolver::iterator]

[indexterm2 iterator..ip::basic_resolver] 
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]]]
    [Default constructor creates an end iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.create [*create]]]
    [Create an iterator from an addrinfo list returned by getaddrinfo. 

     Create an iterator from an endpoint, host name and service name. 

     Create an iterator from a sequence of endpoints, host and service name. ]
  ]
  
  [
    [[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). 

     Increment operator (postfix). ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_arrow_ [*operator->]]]
    [Dereference an iterator. ]
  ]
  
]

[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:protocol_type ip::basic_resolver::protocol_type]

[indexterm2 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 query..ip::basic_resolver] 
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]]]
    [Construct with specified service name for any protocol. 

     Construct with specified service name for a given protocol. 

     Construct with specified host name and service name for any protocol. 

     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]]]
    [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]]]
    [If used with v4_mapped, return all matching IPv6 and IPv4 addresses. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver_query.canonical_name [*canonical_name]]]
    [Determine the canonical name of the host specified in the query. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver_query.numeric_host [*numeric_host]]]
    [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]]]
    [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]]]
    [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]]]
    [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 resolve..ip::basic_resolver] 
Perform forward resolution of a query to a list of entries. 


  iterator ``[link asio.reference.ip__basic_resolver.resolve.overload1 resolve]``(
      const query & q);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.resolve.overload1 more...]]``

  iterator ``[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 reverse resolution of an endpoint to a list of entries. 


  iterator ``[link asio.reference.ip__basic_resolver.resolve.overload3 resolve]``(
      const endpoint_type & e);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.resolve.overload3 more...]]``

  iterator ``[link asio.reference.ip__basic_resolver.resolve.overload4 resolve]``(
      const endpoint_type & e,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.resolve.overload4 more...]]``


[section:overload1 ip::basic_resolver::resolve (1 of 4 overloads)]


Perform forward resolution of a query to a list of entries. 


  iterator 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 forward-only iterator that can be used to traverse the list of endpoint entries.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
A default constructed iterator represents the end of the list.

A successful call to this function is guaranteed to return at least one entry. 


[endsect]



[section:overload2 ip::basic_resolver::resolve (2 of 4 overloads)]


Perform forward resolution of a query to a list of entries. 


  iterator 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 forward-only iterator that can be used to traverse the list of endpoint entries. Returns a default constructed iterator if an error occurs.


[heading Remarks]
      
A default constructed iterator represents the end of the list.

A successful call to this function is guaranteed to return at least one entry. 


[endsect]



[section:overload3 ip::basic_resolver::resolve (3 of 4 overloads)]


Perform reverse resolution of an endpoint to a list of entries. 


  iterator 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 forward-only iterator that can be used to traverse the list of endpoint entries.


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure.]]

]


[heading Remarks]
      
A default constructed iterator represents the end of the list.

A successful call to this function is guaranteed to return at least one entry. 


[endsect]



[section:overload4 ip::basic_resolver::resolve (4 of 4 overloads)]


Perform reverse resolution of an endpoint to a list of entries. 


  iterator 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 forward-only iterator that can be used to traverse the list of endpoint entries. Returns a default constructed iterator if an error occurs.


[heading Remarks]
      
A default constructed iterator represents the end of the list.

A successful call to this function is guaranteed to return at least one entry. 


[endsect]


[endsect]


[section:service_type ip::basic_resolver::service_type]


['Inherited from basic_io_object.]

[indexterm2 service_type..ip::basic_resolver] 
The type of the service that will be used to provide I/O operations. 


  typedef ResolverService service_type;



[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]]]
    [Default constructor. 

     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 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,
      const std::string & host,
      const std::string & 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,
      const std::string & host,
      const std::string & service);



[endsect]


[endsect]


[section:endpoint ip::basic_resolver_entry::endpoint]

[indexterm2 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 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 host_name..ip::basic_resolver_entry] 
Get the host name associated with the entry. 


  std::string host_name() const;



[endsect]



[section:operator_endpoint_type ip::basic_resolver_entry::operator endpoint_type]

[indexterm2 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 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 service_name..ip::basic_resolver_entry] 
Get the service name associated with the entry. 


  std::string service_name() const;



[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]]]
    [Default constructor creates an end iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.create [*create]]]
    [Create an iterator from an addrinfo list returned by getaddrinfo. 

     Create an iterator from an endpoint, host name and service name. 

     Create an iterator from a sequence of endpoints, host and service name. ]
  ]
  
  [
    [[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). 

     Increment operator (postfix). ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_arrow_ [*operator->]]]
    [Dereference an iterator. ]
  ]
  
]

[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 basic_resolver_iterator..ip::basic_resolver_iterator] 
Default constructor creates an end iterator. 


  basic_resolver_iterator();



[endsect]


[section:create ip::basic_resolver_iterator::create]

[indexterm2 create..ip::basic_resolver_iterator] 
Create an iterator from an addrinfo list returned by getaddrinfo. 


  static basic_resolver_iterator ``[link asio.reference.ip__basic_resolver_iterator.create.overload1 create]``(
      asio::detail::addrinfo_type * address_info,
      const std::string & host_name,
      const std::string & service_name);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_iterator.create.overload1 more...]]``


Create an iterator from an endpoint, host name and service name. 


  static basic_resolver_iterator ``[link asio.reference.ip__basic_resolver_iterator.create.overload2 create]``(
      const typename InternetProtocol::endpoint & endpoint,
      const std::string & host_name,
      const std::string & service_name);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_iterator.create.overload2 more...]]``


Create an iterator from a sequence of endpoints, host and service name. 


  template<
      typename EndpointIterator>
  static basic_resolver_iterator ``[link asio.reference.ip__basic_resolver_iterator.create.overload3 create]``(
      EndpointIterator begin,
      EndpointIterator end,
      const std::string & host_name,
      const std::string & service_name);
  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver_iterator.create.overload3 more...]]``


[section:overload1 ip::basic_resolver_iterator::create (1 of 3 overloads)]


Create an iterator from an addrinfo list returned by getaddrinfo. 


  static basic_resolver_iterator create(
      asio::detail::addrinfo_type * address_info,
      const std::string & host_name,
      const std::string & service_name);



[endsect]



[section:overload2 ip::basic_resolver_iterator::create (2 of 3 overloads)]


Create an iterator from an endpoint, host name and service name. 


  static basic_resolver_iterator create(
      const typename InternetProtocol::endpoint & endpoint,
      const std::string & host_name,
      const std::string & service_name);



[endsect]



[section:overload3 ip::basic_resolver_iterator::create (3 of 3 overloads)]


Create an iterator from a sequence of endpoints, host and service name. 


  template<
      typename EndpointIterator>
  static basic_resolver_iterator create(
      EndpointIterator begin,
      EndpointIterator end,
      const std::string & host_name,
      const std::string & service_name);



[endsect]


[endsect]


[section:difference_type ip::basic_resolver_iterator::difference_type]

[indexterm2 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:iterator_category ip::basic_resolver_iterator::iterator_category]

[indexterm2 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 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 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 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 operator->..ip::basic_resolver_iterator] 
Dereference an iterator. 


  const basic_resolver_entry< InternetProtocol > * operator->() const;



[endsect]



[section:operator_eq__eq_ ip::basic_resolver_iterator::operator==]

[indexterm2 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 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 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]]]
    [Default constructor. 

     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 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]]]
    [Default constructor. 

     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]



[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]]]
    [Construct with specified service name for any protocol. 

     Construct with specified service name for a given protocol. 

     Construct with specified host name and service name for any protocol. 

     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]]]
    [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]]]
    [If used with v4_mapped, return all matching IPv6 and IPv4 addresses. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver_query.canonical_name [*canonical_name]]]
    [Determine the canonical name of the host specified in the query. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver_query.numeric_host [*numeric_host]]]
    [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]]]
    [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]]]
    [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]]]
    [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_query_base.]

[indexterm2 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_query_base.]

[indexterm2 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 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_query_base.]

[indexterm2 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_query_base.]

[indexterm2 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 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 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_query_base.]

[indexterm2 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_query_base.]

[indexterm2 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_query_base.]

[indexterm2 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 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 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_query_base.]

[indexterm2 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__host_name ip::host_name]

[indexterm1 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]]]
    [Construct to represent the IPv4 ICMP protocol. ]
  ]
  
  [
    [[link asio.reference.ip__icmp.v6 [*v6]]]
    [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 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. 

     Set the IP address associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.basic_endpoint [*basic_endpoint]]]
    [Default constructor. 

     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. 

     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. 

     Copy 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. ]
  ]
  
  [
    [[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. 

     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 family..ip::icmp] 
Obtain an identifier for the protocol family. 


  int family() const;



[endsect]



[section:operator_not__eq_ ip::icmp::operator!=]

[indexterm2 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 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 protocol..ip::icmp] 
Obtain an identifier for the protocol. 


  int protocol() const;



[endsect]



[section:resolver ip::icmp::resolver]

[indexterm2 resolver..ip::icmp] 
The ICMP resolver type. 


  typedef basic_resolver< icmp > resolver;


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.iterator [*iterator]]]
    [The iterator type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.query [*query]]]
    [The query type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.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.ip__basic_resolver.async_resolve [*async_resolve]]]
    [Asynchronously perform forward resolution of a query to a list of entries. 

     Asynchronously perform reverse resolution of an endpoint to a list of entries. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.basic_resolver [*basic_resolver]]]
    [Constructor. ]
  ]
  
  [
    [[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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service associated with the object. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.resolve [*resolve]]]
    [Perform forward resolution of a query to a list of entries. 

     Perform reverse resolution of an endpoint to a list of entries. ]
  ]
  
]

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

  [
    [[link asio.reference.ip__basic_resolver.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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 socket..ip::icmp] 
The ICMP socket type. 


  typedef basic_raw_socket< icmp > socket;


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_raw_socket without opening it. 

     Construct and open a basic_raw_socket. 

     Construct a basic_raw_socket, opening it and binding it to the given local endpoint. 

     Construct a basic_raw_socket on an existing native socket. 

     Move-construct a basic_raw_socket from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     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. 

     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.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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_raw_socket.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_raw_socket.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_raw_socket.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_raw_socket.message_peek [*message_peek]]]
    [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 type..ip::icmp] 
Obtain an identifier for the type of the protocol. 


  int type() const;



[endsect]



[section:v4 ip::icmp::v4]

[indexterm2 v4..ip::icmp] 
Construct to represent the IPv4 ICMP protocol. 


  static icmp v4();



[endsect]



[section:v6 ip::icmp::v6]

[indexterm2 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 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(io_service); 
   ...
   asio::ip::multicast::enable_loopback option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::ip::multicast::hops option(4);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   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 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(io_service); 
   ...
   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 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(io_service); 
   ...
   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]]]
    [Default constructor. 

     Construct a network based on the specified address and prefix length. 

     Construct network based on the specified address and netmask. 

     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. 

     Create an IPv4 address from an IP address string in dotted decimal form. ]
  ]
  
]

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 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 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 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 hosts..ip::network_v4] 
Obtain an address range corresponding to the hosts in the network. 


  address_range_v4 hosts() const;



[endsect]



[section:is_host ip::network_v4::is_host]

[indexterm2 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 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 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...]]``


Create an IPv4 address from an IP address string in dotted decimal form. 


  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...]]``


[section:overload1 ip::network_v4::make_network_v4 (1 of 4 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 4 overloads)]


Create an IPv4 address from an IP address string in dotted decimal form. 


  network_v4 make_network_v4(
      const char * str,
      asio::error_code & ec);



[endsect]



[section:overload3 ip::network_v4::make_network_v4 (3 of 4 overloads)]


Create an IPv4 address from an IP address string in dotted decimal form. 


  network_v4 make_network_v4(
      const std::string & str);



[endsect]



[section:overload4 ip::network_v4::make_network_v4 (4 of 4 overloads)]


Create an IPv4 address from an IP address string in dotted decimal form. 


  network_v4 make_network_v4(
      const std::string & str,
      asio::error_code & ec);



[endsect]


[endsect]


[section:netmask ip::network_v4::netmask]

[indexterm2 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 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 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 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 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 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 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 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]]]
    [Default constructor. 

     Construct a network based on the specified address and prefix length. 

     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. 

     Create an IPv6 address from an IP address string in dotted decimal form. ]
  ]
  
]

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 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 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 hosts..ip::network_v6] 
Obtain an address range corresponding to the hosts in the network. 


  address_range_v6 hosts() const;



[endsect]



[section:is_host ip::network_v6::is_host]

[indexterm2 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 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 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...]]``


Create an IPv6 address from an IP address string in dotted decimal form. 


  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...]]``


[section:overload1 ip::network_v6::make_network_v6 (1 of 4 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 4 overloads)]


Create an IPv6 address from an IP address string in dotted decimal form. 


  network_v6 make_network_v6(
      const char * str,
      asio::error_code & ec);



[endsect]



[section:overload3 ip::network_v6::make_network_v6 (3 of 4 overloads)]


Create an IPv6 address from an IP address string in dotted decimal form. 


  network_v6 make_network_v6(
      const std::string & str);



[endsect]



[section:overload4 ip::network_v6::make_network_v6 (4 of 4 overloads)]


Create an IPv6 address from an IP address string in dotted decimal form. 


  network_v6 make_network_v6(
      const std::string & str,
      asio::error_code & ec);



[endsect]


[endsect]


[section:network ip::network_v6::network]

[indexterm2 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 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 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 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 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 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 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_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


[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]]]
    [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]]]
    [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]]]
    [If used with v4_mapped, return all matching IPv6 and IPv4 addresses. ]
  ]

  [
    [[link asio.reference.ip__resolver_query_base.canonical_name [*canonical_name]]]
    [Determine the canonical name of the host specified in the query. ]
  ]

  [
    [[link asio.reference.ip__resolver_query_base.numeric_host [*numeric_host]]]
    [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]]]
    [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]]]
    [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]]]
    [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]

[indexterm2 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]

[indexterm2 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]

[indexterm2 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]

[indexterm2 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]

[indexterm2 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]

[indexterm2 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]

[indexterm2 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]

[indexterm2 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 ~resolver_query_base..ip::resolver_query_base] 
Protected destructor to prevent deletion through this type. 


  ~resolver_query_base();



[endsect]



[endsect]

[section:ip__resolver_service ip::resolver_service]


Default service implementation for a resolver. 


  template<
      typename ``[link asio.reference.InternetProtocol InternetProtocol]``>
  class resolver_service :
    public io_service::service


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

  [

    [[link asio.reference.ip__resolver_service.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.ip__resolver_service.implementation_type [*implementation_type]]]
    [The type of a resolver implementation. ]
  
  ]

  [

    [[link asio.reference.ip__resolver_service.iterator_type [*iterator_type]]]
    [The iterator type. ]
  
  ]

  [

    [[link asio.reference.ip__resolver_service.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.ip__resolver_service.query_type [*query_type]]]
    [The query type. ]
  
  ]

]

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

  [
    [[link asio.reference.ip__resolver_service.async_resolve [*async_resolve]]]
    [Asynchronously resolve a query to a list of entries. 

     Asynchronously resolve an endpoint to a list of entries. ]
  ]
  
  [
    [[link asio.reference.ip__resolver_service.cancel [*cancel]]]
    [Cancel pending asynchronous operations. ]
  ]
  
  [
    [[link asio.reference.ip__resolver_service.construct [*construct]]]
    [Construct a new resolver implementation. ]
  ]
  
  [
    [[link asio.reference.ip__resolver_service.destroy [*destroy]]]
    [Destroy a resolver implementation. ]
  ]
  
  [
    [[link asio.reference.ip__resolver_service.get_io_service [*get_io_service]]]
    [Get the io_service object that owns the service. ]
  ]
  
  [
    [[link asio.reference.ip__resolver_service.resolve [*resolve]]]
    [Resolve a query to a list of entries. 

     Resolve an endpoint to a list of entries. ]
  ]
  
  [
    [[link asio.reference.ip__resolver_service.resolver_service [*resolver_service]]]
    [Construct a new resolver service for the specified io_service. ]
  ]
  
]

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

  [
    [[link asio.reference.ip__resolver_service.id [*id]]]
    [The unique service identifier. ]
  ]

]

[heading Requirements]

['Header: ][^asio/ip/resolver_service.hpp]

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

[section:async_resolve ip::resolver_service::async_resolve]

[indexterm2 async_resolve..ip::resolver_service] 
Asynchronously resolve a query to a list of entries. 


  template<
      typename ``[link asio.reference.ResolveHandler ResolveHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.ip__resolver_service.async_resolve.overload1 async_resolve]``(
      implementation_type & impl,
      const query_type & query,
      ResolveHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.ip__resolver_service.async_resolve.overload1 more...]]``


Asynchronously resolve an endpoint to a list of entries. 


  template<
      typename ``[link asio.reference.ResolveHandler ResolveHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.ip__resolver_service.async_resolve.overload2 async_resolve]``(
      implementation_type & impl,
      const endpoint_type & endpoint,
      ResolveHandler && handler);
  ``  [''''&raquo;''' [link asio.reference.ip__resolver_service.async_resolve.overload2 more...]]``


[section:overload1 ip::resolver_service::async_resolve (1 of 2 overloads)]


Asynchronously resolve a query to a list of entries. 


  template<
      typename ``[link asio.reference.ResolveHandler ResolveHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_resolve(
      implementation_type & impl,
      const query_type & query,
      ResolveHandler && handler);



[endsect]



[section:overload2 ip::resolver_service::async_resolve (2 of 2 overloads)]


Asynchronously resolve an endpoint to a list of entries. 


  template<
      typename ``[link asio.reference.ResolveHandler ResolveHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_resolve(
      implementation_type & impl,
      const endpoint_type & endpoint,
      ResolveHandler && handler);



[endsect]


[endsect]


[section:cancel ip::resolver_service::cancel]

[indexterm2 cancel..ip::resolver_service] 
Cancel pending asynchronous operations. 


  void cancel(
      implementation_type & impl);



[endsect]



[section:construct ip::resolver_service::construct]

[indexterm2 construct..ip::resolver_service] 
Construct a new resolver implementation. 


  void construct(
      implementation_type & impl);



[endsect]



[section:destroy ip::resolver_service::destroy]

[indexterm2 destroy..ip::resolver_service] 
Destroy a resolver implementation. 


  void destroy(
      implementation_type & impl);



[endsect]



[section:endpoint_type ip::resolver_service::endpoint_type]

[indexterm2 endpoint_type..ip::resolver_service] 
The endpoint type. 


  typedef InternetProtocol::endpoint endpoint_type;



[heading Requirements]

['Header: ][^asio/ip/resolver_service.hpp]

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


[endsect]



[section:get_io_service ip::resolver_service::get_io_service]


['Inherited from io_service.]

[indexterm2 get_io_service..ip::resolver_service] 
Get the [link asio.reference.io_service `io_service`] object that owns the service. 


  asio::io_service & get_io_service();



[endsect]



[section:id ip::resolver_service::id]

[indexterm2 id..ip::resolver_service] 
The unique service identifier. 


  static asio::io_service::id id;



[endsect]



[section:implementation_type ip::resolver_service::implementation_type]

[indexterm2 implementation_type..ip::resolver_service] 
The type of a resolver implementation. 


  typedef implementation_defined implementation_type;



[heading Requirements]

['Header: ][^asio/ip/resolver_service.hpp]

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


[endsect]



[section:iterator_type ip::resolver_service::iterator_type]

[indexterm2 iterator_type..ip::resolver_service] 
The iterator type. 


  typedef basic_resolver_iterator< InternetProtocol > iterator_type;


[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]]]
    [Default constructor creates an end iterator. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.create [*create]]]
    [Create an iterator from an addrinfo list returned by getaddrinfo. 

     Create an iterator from an endpoint, host name and service name. 

     Create an iterator from a sequence of endpoints, host and service name. ]
  ]
  
  [
    [[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). 

     Increment operator (postfix). ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver_iterator.operator_arrow_ [*operator->]]]
    [Dereference an iterator. ]
  ]
  
]

[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/resolver_service.hpp]

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


[endsect]



[section:protocol_type ip::resolver_service::protocol_type]

[indexterm2 protocol_type..ip::resolver_service] 
The protocol type. 


  typedef InternetProtocol protocol_type;



[heading Requirements]

['Header: ][^asio/ip/resolver_service.hpp]

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


[endsect]



[section:query_type ip::resolver_service::query_type]

[indexterm2 query_type..ip::resolver_service] 
The query type. 


  typedef basic_resolver_query< InternetProtocol > query_type;


[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]]]
    [Construct with specified service name for any protocol. 

     Construct with specified service name for a given protocol. 

     Construct with specified host name and service name for any protocol. 

     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]]]
    [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]]]
    [If used with v4_mapped, return all matching IPv6 and IPv4 addresses. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver_query.canonical_name [*canonical_name]]]
    [Determine the canonical name of the host specified in the query. ]
  ]

  [
    [[link asio.reference.ip__basic_resolver_query.numeric_host [*numeric_host]]]
    [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]]]
    [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]]]
    [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]]]
    [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/resolver_service.hpp]

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


[endsect]


[section:resolve ip::resolver_service::resolve]

[indexterm2 resolve..ip::resolver_service] 
Resolve a query to a list of entries. 


  iterator_type ``[link asio.reference.ip__resolver_service.resolve.overload1 resolve]``(
      implementation_type & impl,
      const query_type & query,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__resolver_service.resolve.overload1 more...]]``


Resolve an endpoint to a list of entries. 


  iterator_type ``[link asio.reference.ip__resolver_service.resolve.overload2 resolve]``(
      implementation_type & impl,
      const endpoint_type & endpoint,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.ip__resolver_service.resolve.overload2 more...]]``


[section:overload1 ip::resolver_service::resolve (1 of 2 overloads)]


Resolve a query to a list of entries. 


  iterator_type resolve(
      implementation_type & impl,
      const query_type & query,
      asio::error_code & ec);



[endsect]



[section:overload2 ip::resolver_service::resolve (2 of 2 overloads)]


Resolve an endpoint to a list of entries. 


  iterator_type resolve(
      implementation_type & impl,
      const endpoint_type & endpoint,
      asio::error_code & ec);



[endsect]


[endsect]


[section:resolver_service ip::resolver_service::resolver_service]

[indexterm2 resolver_service..ip::resolver_service] 
Construct a new resolver service for the specified [link asio.reference.io_service `io_service`]. 


  resolver_service(
      asio::io_service & io_service);



[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]]]
    [Construct to represent the IPv4 TCP protocol. ]
  ]
  
  [
    [[link asio.reference.ip__tcp.v6 [*v6]]]
    [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 acceptor..ip::tcp] 
The TCP acceptor type. 


  typedef basic_socket_acceptor< tcp > acceptor;


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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. 

     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]]]
    [Construct an acceptor without opening it. 

     Construct an open acceptor. 

     Construct an acceptor opened on the given endpoint. 

     Construct a basic_socket_acceptor on an existing native acceptor. 

     Move-construct a basic_socket_acceptor from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     Move-assign a basic_socket_acceptor from an acceptor of another protocol type. ]
  ]
  
  [
    [[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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_socket_acceptor.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_socket_acceptor.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_peek [*message_peek]]]
    [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(io_service);
   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 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. 

     Set the IP address associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.basic_endpoint [*basic_endpoint]]]
    [Default constructor. 

     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. 

     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. 

     Copy 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. ]
  ]
  
  [
    [[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. 

     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 family..ip::tcp] 
Obtain an identifier for the protocol family. 


  int family() const;



[endsect]



[section:iostream ip::tcp::iostream]

[indexterm2 iostream..ip::tcp] 
The TCP iostream type. 


  typedef basic_socket_iostream< tcp > iostream;


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

  [

    [[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.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]]]
    [Construct a basic_socket_iostream without establishing a connection. 

     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. 

     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. 

     (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.rdbuf [*rdbuf]]]
    [Return a pointer to the underlying streambuf. ]
  ]
  
]


[heading Requirements]

['Header: ][^asio/ip/tcp.hpp]

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


[endsect]



[section:no_delay ip::tcp::no_delay]

[indexterm2 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(io_service); 
   ...
   asio::ip::tcp::no_delay option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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 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 protocol..ip::tcp] 
Obtain an identifier for the protocol. 


  int protocol() const;



[endsect]



[section:resolver ip::tcp::resolver]

[indexterm2 resolver..ip::tcp] 
The TCP resolver type. 


  typedef basic_resolver< tcp > resolver;


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.iterator [*iterator]]]
    [The iterator type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.query [*query]]]
    [The query type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.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.ip__basic_resolver.async_resolve [*async_resolve]]]
    [Asynchronously perform forward resolution of a query to a list of entries. 

     Asynchronously perform reverse resolution of an endpoint to a list of entries. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.basic_resolver [*basic_resolver]]]
    [Constructor. ]
  ]
  
  [
    [[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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service associated with the object. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.resolve [*resolve]]]
    [Perform forward resolution of a query to a list of entries. 

     Perform reverse resolution of an endpoint to a list of entries. ]
  ]
  
]

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

  [
    [[link asio.reference.ip__basic_resolver.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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 socket..ip::tcp] 
The TCP socket type. 


  typedef basic_stream_socket< tcp > socket;


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_stream_socket without opening it. 

     Construct and open a basic_stream_socket. 

     Construct a basic_stream_socket, opening it and binding it to the given local endpoint. 

     Construct a basic_stream_socket on an existing native socket. 

     Move-construct a basic_stream_socket from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     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. 

     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. 

     Receive some data on a connected 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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_stream_socket.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_stream_socket.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_peek [*message_peek]]]
    [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 type..ip::tcp] 
Obtain an identifier for the type of the protocol. 


  int type() const;



[endsect]



[section:v4 ip::tcp::v4]

[indexterm2 v4..ip::tcp] 
Construct to represent the IPv4 TCP protocol. 


  static tcp v4();



[endsect]



[section:v6 ip::tcp::v6]

[indexterm2 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]]]
    [Construct to represent the IPv4 UDP protocol. ]
  ]
  
  [
    [[link asio.reference.ip__udp.v6 [*v6]]]
    [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 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. 

     Set the IP address associated with the endpoint. ]
  ]
  
  [
    [[link asio.reference.ip__basic_endpoint.basic_endpoint [*basic_endpoint]]]
    [Default constructor. 

     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. 

     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. 

     Copy 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. ]
  ]
  
  [
    [[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. 

     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 family..ip::udp] 
Obtain an identifier for the protocol family. 


  int family() const;



[endsect]



[section:operator_not__eq_ ip::udp::operator!=]

[indexterm2 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 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 protocol..ip::udp] 
Obtain an identifier for the protocol. 


  int protocol() const;



[endsect]



[section:resolver ip::udp::resolver]

[indexterm2 resolver..ip::udp] 
The UDP resolver type. 


  typedef basic_resolver< udp > resolver;


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.iterator [*iterator]]]
    [The iterator type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.query [*query]]]
    [The query type. ]
  
  ]

  [

    [[link asio.reference.ip__basic_resolver.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.ip__basic_resolver.async_resolve [*async_resolve]]]
    [Asynchronously perform forward resolution of a query to a list of entries. 

     Asynchronously perform reverse resolution of an endpoint to a list of entries. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.basic_resolver [*basic_resolver]]]
    [Constructor. ]
  ]
  
  [
    [[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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service associated with the object. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.resolve [*resolve]]]
    [Perform forward resolution of a query to a list of entries. 

     Perform reverse resolution of an endpoint to a list of entries. ]
  ]
  
]

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

  [
    [[link asio.reference.ip__basic_resolver.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.ip__basic_resolver.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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 socket..ip::udp] 
The UDP socket type. 


  typedef basic_datagram_socket< udp > socket;


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_datagram_socket without opening it. 

     Construct and open a basic_datagram_socket. 

     Construct a basic_datagram_socket, opening it and binding it to the given local endpoint. 

     Construct a basic_datagram_socket on an existing native socket. 

     Move-construct a basic_datagram_socket from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     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. 

     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.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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_datagram_socket.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_datagram_socket.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_peek [*message_peek]]]
    [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 type..ip::udp] 
Obtain an identifier for the type of the protocol. 


  int type() const;



[endsect]



[section:v4 ip::udp::v4]

[indexterm2 v4..ip::udp] 
Construct to represent the IPv4 UDP protocol. 


  static udp v4();



[endsect]



[section:v6 ip::udp::v6]

[indexterm2 v6..ip::udp] 
Construct to represent the IPv6 UDP protocol. 


  static udp v6();



[endsect]



[endsect]


[section:ip__unicast__hops ip::unicast::hops]

[indexterm1 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(io_service); 
   ...
   asio::ip::unicast::hops option(4);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(io_service); 
   ...
   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 ip::v4_mapped_t] 
Tag type used for distinguishing overloads that deal in IPv4-mapped IPv6 addresses. 


  enum v4_mapped_t

[indexterm2 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 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(io_service); 
   ...
   asio::ip::v6_only option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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_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_sequence is_dynamic_buffer_sequence]


Trait to determine whether a type satisfies the DynamicBufferSequence requirements. 


  template<
      typename T>
  struct is_dynamic_buffer_sequence


[heading Requirements]

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

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


[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


Meets the UnaryTypeTrait requirements. The asio library implementation provides a definition that is derived from false\_type. A program may specialise this template to derive from true\_type for a user-defined type T that meets the Executor requirements. 

[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]]]
    [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 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_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]]]
    [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 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]]]
    [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 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]]]
    [Default constructor. 

     Construct an endpoint using the specified path name. 

     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. 

     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 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 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 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 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 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 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 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 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 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 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 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 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 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 protocol..local::basic_endpoint] 
The protocol associated with the endpoint. 


  protocol_type protocol() const;



[endsect]



[section:protocol_type local::basic_endpoint::protocol_type]

[indexterm2 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 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 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 local::connect_pair] 
Create a pair of connected sockets. 

    
  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService1]``,
      typename ``[link asio.reference.SocketService SocketService2]``>
  void ``[link asio.reference.local__connect_pair.overload1 connect_pair]``(
      basic_socket< Protocol, SocketService1 > & socket1,
      basic_socket< Protocol, SocketService2 > & socket2);
  ``  [''''&raquo;''' [link asio.reference.local__connect_pair.overload1 more...]]``

  template<
      typename ``[link asio.reference.Protocol Protocol]``,
      typename ``[link asio.reference.SocketService SocketService1]``,
      typename ``[link asio.reference.SocketService SocketService2]``>
  asio::error_code ``[link asio.reference.local__connect_pair.overload2 connect_pair]``(
      basic_socket< Protocol, SocketService1 > & socket1,
      basic_socket< Protocol, SocketService2 > & 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.SocketService SocketService1]``,
      typename ``[link asio.reference.SocketService SocketService2]``>
  void connect_pair(
      basic_socket< Protocol, SocketService1 > & socket1,
      basic_socket< Protocol, SocketService2 > & 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.SocketService SocketService1]``,
      typename ``[link asio.reference.SocketService SocketService2]``>
  asio::error_code connect_pair(
      basic_socket< Protocol, SocketService1 > & socket1,
      basic_socket< Protocol, SocketService2 > & 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 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]]]
    [Default constructor. 

     Construct an endpoint using the specified path name. 

     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. 

     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 family..local::datagram_protocol] 
Obtain an identifier for the protocol family. 


  int family() const;



[endsect]



[section:protocol local::datagram_protocol::protocol]

[indexterm2 protocol..local::datagram_protocol] 
Obtain an identifier for the protocol. 


  int protocol() const;



[endsect]



[section:socket local::datagram_protocol::socket]

[indexterm2 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.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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_datagram_socket without opening it. 

     Construct and open a basic_datagram_socket. 

     Construct a basic_datagram_socket, opening it and binding it to the given local endpoint. 

     Construct a basic_datagram_socket on an existing native socket. 

     Move-construct a basic_datagram_socket from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     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. 

     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.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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_datagram_socket.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_datagram_socket.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_datagram_socket.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_datagram_socket.message_peek [*message_peek]]]
    [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 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 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.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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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. 

     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]]]
    [Construct an acceptor without opening it. 

     Construct an open acceptor. 

     Construct an acceptor opened on the given endpoint. 

     Construct a basic_socket_acceptor on an existing native acceptor. 

     Move-construct a basic_socket_acceptor from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     Move-assign a basic_socket_acceptor from an acceptor of another protocol type. ]
  ]
  
  [
    [[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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_socket_acceptor.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_socket_acceptor.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_socket_acceptor.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_socket_acceptor.message_peek [*message_peek]]]
    [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(io_service);
   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 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]]]
    [Default constructor. 

     Construct an endpoint using the specified path name. 

     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. 

     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 family..local::stream_protocol] 
Obtain an identifier for the protocol family. 


  int family() const;



[endsect]



[section:iostream local::stream_protocol::iostream]

[indexterm2 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.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.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]]]
    [Construct a basic_socket_iostream without establishing a connection. 

     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. 

     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. 

     (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.rdbuf [*rdbuf]]]
    [Return a pointer to the underlying streambuf. ]
  ]
  
]


[heading Requirements]

['Header: ][^asio/local/stream_protocol.hpp]

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


[endsect]



[section:protocol local::stream_protocol::protocol]

[indexterm2 protocol..local::stream_protocol] 
Obtain an identifier for the protocol. 


  int protocol() const;



[endsect]



[section:socket local::stream_protocol::socket]

[indexterm2 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.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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O 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.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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_stream_socket without opening it. 

     Construct and open a basic_stream_socket. 

     Construct a basic_stream_socket, opening it and binding it to the given local endpoint. 

     Construct a basic_stream_socket on an existing native socket. 

     Move-construct a basic_stream_socket from another. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     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. 

     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. 

     Receive some data on a connected 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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_stream_socket.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_stream_socket.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_stream_socket.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.basic_stream_socket.message_peek [*message_peek]]]
    [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 type..local::stream_protocol] 
Obtain an identifier for the type of the protocol. 


  int type() const;



[endsect]



[endsect]

[section:make_work make_work]

[indexterm1 make_work] 
Create an [link asio.reference.executor_work `executor_work`]  object. 

    
  template<
      typename ``[link asio.reference.Executor Executor]``>
  executor_work< Executor > ``[link asio.reference.make_work.overload1 make_work]``(
      const Executor & ex,
      typename enable_if< is_executor< Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.make_work.overload1 more...]]``

  template<
      typename ExecutionContext>
  executor_work< typename ExecutionContext::executor_type > ``[link asio.reference.make_work.overload2 make_work]``(
      ExecutionContext & ctx,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.make_work.overload2 more...]]``

  template<
      typename T>
  executor_work< typename associated_executor< T >::type > ``[link asio.reference.make_work.overload3 make_work]``(
      const T & t,
      typename enable_if<!is_executor< T >::value &&!is_convertible< T &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.make_work.overload3 more...]]``

  template<
      typename T,
      typename ``[link asio.reference.Executor Executor]``>
  executor_work< typename associated_executor< T, Executor >::type > ``[link asio.reference.make_work.overload4 make_work]``(
      const T & t,
      const Executor & ex,
      typename enable_if< is_executor< Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.make_work.overload4 more...]]``

  template<
      typename T,
      typename ExecutionContext>
  executor_work< typename associated_executor< T, typename ExecutionContext::executor_type >::type > ``[link asio.reference.make_work.overload5 make_work]``(
      const T & t,
      ExecutionContext & ctx,
      typename enable_if<!is_executor< T >::value &&!is_convertible< T &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.make_work.overload5 more...]]``

[heading Requirements]

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

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


[section:overload1 make_work (1 of 5 overloads)]


Create an [link asio.reference.executor_work `executor_work`]  object. 


  template<
      typename ``[link asio.reference.Executor Executor]``>
  executor_work< Executor > make_work(
      const Executor & ex,
      typename enable_if< is_executor< Executor >::value >::type *  = 0);



[endsect]



[section:overload2 make_work (2 of 5 overloads)]


Create an [link asio.reference.executor_work `executor_work`]  object. 


  template<
      typename ExecutionContext>
  executor_work< typename ExecutionContext::executor_type > make_work(
      ExecutionContext & ctx,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);



[endsect]



[section:overload3 make_work (3 of 5 overloads)]


Create an [link asio.reference.executor_work `executor_work`]  object. 


  template<
      typename T>
  executor_work< typename associated_executor< T >::type > make_work(
      const T & t,
      typename enable_if<!is_executor< T >::value &&!is_convertible< T &, execution_context & >::value >::type *  = 0);



[endsect]



[section:overload4 make_work (4 of 5 overloads)]


Create an [link asio.reference.executor_work `executor_work`]  object. 


  template<
      typename T,
      typename ``[link asio.reference.Executor Executor]``>
  executor_work< typename associated_executor< T, Executor >::type > make_work(
      const T & t,
      const Executor & ex,
      typename enable_if< is_executor< Executor >::value >::type *  = 0);



[endsect]



[section:overload5 make_work (5 of 5 overloads)]


Create an [link asio.reference.executor_work `executor_work`]  object. 


  template<
      typename T,
      typename ExecutionContext>
  executor_work< typename associated_executor< T, typename ExecutionContext::executor_type >::type > make_work(
      const T & t,
      ExecutionContext & ctx,
      typename enable_if<!is_executor< T >::value &&!is_convertible< T &, execution_context & >::value >::type *  = 0);



[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.mutable_buffer [*mutable_buffer]]]
    [Construct an empty buffer. 

     Construct a buffer to represent a given 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 [link asio.reference.buffer_size `buffer_size`]  and [link asio.reference.buffer_cast `buffer_cast`]  functions:



   asio::mutable_buffer b1 = ...;
   std::size_t s1 = asio::buffer_size(b1);
   unsigned char* p1 = asio::buffer_cast<unsigned char*>(b1);




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:mutable_buffer mutable_buffer::mutable_buffer]

[indexterm2 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 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 start);
  ``  [''''&raquo;''' [link asio.reference.mutable_buffer.operator_plus_.overload1 more...]]``

  mutable_buffer ``[link asio.reference.mutable_buffer.operator_plus_.overload2 operator+]``(
      std::size_t start,
      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 start);



[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 start,
      const mutable_buffer & b);



[endsect]


[endsect]


[endsect]

[section:mutable_buffers_1 mutable_buffers_1]


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.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]]]
    [Construct to represent a given memory range. 

     Construct to represent a single modifiable buffer. ]
  ]
  
]

[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 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 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:end mutable_buffers_1::end]

[indexterm2 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 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 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 start);
  ``  [''''&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 start,
      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 start);



[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 start,
      const mutable_buffer & b);



[endsect]


[endsect]


[section:value_type mutable_buffers_1::value_type]

[indexterm2 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.mutable_buffer [*mutable_buffer]]]
    [Construct an empty buffer. 

     Construct a buffer to represent a given 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 [link asio.reference.buffer_size `buffer_size`]  and [link asio.reference.buffer_cast `buffer_cast`]  functions:



   asio::mutable_buffer b1 = ...;
   std::size_t s1 = asio::buffer_size(b1);
   unsigned char* p1 = asio::buffer_cast<unsigned char*>(b1);




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]


[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 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 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 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 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.mutable_buffer [*mutable_buffer]]]
    [Construct an empty buffer. 

     Construct a buffer to represent a given 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 [link asio.reference.buffer_size `buffer_size`]  and [link asio.reference.buffer_cast `buffer_cast`]  functions:



   asio::mutable_buffer b1 = ...;
   std::size_t s1 = asio::buffer_size(b1);
   unsigned char* p1 = asio::buffer_cast<unsigned char*>(b1);




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]


[endsect]



[endsect]


[section:operator_lt__lt_ operator<<]

[indexterm1 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:package package]

[indexterm1 package] 
Wrap a function object in a packaged task. 

    
  template<
      typename Function>
  packaged_token< typename decay< Function >::type, std::allocator< void > > ``[link asio.reference.package.overload1 package]``(
      Function && function);
  ``  [''''&raquo;''' [link asio.reference.package.overload1 more...]]``

  template<
      typename Function,
      typename Allocator>
  packaged_token< typename decay< Function >::type, Allocator > ``[link asio.reference.package.overload2 package]``(
      Function && function,
      const Allocator & a);
  ``  [''''&raquo;''' [link asio.reference.package.overload2 more...]]``

[heading Requirements]

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

['Convenience header: ]None


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


Wrap a function object in a packaged task. 


  template<
      typename Function>
  packaged_token< typename decay< Function >::type, std::allocator< void > > package(
      Function && function);


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,
       package([](asio::error_code ec, std::size_t n)
         {
           return ec ? 0 : n;
         }));
   ...
   std::size_t n = fut.get(); 





[endsect]



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


Wrap a function object in a packaged task. 


  template<
      typename Function,
      typename Allocator>
  packaged_token< typename decay< Function >::type, Allocator > package(
      Function && function,
      const Allocator & a);


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,
       package([](asio::error_code ec, std::size_t n)
         {
           return ec ? 0 : n;
         }));
   ...
   std::size_t n = fut.get(); 





[endsect]


[endsect]

[section:packaged_handler packaged_handler]


A packaged\_task with an associated allocator. 


  template<
      typename Signature,
      typename Allocator>
  class packaged_handler


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

  [

    [[link asio.reference.packaged_handler.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.packaged_handler.get_allocator [*get_allocator]]]
    [Obtain allocator. ]
  ]
  
  [
    [[link asio.reference.packaged_handler.packaged_handler [*packaged_handler]]]
    [Construct from a packaged token. 

     Move construct from another packaged handler. ]
  ]
  
]

[heading Requirements]

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

['Convenience header: ]None


[section:allocator_type packaged_handler::allocator_type]

[indexterm2 allocator_type..packaged_handler] 
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/package.hpp]

['Convenience header: ]None


[endsect]



[section:get_allocator packaged_handler::get_allocator]

[indexterm2 get_allocator..packaged_handler] 
Obtain allocator. 


  allocator_type get_allocator() const;



[endsect]


[section:packaged_handler packaged_handler::packaged_handler]

[indexterm2 packaged_handler..packaged_handler] 
Construct from a packaged token. 


  template<
      typename Function>
  ``[link asio.reference.packaged_handler.packaged_handler.overload1 packaged_handler]``(
      packaged_token< Function, Allocator > && token);
  ``  [''''&raquo;''' [link asio.reference.packaged_handler.packaged_handler.overload1 more...]]``


Move construct from another packaged handler. 


  ``[link asio.reference.packaged_handler.packaged_handler.overload2 packaged_handler]``(
      packaged_handler && other);
  ``  [''''&raquo;''' [link asio.reference.packaged_handler.packaged_handler.overload2 more...]]``


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


Construct from a packaged token. 


  template<
      typename Function>
  packaged_handler(
      packaged_token< Function, Allocator > && token);



[endsect]



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


Move construct from another packaged handler. 


  packaged_handler(
      packaged_handler && other);



[endsect]


[endsect]


[endsect]

[section:packaged_token packaged_token]


Class to enable lazy construction of a packaged\_task from a completion token. 


  template<
      typename Function,
      typename Allocator = std::allocator<void>>
  class packaged_token


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

  [

    [[link asio.reference.packaged_token.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.packaged_token.get_allocator [*get_allocator]]]
    [Obtain allocator. ]
  ]
  
  [
    [[link asio.reference.packaged_token.packaged_token [*packaged_token]]]
    [Construct using specified allocator. ]
  ]
  
]

The [link asio.reference.packaged_token `packaged_token`] class 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.

Use the [link asio.reference.package `package`]  function rather than using this class directly. 

[heading Requirements]

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

['Convenience header: ]None


[section:allocator_type packaged_token::allocator_type]

[indexterm2 allocator_type..packaged_token] 
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/package.hpp]

['Convenience header: ]None


[endsect]



[section:get_allocator packaged_token::get_allocator]

[indexterm2 get_allocator..packaged_token] 
Obtain allocator. 


  allocator_type get_allocator() const;



[endsect]


[section:packaged_token packaged_token::packaged_token]

[indexterm2 packaged_token..packaged_token] 
Construct using specified allocator. 


  explicit ``[link asio.reference.packaged_token.packaged_token.overload1 packaged_token]``(
      Function f);
  ``  [''''&raquo;''' [link asio.reference.packaged_token.packaged_token.overload1 more...]]``

  ``[link asio.reference.packaged_token.packaged_token.overload2 packaged_token]``(
      Function f,
      const Allocator & allocator);
  ``  [''''&raquo;''' [link asio.reference.packaged_token.packaged_token.overload2 more...]]``


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


Construct using specified allocator. 


  packaged_token(
      Function f);



[endsect]



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


Construct using specified allocator. 


  packaged_token(
      Function f,
      const Allocator & allocator);



[endsect]


[endsect]


[endsect]


[section:placeholders__bytes_transferred placeholders::bytes_transferred]

[indexterm1 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__error placeholders::error]

[indexterm1 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 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::basic\_resolver::async\_resolve. 


  unspecified iterator;


[heading Requirements]

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

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


[endsect]



[section:placeholders__signal_number placeholders::signal_number]

[indexterm1 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.DescriptorService DescriptorService]``>
  class basic_descriptor :
    public basic_io_object< DescriptorService >,
    public posix::descriptor_base


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.lowest_layer_type [*lowest_layer_type]]]
    [A basic_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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_descriptor without opening it. 

     Construct a basic_descriptor on an existing native descriptor. 

     Move-construct a basic_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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     Sets the non-blocking mode of the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.operator_eq_ [*operator=]]]
    [Move-assign a basic_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.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor._basic_descriptor [*~basic_descriptor]]]
    [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 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...]]``

  asio::error_code ``[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. 


  asio::error_code assign(
      const native_handle_type & native_descriptor,
      asio::error_code & ec);



[endsect]


[endsect]


[section:async_wait posix::basic_descriptor::async_wait]

[indexterm2 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      wait_type w,
      WaitHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`.]]

]


[heading Example]
  


   void wait_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Wait succeeded.
     }
   }

   ...

   asio::posix::stream_descriptor descriptor(io_service);
   ...
   descriptor.async_wait(
       asio::posix::stream_descriptor::wait_read,
       wait_handler);







[endsect]


[section:basic_descriptor posix::basic_descriptor::basic_descriptor]

[indexterm2 basic_descriptor..posix::basic_descriptor] 
Construct a [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] without opening it. 


  explicit ``[link asio.reference.posix__basic_descriptor.basic_descriptor.overload1 basic_descriptor]``(
      asio::io_service & io_service);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.basic_descriptor.overload1 more...]]``


Construct a [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] on an existing native descriptor. 


  ``[link asio.reference.posix__basic_descriptor.basic_descriptor.overload2 basic_descriptor]``(
      asio::io_service & io_service,
      const native_handle_type & native_descriptor);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.basic_descriptor.overload2 more...]]``


Move-construct a [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] from another. 


  ``[link asio.reference.posix__basic_descriptor.basic_descriptor.overload3 basic_descriptor]``(
      basic_descriptor && other);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.basic_descriptor.overload3 more...]]``


[section:overload1 posix::basic_descriptor::basic_descriptor (1 of 3 overloads)]


Construct a [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] without opening it. 


  basic_descriptor(
      asio::io_service & io_service);


This constructor creates a descriptor without opening it.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the descriptor will use to dispatch handlers for any asynchronous operations performed on the descriptor. ]]

]




[endsect]



[section:overload2 posix::basic_descriptor::basic_descriptor (2 of 3 overloads)]


Construct a [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] on an existing native descriptor. 


  basic_descriptor(
      asio::io_service & io_service,
      const native_handle_type & native_descriptor);


This constructor creates a descriptor object to hold an existing native descriptor.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the descriptor will use 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:overload3 posix::basic_descriptor::basic_descriptor (3 of 3 overloads)]


Move-construct a [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] from another. 


  basic_descriptor(
      basic_descriptor && other);


This constructor moves a descriptor from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.posix__basic_descriptor `posix::basic_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(io_service&) constructor`. 




[endsect]


[endsect]


[section:bytes_readable posix::basic_descriptor::bytes_readable]


['Inherited from posix::descriptor_base.]

[indexterm2 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(io_service); 
   ...
   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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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]


['Inherited from basic_io_object.]

[indexterm2 executor_type..posix::basic_descriptor] 
The type of the executor associated with the object. 


  typedef asio::io_service::executor_type executor_type;


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

  [
    [[link asio.reference.io_service__executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.defer [*defer]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.dispatch [*dispatch]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_finished [*on_work_finished]]]
    [Inform the io_service that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_started [*on_work_started]]]
    [Inform the io_service that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.post [*post]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the io_service is running in the current thread. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_service__executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[heading Requirements]

['Header: ][^asio/posix/basic_descriptor.hpp]

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


[endsect]



[section:get_executor posix::basic_descriptor::get_executor]


['Inherited from basic_io_object.]

[indexterm2 get_executor..posix::basic_descriptor] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_implementation posix::basic_descriptor::get_implementation]

[indexterm2 get_implementation..posix::basic_descriptor] 
Get the underlying implementation of the I/O object. 


  implementation_type & ``[link asio.reference.posix__basic_descriptor.get_implementation.overload1 get_implementation]``();
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.get_implementation.overload1 more...]]``

  const implementation_type & ``[link asio.reference.posix__basic_descriptor.get_implementation.overload2 get_implementation]``() const;
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.get_implementation.overload2 more...]]``


[section:overload1 posix::basic_descriptor::get_implementation (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  implementation_type & get_implementation();



[endsect]



[section:overload2 posix::basic_descriptor::get_implementation (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  const implementation_type & get_implementation() const;



[endsect]


[endsect]


[section:get_io_service posix::basic_descriptor::get_io_service]


['Inherited from basic_io_object.]

[indexterm2 get_io_service..posix::basic_descriptor] 
(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();


This function may be used to obtain the [link asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_service `io_service`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 




[endsect]


[section:get_service posix::basic_descriptor::get_service]

[indexterm2 get_service..posix::basic_descriptor] 
Get the service associated with the I/O object. 


  service_type & ``[link asio.reference.posix__basic_descriptor.get_service.overload1 get_service]``();
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.get_service.overload1 more...]]``

  const service_type & ``[link asio.reference.posix__basic_descriptor.get_service.overload2 get_service]``() const;
  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.get_service.overload2 more...]]``


[section:overload1 posix::basic_descriptor::get_service (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  service_type & get_service();



[endsect]



[section:overload2 posix::basic_descriptor::get_service (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  const service_type & get_service() const;



[endsect]


[endsect]


[section:implementation_type posix::basic_descriptor::implementation_type]


['Inherited from basic_io_object.]

[indexterm2 implementation_type..posix::basic_descriptor] 
The underlying implementation type of I/O object. 


  typedef service_type::implementation_type implementation_type;



[heading Requirements]

['Header: ][^asio/posix/basic_descriptor.hpp]

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


[endsect]


[section:io_control posix::basic_descriptor::io_control]

[indexterm2 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]``>
  asio::error_code ``[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(io_service);
   ...
   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]``>
  asio::error_code 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(io_service);
   ...
   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 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 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 [link asio.reference.posix__basic_descriptor `posix::basic_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 [link asio.reference.posix__basic_descriptor `posix::basic_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 lowest_layer_type..posix::basic_descriptor] 
A [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] is always the lowest layer. 


  typedef basic_descriptor< DescriptorService > lowest_layer_type;


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.lowest_layer_type [*lowest_layer_type]]]
    [A basic_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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_descriptor without opening it. 

     Construct a basic_descriptor on an existing native descriptor. 

     Move-construct a basic_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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     Sets the non-blocking mode of the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.operator_eq_ [*operator=]]]
    [Move-assign a basic_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.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor._basic_descriptor [*~basic_descriptor]]]
    [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 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 native_handle_type..posix::basic_descriptor] 
The native representation of a descriptor. 


  typedef DescriptorService::native_handle_type 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 operator=..posix::basic_descriptor] 
Move-assign a [link asio.reference.posix__basic_descriptor `posix::basic_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 [link asio.reference.posix__basic_descriptor `posix::basic_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(io_service&) constructor`. 




[endsect]



[section:release posix::basic_descriptor::release]

[indexterm2 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:service_type posix::basic_descriptor::service_type]


['Inherited from basic_io_object.]

[indexterm2 service_type..posix::basic_descriptor] 
The type of the service that will be used to provide I/O operations. 


  typedef DescriptorService service_type;



[heading Requirements]

['Header: ][^asio/posix/basic_descriptor.hpp]

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


[endsect]


[section:wait posix::basic_descriptor::wait]

[indexterm2 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...]]``

  asio::error_code ``[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(io_service);
   ...
   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. 


  asio::error_code 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(io_service);
   ...
   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 wait_type..posix::basic_descriptor] 
Wait types. 


  enum wait_type

[indexterm2 wait_read..posix::basic_descriptor]
[indexterm2 wait_write..posix::basic_descriptor]
[indexterm2 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 `basic_descriptor::wait()` and `basic_descriptor::async_wait()`. 


[endsect]



[section:_basic_descriptor posix::basic_descriptor::~basic_descriptor]

[indexterm2 ~basic_descriptor..posix::basic_descriptor] 
Protected destructor to prevent deletion through this type. 


  ~basic_descriptor();



[endsect]



[endsect]

[section:posix__basic_stream_descriptor posix::basic_stream_descriptor]


Provides stream-oriented descriptor functionality. 


  template<
      typename ``[link asio.reference.StreamDescriptorService StreamDescriptorService]`` = stream_descriptor_service>
  class basic_stream_descriptor :
    public posix::basic_descriptor< StreamDescriptorService >


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.posix__basic_stream_descriptor.lowest_layer_type [*lowest_layer_type]]]
    [A basic_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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_stream_descriptor without opening it. 

     Construct a basic_stream_descriptor on an existing native descriptor. 

     Move-construct a basic_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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     Sets the non-blocking mode of the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.operator_eq_ [*operator=]]]
    [Move-assign a basic_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. ]
  ]
  
]

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

  [
    [[link asio.reference.posix__basic_stream_descriptor.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some(
      const MutableBufferSequence & buffers,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      wait_type w,
      WaitHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`.]]

]


[heading Example]
  


   void wait_handler(const asio::error_code& error)
   {
     if (!error)
     {
       // Wait succeeded.
     }
   }

   ...

   asio::posix::stream_descriptor descriptor(io_service);
   ...
   descriptor.async_wait(
       asio::posix::stream_descriptor::wait_read,
       wait_handler);







[endsect]



[section:async_write_some posix::basic_stream_descriptor::async_write_some]

[indexterm2 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some(
      const ConstBufferSequence & buffers,
      WriteHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 basic_stream_descriptor..posix::basic_stream_descriptor] 
Construct a [link asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] without opening it. 


  explicit ``[link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload1 basic_stream_descriptor]``(
      asio::io_service & io_service);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload1 more...]]``


Construct a [link asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] on an existing native descriptor. 


  ``[link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload2 basic_stream_descriptor]``(
      asio::io_service & io_service,
      const native_handle_type & native_descriptor);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload2 more...]]``


Move-construct a [link asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] from another. 


  ``[link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload3 basic_stream_descriptor]``(
      basic_stream_descriptor && other);
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload3 more...]]``


[section:overload1 posix::basic_stream_descriptor::basic_stream_descriptor (1 of 3 overloads)]


Construct a [link asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] without opening it. 


  basic_stream_descriptor(
      asio::io_service & io_service);


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
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the stream descriptor will use to dispatch handlers for any asynchronous operations performed on the descriptor. ]]

]




[endsect]



[section:overload2 posix::basic_stream_descriptor::basic_stream_descriptor (2 of 3 overloads)]


Construct a [link asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] on an existing native descriptor. 


  basic_stream_descriptor(
      asio::io_service & io_service,
      const native_handle_type & native_descriptor);


This constructor creates a stream descriptor object to hold an existing native descriptor.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the stream descriptor will use 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:overload3 posix::basic_stream_descriptor::basic_stream_descriptor (3 of 3 overloads)]


Move-construct a [link asio.reference.posix__basic_stream_descriptor `posix::basic_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 [link asio.reference.posix__basic_stream_descriptor `posix::basic_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(io_service&) constructor`. 




[endsect]


[endsect]


[section:bytes_readable posix::basic_stream_descriptor::bytes_readable]


['Inherited from posix::descriptor_base.]

[indexterm2 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(io_service); 
   ...
   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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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]


['Inherited from basic_io_object.]

[indexterm2 executor_type..posix::basic_stream_descriptor] 
The type of the executor associated with the object. 


  typedef asio::io_service::executor_type executor_type;


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

  [
    [[link asio.reference.io_service__executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.defer [*defer]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.dispatch [*dispatch]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_finished [*on_work_finished]]]
    [Inform the io_service that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_started [*on_work_started]]]
    [Inform the io_service that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.post [*post]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the io_service is running in the current thread. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_service__executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[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 basic_io_object.]

[indexterm2 get_executor..posix::basic_stream_descriptor] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_implementation posix::basic_stream_descriptor::get_implementation]

[indexterm2 get_implementation..posix::basic_stream_descriptor] 
Get the underlying implementation of the I/O object. 


  implementation_type & ``[link asio.reference.posix__basic_stream_descriptor.get_implementation.overload1 get_implementation]``();
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.get_implementation.overload1 more...]]``

  const implementation_type & ``[link asio.reference.posix__basic_stream_descriptor.get_implementation.overload2 get_implementation]``() const;
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.get_implementation.overload2 more...]]``


[section:overload1 posix::basic_stream_descriptor::get_implementation (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  implementation_type & get_implementation();



[endsect]



[section:overload2 posix::basic_stream_descriptor::get_implementation (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  const implementation_type & get_implementation() const;



[endsect]


[endsect]


[section:get_io_service posix::basic_stream_descriptor::get_io_service]


['Inherited from basic_io_object.]

[indexterm2 get_io_service..posix::basic_stream_descriptor] 
(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();


This function may be used to obtain the [link asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_service `io_service`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 




[endsect]


[section:get_service posix::basic_stream_descriptor::get_service]

[indexterm2 get_service..posix::basic_stream_descriptor] 
Get the service associated with the I/O object. 


  service_type & ``[link asio.reference.posix__basic_stream_descriptor.get_service.overload1 get_service]``();
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.get_service.overload1 more...]]``

  const service_type & ``[link asio.reference.posix__basic_stream_descriptor.get_service.overload2 get_service]``() const;
  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.get_service.overload2 more...]]``


[section:overload1 posix::basic_stream_descriptor::get_service (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  service_type & get_service();



[endsect]



[section:overload2 posix::basic_stream_descriptor::get_service (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  const service_type & get_service() const;



[endsect]


[endsect]


[section:implementation_type posix::basic_stream_descriptor::implementation_type]


['Inherited from basic_io_object.]

[indexterm2 implementation_type..posix::basic_stream_descriptor] 
The underlying implementation type of I/O object. 


  typedef service_type::implementation_type implementation_type;



[heading Requirements]

['Header: ][^asio/posix/basic_stream_descriptor.hpp]

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


[endsect]


[section:io_control posix::basic_stream_descriptor::io_control]

[indexterm2 io_control..posix::basic_stream_descriptor] 
Perform an IO control command on the descriptor. 


  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...]]``

  asio::error_code ``[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(io_service);
   ...
   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]``>
  asio::error_code 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(io_service);
   ...
   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 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 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 [link asio.reference.posix__basic_descriptor `posix::basic_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 [link asio.reference.posix__basic_descriptor `posix::basic_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 lowest_layer_type..posix::basic_stream_descriptor] 
A [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] is always the lowest layer. 


  typedef basic_descriptor< StreamDescriptorService > lowest_layer_type;


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.posix__basic_descriptor.lowest_layer_type [*lowest_layer_type]]]
    [A basic_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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_descriptor without opening it. 

     Construct a basic_descriptor on an existing native descriptor. 

     Move-construct a basic_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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     Sets the non-blocking mode of the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.operator_eq_ [*operator=]]]
    [Move-assign a basic_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.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
  [
    [[link asio.reference.posix__basic_descriptor._basic_descriptor [*~basic_descriptor]]]
    [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 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 native_handle_type..posix::basic_stream_descriptor] 
The native representation of a descriptor. 


  typedef StreamDescriptorService::native_handle_type native_handle_type;



[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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 operator=..posix::basic_stream_descriptor] 
Move-assign a [link asio.reference.posix__basic_stream_descriptor `posix::basic_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 [link asio.reference.posix__basic_stream_descriptor `posix::basic_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(io_service&) constructor`. 




[endsect]


[section:read_some posix::basic_stream_descriptor::read_some]

[indexterm2 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 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:service_type posix::basic_stream_descriptor::service_type]


['Inherited from basic_io_object.]

[indexterm2 service_type..posix::basic_stream_descriptor] 
The type of the service that will be used to provide I/O operations. 


  typedef StreamDescriptorService service_type;



[heading Requirements]

['Header: ][^asio/posix/basic_stream_descriptor.hpp]

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


[endsect]


[section:wait posix::basic_stream_descriptor::wait]

[indexterm2 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...]]``

  asio::error_code ``[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(io_service);
   ...
   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. 


  asio::error_code 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(io_service);
   ...
   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 wait_type..posix::basic_stream_descriptor] 
Wait types. 


  enum wait_type

[indexterm2 wait_read..posix::basic_stream_descriptor]
[indexterm2 wait_write..posix::basic_stream_descriptor]
[indexterm2 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 `basic_descriptor::wait()` and `basic_descriptor::async_wait()`. 


[endsect]


[section:write_some posix::basic_stream_descriptor::write_some]

[indexterm2 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__descriptor_base posix::descriptor_base]


The [link asio.reference.posix__descriptor_base `posix::descriptor_base`] class is used as a base for the [link asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] class template so that we have a common 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]]]
    [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 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(io_service); 
   ...
   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 wait_type..posix::descriptor_base] 
Wait types. 


  enum wait_type

[indexterm2 wait_read..posix::descriptor_base]
[indexterm2 wait_write..posix::descriptor_base]
[indexterm2 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 `basic_descriptor::wait()` and `basic_descriptor::async_wait()`. 


[endsect]



[section:_descriptor_base posix::descriptor_base::~descriptor_base]

[indexterm2 ~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 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.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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.posix__basic_stream_descriptor.lowest_layer_type [*lowest_layer_type]]]
    [A basic_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.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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]]]
    [Construct a basic_stream_descriptor without opening it. 

     Construct a basic_stream_descriptor on an existing native descriptor. 

     Move-construct a basic_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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. 

     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. 

     Sets the non-blocking mode of the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.operator_eq_ [*operator=]]]
    [Move-assign a basic_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. ]
  ]
  
]

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

  [
    [[link asio.reference.posix__basic_stream_descriptor.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.posix__basic_stream_descriptor.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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:posix__stream_descriptor_service posix::stream_descriptor_service]


Default service implementation for a stream descriptor. 


  class stream_descriptor_service :
    public io_service::service


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

  [

    [[link asio.reference.posix__stream_descriptor_service.implementation_type [*implementation_type]]]
    [The type of a stream descriptor implementation. ]
  
  ]

  [

    [[link asio.reference.posix__stream_descriptor_service.native_handle_type [*native_handle_type]]]
    [The native descriptor type. ]
  
  ]

]

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

  [
    [[link asio.reference.posix__stream_descriptor_service.assign [*assign]]]
    [Assign an existing native descriptor to a stream descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__stream_descriptor_service.async_read_some [*async_read_some]]]
    [Start an asynchronous read. ]
  ]
  
  [
    [[link asio.reference.posix__stream_descriptor_service.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__stream_descriptor_service.async_write_some [*async_write_some]]]
    [Start an asynchronous write. ]
  ]
  
  [
    [[link asio.reference.posix__stream_descriptor_service.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__stream_descriptor_service.close [*close]]]
    [Close a stream descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__stream_descriptor_service.construct [*construct]]]
    [Construct a new stream descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__stream_descriptor_service.destroy [*destroy]]]
    [Destroy a stream descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__stream_descriptor_service.get_io_service [*get_io_service]]]
    [Get the io_service object that owns the service. ]
  ]
  
  [
    [[link asio.reference.posix__stream_descriptor_service.io_control [*io_control]]]
    [Perform an IO control command on the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__stream_descriptor_service.is_open [*is_open]]]
    [Determine whether the descriptor is open. ]
  ]
  
  [
    [[link asio.reference.posix__stream_descriptor_service.move_assign [*move_assign]]]
    [Move-assign from another stream descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__stream_descriptor_service.move_construct [*move_construct]]]
    [Move-construct a new stream descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__stream_descriptor_service.native_handle [*native_handle]]]
    [Get the native descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__stream_descriptor_service.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native descriptor implementation. 

     Sets the non-blocking mode of the native descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__stream_descriptor_service.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the descriptor. 

     Sets the non-blocking mode of the descriptor. ]
  ]
  
  [
    [[link asio.reference.posix__stream_descriptor_service.read_some [*read_some]]]
    [Read some data from the stream. ]
  ]
  
  [
    [[link asio.reference.posix__stream_descriptor_service.release [*release]]]
    [Release ownership of the native descriptor implementation. ]
  ]
  
  [
    [[link asio.reference.posix__stream_descriptor_service.stream_descriptor_service [*stream_descriptor_service]]]
    [Construct a new stream descriptor service for the specified io_service. ]
  ]
  
  [
    [[link asio.reference.posix__stream_descriptor_service.wait [*wait]]]
    [Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
  [
    [[link asio.reference.posix__stream_descriptor_service.write_some [*write_some]]]
    [Write the given data to the stream. ]
  ]
  
]

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

  [
    [[link asio.reference.posix__stream_descriptor_service.id [*id]]]
    [The unique service identifier. ]
  ]

]

[heading Requirements]

['Header: ][^asio/posix/stream_descriptor_service.hpp]

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


[section:assign posix::stream_descriptor_service::assign]

[indexterm2 assign..posix::stream_descriptor_service] 
Assign an existing native descriptor to a stream descriptor. 


  asio::error_code assign(
      implementation_type & impl,
      const native_handle_type & native_descriptor,
      asio::error_code & ec);



[endsect]



[section:async_read_some posix::stream_descriptor_service::async_read_some]

[indexterm2 async_read_some..posix::stream_descriptor_service] 
Start an asynchronous read. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some(
      implementation_type & impl,
      const MutableBufferSequence & buffers,
      ReadHandler && handler);



[endsect]



[section:async_wait posix::stream_descriptor_service::async_wait]

[indexterm2 async_wait..posix::stream_descriptor_service] 
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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      implementation_type & impl,
      descriptor_base::wait_type w,
      WaitHandler && handler);



[endsect]



[section:async_write_some posix::stream_descriptor_service::async_write_some]

[indexterm2 async_write_some..posix::stream_descriptor_service] 
Start an asynchronous write. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some(
      implementation_type & impl,
      const ConstBufferSequence & buffers,
      WriteHandler && handler);



[endsect]



[section:cancel posix::stream_descriptor_service::cancel]

[indexterm2 cancel..posix::stream_descriptor_service] 
Cancel all asynchronous operations associated with the descriptor. 


  asio::error_code cancel(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:close posix::stream_descriptor_service::close]

[indexterm2 close..posix::stream_descriptor_service] 
Close a stream descriptor implementation. 


  asio::error_code close(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:construct posix::stream_descriptor_service::construct]

[indexterm2 construct..posix::stream_descriptor_service] 
Construct a new stream descriptor implementation. 


  void construct(
      implementation_type & impl);



[endsect]



[section:destroy posix::stream_descriptor_service::destroy]

[indexterm2 destroy..posix::stream_descriptor_service] 
Destroy a stream descriptor implementation. 


  void destroy(
      implementation_type & impl);



[endsect]



[section:get_io_service posix::stream_descriptor_service::get_io_service]


['Inherited from io_service.]

[indexterm2 get_io_service..posix::stream_descriptor_service] 
Get the [link asio.reference.io_service `io_service`] object that owns the service. 


  asio::io_service & get_io_service();



[endsect]



[section:id posix::stream_descriptor_service::id]

[indexterm2 id..posix::stream_descriptor_service] 
The unique service identifier. 


  static asio::io_service::id id;



[endsect]



[section:implementation_type posix::stream_descriptor_service::implementation_type]

[indexterm2 implementation_type..posix::stream_descriptor_service] 
The type of a stream descriptor implementation. 


  typedef implementation_defined implementation_type;



[heading Requirements]

['Header: ][^asio/posix/stream_descriptor_service.hpp]

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


[endsect]



[section:io_control posix::stream_descriptor_service::io_control]

[indexterm2 io_control..posix::stream_descriptor_service] 
Perform an IO control command on the descriptor. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  asio::error_code io_control(
      implementation_type & impl,
      IoControlCommand & command,
      asio::error_code & ec);



[endsect]



[section:is_open posix::stream_descriptor_service::is_open]

[indexterm2 is_open..posix::stream_descriptor_service] 
Determine whether the descriptor is open. 


  bool is_open(
      const implementation_type & impl) const;



[endsect]



[section:move_assign posix::stream_descriptor_service::move_assign]

[indexterm2 move_assign..posix::stream_descriptor_service] 
Move-assign from another stream descriptor implementation. 


  void move_assign(
      implementation_type & impl,
      stream_descriptor_service & other_service,
      implementation_type & other_impl);



[endsect]



[section:move_construct posix::stream_descriptor_service::move_construct]

[indexterm2 move_construct..posix::stream_descriptor_service] 
Move-construct a new stream descriptor implementation. 


  void move_construct(
      implementation_type & impl,
      implementation_type & other_impl);



[endsect]



[section:native_handle posix::stream_descriptor_service::native_handle]

[indexterm2 native_handle..posix::stream_descriptor_service] 
Get the native descriptor implementation. 


  native_handle_type native_handle(
      implementation_type & impl);



[endsect]



[section:native_handle_type posix::stream_descriptor_service::native_handle_type]

[indexterm2 native_handle_type..posix::stream_descriptor_service] 
The native descriptor type. 


  typedef implementation_defined native_handle_type;



[heading Requirements]

['Header: ][^asio/posix/stream_descriptor_service.hpp]

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


[endsect]


[section:native_non_blocking posix::stream_descriptor_service::native_non_blocking]

[indexterm2 native_non_blocking..posix::stream_descriptor_service] 
Gets the non-blocking mode of the native descriptor implementation. 


  bool ``[link asio.reference.posix__stream_descriptor_service.native_non_blocking.overload1 native_non_blocking]``(
      const implementation_type & impl) const;
  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor_service.native_non_blocking.overload1 more...]]``


Sets the non-blocking mode of the native descriptor implementation. 


  asio::error_code ``[link asio.reference.posix__stream_descriptor_service.native_non_blocking.overload2 native_non_blocking]``(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor_service.native_non_blocking.overload2 more...]]``


[section:overload1 posix::stream_descriptor_service::native_non_blocking (1 of 2 overloads)]


Gets the non-blocking mode of the native descriptor implementation. 


  bool native_non_blocking(
      const implementation_type & impl) const;



[endsect]



[section:overload2 posix::stream_descriptor_service::native_non_blocking (2 of 2 overloads)]


Sets the non-blocking mode of the native descriptor implementation. 


  asio::error_code native_non_blocking(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);



[endsect]


[endsect]

[section:non_blocking posix::stream_descriptor_service::non_blocking]

[indexterm2 non_blocking..posix::stream_descriptor_service] 
Gets the non-blocking mode of the descriptor. 


  bool ``[link asio.reference.posix__stream_descriptor_service.non_blocking.overload1 non_blocking]``(
      const implementation_type & impl) const;
  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor_service.non_blocking.overload1 more...]]``


Sets the non-blocking mode of the descriptor. 


  asio::error_code ``[link asio.reference.posix__stream_descriptor_service.non_blocking.overload2 non_blocking]``(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor_service.non_blocking.overload2 more...]]``


[section:overload1 posix::stream_descriptor_service::non_blocking (1 of 2 overloads)]


Gets the non-blocking mode of the descriptor. 


  bool non_blocking(
      const implementation_type & impl) const;



[endsect]



[section:overload2 posix::stream_descriptor_service::non_blocking (2 of 2 overloads)]


Sets the non-blocking mode of the descriptor. 


  asio::error_code non_blocking(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);



[endsect]


[endsect]


[section:read_some posix::stream_descriptor_service::read_some]

[indexterm2 read_some..posix::stream_descriptor_service] 
Read some data from the stream. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_some(
      implementation_type & impl,
      const MutableBufferSequence & buffers,
      asio::error_code & ec);



[endsect]



[section:release posix::stream_descriptor_service::release]

[indexterm2 release..posix::stream_descriptor_service] 
Release ownership of the native descriptor implementation. 


  native_handle_type release(
      implementation_type & impl);



[endsect]



[section:stream_descriptor_service posix::stream_descriptor_service::stream_descriptor_service]

[indexterm2 stream_descriptor_service..posix::stream_descriptor_service] 
Construct a new stream descriptor service for the specified [link asio.reference.io_service `io_service`]. 


  stream_descriptor_service(
      asio::io_service & io_service);



[endsect]



[section:wait posix::stream_descriptor_service::wait]

[indexterm2 wait..posix::stream_descriptor_service] 
Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. 


  asio::error_code wait(
      implementation_type & impl,
      descriptor_base::wait_type w,
      asio::error_code & ec);



[endsect]



[section:write_some posix::stream_descriptor_service::write_some]

[indexterm2 write_some..posix::stream_descriptor_service] 
Write the given data to the stream. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_some(
      implementation_type & impl,
      const ConstBufferSequence & buffers,
      asio::error_code & ec);



[endsect]



[endsect]

[section:post post]

[indexterm1 post] 
Submits a completion token or function object for execution. 

    
  template<
      typename CompletionToken>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.post.overload1 post]``(
      CompletionToken && token);
  ``  [''''&raquo;''' [link asio.reference.post.overload1 more...]]``

  template<
      typename ``[link asio.reference.Executor Executor]``,
      typename CompletionToken>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.post.overload2 post]``(
      const Executor & ex,
      CompletionToken && token,
      typename enable_if< is_executor< Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.post.overload2 more...]]``

  template<
      typename ExecutionContext,
      typename CompletionToken>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.post.overload3 post]``(
      ExecutionContext & ctx,
      CompletionToken && token,
      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.return_type_of_an_initiating_function ['void-or-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()`.

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.Executor Executor]``,
      typename CompletionToken>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` post(
      const Executor & ex,
      CompletionToken && token,
      typename enable_if< 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()`.

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.return_type_of_an_initiating_function ['void-or-deduced]]`` post(
      ExecutionContext & ctx,
      CompletionToken && token,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);



[heading Return Value]
      
`post(ctx.get_executor(), forward<CompletionToken>(token))`. 




[endsect]


[endsect]

[section:raw_socket_service raw_socket_service]


Default service implementation for a raw socket. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``>
  class raw_socket_service :
    public io_service::service


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

  [

    [[link asio.reference.raw_socket_service.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.raw_socket_service.implementation_type [*implementation_type]]]
    [The type of a raw socket. ]
  
  ]

  [

    [[link asio.reference.raw_socket_service.native_handle_type [*native_handle_type]]]
    [The native socket type. ]
  
  ]

  [

    [[link asio.reference.raw_socket_service.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

]

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

  [
    [[link asio.reference.raw_socket_service.assign [*assign]]]
    [Assign an existing native socket to a raw socket. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.async_receive [*async_receive]]]
    [Start an asynchronous receive. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.async_receive_from [*async_receive_from]]]
    [Start an asynchronous receive that will get the endpoint of the sender. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.async_send [*async_send]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.async_send_to [*async_send_to]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.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.raw_socket_service.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.bind [*bind]]]
    []
  ]
  
  [
    [[link asio.reference.raw_socket_service.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.close [*close]]]
    [Close a raw socket implementation. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.connect [*connect]]]
    [Connect the raw socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.construct [*construct]]]
    [Construct a new raw socket implementation. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.converting_move_construct [*converting_move_construct]]]
    [Move-construct a new raw socket implementation from another protocol type. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.destroy [*destroy]]]
    [Destroy a raw socket implementation. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.get_io_service [*get_io_service]]]
    [Get the io_service object that owns the service. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.get_option [*get_option]]]
    [Get a socket option. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.local_endpoint [*local_endpoint]]]
    [Get the local endpoint. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.move_assign [*move_assign]]]
    [Move-assign from another raw socket implementation. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.move_construct [*move_construct]]]
    [Move-construct a new raw socket implementation. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.native_handle [*native_handle]]]
    [Get the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 

     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 

     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.open [*open]]]
    []
  ]
  
  [
    [[link asio.reference.raw_socket_service.raw_socket_service [*raw_socket_service]]]
    [Construct a new raw socket service for the specified io_service. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.receive [*receive]]]
    [Receive some data from the peer. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.receive_from [*receive_from]]]
    [Receive raw data with the endpoint of the sender. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.send [*send]]]
    [Send the given data to the peer. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.send_to [*send_to]]]
    [Send raw data to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.set_option [*set_option]]]
    [Set a socket option. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.raw_socket_service.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
]

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

  [
    [[link asio.reference.raw_socket_service.id [*id]]]
    [The unique service identifier. ]
  ]

]

[heading Requirements]

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

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


[section:assign raw_socket_service::assign]

[indexterm2 assign..raw_socket_service] 
Assign an existing native socket to a raw socket. 


  asio::error_code assign(
      implementation_type & impl,
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      asio::error_code & ec);



[endsect]



[section:async_connect raw_socket_service::async_connect]

[indexterm2 async_connect..raw_socket_service] 
Start an asynchronous connect. 


  template<
      typename ``[link asio.reference.ConnectHandler ConnectHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
      implementation_type & impl,
      const endpoint_type & peer_endpoint,
      ConnectHandler && handler);



[endsect]



[section:async_receive raw_socket_service::async_receive]

[indexterm2 async_receive..raw_socket_service] 
Start an asynchronous receive. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive(
      implementation_type & impl,
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      ReadHandler && handler);



[endsect]



[section:async_receive_from raw_socket_service::async_receive_from]

[indexterm2 async_receive_from..raw_socket_service] 
Start an asynchronous receive that will get the endpoint of the sender. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive_from(
      implementation_type & impl,
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      socket_base::message_flags flags,
      ReadHandler && handler);



[endsect]



[section:async_send raw_socket_service::async_send]

[indexterm2 async_send..raw_socket_service] 
Start an asynchronous send. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send(
      implementation_type & impl,
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      WriteHandler && handler);



[endsect]



[section:async_send_to raw_socket_service::async_send_to]

[indexterm2 async_send_to..raw_socket_service] 
Start an asynchronous send. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send_to(
      implementation_type & impl,
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      socket_base::message_flags flags,
      WriteHandler && handler);



[endsect]



[section:async_wait raw_socket_service::async_wait]

[indexterm2 async_wait..raw_socket_service] 
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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      implementation_type & impl,
      socket_base::wait_type w,
      WaitHandler && handler);



[endsect]



[section:at_mark raw_socket_service::at_mark]

[indexterm2 at_mark..raw_socket_service] 
Determine whether the socket is at the out-of-band data mark. 


  bool at_mark(
      const implementation_type & impl,
      asio::error_code & ec) const;



[endsect]



[section:available raw_socket_service::available]

[indexterm2 available..raw_socket_service] 
Determine the number of bytes available for reading. 


  std::size_t available(
      const implementation_type & impl,
      asio::error_code & ec) const;



[endsect]



[section:bind raw_socket_service::bind]

[indexterm2 bind..raw_socket_service] 

  asio::error_code bind(
      implementation_type & impl,
      const endpoint_type & endpoint,
      asio::error_code & ec);



[endsect]



[section:cancel raw_socket_service::cancel]

[indexterm2 cancel..raw_socket_service] 
Cancel all asynchronous operations associated with the socket. 


  asio::error_code cancel(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:close raw_socket_service::close]

[indexterm2 close..raw_socket_service] 
Close a raw socket implementation. 


  asio::error_code close(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:connect raw_socket_service::connect]

[indexterm2 connect..raw_socket_service] 
Connect the raw socket to the specified endpoint. 


  asio::error_code connect(
      implementation_type & impl,
      const endpoint_type & peer_endpoint,
      asio::error_code & ec);



[endsect]



[section:construct raw_socket_service::construct]

[indexterm2 construct..raw_socket_service] 
Construct a new raw socket implementation. 


  void construct(
      implementation_type & impl);



[endsect]



[section:converting_move_construct raw_socket_service::converting_move_construct]

[indexterm2 converting_move_construct..raw_socket_service] 
Move-construct a new raw socket implementation from another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``>
  void converting_move_construct(
      implementation_type & impl,
      typename raw_socket_service< Protocol1 >::implementation_type & other_impl,
      typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);



[endsect]



[section:destroy raw_socket_service::destroy]

[indexterm2 destroy..raw_socket_service] 
Destroy a raw socket implementation. 


  void destroy(
      implementation_type & impl);



[endsect]



[section:endpoint_type raw_socket_service::endpoint_type]

[indexterm2 endpoint_type..raw_socket_service] 
The endpoint type. 


  typedef Protocol::endpoint endpoint_type;



[heading Requirements]

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

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


[endsect]



[section:get_io_service raw_socket_service::get_io_service]


['Inherited from io_service.]

[indexterm2 get_io_service..raw_socket_service] 
Get the [link asio.reference.io_service `io_service`] object that owns the service. 


  asio::io_service & get_io_service();



[endsect]



[section:get_option raw_socket_service::get_option]

[indexterm2 get_option..raw_socket_service] 
Get a socket option. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  asio::error_code get_option(
      const implementation_type & impl,
      GettableSocketOption & option,
      asio::error_code & ec) const;



[endsect]



[section:id raw_socket_service::id]

[indexterm2 id..raw_socket_service] 
The unique service identifier. 


  static asio::io_service::id id;



[endsect]



[section:implementation_type raw_socket_service::implementation_type]

[indexterm2 implementation_type..raw_socket_service] 
The type of a raw socket. 


  typedef implementation_defined implementation_type;



[heading Requirements]

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

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


[endsect]



[section:io_control raw_socket_service::io_control]

[indexterm2 io_control..raw_socket_service] 
Perform an IO control command on the socket. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  asio::error_code io_control(
      implementation_type & impl,
      IoControlCommand & command,
      asio::error_code & ec);



[endsect]



[section:is_open raw_socket_service::is_open]

[indexterm2 is_open..raw_socket_service] 
Determine whether the socket is open. 


  bool is_open(
      const implementation_type & impl) const;



[endsect]



[section:local_endpoint raw_socket_service::local_endpoint]

[indexterm2 local_endpoint..raw_socket_service] 
Get the local endpoint. 


  endpoint_type local_endpoint(
      const implementation_type & impl,
      asio::error_code & ec) const;



[endsect]



[section:move_assign raw_socket_service::move_assign]

[indexterm2 move_assign..raw_socket_service] 
Move-assign from another raw socket implementation. 


  void move_assign(
      implementation_type & impl,
      raw_socket_service & other_service,
      implementation_type & other_impl);



[endsect]



[section:move_construct raw_socket_service::move_construct]

[indexterm2 move_construct..raw_socket_service] 
Move-construct a new raw socket implementation. 


  void move_construct(
      implementation_type & impl,
      implementation_type & other_impl);



[endsect]



[section:native_handle raw_socket_service::native_handle]

[indexterm2 native_handle..raw_socket_service] 
Get the native socket implementation. 


  native_handle_type native_handle(
      implementation_type & impl);



[endsect]



[section:native_handle_type raw_socket_service::native_handle_type]

[indexterm2 native_handle_type..raw_socket_service] 
The native socket type. 


  typedef implementation_defined native_handle_type;



[heading Requirements]

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

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


[endsect]


[section:native_non_blocking raw_socket_service::native_non_blocking]

[indexterm2 native_non_blocking..raw_socket_service] 
Gets the non-blocking mode of the native socket implementation. 


  bool ``[link asio.reference.raw_socket_service.native_non_blocking.overload1 native_non_blocking]``(
      const implementation_type & impl) const;
  ``  [''''&raquo;''' [link asio.reference.raw_socket_service.native_non_blocking.overload1 more...]]``


Sets the non-blocking mode of the native socket implementation. 


  asio::error_code ``[link asio.reference.raw_socket_service.native_non_blocking.overload2 native_non_blocking]``(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.raw_socket_service.native_non_blocking.overload2 more...]]``


[section:overload1 raw_socket_service::native_non_blocking (1 of 2 overloads)]


Gets the non-blocking mode of the native socket implementation. 


  bool native_non_blocking(
      const implementation_type & impl) const;



[endsect]



[section:overload2 raw_socket_service::native_non_blocking (2 of 2 overloads)]


Sets the non-blocking mode of the native socket implementation. 


  asio::error_code native_non_blocking(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);



[endsect]


[endsect]

[section:non_blocking raw_socket_service::non_blocking]

[indexterm2 non_blocking..raw_socket_service] 
Gets the non-blocking mode of the socket. 


  bool ``[link asio.reference.raw_socket_service.non_blocking.overload1 non_blocking]``(
      const implementation_type & impl) const;
  ``  [''''&raquo;''' [link asio.reference.raw_socket_service.non_blocking.overload1 more...]]``


Sets the non-blocking mode of the socket. 


  asio::error_code ``[link asio.reference.raw_socket_service.non_blocking.overload2 non_blocking]``(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.raw_socket_service.non_blocking.overload2 more...]]``


[section:overload1 raw_socket_service::non_blocking (1 of 2 overloads)]


Gets the non-blocking mode of the socket. 


  bool non_blocking(
      const implementation_type & impl) const;



[endsect]



[section:overload2 raw_socket_service::non_blocking (2 of 2 overloads)]


Sets the non-blocking mode of the socket. 


  asio::error_code non_blocking(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);



[endsect]


[endsect]


[section:open raw_socket_service::open]

[indexterm2 open..raw_socket_service] 

  asio::error_code open(
      implementation_type & impl,
      const protocol_type & protocol,
      asio::error_code & ec);



[endsect]



[section:protocol_type raw_socket_service::protocol_type]

[indexterm2 protocol_type..raw_socket_service] 
The protocol type. 


  typedef Protocol protocol_type;



[heading Requirements]

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

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


[endsect]



[section:raw_socket_service raw_socket_service::raw_socket_service]

[indexterm2 raw_socket_service..raw_socket_service] 
Construct a new raw socket service for the specified [link asio.reference.io_service `io_service`]. 


  raw_socket_service(
      asio::io_service & io_service);



[endsect]



[section:receive raw_socket_service::receive]

[indexterm2 receive..raw_socket_service] 
Receive some data from the peer. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive(
      implementation_type & impl,
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      asio::error_code & ec);



[endsect]



[section:receive_from raw_socket_service::receive_from]

[indexterm2 receive_from..raw_socket_service] 
Receive raw data with the endpoint of the sender. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive_from(
      implementation_type & impl,
      const MutableBufferSequence & buffers,
      endpoint_type & sender_endpoint,
      socket_base::message_flags flags,
      asio::error_code & ec);



[endsect]



[section:remote_endpoint raw_socket_service::remote_endpoint]

[indexterm2 remote_endpoint..raw_socket_service] 
Get the remote endpoint. 


  endpoint_type remote_endpoint(
      const implementation_type & impl,
      asio::error_code & ec) const;



[endsect]



[section:send raw_socket_service::send]

[indexterm2 send..raw_socket_service] 
Send the given data to the peer. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send(
      implementation_type & impl,
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      asio::error_code & ec);



[endsect]



[section:send_to raw_socket_service::send_to]

[indexterm2 send_to..raw_socket_service] 
Send raw data to the specified endpoint. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send_to(
      implementation_type & impl,
      const ConstBufferSequence & buffers,
      const endpoint_type & destination,
      socket_base::message_flags flags,
      asio::error_code & ec);



[endsect]



[section:set_option raw_socket_service::set_option]

[indexterm2 set_option..raw_socket_service] 
Set a socket option. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  asio::error_code set_option(
      implementation_type & impl,
      const SettableSocketOption & option,
      asio::error_code & ec);



[endsect]



[section:shutdown raw_socket_service::shutdown]

[indexterm2 shutdown..raw_socket_service] 
Disable sends or receives on the socket. 


  asio::error_code shutdown(
      implementation_type & impl,
      socket_base::shutdown_type what,
      asio::error_code & ec);



[endsect]



[section:wait raw_socket_service::wait]

[indexterm2 wait..raw_socket_service] 
Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  asio::error_code wait(
      implementation_type & impl,
      socket_base::wait_type w,
      asio::error_code & ec);



[endsect]



[endsect]

[section:read read]

[indexterm1 read] 
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 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 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.DynamicBufferSequence DynamicBufferSequence]``>
  std::size_t ``[link asio.reference.read.overload5 read]``(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read.overload5 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``>
  std::size_t ``[link asio.reference.read.overload6 read]``(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read.overload6 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``,
      typename CompletionCondition>
  std::size_t ``[link asio.reference.read.overload7 read]``(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      CompletionCondition completion_condition,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read.overload7 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``,
      typename CompletionCondition>
  std::size_t ``[link asio.reference.read.overload8 read]``(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      CompletionCondition completion_condition,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::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 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 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...]]``

[heading Requirements]

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

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


[section:overload1 read (1 of 12 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 12 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 12 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 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 12 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 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 12 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.DynamicBufferSequence DynamicBufferSequence]``>
  std::size_t read(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::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 12 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.DynamicBufferSequence DynamicBufferSequence]``>
  std::size_t read(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::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 12 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.DynamicBufferSequence DynamicBufferSequence]``,
      typename CompletionCondition>
  std::size_t read(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      CompletionCondition completion_condition,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::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 12 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.DynamicBufferSequence DynamicBufferSequence]``,
      typename CompletionCondition>
  std::size_t read(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      CompletionCondition completion_condition,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::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 12 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 12 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 12 overloads)]


Attempt to read a certain amount of data from a stream before returning. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator,
      typename 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 12 overloads)]


Attempt to read a certain amount of data from a stream before returning. 


  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename Allocator,
      typename 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]


[endsect]

[section:read_at read_at]

[indexterm1 read_at] 
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 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 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 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 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 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 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 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 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 read_until] 
Read 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. 

      
  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``>
  std::size_t ``[link asio.reference.read_until.overload1 read_until]``(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      char delim);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload1 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``>
  std::size_t ``[link asio.reference.read_until.overload2 read_until]``(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      char delim,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload2 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``,
      typename Allocator>
  std::size_t ``[link asio.reference.read_until.overload3 read_until]``(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      const std::basic_string< char, std::char_traits< char >, Allocator > & delim);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload3 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``,
      typename Allocator>
  std::size_t ``[link asio.reference.read_until.overload4 read_until]``(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      const std::basic_string< char, std::char_traits< char >, Allocator > & delim,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload4 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``>
  std::size_t ``[link asio.reference.read_until.overload5 read_until]``(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      const boost::regex & expr);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload5 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``>
  std::size_t ``[link asio.reference.read_until.overload6 read_until]``(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      const boost::regex & expr,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload6 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``,
      typename MatchCondition>
  std::size_t ``[link asio.reference.read_until.overload7 read_until]``(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      MatchCondition match_condition,
      typename enable_if< is_match_condition< MatchCondition >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload7 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``,
      typename MatchCondition>
  std::size_t ``[link asio.reference.read_until.overload8 read_until]``(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      MatchCondition match_condition,
      asio::error_code & ec,
      typename enable_if< is_match_condition< MatchCondition >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload8 more...]]``

  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,
      const std::string & 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,
      const std::string & delim,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload12 more...]]``

  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...]]``

  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...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``>
  std::size_t ``[link asio.reference.read_until.overload17 read_until]``(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      const std::string & delim);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload17 more...]]``

  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``>
  std::size_t ``[link asio.reference.read_until.overload18 read_until]``(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      const std::string & delim,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.read_until.overload18 more...]]``

[heading Requirements]

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

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


[section:overload1 read_until (1 of 18 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.DynamicBufferSequence DynamicBufferSequence]``>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      char delim);


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::string 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 18 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.DynamicBufferSequence DynamicBufferSequence]``>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      char delim,
      asio::error_code & ec);


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 18 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.DynamicBufferSequence DynamicBufferSequence]``,
      typename Allocator>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      const std::basic_string< char, std::char_traits< char >, Allocator > & delim);


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::string 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 18 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.DynamicBufferSequence DynamicBufferSequence]``,
      typename Allocator>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      const std::basic_string< char, std::char_traits< char >, Allocator > & delim,
      asio::error_code & ec);


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 18 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.DynamicBufferSequence DynamicBufferSequence]``>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      const boost::regex & expr);


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::string 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 18 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.DynamicBufferSequence DynamicBufferSequence]``>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      const boost::regex & expr,
      asio::error_code & ec);


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 18 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.DynamicBufferSequence DynamicBufferSequence]``,
      typename MatchCondition>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      MatchCondition match_condition,
      typename enable_if< is_match_condition< MatchCondition >::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 DynamicBufferSequence::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\_sequence'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 18 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.DynamicBufferSequence DynamicBufferSequence]``,
      typename MatchCondition>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      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 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<DynamicBufferSequence::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 18 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 delimiter, so that the string `line` contains: 

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


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 18 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 18 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,
      const std::string & 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 delimiter, so that the string `line` contains: 

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


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 18 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,
      const std::string & 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 18 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 match, so that the string `line` contains: 

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


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 18 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 18 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 18 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 18 overloads)]



  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      const std::string & delim);



[endsect]



[section:overload18 read_until (18 of 18 overloads)]



  template<
      typename ``[link asio.reference.SyncReadStream SyncReadStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``>
  std::size_t read_until(
      SyncReadStream & s,
      DynamicBufferSequence && buffers,
      const std::string & delim,
      asio::error_code & ec);



[endsect]


[endsect]

[section:seq_packet_socket_service seq_packet_socket_service]


Default service implementation for a sequenced packet socket. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``>
  class seq_packet_socket_service :
    public io_service::service


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

  [

    [[link asio.reference.seq_packet_socket_service.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.seq_packet_socket_service.implementation_type [*implementation_type]]]
    [The type of a sequenced packet socket implementation. ]
  
  ]

  [

    [[link asio.reference.seq_packet_socket_service.native_handle_type [*native_handle_type]]]
    [The native socket type. ]
  
  ]

  [

    [[link asio.reference.seq_packet_socket_service.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

]

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

  [
    [[link asio.reference.seq_packet_socket_service.assign [*assign]]]
    [Assign an existing native socket to a sequenced packet socket. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.async_receive [*async_receive]]]
    [Start an asynchronous receive. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.async_send [*async_send]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.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.seq_packet_socket_service.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.bind [*bind]]]
    [Bind the sequenced packet socket to the specified local endpoint. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.close [*close]]]
    [Close a sequenced packet socket implementation. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.connect [*connect]]]
    [Connect the sequenced packet socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.construct [*construct]]]
    [Construct a new sequenced packet socket implementation. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.converting_move_construct [*converting_move_construct]]]
    [Move-construct a new sequenced packet socket implementation from another protocol type. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.destroy [*destroy]]]
    [Destroy a sequenced packet socket implementation. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.get_io_service [*get_io_service]]]
    [Get the io_service object that owns the service. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.get_option [*get_option]]]
    [Get a socket option. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.local_endpoint [*local_endpoint]]]
    [Get the local endpoint. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.move_assign [*move_assign]]]
    [Move-assign from another sequenced packet socket implementation. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.move_construct [*move_construct]]]
    [Move-construct a new sequenced packet socket implementation. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.native_handle [*native_handle]]]
    [Get the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 

     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 

     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.open [*open]]]
    [Open a sequenced packet socket. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.receive [*receive]]]
    [Receive some data from the peer. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.send [*send]]]
    [Send the given data to the peer. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.seq_packet_socket_service [*seq_packet_socket_service]]]
    [Construct a new sequenced packet socket service for the specified io_service. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.set_option [*set_option]]]
    [Set a socket option. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.seq_packet_socket_service.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
]

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

  [
    [[link asio.reference.seq_packet_socket_service.id [*id]]]
    [The unique service identifier. ]
  ]

]

[heading Requirements]

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

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


[section:assign seq_packet_socket_service::assign]

[indexterm2 assign..seq_packet_socket_service] 
Assign an existing native socket to a sequenced packet socket. 


  asio::error_code assign(
      implementation_type & impl,
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      asio::error_code & ec);



[endsect]



[section:async_connect seq_packet_socket_service::async_connect]

[indexterm2 async_connect..seq_packet_socket_service] 
Start an asynchronous connect. 


  template<
      typename ``[link asio.reference.ConnectHandler ConnectHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
      implementation_type & impl,
      const endpoint_type & peer_endpoint,
      ConnectHandler && handler);



[endsect]



[section:async_receive seq_packet_socket_service::async_receive]

[indexterm2 async_receive..seq_packet_socket_service] 
Start an asynchronous receive. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive(
      implementation_type & impl,
      const MutableBufferSequence & buffers,
      socket_base::message_flags in_flags,
      socket_base::message_flags & out_flags,
      ReadHandler && handler);



[endsect]



[section:async_send seq_packet_socket_service::async_send]

[indexterm2 async_send..seq_packet_socket_service] 
Start an asynchronous send. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send(
      implementation_type & impl,
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      WriteHandler && handler);



[endsect]



[section:async_wait seq_packet_socket_service::async_wait]

[indexterm2 async_wait..seq_packet_socket_service] 
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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      implementation_type & impl,
      socket_base::wait_type w,
      WaitHandler && handler);



[endsect]



[section:at_mark seq_packet_socket_service::at_mark]

[indexterm2 at_mark..seq_packet_socket_service] 
Determine whether the socket is at the out-of-band data mark. 


  bool at_mark(
      const implementation_type & impl,
      asio::error_code & ec) const;



[endsect]



[section:available seq_packet_socket_service::available]

[indexterm2 available..seq_packet_socket_service] 
Determine the number of bytes available for reading. 


  std::size_t available(
      const implementation_type & impl,
      asio::error_code & ec) const;



[endsect]



[section:bind seq_packet_socket_service::bind]

[indexterm2 bind..seq_packet_socket_service] 
Bind the sequenced packet socket to the specified local endpoint. 


  asio::error_code bind(
      implementation_type & impl,
      const endpoint_type & endpoint,
      asio::error_code & ec);



[endsect]



[section:cancel seq_packet_socket_service::cancel]

[indexterm2 cancel..seq_packet_socket_service] 
Cancel all asynchronous operations associated with the socket. 


  asio::error_code cancel(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:close seq_packet_socket_service::close]

[indexterm2 close..seq_packet_socket_service] 
Close a sequenced packet socket implementation. 


  asio::error_code close(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:connect seq_packet_socket_service::connect]

[indexterm2 connect..seq_packet_socket_service] 
Connect the sequenced packet socket to the specified endpoint. 


  asio::error_code connect(
      implementation_type & impl,
      const endpoint_type & peer_endpoint,
      asio::error_code & ec);



[endsect]



[section:construct seq_packet_socket_service::construct]

[indexterm2 construct..seq_packet_socket_service] 
Construct a new sequenced packet socket implementation. 


  void construct(
      implementation_type & impl);



[endsect]



[section:converting_move_construct seq_packet_socket_service::converting_move_construct]

[indexterm2 converting_move_construct..seq_packet_socket_service] 
Move-construct a new sequenced packet socket implementation from another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``>
  void converting_move_construct(
      implementation_type & impl,
      typename seq_packet_socket_service< Protocol1 >::implementation_type & other_impl,
      typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);



[endsect]



[section:destroy seq_packet_socket_service::destroy]

[indexterm2 destroy..seq_packet_socket_service] 
Destroy a sequenced packet socket implementation. 


  void destroy(
      implementation_type & impl);



[endsect]



[section:endpoint_type seq_packet_socket_service::endpoint_type]

[indexterm2 endpoint_type..seq_packet_socket_service] 
The endpoint type. 


  typedef Protocol::endpoint endpoint_type;



[heading Requirements]

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

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


[endsect]



[section:get_io_service seq_packet_socket_service::get_io_service]


['Inherited from io_service.]

[indexterm2 get_io_service..seq_packet_socket_service] 
Get the [link asio.reference.io_service `io_service`] object that owns the service. 


  asio::io_service & get_io_service();



[endsect]



[section:get_option seq_packet_socket_service::get_option]

[indexterm2 get_option..seq_packet_socket_service] 
Get a socket option. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  asio::error_code get_option(
      const implementation_type & impl,
      GettableSocketOption & option,
      asio::error_code & ec) const;



[endsect]



[section:id seq_packet_socket_service::id]

[indexterm2 id..seq_packet_socket_service] 
The unique service identifier. 


  static asio::io_service::id id;



[endsect]



[section:implementation_type seq_packet_socket_service::implementation_type]

[indexterm2 implementation_type..seq_packet_socket_service] 
The type of a sequenced packet socket implementation. 


  typedef implementation_defined implementation_type;



[heading Requirements]

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

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


[endsect]



[section:io_control seq_packet_socket_service::io_control]

[indexterm2 io_control..seq_packet_socket_service] 
Perform an IO control command on the socket. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  asio::error_code io_control(
      implementation_type & impl,
      IoControlCommand & command,
      asio::error_code & ec);



[endsect]



[section:is_open seq_packet_socket_service::is_open]

[indexterm2 is_open..seq_packet_socket_service] 
Determine whether the socket is open. 


  bool is_open(
      const implementation_type & impl) const;



[endsect]



[section:local_endpoint seq_packet_socket_service::local_endpoint]

[indexterm2 local_endpoint..seq_packet_socket_service] 
Get the local endpoint. 


  endpoint_type local_endpoint(
      const implementation_type & impl,
      asio::error_code & ec) const;



[endsect]



[section:move_assign seq_packet_socket_service::move_assign]

[indexterm2 move_assign..seq_packet_socket_service] 
Move-assign from another sequenced packet socket implementation. 


  void move_assign(
      implementation_type & impl,
      seq_packet_socket_service & other_service,
      implementation_type & other_impl);



[endsect]



[section:move_construct seq_packet_socket_service::move_construct]

[indexterm2 move_construct..seq_packet_socket_service] 
Move-construct a new sequenced packet socket implementation. 


  void move_construct(
      implementation_type & impl,
      implementation_type & other_impl);



[endsect]



[section:native_handle seq_packet_socket_service::native_handle]

[indexterm2 native_handle..seq_packet_socket_service] 
Get the native socket implementation. 


  native_handle_type native_handle(
      implementation_type & impl);



[endsect]



[section:native_handle_type seq_packet_socket_service::native_handle_type]

[indexterm2 native_handle_type..seq_packet_socket_service] 
The native socket type. 


  typedef implementation_defined native_handle_type;



[heading Requirements]

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

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


[endsect]


[section:native_non_blocking seq_packet_socket_service::native_non_blocking]

[indexterm2 native_non_blocking..seq_packet_socket_service] 
Gets the non-blocking mode of the native socket implementation. 


  bool ``[link asio.reference.seq_packet_socket_service.native_non_blocking.overload1 native_non_blocking]``(
      const implementation_type & impl) const;
  ``  [''''&raquo;''' [link asio.reference.seq_packet_socket_service.native_non_blocking.overload1 more...]]``


Sets the non-blocking mode of the native socket implementation. 


  asio::error_code ``[link asio.reference.seq_packet_socket_service.native_non_blocking.overload2 native_non_blocking]``(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.seq_packet_socket_service.native_non_blocking.overload2 more...]]``


[section:overload1 seq_packet_socket_service::native_non_blocking (1 of 2 overloads)]


Gets the non-blocking mode of the native socket implementation. 


  bool native_non_blocking(
      const implementation_type & impl) const;



[endsect]



[section:overload2 seq_packet_socket_service::native_non_blocking (2 of 2 overloads)]


Sets the non-blocking mode of the native socket implementation. 


  asio::error_code native_non_blocking(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);



[endsect]


[endsect]

[section:non_blocking seq_packet_socket_service::non_blocking]

[indexterm2 non_blocking..seq_packet_socket_service] 
Gets the non-blocking mode of the socket. 


  bool ``[link asio.reference.seq_packet_socket_service.non_blocking.overload1 non_blocking]``(
      const implementation_type & impl) const;
  ``  [''''&raquo;''' [link asio.reference.seq_packet_socket_service.non_blocking.overload1 more...]]``


Sets the non-blocking mode of the socket. 


  asio::error_code ``[link asio.reference.seq_packet_socket_service.non_blocking.overload2 non_blocking]``(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.seq_packet_socket_service.non_blocking.overload2 more...]]``


[section:overload1 seq_packet_socket_service::non_blocking (1 of 2 overloads)]


Gets the non-blocking mode of the socket. 


  bool non_blocking(
      const implementation_type & impl) const;



[endsect]



[section:overload2 seq_packet_socket_service::non_blocking (2 of 2 overloads)]


Sets the non-blocking mode of the socket. 


  asio::error_code non_blocking(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);



[endsect]


[endsect]


[section:open seq_packet_socket_service::open]

[indexterm2 open..seq_packet_socket_service] 
Open a sequenced packet socket. 


  asio::error_code open(
      implementation_type & impl,
      const protocol_type & protocol,
      asio::error_code & ec);



[endsect]



[section:protocol_type seq_packet_socket_service::protocol_type]

[indexterm2 protocol_type..seq_packet_socket_service] 
The protocol type. 


  typedef Protocol protocol_type;



[heading Requirements]

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

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


[endsect]



[section:receive seq_packet_socket_service::receive]

[indexterm2 receive..seq_packet_socket_service] 
Receive some data from the peer. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive(
      implementation_type & impl,
      const MutableBufferSequence & buffers,
      socket_base::message_flags in_flags,
      socket_base::message_flags & out_flags,
      asio::error_code & ec);



[endsect]



[section:remote_endpoint seq_packet_socket_service::remote_endpoint]

[indexterm2 remote_endpoint..seq_packet_socket_service] 
Get the remote endpoint. 


  endpoint_type remote_endpoint(
      const implementation_type & impl,
      asio::error_code & ec) const;



[endsect]



[section:send seq_packet_socket_service::send]

[indexterm2 send..seq_packet_socket_service] 
Send the given data to the peer. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send(
      implementation_type & impl,
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      asio::error_code & ec);



[endsect]



[section:seq_packet_socket_service seq_packet_socket_service::seq_packet_socket_service]

[indexterm2 seq_packet_socket_service..seq_packet_socket_service] 
Construct a new sequenced packet socket service for the specified [link asio.reference.io_service `io_service`]. 


  seq_packet_socket_service(
      asio::io_service & io_service);



[endsect]



[section:set_option seq_packet_socket_service::set_option]

[indexterm2 set_option..seq_packet_socket_service] 
Set a socket option. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  asio::error_code set_option(
      implementation_type & impl,
      const SettableSocketOption & option,
      asio::error_code & ec);



[endsect]



[section:shutdown seq_packet_socket_service::shutdown]

[indexterm2 shutdown..seq_packet_socket_service] 
Disable sends or receives on the socket. 


  asio::error_code shutdown(
      implementation_type & impl,
      socket_base::shutdown_type what,
      asio::error_code & ec);



[endsect]



[section:wait seq_packet_socket_service::wait]

[indexterm2 wait..seq_packet_socket_service] 
Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  asio::error_code wait(
      implementation_type & impl,
      socket_base::wait_type w,
      asio::error_code & ec);



[endsect]



[endsect]


[section:serial_port serial_port]

[indexterm1 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.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_serial_port.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.basic_serial_port.lowest_layer_type [*lowest_layer_type]]]
    [A 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. ]
  
  ]

  [

    [[link asio.reference.basic_serial_port.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_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]]]
    [Construct a basic_serial_port without opening it. 

     Construct and open a basic_serial_port. 

     Construct a basic_serial_port on an existing native serial port. 

     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_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_serial_port.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_serial_port.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

The [link asio.reference.basic_serial_port `basic_serial_port`] class template provides functionality that is common to all serial ports.


[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]]]
    [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 ~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]]]
    []
  ]
  
  [
    [[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 baud_rate..serial_port_base::baud_rate] 

  baud_rate(
      unsigned int rate = 0);



[endsect]



[section:load serial_port_base::baud_rate::load]

[indexterm2 load..serial_port_base::baud_rate] 

  asio::error_code load(
      const ASIO_OPTION_STORAGE & storage,
      asio::error_code & ec);



[endsect]



[section:store serial_port_base::baud_rate::store]

[indexterm2 store..serial_port_base::baud_rate] 

  asio::error_code store(
      ASIO_OPTION_STORAGE & storage,
      asio::error_code & ec) const;



[endsect]



[section:value serial_port_base::baud_rate::value]

[indexterm2 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]]]
    []
  ]
  
  [
    [[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 character_size..serial_port_base::character_size] 

  character_size(
      unsigned int t = 8);



[endsect]



[section:load serial_port_base::character_size::load]

[indexterm2 load..serial_port_base::character_size] 

  asio::error_code load(
      const ASIO_OPTION_STORAGE & storage,
      asio::error_code & ec);



[endsect]



[section:store serial_port_base::character_size::store]

[indexterm2 store..serial_port_base::character_size] 

  asio::error_code store(
      ASIO_OPTION_STORAGE & storage,
      asio::error_code & ec) const;



[endsect]



[section:value serial_port_base::character_size::value]

[indexterm2 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]]]
    []
  ]
  
  [
    [[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 flow_control..serial_port_base::flow_control] 

  flow_control(
      type t = none);



[endsect]



[section:load serial_port_base::flow_control::load]

[indexterm2 load..serial_port_base::flow_control] 

  asio::error_code load(
      const ASIO_OPTION_STORAGE & storage,
      asio::error_code & ec);



[endsect]



[section:store serial_port_base::flow_control::store]

[indexterm2 store..serial_port_base::flow_control] 

  asio::error_code store(
      ASIO_OPTION_STORAGE & storage,
      asio::error_code & ec) const;



[endsect]



[section:type serial_port_base::flow_control::type]

[indexterm2 type..serial_port_base::flow_control] 

  enum type

[indexterm2 none..serial_port_base::flow_control]
[indexterm2 software..serial_port_base::flow_control]
[indexterm2 hardware..serial_port_base::flow_control]

[heading Values]
[variablelist

  [
    [none]
    []
  ]

  [
    [software]
    []
  ]

  [
    [hardware]
    []
  ]

]



[endsect]



[section:value serial_port_base::flow_control::value]

[indexterm2 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]]]
    []
  ]
  
  [
    [[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 load..serial_port_base::parity] 

  asio::error_code load(
      const ASIO_OPTION_STORAGE & storage,
      asio::error_code & ec);



[endsect]



[section:parity serial_port_base::parity::parity]

[indexterm2 parity..serial_port_base::parity] 

  parity(
      type t = none);



[endsect]



[section:store serial_port_base::parity::store]

[indexterm2 store..serial_port_base::parity] 

  asio::error_code store(
      ASIO_OPTION_STORAGE & storage,
      asio::error_code & ec) const;



[endsect]



[section:type serial_port_base::parity::type]

[indexterm2 type..serial_port_base::parity] 

  enum type

[indexterm2 none..serial_port_base::parity]
[indexterm2 odd..serial_port_base::parity]
[indexterm2 even..serial_port_base::parity]

[heading Values]
[variablelist

  [
    [none]
    []
  ]

  [
    [odd]
    []
  ]

  [
    [even]
    []
  ]

]



[endsect]



[section:value serial_port_base::parity::value]

[indexterm2 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]]]
    []
  ]
  
  [
    [[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 load..serial_port_base::stop_bits] 

  asio::error_code load(
      const ASIO_OPTION_STORAGE & storage,
      asio::error_code & ec);



[endsect]



[section:stop_bits serial_port_base::stop_bits::stop_bits]

[indexterm2 stop_bits..serial_port_base::stop_bits] 

  stop_bits(
      type t = one);



[endsect]



[section:store serial_port_base::stop_bits::store]

[indexterm2 store..serial_port_base::stop_bits] 

  asio::error_code store(
      ASIO_OPTION_STORAGE & storage,
      asio::error_code & ec) const;



[endsect]



[section:type serial_port_base::stop_bits::type]

[indexterm2 type..serial_port_base::stop_bits] 

  enum type

[indexterm2 one..serial_port_base::stop_bits]
[indexterm2 onepointfive..serial_port_base::stop_bits]
[indexterm2 two..serial_port_base::stop_bits]

[heading Values]
[variablelist

  [
    [one]
    []
  ]

  [
    [onepointfive]
    []
  ]

  [
    [two]
    []
  ]

]



[endsect]



[section:value serial_port_base::stop_bits::value]

[indexterm2 value..serial_port_base::stop_bits] 

  type value() const;



[endsect]



[endsect]

[section:serial_port_service serial_port_service]


Default service implementation for a serial port. 


  class serial_port_service :
    public io_service::service


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

  [

    [[link asio.reference.serial_port_service.implementation_type [*implementation_type]]]
    [The type of a serial port implementation. ]
  
  ]

  [

    [[link asio.reference.serial_port_service.native_handle_type [*native_handle_type]]]
    [The native handle type. ]
  
  ]

]

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

  [
    [[link asio.reference.serial_port_service.assign [*assign]]]
    [Assign an existing native handle to a serial port. ]
  ]
  
  [
    [[link asio.reference.serial_port_service.async_read_some [*async_read_some]]]
    [Start an asynchronous read. ]
  ]
  
  [
    [[link asio.reference.serial_port_service.async_write_some [*async_write_some]]]
    [Start an asynchronous write. ]
  ]
  
  [
    [[link asio.reference.serial_port_service.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.serial_port_service.close [*close]]]
    [Close a serial port implementation. ]
  ]
  
  [
    [[link asio.reference.serial_port_service.construct [*construct]]]
    [Construct a new serial port implementation. ]
  ]
  
  [
    [[link asio.reference.serial_port_service.destroy [*destroy]]]
    [Destroy a serial port implementation. ]
  ]
  
  [
    [[link asio.reference.serial_port_service.get_io_service [*get_io_service]]]
    [Get the io_service object that owns the service. ]
  ]
  
  [
    [[link asio.reference.serial_port_service.get_option [*get_option]]]
    [Get a serial port option. ]
  ]
  
  [
    [[link asio.reference.serial_port_service.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.serial_port_service.move_assign [*move_assign]]]
    [Move-assign from another serial port implementation. ]
  ]
  
  [
    [[link asio.reference.serial_port_service.move_construct [*move_construct]]]
    [Move-construct a new serial port implementation. ]
  ]
  
  [
    [[link asio.reference.serial_port_service.native_handle [*native_handle]]]
    [Get the native handle implementation. ]
  ]
  
  [
    [[link asio.reference.serial_port_service.open [*open]]]
    [Open a serial port. ]
  ]
  
  [
    [[link asio.reference.serial_port_service.read_some [*read_some]]]
    [Read some data from the stream. ]
  ]
  
  [
    [[link asio.reference.serial_port_service.send_break [*send_break]]]
    [Send a break sequence to the serial port. ]
  ]
  
  [
    [[link asio.reference.serial_port_service.serial_port_service [*serial_port_service]]]
    [Construct a new serial port service for the specified io_service. ]
  ]
  
  [
    [[link asio.reference.serial_port_service.set_option [*set_option]]]
    [Set a serial port option. ]
  ]
  
  [
    [[link asio.reference.serial_port_service.write_some [*write_some]]]
    [Write the given data to the stream. ]
  ]
  
]

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

  [
    [[link asio.reference.serial_port_service.id [*id]]]
    [The unique service identifier. ]
  ]

]

[heading Requirements]

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

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


[section:assign serial_port_service::assign]

[indexterm2 assign..serial_port_service] 
Assign an existing native handle to a serial port. 


  asio::error_code assign(
      implementation_type & impl,
      const native_handle_type & handle,
      asio::error_code & ec);



[endsect]



[section:async_read_some serial_port_service::async_read_some]

[indexterm2 async_read_some..serial_port_service] 
Start an asynchronous read. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some(
      implementation_type & impl,
      const MutableBufferSequence & buffers,
      ReadHandler && handler);



[endsect]



[section:async_write_some serial_port_service::async_write_some]

[indexterm2 async_write_some..serial_port_service] 
Start an asynchronous write. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some(
      implementation_type & impl,
      const ConstBufferSequence & buffers,
      WriteHandler && handler);



[endsect]



[section:cancel serial_port_service::cancel]

[indexterm2 cancel..serial_port_service] 
Cancel all asynchronous operations associated with the handle. 


  asio::error_code cancel(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:close serial_port_service::close]

[indexterm2 close..serial_port_service] 
Close a serial port implementation. 


  asio::error_code close(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:construct serial_port_service::construct]

[indexterm2 construct..serial_port_service] 
Construct a new serial port implementation. 


  void construct(
      implementation_type & impl);



[endsect]



[section:destroy serial_port_service::destroy]

[indexterm2 destroy..serial_port_service] 
Destroy a serial port implementation. 


  void destroy(
      implementation_type & impl);



[endsect]



[section:get_io_service serial_port_service::get_io_service]


['Inherited from io_service.]

[indexterm2 get_io_service..serial_port_service] 
Get the [link asio.reference.io_service `io_service`] object that owns the service. 


  asio::io_service & get_io_service();



[endsect]



[section:get_option serial_port_service::get_option]

[indexterm2 get_option..serial_port_service] 
Get a serial port option. 


  template<
      typename ``[link asio.reference.GettableSerialPortOption GettableSerialPortOption]``>
  asio::error_code get_option(
      const implementation_type & impl,
      GettableSerialPortOption & option,
      asio::error_code & ec) const;



[endsect]



[section:id serial_port_service::id]

[indexterm2 id..serial_port_service] 
The unique service identifier. 


  static asio::io_service::id id;



[endsect]



[section:implementation_type serial_port_service::implementation_type]

[indexterm2 implementation_type..serial_port_service] 
The type of a serial port implementation. 


  typedef implementation_defined implementation_type;



[heading Requirements]

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

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


[endsect]



[section:is_open serial_port_service::is_open]

[indexterm2 is_open..serial_port_service] 
Determine whether the handle is open. 


  bool is_open(
      const implementation_type & impl) const;



[endsect]



[section:move_assign serial_port_service::move_assign]

[indexterm2 move_assign..serial_port_service] 
Move-assign from another serial port implementation. 


  void move_assign(
      implementation_type & impl,
      serial_port_service & other_service,
      implementation_type & other_impl);



[endsect]



[section:move_construct serial_port_service::move_construct]

[indexterm2 move_construct..serial_port_service] 
Move-construct a new serial port implementation. 


  void move_construct(
      implementation_type & impl,
      implementation_type & other_impl);



[endsect]



[section:native_handle serial_port_service::native_handle]

[indexterm2 native_handle..serial_port_service] 
Get the native handle implementation. 


  native_handle_type native_handle(
      implementation_type & impl);



[endsect]



[section:native_handle_type serial_port_service::native_handle_type]

[indexterm2 native_handle_type..serial_port_service] 
The native handle type. 


  typedef implementation_defined native_handle_type;



[heading Requirements]

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

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


[endsect]



[section:open serial_port_service::open]

[indexterm2 open..serial_port_service] 
Open a serial port. 


  asio::error_code open(
      implementation_type & impl,
      const std::string & device,
      asio::error_code & ec);



[endsect]



[section:read_some serial_port_service::read_some]

[indexterm2 read_some..serial_port_service] 
Read some data from the stream. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_some(
      implementation_type & impl,
      const MutableBufferSequence & buffers,
      asio::error_code & ec);



[endsect]



[section:send_break serial_port_service::send_break]

[indexterm2 send_break..serial_port_service] 
Send a break sequence to the serial port. 


  asio::error_code send_break(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:serial_port_service serial_port_service::serial_port_service]

[indexterm2 serial_port_service..serial_port_service] 
Construct a new serial port service for the specified [link asio.reference.io_service `io_service`]. 


  serial_port_service(
      asio::io_service & io_service);



[endsect]



[section:set_option serial_port_service::set_option]

[indexterm2 set_option..serial_port_service] 
Set a serial port option. 


  template<
      typename ``[link asio.reference.SettableSerialPortOption SettableSerialPortOption]``>
  asio::error_code set_option(
      implementation_type & impl,
      const SettableSerialPortOption & option,
      asio::error_code & ec);



[endsect]



[section:write_some serial_port_service::write_some]

[indexterm2 write_some..serial_port_service] 
Write the given data to the stream. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_some(
      implementation_type & impl,
      const ConstBufferSequence & buffers,
      asio::error_code & ec);



[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]]]
    []
  ]
  
]

[heading Requirements]

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

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


[section:service_already_exists service_already_exists::service_already_exists]

[indexterm2 service_already_exists..service_already_exists] 

  service_already_exists();



[endsect]



[endsect]


[section:signal_set signal_set]

[indexterm1 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.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.basic_signal_set.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.basic_signal_set.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_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]]]
    [Construct a signal set without adding any signals. 

     Construct a signal set and add one signal. 

     Construct a signal set and add two signals. 

     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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service associated with the object. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set.remove [*remove]]]
    [Remove a signal from a signal_set. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_signal_set.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_signal_set.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

The [link asio.reference.basic_signal_set `basic_signal_set`] class template provides the ability to perform an asynchronous wait for one or more signals to occur.

Most applications will use the [link asio.reference.signal_set `signal_set`] typedef.


[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(io_service, 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:signal_set_service signal_set_service]


Default service implementation for a signal set. 


  class signal_set_service :
    public io_service::service


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

  [

    [[link asio.reference.signal_set_service.implementation_type [*implementation_type]]]
    [The type of a signal set implementation. ]
  
  ]

]

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

  [
    [[link asio.reference.signal_set_service.add [*add]]]
    [Add a signal to a signal_set. ]
  ]
  
  [
    [[link asio.reference.signal_set_service.async_wait [*async_wait]]]
    []
  ]
  
  [
    [[link asio.reference.signal_set_service.cancel [*cancel]]]
    [Cancel all operations associated with the signal set. ]
  ]
  
  [
    [[link asio.reference.signal_set_service.clear [*clear]]]
    [Remove all signals from a signal_set. ]
  ]
  
  [
    [[link asio.reference.signal_set_service.construct [*construct]]]
    [Construct a new signal set implementation. ]
  ]
  
  [
    [[link asio.reference.signal_set_service.destroy [*destroy]]]
    [Destroy a signal set implementation. ]
  ]
  
  [
    [[link asio.reference.signal_set_service.get_io_service [*get_io_service]]]
    [Get the io_service object that owns the service. ]
  ]
  
  [
    [[link asio.reference.signal_set_service.remove [*remove]]]
    [Remove a signal to a signal_set. ]
  ]
  
  [
    [[link asio.reference.signal_set_service.signal_set_service [*signal_set_service]]]
    [Construct a new signal set service for the specified io_service. ]
  ]
  
]

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

  [
    [[link asio.reference.signal_set_service.id [*id]]]
    [The unique service identifier. ]
  ]

]

[heading Requirements]

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

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


[section:add signal_set_service::add]

[indexterm2 add..signal_set_service] 
Add a signal to a signal\_set. 


  asio::error_code add(
      implementation_type & impl,
      int signal_number,
      asio::error_code & ec);



[endsect]



[section:async_wait signal_set_service::async_wait]

[indexterm2 async_wait..signal_set_service] 

  template<
      typename ``[link asio.reference.SignalHandler SignalHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      implementation_type & impl,
      SignalHandler && handler);



[endsect]



[section:cancel signal_set_service::cancel]

[indexterm2 cancel..signal_set_service] 
Cancel all operations associated with the signal set. 


  asio::error_code cancel(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:clear signal_set_service::clear]

[indexterm2 clear..signal_set_service] 
Remove all signals from a signal\_set. 


  asio::error_code clear(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:construct signal_set_service::construct]

[indexterm2 construct..signal_set_service] 
Construct a new signal set implementation. 


  void construct(
      implementation_type & impl);



[endsect]



[section:destroy signal_set_service::destroy]

[indexterm2 destroy..signal_set_service] 
Destroy a signal set implementation. 


  void destroy(
      implementation_type & impl);



[endsect]



[section:get_io_service signal_set_service::get_io_service]


['Inherited from io_service.]

[indexterm2 get_io_service..signal_set_service] 
Get the [link asio.reference.io_service `io_service`] object that owns the service. 


  asio::io_service & get_io_service();



[endsect]



[section:id signal_set_service::id]

[indexterm2 id..signal_set_service] 
The unique service identifier. 


  static asio::io_service::id id;



[endsect]



[section:implementation_type signal_set_service::implementation_type]

[indexterm2 implementation_type..signal_set_service] 
The type of a signal set implementation. 


  typedef implementation_defined implementation_type;



[heading Requirements]

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

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


[endsect]



[section:remove signal_set_service::remove]

[indexterm2 remove..signal_set_service] 
Remove a signal to a signal\_set. 


  asio::error_code remove(
      implementation_type & impl,
      int signal_number,
      asio::error_code & ec);



[endsect]



[section:signal_set_service signal_set_service::signal_set_service]

[indexterm2 signal_set_service..signal_set_service] 
Construct a new signal set service for the specified [link asio.reference.io_service `io_service`]. 


  signal_set_service(
      asio::io_service & io_service);



[endsect]



[endsect]

[section:socket_acceptor_service socket_acceptor_service]


Default service implementation for a socket acceptor. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``>
  class socket_acceptor_service :
    public io_service::service


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

  [

    [[link asio.reference.socket_acceptor_service.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.socket_acceptor_service.implementation_type [*implementation_type]]]
    [The native type of the socket acceptor. ]
  
  ]

  [

    [[link asio.reference.socket_acceptor_service.native_handle_type [*native_handle_type]]]
    [The native acceptor type. ]
  
  ]

  [

    [[link asio.reference.socket_acceptor_service.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

]

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

  [
    [[link asio.reference.socket_acceptor_service.accept [*accept]]]
    [Accept a new connection. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.assign [*assign]]]
    [Assign an existing native acceptor to a socket acceptor. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.async_accept [*async_accept]]]
    [Start an asynchronous accept. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.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.socket_acceptor_service.bind [*bind]]]
    [Bind the socket acceptor to the specified local endpoint. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the acceptor. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.close [*close]]]
    [Close a socket acceptor implementation. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.construct [*construct]]]
    [Construct a new socket acceptor implementation. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.converting_move_construct [*converting_move_construct]]]
    [Move-construct a new socket acceptor implementation from another protocol type. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.destroy [*destroy]]]
    [Destroy a socket acceptor implementation. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.get_io_service [*get_io_service]]]
    [Get the io_service object that owns the service. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.get_option [*get_option]]]
    [Get a socket option. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.is_open [*is_open]]]
    [Determine whether the acceptor is open. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.listen [*listen]]]
    [Place the socket acceptor into the state where it will listen for new connections. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.local_endpoint [*local_endpoint]]]
    [Get the local endpoint. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.move_assign [*move_assign]]]
    [Move-assign from another socket acceptor implementation. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.move_construct [*move_construct]]]
    [Move-construct a new socket acceptor implementation. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.native_handle [*native_handle]]]
    [Get the native acceptor implementation. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native acceptor implementation. 

     Sets the non-blocking mode of the native acceptor implementation. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the acceptor. 

     Sets the non-blocking mode of the acceptor. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.open [*open]]]
    [Open a new socket acceptor implementation. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.set_option [*set_option]]]
    [Set a socket option. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.socket_acceptor_service [*socket_acceptor_service]]]
    [Construct a new socket acceptor service for the specified io_service. ]
  ]
  
  [
    [[link asio.reference.socket_acceptor_service.wait [*wait]]]
    [Wait for the acceptor to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
]

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

  [
    [[link asio.reference.socket_acceptor_service.id [*id]]]
    [The unique service identifier. ]
  ]

]

[heading Requirements]

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

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


[section:accept socket_acceptor_service::accept]

[indexterm2 accept..socket_acceptor_service] 
Accept a new connection. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.SocketService SocketService]``>
  asio::error_code accept(
      implementation_type & impl,
      basic_socket< Protocol1, SocketService > & peer,
      endpoint_type * peer_endpoint,
      asio::error_code & ec,
      typename enable_if< is_convertible< Protocol, Protocol1 >::value >::type *  = 0);



[endsect]



[section:assign socket_acceptor_service::assign]

[indexterm2 assign..socket_acceptor_service] 
Assign an existing native acceptor to a socket acceptor. 


  asio::error_code assign(
      implementation_type & impl,
      const protocol_type & protocol,
      const native_handle_type & native_acceptor,
      asio::error_code & ec);



[endsect]



[section:async_accept socket_acceptor_service::async_accept]

[indexterm2 async_accept..socket_acceptor_service] 
Start an asynchronous accept. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``,
      typename ``[link asio.reference.SocketService SocketService]``,
      typename ``[link asio.reference.AcceptHandler AcceptHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_accept(
      implementation_type & impl,
      basic_socket< Protocol1, SocketService > & peer,
      endpoint_type * peer_endpoint,
      AcceptHandler && handler,
      typename enable_if< is_convertible< Protocol, Protocol1 >::value >::type *  = 0);



[endsect]



[section:async_wait socket_acceptor_service::async_wait]

[indexterm2 async_wait..socket_acceptor_service] 
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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      implementation_type & impl,
      socket_base::wait_type w,
      WaitHandler && handler);



[endsect]



[section:bind socket_acceptor_service::bind]

[indexterm2 bind..socket_acceptor_service] 
Bind the socket acceptor to the specified local endpoint. 


  asio::error_code bind(
      implementation_type & impl,
      const endpoint_type & endpoint,
      asio::error_code & ec);



[endsect]



[section:cancel socket_acceptor_service::cancel]

[indexterm2 cancel..socket_acceptor_service] 
Cancel all asynchronous operations associated with the acceptor. 


  asio::error_code cancel(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:close socket_acceptor_service::close]

[indexterm2 close..socket_acceptor_service] 
Close a socket acceptor implementation. 


  asio::error_code close(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:construct socket_acceptor_service::construct]

[indexterm2 construct..socket_acceptor_service] 
Construct a new socket acceptor implementation. 


  void construct(
      implementation_type & impl);



[endsect]



[section:converting_move_construct socket_acceptor_service::converting_move_construct]

[indexterm2 converting_move_construct..socket_acceptor_service] 
Move-construct a new socket acceptor implementation from another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``>
  void converting_move_construct(
      implementation_type & impl,
      typename socket_acceptor_service< Protocol1 >::implementation_type & other_impl,
      typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);



[endsect]



[section:destroy socket_acceptor_service::destroy]

[indexterm2 destroy..socket_acceptor_service] 
Destroy a socket acceptor implementation. 


  void destroy(
      implementation_type & impl);



[endsect]



[section:endpoint_type socket_acceptor_service::endpoint_type]

[indexterm2 endpoint_type..socket_acceptor_service] 
The endpoint type. 


  typedef protocol_type::endpoint endpoint_type;



[heading Requirements]

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

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


[endsect]



[section:get_io_service socket_acceptor_service::get_io_service]


['Inherited from io_service.]

[indexterm2 get_io_service..socket_acceptor_service] 
Get the [link asio.reference.io_service `io_service`] object that owns the service. 


  asio::io_service & get_io_service();



[endsect]



[section:get_option socket_acceptor_service::get_option]

[indexterm2 get_option..socket_acceptor_service] 
Get a socket option. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  asio::error_code get_option(
      const implementation_type & impl,
      GettableSocketOption & option,
      asio::error_code & ec) const;



[endsect]



[section:id socket_acceptor_service::id]

[indexterm2 id..socket_acceptor_service] 
The unique service identifier. 


  static asio::io_service::id id;



[endsect]



[section:implementation_type socket_acceptor_service::implementation_type]

[indexterm2 implementation_type..socket_acceptor_service] 
The native type of the socket acceptor. 


  typedef implementation_defined implementation_type;



[heading Requirements]

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

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


[endsect]



[section:io_control socket_acceptor_service::io_control]

[indexterm2 io_control..socket_acceptor_service] 
Perform an IO control command on the socket. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  asio::error_code io_control(
      implementation_type & impl,
      IoControlCommand & command,
      asio::error_code & ec);



[endsect]



[section:is_open socket_acceptor_service::is_open]

[indexterm2 is_open..socket_acceptor_service] 
Determine whether the acceptor is open. 


  bool is_open(
      const implementation_type & impl) const;



[endsect]



[section:listen socket_acceptor_service::listen]

[indexterm2 listen..socket_acceptor_service] 
Place the socket acceptor into the state where it will listen for new connections. 


  asio::error_code listen(
      implementation_type & impl,
      int backlog,
      asio::error_code & ec);



[endsect]



[section:local_endpoint socket_acceptor_service::local_endpoint]

[indexterm2 local_endpoint..socket_acceptor_service] 
Get the local endpoint. 


  endpoint_type local_endpoint(
      const implementation_type & impl,
      asio::error_code & ec) const;



[endsect]



[section:move_assign socket_acceptor_service::move_assign]

[indexterm2 move_assign..socket_acceptor_service] 
Move-assign from another socket acceptor implementation. 


  void move_assign(
      implementation_type & impl,
      socket_acceptor_service & other_service,
      implementation_type & other_impl);



[endsect]



[section:move_construct socket_acceptor_service::move_construct]

[indexterm2 move_construct..socket_acceptor_service] 
Move-construct a new socket acceptor implementation. 


  void move_construct(
      implementation_type & impl,
      implementation_type & other_impl);



[endsect]



[section:native_handle socket_acceptor_service::native_handle]

[indexterm2 native_handle..socket_acceptor_service] 
Get the native acceptor implementation. 


  native_handle_type native_handle(
      implementation_type & impl);



[endsect]



[section:native_handle_type socket_acceptor_service::native_handle_type]

[indexterm2 native_handle_type..socket_acceptor_service] 
The native acceptor type. 


  typedef implementation_defined native_handle_type;



[heading Requirements]

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

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


[endsect]


[section:native_non_blocking socket_acceptor_service::native_non_blocking]

[indexterm2 native_non_blocking..socket_acceptor_service] 
Gets the non-blocking mode of the native acceptor implementation. 


  bool ``[link asio.reference.socket_acceptor_service.native_non_blocking.overload1 native_non_blocking]``(
      const implementation_type & impl) const;
  ``  [''''&raquo;''' [link asio.reference.socket_acceptor_service.native_non_blocking.overload1 more...]]``


Sets the non-blocking mode of the native acceptor implementation. 


  asio::error_code ``[link asio.reference.socket_acceptor_service.native_non_blocking.overload2 native_non_blocking]``(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.socket_acceptor_service.native_non_blocking.overload2 more...]]``


[section:overload1 socket_acceptor_service::native_non_blocking (1 of 2 overloads)]


Gets the non-blocking mode of the native acceptor implementation. 


  bool native_non_blocking(
      const implementation_type & impl) const;



[endsect]



[section:overload2 socket_acceptor_service::native_non_blocking (2 of 2 overloads)]


Sets the non-blocking mode of the native acceptor implementation. 


  asio::error_code native_non_blocking(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);



[endsect]


[endsect]

[section:non_blocking socket_acceptor_service::non_blocking]

[indexterm2 non_blocking..socket_acceptor_service] 
Gets the non-blocking mode of the acceptor. 


  bool ``[link asio.reference.socket_acceptor_service.non_blocking.overload1 non_blocking]``(
      const implementation_type & impl) const;
  ``  [''''&raquo;''' [link asio.reference.socket_acceptor_service.non_blocking.overload1 more...]]``


Sets the non-blocking mode of the acceptor. 


  asio::error_code ``[link asio.reference.socket_acceptor_service.non_blocking.overload2 non_blocking]``(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.socket_acceptor_service.non_blocking.overload2 more...]]``


[section:overload1 socket_acceptor_service::non_blocking (1 of 2 overloads)]


Gets the non-blocking mode of the acceptor. 


  bool non_blocking(
      const implementation_type & impl) const;



[endsect]



[section:overload2 socket_acceptor_service::non_blocking (2 of 2 overloads)]


Sets the non-blocking mode of the acceptor. 


  asio::error_code non_blocking(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);



[endsect]


[endsect]


[section:open socket_acceptor_service::open]

[indexterm2 open..socket_acceptor_service] 
Open a new socket acceptor implementation. 


  asio::error_code open(
      implementation_type & impl,
      const protocol_type & protocol,
      asio::error_code & ec);



[endsect]



[section:protocol_type socket_acceptor_service::protocol_type]

[indexterm2 protocol_type..socket_acceptor_service] 
The protocol type. 


  typedef Protocol protocol_type;



[heading Requirements]

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

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


[endsect]



[section:set_option socket_acceptor_service::set_option]

[indexterm2 set_option..socket_acceptor_service] 
Set a socket option. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  asio::error_code set_option(
      implementation_type & impl,
      const SettableSocketOption & option,
      asio::error_code & ec);



[endsect]



[section:socket_acceptor_service socket_acceptor_service::socket_acceptor_service]

[indexterm2 socket_acceptor_service..socket_acceptor_service] 
Construct a new socket acceptor service for the specified [link asio.reference.io_service `io_service`]. 


  socket_acceptor_service(
      asio::io_service & io_service);



[endsect]



[section:wait socket_acceptor_service::wait]

[indexterm2 wait..socket_acceptor_service] 
Wait for the acceptor to become ready to read, ready to write, or to have pending error conditions. 


  asio::error_code wait(
      implementation_type & impl,
      socket_base::wait_type w,
      asio::error_code & ec);



[endsect]



[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.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]]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

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

  [
    [[link asio.reference.socket_base.max_connections [*max_connections]]]
    [The maximum length of the queue of pending incoming connections. ]
  ]

  [
    [[link asio.reference.socket_base.message_do_not_route [*message_do_not_route]]]
    [Specify that the data should not be subject to routing. ]
  ]

  [
    [[link asio.reference.socket_base.message_end_of_record [*message_end_of_record]]]
    [Specifies that the data marks the end of a record. ]
  ]

  [
    [[link asio.reference.socket_base.message_out_of_band [*message_out_of_band]]]
    [Process out-of-band data. ]
  ]

  [
    [[link asio.reference.socket_base.message_peek [*message_peek]]]
    [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 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(io_service); 
   ...
   asio::socket_base::broadcast option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::debug option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::do_not_route option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::udp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::enable_connection_aborted option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::keep_alive option(true);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::linger option(true, 30);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 max_connections..socket_base] 
The maximum length of the queue of pending incoming connections. 


  static const int max_connections = implementation_defined;



[endsect]



[section:message_do_not_route socket_base::message_do_not_route]

[indexterm2 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 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 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 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 message_peek..socket_base] 
Peek at incoming data without removing it from the input queue. 


  static const int message_peek = implementation_defined;



[endsect]



[section:receive_buffer_size socket_base::receive_buffer_size]

[indexterm2 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(io_service); 
   ...
   asio::socket_base::receive_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::receive_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::reuse_address option(true);
   acceptor.set_option(option);





Getting the current option value: 

   asio::ip::tcp::acceptor acceptor(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::send_buffer_size option(8192);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 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(io_service); 
   ...
   asio::socket_base::send_low_watermark option(1024);
   socket.set_option(option);





Getting the current option value: 

   asio::ip::tcp::socket socket(io_service); 
   ...
   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 shutdown_type..socket_base] 
Different ways a socket may be shutdown. 


  enum shutdown_type

[indexterm2 shutdown_receive..socket_base]
[indexterm2 shutdown_send..socket_base]
[indexterm2 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 wait_type..socket_base] 
Wait types. 


  enum wait_type

[indexterm2 wait_read..socket_base]
[indexterm2 wait_write..socket_base]
[indexterm2 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 ~socket_base..socket_base] 
Protected destructor to prevent deletion through this type. 


  ~socket_base();



[endsect]



[endsect]

[section:spawn spawn]

[indexterm1 spawn] 
Start a new stackful coroutine. 

      
  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 &&!is_convertible< Handler &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.spawn.overload2 more...]]``

  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...]]``

  template<
      typename Function,
      typename ``[link asio.reference.Executor 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 >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.spawn.overload4 more...]]``

  template<
      typename Function,
      typename ``[link asio.reference.Executor 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...]]``

  template<
      typename Function>
  void ``[link asio.reference.spawn.overload6 spawn]``(
      const asio::io_service::strand & s,
      Function && function,
      const boost::coroutines::attributes & attributes = boost::coroutines::attributes());
  ``  [''''&raquo;''' [link asio.reference.spawn.overload6 more...]]``

  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 &&!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.Executor Executor]``>
  void spawn(
      const Executor & ex,
      Function && function,
      const boost::coroutines::attributes & attributes = boost::coroutines::attributes(),
      typename enable_if< 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.Executor 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_service::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. 

     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. ]
  ]
  
]

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

  [
    [[link asio.reference.ssl__context.default_workarounds [*default_workarounds]]]
    [Implement various bug workarounds. ]
  ]

  [
    [[link asio.reference.ssl__context.no_compression [*no_compression]]]
    [Disable compression. Compression is disabled by default. ]
  ]

  [
    [[link asio.reference.ssl__context.no_sslv2 [*no_sslv2]]]
    [Disable SSL v2. ]
  ]

  [
    [[link asio.reference.ssl__context.no_sslv3 [*no_sslv3]]]
    [Disable SSL v3. ]
  ]

  [
    [[link asio.reference.ssl__context.no_tlsv1 [*no_tlsv1]]]
    [Disable TLS v1. ]
  ]

  [
    [[link asio.reference.ssl__context.no_tlsv1_1 [*no_tlsv1_1]]]
    [Disable TLS v1.1. ]
  ]

  [
    [[link asio.reference.ssl__context.no_tlsv1_2 [*no_tlsv1_2]]]
    [Disable TLS v1.2. ]
  ]

  [
    [[link asio.reference.ssl__context.single_dh_use [*single_dh_use]]]
    [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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 context..ssl::context] 
Constructor. 


  explicit ``[link asio.reference.ssl__context.context.overload1 context]``(
      method m);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.context.overload1 more...]]``


Move-construct a context from another. 


  ``[link asio.reference.ssl__context.context.overload2 context]``(
      context && other);
  ``  [''''&raquo;''' [link asio.reference.ssl__context.context.overload2 more...]]``


[section:overload1 ssl::context::context (1 of 2 overloads)]


Constructor. 


  context(
      method m);



[endsect]



[section:overload2 ssl::context::context (2 of 2 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 default_workarounds..ssl::context] 
Implement various bug workarounds. 


  static const long default_workarounds = implementation_defined;



[endsect]



[section:file_format ssl::context::file_format]

[indexterm2 file_format..ssl::context] 
File format types. 


  enum file_format

[indexterm2 asn1..ssl::context]
[indexterm2 pem..ssl::context]

[heading Values]
[variablelist

  [
    [asn1]
    [ASN.1 file. ]
  ]

  [
    [pem]
    [PEM file. ]
  ]

]



[endsect]


[section:load_verify_file ssl::context::load_verify_file]

[indexterm2 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 method..ssl::context] 
Different methods supported by a context. 


  enum method

[indexterm2 sslv2..ssl::context]
[indexterm2 sslv2_client..ssl::context]
[indexterm2 sslv2_server..ssl::context]
[indexterm2 sslv3..ssl::context]
[indexterm2 sslv3_client..ssl::context]
[indexterm2 sslv3_server..ssl::context]
[indexterm2 tlsv1..ssl::context]
[indexterm2 tlsv1_client..ssl::context]
[indexterm2 tlsv1_server..ssl::context]
[indexterm2 sslv23..ssl::context]
[indexterm2 sslv23_client..ssl::context]
[indexterm2 sslv23_server..ssl::context]
[indexterm2 tlsv11..ssl::context]
[indexterm2 tlsv11_client..ssl::context]
[indexterm2 tlsv11_server..ssl::context]
[indexterm2 tlsv12..ssl::context]
[indexterm2 tlsv12_client..ssl::context]
[indexterm2 tlsv12_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. ]
  ]

]



[endsect]



[section:native_handle ssl::context::native_handle]

[indexterm2 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 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 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 no_sslv2..ssl::context] 
Disable SSL v2. 


  static const long no_sslv2 = implementation_defined;



[endsect]



[section:no_sslv3 ssl::context::no_sslv3]

[indexterm2 no_sslv3..ssl::context] 
Disable SSL v3. 


  static const long no_sslv3 = implementation_defined;



[endsect]



[section:no_tlsv1 ssl::context::no_tlsv1]

[indexterm2 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 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 no_tlsv1_2..ssl::context] 
Disable TLS v1.2. 


  static const long no_tlsv1_2 = implementation_defined;



[endsect]



[section:operator_eq_ ssl::context::operator=]

[indexterm2 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 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 password_purpose..ssl::context] 
Purpose of PEM password. 


  enum password_purpose

[indexterm2 for_reading..ssl::context]
[indexterm2 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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>
  asio::error_code ``[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>
  asio::error_code 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 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>
  asio::error_code ``[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>
  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 ~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]]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

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

  [
    [[link asio.reference.ssl__context_base.default_workarounds [*default_workarounds]]]
    [Implement various bug workarounds. ]
  ]

  [
    [[link asio.reference.ssl__context_base.no_compression [*no_compression]]]
    [Disable compression. Compression is disabled by default. ]
  ]

  [
    [[link asio.reference.ssl__context_base.no_sslv2 [*no_sslv2]]]
    [Disable SSL v2. ]
  ]

  [
    [[link asio.reference.ssl__context_base.no_sslv3 [*no_sslv3]]]
    [Disable SSL v3. ]
  ]

  [
    [[link asio.reference.ssl__context_base.no_tlsv1 [*no_tlsv1]]]
    [Disable TLS v1. ]
  ]

  [
    [[link asio.reference.ssl__context_base.no_tlsv1_1 [*no_tlsv1_1]]]
    [Disable TLS v1.1. ]
  ]

  [
    [[link asio.reference.ssl__context_base.no_tlsv1_2 [*no_tlsv1_2]]]
    [Disable TLS v1.2. ]
  ]

  [
    [[link asio.reference.ssl__context_base.single_dh_use [*single_dh_use]]]
    [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 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 file_format..ssl::context_base] 
File format types. 


  enum file_format

[indexterm2 asn1..ssl::context_base]
[indexterm2 pem..ssl::context_base]

[heading Values]
[variablelist

  [
    [asn1]
    [ASN.1 file. ]
  ]

  [
    [pem]
    [PEM file. ]
  ]

]



[endsect]



[section:method ssl::context_base::method]

[indexterm2 method..ssl::context_base] 
Different methods supported by a context. 


  enum method

[indexterm2 sslv2..ssl::context_base]
[indexterm2 sslv2_client..ssl::context_base]
[indexterm2 sslv2_server..ssl::context_base]
[indexterm2 sslv3..ssl::context_base]
[indexterm2 sslv3_client..ssl::context_base]
[indexterm2 sslv3_server..ssl::context_base]
[indexterm2 tlsv1..ssl::context_base]
[indexterm2 tlsv1_client..ssl::context_base]
[indexterm2 tlsv1_server..ssl::context_base]
[indexterm2 sslv23..ssl::context_base]
[indexterm2 sslv23_client..ssl::context_base]
[indexterm2 sslv23_server..ssl::context_base]
[indexterm2 tlsv11..ssl::context_base]
[indexterm2 tlsv11_client..ssl::context_base]
[indexterm2 tlsv11_server..ssl::context_base]
[indexterm2 tlsv12..ssl::context_base]
[indexterm2 tlsv12_client..ssl::context_base]
[indexterm2 tlsv12_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. ]
  ]

]



[endsect]



[section:no_compression ssl::context_base::no_compression]

[indexterm2 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 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 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 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 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 no_tlsv1_2..ssl::context_base] 
Disable TLS v1.2. 


  static const long no_tlsv1_2 = implementation_defined;



[endsect]



[section:options ssl::context_base::options]

[indexterm2 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 password_purpose..ssl::context_base] 
Purpose of PEM password. 


  enum password_purpose

[indexterm2 for_reading..ssl::context_base]
[indexterm2 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 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 ~context_base..ssl::context_base] 
Protected destructor to prevent deletion through this type. 


  ~context_base();



[endsect]



[endsect]

[section:ssl__rfc2818_verification ssl::rfc2818_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. ]
  ]
  
]


[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_service io_service;
   ssl_socket sock(io_service, ctx);
   tcp::resolver resolver(io_service);
   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 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 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 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.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_io_service [*get_io_service]]]
    [Get the io_service 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]]]
    [Construct a stream. ]
  ]
  
  [
    [[link asio.reference.ssl__stream.write_some [*write_some]]]
    [Write some data to the stream. ]
  ]
  
  [
    [[link asio.reference.ssl__stream._stream [*~stream]]]
    [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_service io_service;
   asio::ssl::context ctx(asio::ssl::context::sslv23);
   asio::ssl::stream<asio:ip::tcp::socket> sock(io_service, ctx);







[heading Requirements]

['Header: ][^asio/ssl/stream.hpp]

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

[section:async_handshake ssl::stream::async_handshake]

[indexterm2 async_handshake..ssl::stream] 
Start an asynchronous SSL handshake. 


  template<
      typename ``[link asio.reference.HandshakeHandler HandshakeHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.ssl__stream.async_handshake.overload1 async_handshake]``(
      handshake_type type,
      HandshakeHandler && handler);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.ssl__stream.async_handshake.overload2 async_handshake]``(
      handshake_type type,
      const ConstBufferSequence & buffers,
      BufferedHandshakeHandler && handler);
  ``  [''''&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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_handshake(
      handshake_type type,
      HandshakeHandler && handler);


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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_handshake(
      handshake_type type,
      const ConstBufferSequence & buffers,
      BufferedHandshakeHandler && handler);


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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some(
      const MutableBufferSequence & buffers,
      ReadHandler && handler);


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 async_shutdown..ssl::stream] 
Asynchronously shut down SSL on the stream. 


  template<
      typename ``[link asio.reference.ShutdownHandler ShutdownHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_shutdown(
      ShutdownHandler && handler);


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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some(
      const ConstBufferSequence & buffers,
      WriteHandler && handler);


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 blocking operation completes. 




[endsect]



[section:get_io_service ssl::stream::get_io_service]

[indexterm2 get_io_service..ssl::stream] 
Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();


This function may be used to obtain the [link asio.reference.io_service `io_service`] object that the stream uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_service `io_service`] object that stream will use to dispatch handlers. Ownership is not transferred to the caller. 




[endsect]


[section:handshake ssl::stream::handshake]

[indexterm2 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...]]``

  asio::error_code ``[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]``>
  asio::error_code ``[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. 


  asio::error_code 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]``>
  asio::error_code 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 handshake_type..ssl::stream] 
Different handshake types. 


  enum handshake_type

[indexterm2 client..ssl::stream]
[indexterm2 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 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 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 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(io_service, 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 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 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 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 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 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>
  asio::error_code ``[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>
  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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. 


  asio::error_code 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 stream..ssl::stream] 
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:write_some ssl::stream::write_some]

[indexterm2 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 ~stream..ssl::stream] 
Destructor. 


  ~stream();



[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 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]]]
    [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 handshake_type..ssl::stream_base] 
Different handshake types. 


  enum handshake_type

[indexterm2 client..ssl::stream_base]
[indexterm2 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 ~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 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. ]
  ]
  
]


[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 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 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 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 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 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 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 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:steady_timer steady_timer]

[indexterm1 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.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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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 to set a particular expiry time as an absolute time. 

     Constructor to set a particular expiry time relative to now. 

     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. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.cancel_one [*cancel_one]]]
    [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. 

     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. 

     (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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_waitable_timer.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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(io_service);

   // 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(io_service,
       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: ]None


[endsect]


[section:strand strand]


Provides serialised function invocation for any executor type. 


  template<
      typename ``[link asio.reference.Executor 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.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[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.get_inner_executor [*get_inner_executor]]]
    [Obtain the underlying executor. ]
  ]
  
  [
    [[link asio.reference.strand.on_work_finished [*on_work_finished]]]
    [Inform the strand that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.strand.on_work_started [*on_work_started]]]
    [Inform the strand that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.strand.operator_eq_ [*operator=]]]
    [Assignment operator. 

     Converting assignment operator. 

     Move assignment operator. 

     Converting move assignment operator. ]
  ]
  
  [
    [[link asio.reference.strand.post [*post]]]
    [Request the strand to invoke the given function object. ]
  ]
  
  [
    [[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]]]
    [Default constructor. 

     Construct a strand for the specified executor. 

     Copy constructor. 

     Converting constructor. 

     Move constructor. 

     Converting move constructor. ]
  ]
  
  [
    [[link asio.reference.strand._strand [*~strand]]]
    [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:context strand::context]

[indexterm2 context..strand] 
Obtain the underlying execution context. 


  execution_context & context();



[endsect]



[section:defer strand::defer]

[indexterm2 defer..strand] 
Request the strand to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void defer(
      Function && f,
      const Allocator & a);


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 dispatch..strand] 
Request the strand to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void dispatch(
      Function && f,
      const Allocator & a);


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:get_inner_executor strand::get_inner_executor]

[indexterm2 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 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:on_work_finished strand::on_work_finished]

[indexterm2 on_work_finished..strand] 
Inform the strand that some work is no longer outstanding. 


  void on_work_finished();


The strand delegates this call to its underlying executor. 


[endsect]



[section:on_work_started strand::on_work_started]

[indexterm2 on_work_started..strand] 
Inform the strand that it has some outstanding work to do. 


  void on_work_started();


The strand delegates this call to its underlying executor. 


[endsect]



[section:operator_not__eq_ strand::operator!=]

[indexterm2 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 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.Executor 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.Executor OtherExecutor]``>
  strand & ``[link asio.reference.strand.operator_eq_.overload4 operator=]``(
      const 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.Executor 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.Executor OtherExecutor]``>
  strand & operator=(
      const 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 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 post..strand] 
Request the strand to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void post(
      Function && f,
      const Allocator & a);


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:running_in_this_thread strand::running_in_this_thread]

[indexterm2 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 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. 


  explicit ``[link asio.reference.strand.strand.overload2 strand]``(
      const Executor & e);
  ``  [''''&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.Executor 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.Executor 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. 


  strand(
      const Executor & e);



[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.Executor 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.Executor 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 ~strand..strand] 
Destructor. 


  ~strand();



[endsect]



[endsect]

[section:stream_socket_service stream_socket_service]


Default service implementation for a stream socket. 


  template<
      typename ``[link asio.reference.Protocol Protocol]``>
  class stream_socket_service :
    public io_service::service


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

  [

    [[link asio.reference.stream_socket_service.endpoint_type [*endpoint_type]]]
    [The endpoint type. ]
  
  ]

  [

    [[link asio.reference.stream_socket_service.implementation_type [*implementation_type]]]
    [The type of a stream socket implementation. ]
  
  ]

  [

    [[link asio.reference.stream_socket_service.native_handle_type [*native_handle_type]]]
    [The native socket type. ]
  
  ]

  [

    [[link asio.reference.stream_socket_service.protocol_type [*protocol_type]]]
    [The protocol type. ]
  
  ]

]

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

  [
    [[link asio.reference.stream_socket_service.assign [*assign]]]
    [Assign an existing native socket to a stream socket. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.async_connect [*async_connect]]]
    [Start an asynchronous connect. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.async_receive [*async_receive]]]
    [Start an asynchronous receive. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.async_send [*async_send]]]
    [Start an asynchronous send. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.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.stream_socket_service.at_mark [*at_mark]]]
    [Determine whether the socket is at the out-of-band data mark. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.available [*available]]]
    [Determine the number of bytes available for reading. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.bind [*bind]]]
    [Bind the stream socket to the specified local endpoint. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the socket. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.close [*close]]]
    [Close a stream socket implementation. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.connect [*connect]]]
    [Connect the stream socket to the specified endpoint. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.construct [*construct]]]
    [Construct a new stream socket implementation. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.converting_move_construct [*converting_move_construct]]]
    [Move-construct a new stream socket implementation from another protocol type. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.destroy [*destroy]]]
    [Destroy a stream socket implementation. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.get_io_service [*get_io_service]]]
    [Get the io_service object that owns the service. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.get_option [*get_option]]]
    [Get a socket option. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.io_control [*io_control]]]
    [Perform an IO control command on the socket. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.is_open [*is_open]]]
    [Determine whether the socket is open. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.local_endpoint [*local_endpoint]]]
    [Get the local endpoint. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.move_assign [*move_assign]]]
    [Move-assign from another stream socket implementation. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.move_construct [*move_construct]]]
    [Move-construct a new stream socket implementation. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.native_handle [*native_handle]]]
    [Get the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.native_non_blocking [*native_non_blocking]]]
    [Gets the non-blocking mode of the native socket implementation. 

     Sets the non-blocking mode of the native socket implementation. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.non_blocking [*non_blocking]]]
    [Gets the non-blocking mode of the socket. 

     Sets the non-blocking mode of the socket. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.open [*open]]]
    [Open a stream socket. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.receive [*receive]]]
    [Receive some data from the peer. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.remote_endpoint [*remote_endpoint]]]
    [Get the remote endpoint. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.send [*send]]]
    [Send the given data to the peer. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.set_option [*set_option]]]
    [Set a socket option. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.shutdown [*shutdown]]]
    [Disable sends or receives on the socket. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.stream_socket_service [*stream_socket_service]]]
    [Construct a new stream socket service for the specified io_service. ]
  ]
  
  [
    [[link asio.reference.stream_socket_service.wait [*wait]]]
    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
  ]
  
]

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

  [
    [[link asio.reference.stream_socket_service.id [*id]]]
    [The unique service identifier. ]
  ]

]

[heading Requirements]

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

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


[section:assign stream_socket_service::assign]

[indexterm2 assign..stream_socket_service] 
Assign an existing native socket to a stream socket. 


  asio::error_code assign(
      implementation_type & impl,
      const protocol_type & protocol,
      const native_handle_type & native_socket,
      asio::error_code & ec);



[endsect]



[section:async_connect stream_socket_service::async_connect]

[indexterm2 async_connect..stream_socket_service] 
Start an asynchronous connect. 


  template<
      typename ``[link asio.reference.ConnectHandler ConnectHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
      implementation_type & impl,
      const endpoint_type & peer_endpoint,
      ConnectHandler && handler);



[endsect]



[section:async_receive stream_socket_service::async_receive]

[indexterm2 async_receive..stream_socket_service] 
Start an asynchronous receive. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive(
      implementation_type & impl,
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      ReadHandler && handler);



[endsect]



[section:async_send stream_socket_service::async_send]

[indexterm2 async_send..stream_socket_service] 
Start an asynchronous send. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send(
      implementation_type & impl,
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      WriteHandler && handler);



[endsect]



[section:async_wait stream_socket_service::async_wait]

[indexterm2 async_wait..stream_socket_service] 
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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      implementation_type & impl,
      socket_base::wait_type w,
      WaitHandler && handler);



[endsect]



[section:at_mark stream_socket_service::at_mark]

[indexterm2 at_mark..stream_socket_service] 
Determine whether the socket is at the out-of-band data mark. 


  bool at_mark(
      const implementation_type & impl,
      asio::error_code & ec) const;



[endsect]



[section:available stream_socket_service::available]

[indexterm2 available..stream_socket_service] 
Determine the number of bytes available for reading. 


  std::size_t available(
      const implementation_type & impl,
      asio::error_code & ec) const;



[endsect]



[section:bind stream_socket_service::bind]

[indexterm2 bind..stream_socket_service] 
Bind the stream socket to the specified local endpoint. 


  asio::error_code bind(
      implementation_type & impl,
      const endpoint_type & endpoint,
      asio::error_code & ec);



[endsect]



[section:cancel stream_socket_service::cancel]

[indexterm2 cancel..stream_socket_service] 
Cancel all asynchronous operations associated with the socket. 


  asio::error_code cancel(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:close stream_socket_service::close]

[indexterm2 close..stream_socket_service] 
Close a stream socket implementation. 


  asio::error_code close(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:connect stream_socket_service::connect]

[indexterm2 connect..stream_socket_service] 
Connect the stream socket to the specified endpoint. 


  asio::error_code connect(
      implementation_type & impl,
      const endpoint_type & peer_endpoint,
      asio::error_code & ec);



[endsect]



[section:construct stream_socket_service::construct]

[indexterm2 construct..stream_socket_service] 
Construct a new stream socket implementation. 


  void construct(
      implementation_type & impl);



[endsect]



[section:converting_move_construct stream_socket_service::converting_move_construct]

[indexterm2 converting_move_construct..stream_socket_service] 
Move-construct a new stream socket implementation from another protocol type. 


  template<
      typename ``[link asio.reference.Protocol Protocol1]``>
  void converting_move_construct(
      implementation_type & impl,
      typename stream_socket_service< Protocol1 >::implementation_type & other_impl,
      typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);



[endsect]



[section:destroy stream_socket_service::destroy]

[indexterm2 destroy..stream_socket_service] 
Destroy a stream socket implementation. 


  void destroy(
      implementation_type & impl);



[endsect]



[section:endpoint_type stream_socket_service::endpoint_type]

[indexterm2 endpoint_type..stream_socket_service] 
The endpoint type. 


  typedef Protocol::endpoint endpoint_type;



[heading Requirements]

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

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


[endsect]



[section:get_io_service stream_socket_service::get_io_service]


['Inherited from io_service.]

[indexterm2 get_io_service..stream_socket_service] 
Get the [link asio.reference.io_service `io_service`] object that owns the service. 


  asio::io_service & get_io_service();



[endsect]



[section:get_option stream_socket_service::get_option]

[indexterm2 get_option..stream_socket_service] 
Get a socket option. 


  template<
      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
  asio::error_code get_option(
      const implementation_type & impl,
      GettableSocketOption & option,
      asio::error_code & ec) const;



[endsect]



[section:id stream_socket_service::id]

[indexterm2 id..stream_socket_service] 
The unique service identifier. 


  static asio::io_service::id id;



[endsect]



[section:implementation_type stream_socket_service::implementation_type]

[indexterm2 implementation_type..stream_socket_service] 
The type of a stream socket implementation. 


  typedef implementation_defined implementation_type;



[heading Requirements]

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

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


[endsect]



[section:io_control stream_socket_service::io_control]

[indexterm2 io_control..stream_socket_service] 
Perform an IO control command on the socket. 


  template<
      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
  asio::error_code io_control(
      implementation_type & impl,
      IoControlCommand & command,
      asio::error_code & ec);



[endsect]



[section:is_open stream_socket_service::is_open]

[indexterm2 is_open..stream_socket_service] 
Determine whether the socket is open. 


  bool is_open(
      const implementation_type & impl) const;



[endsect]



[section:local_endpoint stream_socket_service::local_endpoint]

[indexterm2 local_endpoint..stream_socket_service] 
Get the local endpoint. 


  endpoint_type local_endpoint(
      const implementation_type & impl,
      asio::error_code & ec) const;



[endsect]



[section:move_assign stream_socket_service::move_assign]

[indexterm2 move_assign..stream_socket_service] 
Move-assign from another stream socket implementation. 


  void move_assign(
      implementation_type & impl,
      stream_socket_service & other_service,
      implementation_type & other_impl);



[endsect]



[section:move_construct stream_socket_service::move_construct]

[indexterm2 move_construct..stream_socket_service] 
Move-construct a new stream socket implementation. 


  void move_construct(
      implementation_type & impl,
      implementation_type & other_impl);



[endsect]



[section:native_handle stream_socket_service::native_handle]

[indexterm2 native_handle..stream_socket_service] 
Get the native socket implementation. 


  native_handle_type native_handle(
      implementation_type & impl);



[endsect]



[section:native_handle_type stream_socket_service::native_handle_type]

[indexterm2 native_handle_type..stream_socket_service] 
The native socket type. 


  typedef implementation_defined native_handle_type;



[heading Requirements]

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

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


[endsect]


[section:native_non_blocking stream_socket_service::native_non_blocking]

[indexterm2 native_non_blocking..stream_socket_service] 
Gets the non-blocking mode of the native socket implementation. 


  bool ``[link asio.reference.stream_socket_service.native_non_blocking.overload1 native_non_blocking]``(
      const implementation_type & impl) const;
  ``  [''''&raquo;''' [link asio.reference.stream_socket_service.native_non_blocking.overload1 more...]]``


Sets the non-blocking mode of the native socket implementation. 


  asio::error_code ``[link asio.reference.stream_socket_service.native_non_blocking.overload2 native_non_blocking]``(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.stream_socket_service.native_non_blocking.overload2 more...]]``


[section:overload1 stream_socket_service::native_non_blocking (1 of 2 overloads)]


Gets the non-blocking mode of the native socket implementation. 


  bool native_non_blocking(
      const implementation_type & impl) const;



[endsect]



[section:overload2 stream_socket_service::native_non_blocking (2 of 2 overloads)]


Sets the non-blocking mode of the native socket implementation. 


  asio::error_code native_non_blocking(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);



[endsect]


[endsect]

[section:non_blocking stream_socket_service::non_blocking]

[indexterm2 non_blocking..stream_socket_service] 
Gets the non-blocking mode of the socket. 


  bool ``[link asio.reference.stream_socket_service.non_blocking.overload1 non_blocking]``(
      const implementation_type & impl) const;
  ``  [''''&raquo;''' [link asio.reference.stream_socket_service.non_blocking.overload1 more...]]``


Sets the non-blocking mode of the socket. 


  asio::error_code ``[link asio.reference.stream_socket_service.non_blocking.overload2 non_blocking]``(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.stream_socket_service.non_blocking.overload2 more...]]``


[section:overload1 stream_socket_service::non_blocking (1 of 2 overloads)]


Gets the non-blocking mode of the socket. 


  bool non_blocking(
      const implementation_type & impl) const;



[endsect]



[section:overload2 stream_socket_service::non_blocking (2 of 2 overloads)]


Sets the non-blocking mode of the socket. 


  asio::error_code non_blocking(
      implementation_type & impl,
      bool mode,
      asio::error_code & ec);



[endsect]


[endsect]


[section:open stream_socket_service::open]

[indexterm2 open..stream_socket_service] 
Open a stream socket. 


  asio::error_code open(
      implementation_type & impl,
      const protocol_type & protocol,
      asio::error_code & ec);



[endsect]



[section:protocol_type stream_socket_service::protocol_type]

[indexterm2 protocol_type..stream_socket_service] 
The protocol type. 


  typedef Protocol protocol_type;



[heading Requirements]

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

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


[endsect]



[section:receive stream_socket_service::receive]

[indexterm2 receive..stream_socket_service] 
Receive some data from the peer. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t receive(
      implementation_type & impl,
      const MutableBufferSequence & buffers,
      socket_base::message_flags flags,
      asio::error_code & ec);



[endsect]



[section:remote_endpoint stream_socket_service::remote_endpoint]

[indexterm2 remote_endpoint..stream_socket_service] 
Get the remote endpoint. 


  endpoint_type remote_endpoint(
      const implementation_type & impl,
      asio::error_code & ec) const;



[endsect]



[section:send stream_socket_service::send]

[indexterm2 send..stream_socket_service] 
Send the given data to the peer. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t send(
      implementation_type & impl,
      const ConstBufferSequence & buffers,
      socket_base::message_flags flags,
      asio::error_code & ec);



[endsect]



[section:set_option stream_socket_service::set_option]

[indexterm2 set_option..stream_socket_service] 
Set a socket option. 


  template<
      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
  asio::error_code set_option(
      implementation_type & impl,
      const SettableSocketOption & option,
      asio::error_code & ec);



[endsect]



[section:shutdown stream_socket_service::shutdown]

[indexterm2 shutdown..stream_socket_service] 
Disable sends or receives on the socket. 


  asio::error_code shutdown(
      implementation_type & impl,
      socket_base::shutdown_type what,
      asio::error_code & ec);



[endsect]



[section:stream_socket_service stream_socket_service::stream_socket_service]

[indexterm2 stream_socket_service..stream_socket_service] 
Construct a new stream socket service for the specified [link asio.reference.io_service `io_service`]. 


  stream_socket_service(
      asio::io_service & io_service);



[endsect]



[section:wait stream_socket_service::wait]

[indexterm2 wait..stream_socket_service] 
Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 


  asio::error_code wait(
      implementation_type & impl,
      socket_base::wait_type w,
      asio::error_code & ec);



[endsect]



[endsect]


[section:streambuf streambuf]

[indexterm1 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]]]
    [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 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_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]]]
    [Construct with an error code. 

     Construct with an error code and context. 

     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. ]
  ]
  
]

[heading Requirements]

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

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


[section:code system_error::code]

[indexterm2 code..system_error] 
Get the error code associated with the exception. 


  error_code code() const;



[endsect]



[section:operator_eq_ system_error::operator=]

[indexterm2 operator=..system_error] 
Assignment operator. 


  system_error & operator=(
      const system_error & e);



[endsect]


[section:system_error system_error::system_error]

[indexterm2 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 what..system_error] 
Get a string representation of the exception. 


  virtual const char * what() const;



[endsect]



[section:_system_error system_error::~system_error]

[indexterm2 ~system_error..system_error] 
Destructor. 


  virtual ~system_error();



[endsect]



[endsect]

[section:system_executor system_executor]


An executor that uses arbitrary threads. 


  class system_executor


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

  [

    [[link asio.reference.system_executor__thread_function [*thread_function]]]
    []
  
  ]

]

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

  [
    [[link asio.reference.system_executor.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.system_executor.defer [*defer]]]
    [Request the system executor to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.system_executor.dispatch [*dispatch]]]
    [Request the system executor to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.system_executor.on_work_finished [*on_work_finished]]]
    [Inform the executor that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.system_executor.on_work_started [*on_work_started]]]
    [Inform the executor that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.system_executor.post [*post]]]
    [Request the system executor to invoke the given function object. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.system_executor.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.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. The `post()` and `defer()` functions schedule the function to run on an unspecified system thread pool, and `dispatch()` invokes the function immediately. 

[heading Requirements]

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

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


[section:context system_executor::context]

[indexterm2 context..system_executor] 
Obtain the underlying execution context. 


  execution_context & context();



[endsect]



[section:defer system_executor::defer]

[indexterm2 defer..system_executor] 
Request the system executor to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void defer(
      Function && f,
      const Allocator & a);


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 system_executor::dispatch]

[indexterm2 dispatch..system_executor] 
Request the system executor to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void dispatch(
      Function && f,
      const Allocator & a);


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:on_work_finished system_executor::on_work_finished]

[indexterm2 on_work_finished..system_executor] 
Inform the executor that some work is no longer outstanding. 


  void on_work_finished();


For the system executor, this is a no-op. 


[endsect]



[section:on_work_started system_executor::on_work_started]

[indexterm2 on_work_started..system_executor] 
Inform the executor that it has some outstanding work to do. 


  void on_work_started();


For the system executor, this is a no-op. 


[endsect]



[section:operator_not__eq_ system_executor::operator!=]

[indexterm2 operator!=..system_executor] 
Compare two executors for inequality. 


  friend bool operator!=(
      const system_executor & ,
      const system_executor & );


System executors always compare equal. 

[heading Requirements]

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

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


[endsect]



[section:operator_eq__eq_ system_executor::operator==]

[indexterm2 operator==..system_executor] 
Compare two executors for equality. 


  friend bool operator==(
      const system_executor & ,
      const system_executor & );


System executors always compare equal. 

[heading Requirements]

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

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


[endsect]



[section:post system_executor::post]

[indexterm2 post..system_executor] 
Request the system executor to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void post(
      Function && f,
      const Allocator & a);


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]



[endsect]

[section:system_executor__context_impl system_executor::context_impl]



  struct context_impl :
    public execution_context


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

  [

    [[link asio.reference.system_executor__context_impl.fork_event [*fork_event]]]
    [Fork-related event notifications. ]
  
  ]

]

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

  [
    [[link asio.reference.system_executor__context_impl.context_impl [*context_impl]]]
    []
  ]
  
  [
    [[link asio.reference.system_executor__context_impl.notify_fork [*notify_fork]]]
    [Notify the execution_context of a fork-related event. ]
  ]
  
  [
    [[link asio.reference.system_executor__context_impl._context_impl [*~context_impl]]]
    []
  ]
  
]

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

  [
    [[link asio.reference.system_executor__context_impl.destroy_context [*destroy_context]]]
    [Destroys all services in the context. ]
  ]
  
  [
    [[link asio.reference.system_executor__context_impl.shutdown_context [*shutdown_context]]]
    [Shuts down all services in the context. ]
  ]
  
]

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

  [
    [[link asio.reference.system_executor__context_impl.scheduler_ [*scheduler_]]]
    []
  ]

  [
    [[link asio.reference.system_executor__context_impl.threads_ [*threads_]]]
    []
  ]

]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.system_executor__context_impl.add_service [*add_service]]]
    [(Deprecated: Use make_service().) Add a service object to the execution_context. ]
  ]
  
  [
    [[link asio.reference.system_executor__context_impl.has_service [*has_service]]]
    [Determine if an execution_context contains a specified service type. ]
  ]
  
  [
    [[link asio.reference.system_executor__context_impl.make_service [*make_service]]]
    [Creates a service object and adds it to the execution_context. ]
  ]
  
  [
    [[link asio.reference.system_executor__context_impl.use_service [*use_service]]]
    [Obtain the service object corresponding to the given type. ]
  ]
  
]

[heading Requirements]

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

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


[section:add_service system_executor::context_impl::add_service]


['Inherited from execution_context.]

[indexterm2 add_service..system_executor::context_impl] 
(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_executor.hpp]

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


[endsect]



[section:context_impl system_executor::context_impl::context_impl]

[indexterm2 context_impl..system_executor::context_impl] 

  context_impl();



[endsect]



[section:destroy_context system_executor::context_impl::destroy_context]


['Inherited from execution_context.]

[indexterm2 destroy_context..system_executor::context_impl] 
Destroys all services in the context. 


  void destroy_context();


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:fork_event system_executor::context_impl::fork_event]


['Inherited from execution_context.]

[indexterm2 fork_event..system_executor::context_impl] 
Fork-related event notifications. 


  enum fork_event

[indexterm2 fork_prepare..system_executor::context_impl]
[indexterm2 fork_parent..system_executor::context_impl]
[indexterm2 fork_child..system_executor::context_impl]

[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 system_executor::context_impl::has_service]


['Inherited from execution_context.]

[indexterm2 has_service..system_executor::context_impl] 
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_executor.hpp]

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


[endsect]



[section:make_service system_executor::context_impl::make_service]


['Inherited from execution_context.]

[indexterm2 make_service..system_executor::context_impl] 
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_executor.hpp]

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


[endsect]



[section:notify_fork system_executor::context_impl::notify_fork]


['Inherited from execution_context.]

[indexterm2 notify_fork..system_executor::context_impl] 
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->fork_service();`. 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_ system_executor::context_impl::scheduler_]

[indexterm2 scheduler_..system_executor::context_impl] 

  detail::scheduler & scheduler_;



[endsect]



[section:shutdown_context system_executor::context_impl::shutdown_context]


['Inherited from execution_context.]

[indexterm2 shutdown_context..system_executor::context_impl] 
Shuts down all services in the context. 


  void shutdown_context();


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_service()`. 




[endsect]



[section:threads_ system_executor::context_impl::threads_]

[indexterm2 threads_..system_executor::context_impl] 

  detail::thread_group threads_;



[endsect]


[section:use_service system_executor::context_impl::use_service]

[indexterm2 use_service..system_executor::context_impl] 
Obtain the service object corresponding to the given type. 


  template<
      typename ``[link asio.reference.Service Service]``>
  friend Service & ``[link asio.reference.system_executor__context_impl.use_service.overload1 use_service]``(
      execution_context & e);
  ``  [''''&raquo;''' [link asio.reference.system_executor__context_impl.use_service.overload1 more...]]``

  template<
      typename ``[link asio.reference.Service Service]``>
  friend Service & ``[link asio.reference.system_executor__context_impl.use_service.overload2 use_service]``(
      io_service & ios);
  ``  [''''&raquo;''' [link asio.reference.system_executor__context_impl.use_service.overload2 more...]]``


[section:overload1 system_executor::context_impl::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_executor.hpp]

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


[endsect]



[section:overload2 system_executor::context_impl::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_service & ios);


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_service `io_service`] will create a new instance of the service.


[heading Parameters]
    

[variablelist
  
[[ios][The [link asio.reference.io_service `io_service`] 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_service__service `io_service::service`]. 



[heading Requirements]

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

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


[endsect]


[endsect]


[section:_context_impl system_executor::context_impl::~context_impl]

[indexterm2 ~context_impl..system_executor::context_impl] 

  ~context_impl();



[endsect]



[endsect]

[section:system_executor__thread_function system_executor::thread_function]



  struct thread_function


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

  [
    [[link asio.reference.system_executor__thread_function.operator_lp__rp_ [*operator()]]]
    []
  ]
  
]

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

  [
    [[link asio.reference.system_executor__thread_function.scheduler_ [*scheduler_]]]
    []
  ]

]

[heading Requirements]

['Header: ][^asio/impl/system_executor.ipp]

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


[section:operator_lp__rp_ system_executor::thread_function::operator()]

[indexterm2 operator()..system_executor::thread_function] 

  void operator()();



[endsect]



[section:scheduler_ system_executor::thread_function::scheduler_]

[indexterm2 scheduler_..system_executor::thread_function] 

  detail::scheduler * scheduler_;



[endsect]



[endsect]


[section:system_timer system_timer]

[indexterm1 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.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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.basic_waitable_timer.service_type [*service_type]]]
    [The type of the service that will be used to provide I/O operations. ]
  
  ]

  [

    [[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 to set a particular expiry time as an absolute time. 

     Constructor to set a particular expiry time relative to now. 

     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. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.cancel_one [*cancel_one]]]
    [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. 

     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. 

     (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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. ]
  ]
  
]

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

  [
    [[link asio.reference.basic_waitable_timer.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.basic_waitable_timer.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

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(io_service);

   // 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(io_service,
       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: ]None


[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]]]
    [Start a new thread that executes the supplied function. ]
  ]
  
  [
    [[link asio.reference.thread._thread [*~thread]]]
    [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\_service's event processing loop:




   asio::io_service io_service;
   // ...
   asio::thread t(boost::bind(&asio::io_service::run, &io_service));
   // ...
   t.join(); 






[heading Requirements]

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

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


[section:join thread::join]

[indexterm2 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 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 ~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__executor_type [*executor_type]]]
    [Executor used to submit functions to a thread pool. ]
  
  ]

  [

    [[link asio.reference.thread_pool__thread_function [*thread_function]]]
    []
  
  ]

  [

    [[link asio.reference.thread_pool.fork_event [*fork_event]]]
    [Fork-related event notifications. ]
  
  ]

]

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

  [
    [[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.stop [*stop]]]
    [Stops the threads. ]
  ]
  
  [
    [[link asio.reference.thread_pool.thread_pool [*thread_pool]]]
    [Constructs a pool with an automatically determined number of threads. 

     Constructs a pool with a specified number of threads. ]
  ]
  
  [
    [[link asio.reference.thread_pool._thread_pool [*~thread_pool]]]
    [Destructor. ]
  ]
  
]

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

  [
    [[link asio.reference.thread_pool.destroy_context [*destroy_context]]]
    [Destroys all services in the context. ]
  ]
  
  [
    [[link asio.reference.thread_pool.shutdown_context [*shutdown_context]]]
    [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 Requirements]

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

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


[section:add_service thread_pool::add_service]


['Inherited from execution_context.]

[indexterm2 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:destroy_context thread_pool::destroy_context]


['Inherited from execution_context.]

[indexterm2 destroy_context..thread_pool] 
Destroys all services in the context. 


  void destroy_context();


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:fork_event thread_pool::fork_event]


['Inherited from execution_context.]

[indexterm2 fork_event..thread_pool] 
Fork-related event notifications. 


  enum fork_event

[indexterm2 fork_prepare..thread_pool]
[indexterm2 fork_parent..thread_pool]
[indexterm2 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 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 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 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 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 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->fork_service();`. 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_context thread_pool::shutdown_context]


['Inherited from execution_context.]

[indexterm2 shutdown_context..thread_pool] 
Shuts down all services in the context. 


  void shutdown_context();


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_service()`. 




[endsect]



[section:stop thread_pool::stop]

[indexterm2 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 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 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_service & ios);
  ``  [''''&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_service & ios);


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_service `io_service`] will create a new instance of the service.


[heading Parameters]
    

[variablelist
  
[[ios][The [link asio.reference.io_service `io_service`] 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_service__service `io_service::service`]. 



[heading Requirements]

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

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


[endsect]


[endsect]


[section:_thread_pool thread_pool::~thread_pool]

[indexterm2 ~thread_pool..thread_pool] 
Destructor. 


  ~thread_pool();


Automatically stops and joins the pool, if not explicitly done beforehand. 


[endsect]



[endsect]

[section:thread_pool__executor_type thread_pool::executor_type]


Executor used to submit functions to a thread pool. 


  class executor_type


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

  [
    [[link asio.reference.thread_pool__executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.thread_pool__executor_type.defer [*defer]]]
    [Request the thread pool to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.thread_pool__executor_type.dispatch [*dispatch]]]
    [Request the thread pool to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.thread_pool__executor_type.on_work_finished [*on_work_finished]]]
    [Inform the thread pool that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.thread_pool__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__executor_type.post [*post]]]
    [Request the thread pool to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.thread_pool__executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the thread pool is running in the current thread. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.thread_pool__executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.thread_pool__executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]

[heading Requirements]

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

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


[section:context thread_pool::executor_type::context]

[indexterm2 context..thread_pool::executor_type] 
Obtain the underlying execution context. 


  thread_pool & context();



[endsect]



[section:defer thread_pool::executor_type::defer]

[indexterm2 defer..thread_pool::executor_type] 
Request the thread pool to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void defer(
      Function && f,
      const Allocator & a);


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::executor_type::dispatch]

[indexterm2 dispatch..thread_pool::executor_type] 
Request the thread pool to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void dispatch(
      Function && f,
      const Allocator & a);


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:on_work_finished thread_pool::executor_type::on_work_finished]

[indexterm2 on_work_finished..thread_pool::executor_type] 
Inform the thread pool that some work is no longer outstanding. 


  void on_work_finished();


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::executor_type::on_work_started]

[indexterm2 on_work_started..thread_pool::executor_type] 
Inform the thread pool that it has some outstanding work to do. 


  void on_work_started();


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::executor_type::operator!=]

[indexterm2 operator!=..thread_pool::executor_type] 
Compare two executors for inequality. 


  friend bool operator!=(
      const executor_type & a,
      const 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__eq_ thread_pool::executor_type::operator==]

[indexterm2 operator==..thread_pool::executor_type] 
Compare two executors for equality. 


  friend bool operator==(
      const executor_type & a,
      const 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::executor_type::post]

[indexterm2 post..thread_pool::executor_type] 
Request the thread pool to invoke the given function object. 


  template<
      typename Function,
      typename Allocator>
  void post(
      Function && f,
      const Allocator & a);


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:running_in_this_thread thread_pool::executor_type::running_in_this_thread]

[indexterm2 running_in_this_thread..thread_pool::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 belongs to the pool. Otherwise returns `false`. 




[endsect]



[endsect]

[section:thread_pool__thread_function thread_pool::thread_function]



  struct thread_function


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

  [
    [[link asio.reference.thread_pool__thread_function.operator_lp__rp_ [*operator()]]]
    []
  ]
  
]

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

  [
    [[link asio.reference.thread_pool__thread_function.scheduler_ [*scheduler_]]]
    []
  ]

]

[heading Requirements]

['Header: ][^asio/impl/thread_pool.ipp]

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


[section:operator_lp__rp_ thread_pool::thread_function::operator()]

[indexterm2 operator()..thread_pool::thread_function] 

  void operator()();



[endsect]



[section:scheduler_ thread_pool::thread_function::scheduler_]

[indexterm2 scheduler_..thread_pool::thread_function] 

  detail::scheduler * scheduler_;



[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]]]
    [Add a duration to a time. ]
  ]
  
  [
    [[link asio.reference.time_traits_lt__ptime__gt_.less_than [*less_than]]]
    [Test whether one time is less than another. ]
  ]
  
  [
    [[link asio.reference.time_traits_lt__ptime__gt_.now [*now]]]
    [Get the current time. ]
  ]
  
  [
    [[link asio.reference.time_traits_lt__ptime__gt_.subtract [*subtract]]]
    [Subtract one time from another. ]
  ]
  
  [
    [[link asio.reference.time_traits_lt__ptime__gt_.to_posix_duration [*to_posix_duration]]]
    [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 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 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 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 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 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 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 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 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 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 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_future use_future]

[indexterm1 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: ]None


[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_lb__rb_ [*operator\[\]]]]
    [Specify an alternate allocator. ]
  ]
  
  [
    [[link asio.reference.use_future_t.use_future_t [*use_future_t]]]
    [Construct using default-constructed allocator. 

     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: ]None


[section:allocator_type use_future_t::allocator_type]

[indexterm2 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: ]None


[endsect]



[section:get_allocator use_future_t::get_allocator]

[indexterm2 get_allocator..use_future_t] 
Obtain allocator. 


  allocator_type get_allocator() const;



[endsect]



[section:operator_lb__rb_ use_future_t::operator\[\]]

[indexterm2 operator\[\]..use_future_t] 
Specify an alternate allocator. 


  template<
      typename OtherAllocator>
  use_future_t< OtherAllocator > operator[](
      const OtherAllocator & allocator) const;



[endsect]


[section:use_future_t use_future_t::use_future_t]

[indexterm2 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:use_service use_service]

[indexterm1 use_service] 
    
  template<
      typename ``[link asio.reference.Service Service]``>
  Service & ``[link asio.reference.use_service.overload1 use_service]``(
      execution_context & e);
  ``  [''''&raquo;''' [link asio.reference.use_service.overload1 more...]]``

  template<
      typename ``[link asio.reference.Service Service]``>
  Service & ``[link asio.reference.use_service.overload2 use_service]``(
      io_service & ios);
  ``  [''''&raquo;''' [link asio.reference.use_service.overload2 more...]]``

[heading Requirements]

['Header: ][^asio/impl/execution_context.hpp]

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


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



  template<
      typename ``[link asio.reference.Service Service]``>
  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. 




[endsect]



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



  template<
      typename ``[link asio.reference.Service Service]``>
  Service & use_service(
      io_service & ios);


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_service `io_service`] will create a new instance of the service.


[heading Parameters]
    

[variablelist
  
[[ios][The [link asio.reference.io_service `io_service`] 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_service__service `io_service::service`]. 




[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.Executor Executor]``>
  struct uses_executor


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]]]
    [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 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:waitable_timer_service waitable_timer_service]


Default service implementation for a timer. 


  template<
      typename Clock,
      typename ``[link asio.reference.WaitTraits WaitTraits]`` = asio::wait_traits<Clock>>
  class waitable_timer_service :
    public io_service::service


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

  [

    [[link asio.reference.waitable_timer_service.clock_type [*clock_type]]]
    [The clock type. ]
  
  ]

  [

    [[link asio.reference.waitable_timer_service.duration [*duration]]]
    [The duration type of the clock. ]
  
  ]

  [

    [[link asio.reference.waitable_timer_service.implementation_type [*implementation_type]]]
    [The implementation type of the waitable timer. ]
  
  ]

  [

    [[link asio.reference.waitable_timer_service.time_point [*time_point]]]
    [The time point type of the clock. ]
  
  ]

  [

    [[link asio.reference.waitable_timer_service.traits_type [*traits_type]]]
    [The wait traits type. ]
  
  ]

]

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

  [
    [[link asio.reference.waitable_timer_service.async_wait [*async_wait]]]
    []
  ]
  
  [
    [[link asio.reference.waitable_timer_service.cancel [*cancel]]]
    [Cancel any asynchronous wait operations associated with the timer. ]
  ]
  
  [
    [[link asio.reference.waitable_timer_service.cancel_one [*cancel_one]]]
    [Cancels one asynchronous wait operation associated with the timer. ]
  ]
  
  [
    [[link asio.reference.waitable_timer_service.construct [*construct]]]
    [Construct a new timer implementation. ]
  ]
  
  [
    [[link asio.reference.waitable_timer_service.destroy [*destroy]]]
    [Destroy a timer implementation. ]
  ]
  
  [
    [[link asio.reference.waitable_timer_service.expires_after [*expires_after]]]
    [Set the expiry time for the timer relative to now. ]
  ]
  
  [
    [[link asio.reference.waitable_timer_service.expires_at [*expires_at]]]
    [(Deprecated: Use expiry().) Get the expiry time for the timer as an absolute time. 

     Set the expiry time for the timer as an absolute time. ]
  ]
  
  [
    [[link asio.reference.waitable_timer_service.expires_from_now [*expires_from_now]]]
    [(Deprecated: Use expiry().) Get the expiry time for the timer relative to now. 

     (Deprecated: Use expires_after().) Set the expiry time for the timer relative to now. ]
  ]
  
  [
    [[link asio.reference.waitable_timer_service.expiry [*expiry]]]
    [Get the expiry time for the timer as an absolute time. ]
  ]
  
  [
    [[link asio.reference.waitable_timer_service.get_io_service [*get_io_service]]]
    [Get the io_service object that owns the service. ]
  ]
  
  [
    [[link asio.reference.waitable_timer_service.move_assign [*move_assign]]]
    [Move-assign from another timer implementation. ]
  ]
  
  [
    [[link asio.reference.waitable_timer_service.move_construct [*move_construct]]]
    [Move-construct a new timer implementation. ]
  ]
  
  [
    [[link asio.reference.waitable_timer_service.wait [*wait]]]
    []
  ]
  
  [
    [[link asio.reference.waitable_timer_service.waitable_timer_service [*waitable_timer_service]]]
    [Construct a new timer service for the specified io_service. ]
  ]
  
]

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

  [
    [[link asio.reference.waitable_timer_service.id [*id]]]
    [The unique service identifier. ]
  ]

]

[heading Requirements]

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

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


[section:async_wait waitable_timer_service::async_wait]

[indexterm2 async_wait..waitable_timer_service] 

  template<
      typename ``[link asio.reference.WaitHandler WaitHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      implementation_type & impl,
      WaitHandler && handler);



[endsect]



[section:cancel waitable_timer_service::cancel]

[indexterm2 cancel..waitable_timer_service] 
Cancel any asynchronous wait operations associated with the timer. 


  std::size_t cancel(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:cancel_one waitable_timer_service::cancel_one]

[indexterm2 cancel_one..waitable_timer_service] 
Cancels one asynchronous wait operation associated with the timer. 


  std::size_t cancel_one(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:clock_type waitable_timer_service::clock_type]

[indexterm2 clock_type..waitable_timer_service] 
The clock type. 


  typedef Clock clock_type;



[heading Requirements]

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

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


[endsect]



[section:construct waitable_timer_service::construct]

[indexterm2 construct..waitable_timer_service] 
Construct a new timer implementation. 


  void construct(
      implementation_type & impl);



[endsect]



[section:destroy waitable_timer_service::destroy]

[indexterm2 destroy..waitable_timer_service] 
Destroy a timer implementation. 


  void destroy(
      implementation_type & impl);



[endsect]



[section:duration waitable_timer_service::duration]

[indexterm2 duration..waitable_timer_service] 
The duration type of the clock. 


  typedef clock_type::duration duration;



[heading Requirements]

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

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


[endsect]



[section:expires_after waitable_timer_service::expires_after]

[indexterm2 expires_after..waitable_timer_service] 
Set the expiry time for the timer relative to now. 


  std::size_t expires_after(
      implementation_type & impl,
      const duration & expiry_time,
      asio::error_code & ec);



[endsect]


[section:expires_at waitable_timer_service::expires_at]

[indexterm2 expires_at..waitable_timer_service] 
(Deprecated: Use `expiry()`.) Get the expiry time for the timer as an absolute time. 


  time_point ``[link asio.reference.waitable_timer_service.expires_at.overload1 expires_at]``(
      const implementation_type & impl) const;
  ``  [''''&raquo;''' [link asio.reference.waitable_timer_service.expires_at.overload1 more...]]``


Set the expiry time for the timer as an absolute time. 


  std::size_t ``[link asio.reference.waitable_timer_service.expires_at.overload2 expires_at]``(
      implementation_type & impl,
      const time_point & expiry_time,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.waitable_timer_service.expires_at.overload2 more...]]``


[section:overload1 waitable_timer_service::expires_at (1 of 2 overloads)]


(Deprecated: Use `expiry()`.) Get the expiry time for the timer as an absolute time. 


  time_point expires_at(
      const implementation_type & impl) const;



[endsect]



[section:overload2 waitable_timer_service::expires_at (2 of 2 overloads)]


Set the expiry time for the timer as an absolute time. 


  std::size_t expires_at(
      implementation_type & impl,
      const time_point & expiry_time,
      asio::error_code & ec);



[endsect]


[endsect]

[section:expires_from_now waitable_timer_service::expires_from_now]

[indexterm2 expires_from_now..waitable_timer_service] 
(Deprecated: Use `expiry()`.) Get the expiry time for the timer relative to now. 


  duration ``[link asio.reference.waitable_timer_service.expires_from_now.overload1 expires_from_now]``(
      const implementation_type & impl) const;
  ``  [''''&raquo;''' [link asio.reference.waitable_timer_service.expires_from_now.overload1 more...]]``


(Deprecated: Use `expires_after()`.) Set the expiry time for the timer relative to now. 


  std::size_t ``[link asio.reference.waitable_timer_service.expires_from_now.overload2 expires_from_now]``(
      implementation_type & impl,
      const duration & expiry_time,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.waitable_timer_service.expires_from_now.overload2 more...]]``


[section:overload1 waitable_timer_service::expires_from_now (1 of 2 overloads)]


(Deprecated: Use `expiry()`.) Get the expiry time for the timer relative to now. 


  duration expires_from_now(
      const implementation_type & impl) const;



[endsect]



[section:overload2 waitable_timer_service::expires_from_now (2 of 2 overloads)]


(Deprecated: Use `expires_after()`.) Set the expiry time for the timer relative to now. 


  std::size_t expires_from_now(
      implementation_type & impl,
      const duration & expiry_time,
      asio::error_code & ec);



[endsect]


[endsect]


[section:expiry waitable_timer_service::expiry]

[indexterm2 expiry..waitable_timer_service] 
Get the expiry time for the timer as an absolute time. 


  time_point expiry(
      const implementation_type & impl) const;



[endsect]



[section:get_io_service waitable_timer_service::get_io_service]


['Inherited from io_service.]

[indexterm2 get_io_service..waitable_timer_service] 
Get the [link asio.reference.io_service `io_service`] object that owns the service. 


  asio::io_service & get_io_service();



[endsect]



[section:id waitable_timer_service::id]

[indexterm2 id..waitable_timer_service] 
The unique service identifier. 


  static asio::io_service::id id;



[endsect]



[section:implementation_type waitable_timer_service::implementation_type]

[indexterm2 implementation_type..waitable_timer_service] 
The implementation type of the waitable timer. 


  typedef implementation_defined implementation_type;



[heading Requirements]

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

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


[endsect]



[section:move_assign waitable_timer_service::move_assign]

[indexterm2 move_assign..waitable_timer_service] 
Move-assign from another timer implementation. 


  void move_assign(
      implementation_type & impl,
      waitable_timer_service & other_service,
      implementation_type & other_impl);



[endsect]



[section:move_construct waitable_timer_service::move_construct]

[indexterm2 move_construct..waitable_timer_service] 
Move-construct a new timer implementation. 


  void move_construct(
      implementation_type & impl,
      implementation_type & other_impl);



[endsect]



[section:time_point waitable_timer_service::time_point]

[indexterm2 time_point..waitable_timer_service] 
The time point type of the clock. 


  typedef clock_type::time_point time_point;



[heading Requirements]

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

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


[endsect]



[section:traits_type waitable_timer_service::traits_type]

[indexterm2 traits_type..waitable_timer_service] 
The wait traits type. 


  typedef WaitTraits traits_type;



[heading Requirements]

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

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


[endsect]



[section:wait waitable_timer_service::wait]

[indexterm2 wait..waitable_timer_service] 

  void wait(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:waitable_timer_service waitable_timer_service::waitable_timer_service]

[indexterm2 waitable_timer_service..waitable_timer_service] 
Construct a new timer service for the specified [link asio.reference.io_service `io_service`]. 


  waitable_timer_service(
      asio::io_service & io_service);



[endsect]



[endsect]

[section:windows__basic_handle windows::basic_handle]


Provides Windows handle functionality. 


  template<
      typename ``[link asio.reference.HandleService HandleService]``>
  class basic_handle :
    public basic_io_object< HandleService >


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

  [

    [[link asio.reference.windows__basic_handle.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_handle.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_handle.lowest_layer_type [*lowest_layer_type]]]
    [A basic_handle is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.windows__basic_handle.native_handle_type [*native_handle_type]]]
    [The native representation of a handle. ]
  
  ]

  [

    [[link asio.reference.windows__basic_handle.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.windows__basic_handle.assign [*assign]]]
    [Assign an existing native handle to the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.basic_handle [*basic_handle]]]
    [Construct a basic_handle without opening it. 

     Construct a basic_handle on an existing native handle. 

     Move-construct a basic_handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.close [*close]]]
    [Close the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 

     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.native_handle [*native_handle]]]
    [Get the native handle representation. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.operator_eq_ [*operator=]]]
    [Move-assign a basic_handle from another. ]
  ]
  
]

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

  [
    [[link asio.reference.windows__basic_handle.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle._basic_handle [*~basic_handle]]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

The [link asio.reference.windows__basic_handle `windows::basic_handle`] class template provides the ability to wrap a Windows handle.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 



[heading Requirements]

['Header: ][^asio/windows/basic_handle.hpp]

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

[section:assign windows::basic_handle::assign]

[indexterm2 assign..windows::basic_handle] 
Assign an existing native handle to the handle. 


  void ``[link asio.reference.windows__basic_handle.assign.overload1 assign]``(
      const native_handle_type & handle);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.assign.overload1 more...]]``

  asio::error_code ``[link asio.reference.windows__basic_handle.assign.overload2 assign]``(
      const native_handle_type & handle,
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.assign.overload2 more...]]``


[section:overload1 windows::basic_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_handle::assign (2 of 2 overloads)]


Assign an existing native handle to the handle. 


  asio::error_code assign(
      const native_handle_type & handle,
      asio::error_code & ec);



[endsect]


[endsect]

[section:basic_handle windows::basic_handle::basic_handle]

[indexterm2 basic_handle..windows::basic_handle] 
Construct a [link asio.reference.windows__basic_handle `windows::basic_handle`] without opening it. 


  explicit ``[link asio.reference.windows__basic_handle.basic_handle.overload1 basic_handle]``(
      asio::io_service & io_service);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.basic_handle.overload1 more...]]``


Construct a [link asio.reference.windows__basic_handle `windows::basic_handle`] on an existing native handle. 


  ``[link asio.reference.windows__basic_handle.basic_handle.overload2 basic_handle]``(
      asio::io_service & io_service,
      const native_handle_type & handle);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.basic_handle.overload2 more...]]``


Move-construct a [link asio.reference.windows__basic_handle `windows::basic_handle`] from another. 


  ``[link asio.reference.windows__basic_handle.basic_handle.overload3 basic_handle]``(
      basic_handle && other);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.basic_handle.overload3 more...]]``


[section:overload1 windows::basic_handle::basic_handle (1 of 3 overloads)]


Construct a [link asio.reference.windows__basic_handle `windows::basic_handle`] without opening it. 


  basic_handle(
      asio::io_service & io_service);


This constructor creates a handle without opening it.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the handle will use to dispatch handlers for any asynchronous operations performed on the handle. ]]

]




[endsect]



[section:overload2 windows::basic_handle::basic_handle (2 of 3 overloads)]


Construct a [link asio.reference.windows__basic_handle `windows::basic_handle`] on an existing native handle. 


  basic_handle(
      asio::io_service & io_service,
      const native_handle_type & handle);


This constructor creates a handle object to hold an existing native handle.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the handle will use to dispatch handlers for any asynchronous operations performed on the handle.]]

[[handle][A native handle.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload3 windows::basic_handle::basic_handle (3 of 3 overloads)]


Move-construct a [link asio.reference.windows__basic_handle `windows::basic_handle`] from another. 


  basic_handle(
      basic_handle && other);


This constructor moves a handle from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.windows__basic_handle `windows::basic_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_handle(io_service&) constructor`. 




[endsect]


[endsect]

[section:cancel windows::basic_handle::cancel]

[indexterm2 cancel..windows::basic_handle] 
Cancel all asynchronous operations associated with the handle. 


  void ``[link asio.reference.windows__basic_handle.cancel.overload1 cancel]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.cancel.overload1 more...]]``

  asio::error_code ``[link asio.reference.windows__basic_handle.cancel.overload2 cancel]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.cancel.overload2 more...]]``


[section:overload1 windows::basic_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_handle::cancel (2 of 2 overloads)]


Cancel all asynchronous operations associated with the handle. 


  asio::error_code 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_handle::close]

[indexterm2 close..windows::basic_handle] 
Close the handle. 


  void ``[link asio.reference.windows__basic_handle.close.overload1 close]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.close.overload1 more...]]``

  asio::error_code ``[link asio.reference.windows__basic_handle.close.overload2 close]``(
      asio::error_code & ec);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.close.overload2 more...]]``


[section:overload1 windows::basic_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_handle::close (2 of 2 overloads)]


Close the handle. 


  asio::error_code 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_handle::executor_type]


['Inherited from basic_io_object.]

[indexterm2 executor_type..windows::basic_handle] 
The type of the executor associated with the object. 


  typedef asio::io_service::executor_type executor_type;


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

  [
    [[link asio.reference.io_service__executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.defer [*defer]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.dispatch [*dispatch]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_finished [*on_work_finished]]]
    [Inform the io_service that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_started [*on_work_started]]]
    [Inform the io_service that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.post [*post]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the io_service is running in the current thread. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_service__executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[heading Requirements]

['Header: ][^asio/windows/basic_handle.hpp]

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


[endsect]



[section:get_executor windows::basic_handle::get_executor]


['Inherited from basic_io_object.]

[indexterm2 get_executor..windows::basic_handle] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_implementation windows::basic_handle::get_implementation]

[indexterm2 get_implementation..windows::basic_handle] 
Get the underlying implementation of the I/O object. 


  implementation_type & ``[link asio.reference.windows__basic_handle.get_implementation.overload1 get_implementation]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.get_implementation.overload1 more...]]``

  const implementation_type & ``[link asio.reference.windows__basic_handle.get_implementation.overload2 get_implementation]``() const;
  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.get_implementation.overload2 more...]]``


[section:overload1 windows::basic_handle::get_implementation (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  implementation_type & get_implementation();



[endsect]



[section:overload2 windows::basic_handle::get_implementation (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  const implementation_type & get_implementation() const;



[endsect]


[endsect]


[section:get_io_service windows::basic_handle::get_io_service]


['Inherited from basic_io_object.]

[indexterm2 get_io_service..windows::basic_handle] 
(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();


This function may be used to obtain the [link asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_service `io_service`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 




[endsect]


[section:get_service windows::basic_handle::get_service]

[indexterm2 get_service..windows::basic_handle] 
Get the service associated with the I/O object. 


  service_type & ``[link asio.reference.windows__basic_handle.get_service.overload1 get_service]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.get_service.overload1 more...]]``

  const service_type & ``[link asio.reference.windows__basic_handle.get_service.overload2 get_service]``() const;
  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.get_service.overload2 more...]]``


[section:overload1 windows::basic_handle::get_service (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  service_type & get_service();



[endsect]



[section:overload2 windows::basic_handle::get_service (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  const service_type & get_service() const;



[endsect]


[endsect]


[section:implementation_type windows::basic_handle::implementation_type]


['Inherited from basic_io_object.]

[indexterm2 implementation_type..windows::basic_handle] 
The underlying implementation type of I/O object. 


  typedef service_type::implementation_type implementation_type;



[heading Requirements]

['Header: ][^asio/windows/basic_handle.hpp]

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


[endsect]



[section:is_open windows::basic_handle::is_open]

[indexterm2 is_open..windows::basic_handle] 
Determine whether the handle is open. 


  bool is_open() const;



[endsect]


[section:lowest_layer windows::basic_handle::lowest_layer]

[indexterm2 lowest_layer..windows::basic_handle] 
Get a reference to the lowest layer. 


  lowest_layer_type & ``[link asio.reference.windows__basic_handle.lowest_layer.overload1 lowest_layer]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.lowest_layer.overload1 more...]]``


Get a const reference to the lowest layer. 


  const lowest_layer_type & ``[link asio.reference.windows__basic_handle.lowest_layer.overload2 lowest_layer]``() const;
  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.lowest_layer.overload2 more...]]``


[section:overload1 windows::basic_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 a [link asio.reference.windows__basic_handle `windows::basic_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_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 a [link asio.reference.windows__basic_handle `windows::basic_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_handle::lowest_layer_type]

[indexterm2 lowest_layer_type..windows::basic_handle] 
A [link asio.reference.windows__basic_handle `windows::basic_handle`] is always the lowest layer. 


  typedef basic_handle< HandleService > lowest_layer_type;


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

  [

    [[link asio.reference.windows__basic_handle.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_handle.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_handle.lowest_layer_type [*lowest_layer_type]]]
    [A basic_handle is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.windows__basic_handle.native_handle_type [*native_handle_type]]]
    [The native representation of a handle. ]
  
  ]

  [

    [[link asio.reference.windows__basic_handle.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.windows__basic_handle.assign [*assign]]]
    [Assign an existing native handle to the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.basic_handle [*basic_handle]]]
    [Construct a basic_handle without opening it. 

     Construct a basic_handle on an existing native handle. 

     Move-construct a basic_handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.close [*close]]]
    [Close the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 

     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.native_handle [*native_handle]]]
    [Get the native handle representation. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.operator_eq_ [*operator=]]]
    [Move-assign a basic_handle from another. ]
  ]
  
]

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

  [
    [[link asio.reference.windows__basic_handle.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle._basic_handle [*~basic_handle]]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

The [link asio.reference.windows__basic_handle `windows::basic_handle`] class template provides the ability to wrap a Windows handle.


[heading Thread Safety]
  
['Distinct] ['objects:] Safe.

['Shared] ['objects:] Unsafe. 




[heading Requirements]

['Header: ][^asio/windows/basic_handle.hpp]

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


[endsect]



[section:native_handle windows::basic_handle::native_handle]

[indexterm2 native_handle..windows::basic_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_handle::native_handle_type]

[indexterm2 native_handle_type..windows::basic_handle] 
The native representation of a handle. 


  typedef HandleService::native_handle_type native_handle_type;



[heading Requirements]

['Header: ][^asio/windows/basic_handle.hpp]

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


[endsect]



[section:operator_eq_ windows::basic_handle::operator=]

[indexterm2 operator=..windows::basic_handle] 
Move-assign a [link asio.reference.windows__basic_handle `windows::basic_handle`] from another. 


  basic_handle & operator=(
      basic_handle && other);


This assignment operator moves a handle from one object to another.


[heading Parameters]
    

[variablelist
  
[[other][The other [link asio.reference.windows__basic_handle `windows::basic_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_handle(io_service&) constructor`. 




[endsect]



[section:service_type windows::basic_handle::service_type]


['Inherited from basic_io_object.]

[indexterm2 service_type..windows::basic_handle] 
The type of the service that will be used to provide I/O operations. 


  typedef HandleService service_type;



[heading Requirements]

['Header: ][^asio/windows/basic_handle.hpp]

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


[endsect]



[section:_basic_handle windows::basic_handle::~basic_handle]

[indexterm2 ~basic_handle..windows::basic_handle] 
Protected destructor to prevent deletion through this type. 


  ~basic_handle();



[endsect]



[endsect]

[section:windows__basic_object_handle windows::basic_object_handle]


Provides object-oriented handle functionality. 


  template<
      typename ``[link asio.reference.ObjectHandleService ObjectHandleService]`` = object_handle_service>
  class basic_object_handle :
    public windows::basic_handle< ObjectHandleService >


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_object_handle.lowest_layer_type [*lowest_layer_type]]]
    [A basic_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. ]
  
  ]

  [

    [[link asio.reference.windows__basic_object_handle.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.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]]]
    [Construct a basic_object_handle without opening it. 

     Construct a basic_object_handle on an existing native handle. 

     Move-construct a basic_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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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 a basic_object_handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.wait [*wait]]]
    [Perform a blocking wait on the object handle. ]
  ]
  
]

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

  [
    [[link asio.reference.windows__basic_object_handle.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

The [link asio.reference.windows__basic_object_handle `windows::basic_object_handle`] class template 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 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...]]``

  asio::error_code ``[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)]


['Inherited from windows::basic_handle.]


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)]


['Inherited from windows::basic_handle.]


Assign an existing native handle to the handle. 


  asio::error_code assign(
      const native_handle_type & handle,
      asio::error_code & ec);



[endsect]


[endsect]


[section:async_wait windows::basic_object_handle::async_wait]

[indexterm2 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      WaitHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::post()`. ]]

]




[endsect]


[section:basic_object_handle windows::basic_object_handle::basic_object_handle]

[indexterm2 basic_object_handle..windows::basic_object_handle] 
Construct a [link asio.reference.windows__basic_object_handle `windows::basic_object_handle`] without opening it. 


  explicit ``[link asio.reference.windows__basic_object_handle.basic_object_handle.overload1 basic_object_handle]``(
      asio::io_service & io_service);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.basic_object_handle.overload1 more...]]``


Construct a [link asio.reference.windows__basic_object_handle `windows::basic_object_handle`] on an existing native handle. 


  ``[link asio.reference.windows__basic_object_handle.basic_object_handle.overload2 basic_object_handle]``(
      asio::io_service & io_service,
      const native_handle_type & native_handle);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.basic_object_handle.overload2 more...]]``


Move-construct a [link asio.reference.windows__basic_object_handle `windows::basic_object_handle`] from another. 


  ``[link asio.reference.windows__basic_object_handle.basic_object_handle.overload3 basic_object_handle]``(
      basic_object_handle && other);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.basic_object_handle.overload3 more...]]``


[section:overload1 windows::basic_object_handle::basic_object_handle (1 of 3 overloads)]


Construct a [link asio.reference.windows__basic_object_handle `windows::basic_object_handle`] without opening it. 


  basic_object_handle(
      asio::io_service & io_service);


This constructor creates an object handle without opening it.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the object handle will use to dispatch handlers for any asynchronous operations performed on the handle. ]]

]




[endsect]



[section:overload2 windows::basic_object_handle::basic_object_handle (2 of 3 overloads)]


Construct a [link asio.reference.windows__basic_object_handle `windows::basic_object_handle`] on an existing native handle. 


  basic_object_handle(
      asio::io_service & io_service,
      const native_handle_type & native_handle);


This constructor creates an object handle object to hold an existing native handle.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the object handle will use to dispatch handlers for any asynchronous operations performed on the handle.]]

[[native_handle][The new underlying handle implementation.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload3 windows::basic_object_handle::basic_object_handle (3 of 3 overloads)]


Move-construct a [link asio.reference.windows__basic_object_handle `windows::basic_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 [link asio.reference.windows__basic_object_handle `windows::basic_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(io_service&) constructor`. 




[endsect]


[endsect]

[section:cancel windows::basic_object_handle::cancel]

[indexterm2 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...]]``

  asio::error_code ``[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)]


['Inherited from windows::basic_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_object_handle::cancel (2 of 2 overloads)]


['Inherited from windows::basic_handle.]


Cancel all asynchronous operations associated with the handle. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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)]


['Inherited from windows::basic_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_object_handle::close (2 of 2 overloads)]


['Inherited from windows::basic_handle.]


Close the handle. 


  asio::error_code 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]


['Inherited from basic_io_object.]

[indexterm2 executor_type..windows::basic_object_handle] 
The type of the executor associated with the object. 


  typedef asio::io_service::executor_type executor_type;


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

  [
    [[link asio.reference.io_service__executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.defer [*defer]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.dispatch [*dispatch]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_finished [*on_work_finished]]]
    [Inform the io_service that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_started [*on_work_started]]]
    [Inform the io_service that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.post [*post]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the io_service is running in the current thread. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_service__executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[heading Requirements]

['Header: ][^asio/windows/basic_object_handle.hpp]

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


[endsect]



[section:get_executor windows::basic_object_handle::get_executor]


['Inherited from basic_io_object.]

[indexterm2 get_executor..windows::basic_object_handle] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_implementation windows::basic_object_handle::get_implementation]

[indexterm2 get_implementation..windows::basic_object_handle] 
Get the underlying implementation of the I/O object. 


  implementation_type & ``[link asio.reference.windows__basic_object_handle.get_implementation.overload1 get_implementation]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.get_implementation.overload1 more...]]``

  const implementation_type & ``[link asio.reference.windows__basic_object_handle.get_implementation.overload2 get_implementation]``() const;
  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.get_implementation.overload2 more...]]``


[section:overload1 windows::basic_object_handle::get_implementation (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  implementation_type & get_implementation();



[endsect]



[section:overload2 windows::basic_object_handle::get_implementation (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  const implementation_type & get_implementation() const;



[endsect]


[endsect]


[section:get_io_service windows::basic_object_handle::get_io_service]


['Inherited from basic_io_object.]

[indexterm2 get_io_service..windows::basic_object_handle] 
(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();


This function may be used to obtain the [link asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_service `io_service`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 




[endsect]


[section:get_service windows::basic_object_handle::get_service]

[indexterm2 get_service..windows::basic_object_handle] 
Get the service associated with the I/O object. 


  service_type & ``[link asio.reference.windows__basic_object_handle.get_service.overload1 get_service]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.get_service.overload1 more...]]``

  const service_type & ``[link asio.reference.windows__basic_object_handle.get_service.overload2 get_service]``() const;
  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.get_service.overload2 more...]]``


[section:overload1 windows::basic_object_handle::get_service (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  service_type & get_service();



[endsect]



[section:overload2 windows::basic_object_handle::get_service (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  const service_type & get_service() const;



[endsect]


[endsect]


[section:implementation_type windows::basic_object_handle::implementation_type]


['Inherited from basic_io_object.]

[indexterm2 implementation_type..windows::basic_object_handle] 
The underlying implementation type of I/O object. 


  typedef service_type::implementation_type implementation_type;



[heading Requirements]

['Header: ][^asio/windows/basic_object_handle.hpp]

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


[endsect]



[section:is_open windows::basic_object_handle::is_open]


['Inherited from windows::basic_handle.]

[indexterm2 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 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)]


['Inherited from windows::basic_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 a [link asio.reference.windows__basic_handle `windows::basic_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)]


['Inherited from windows::basic_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 a [link asio.reference.windows__basic_handle `windows::basic_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]


['Inherited from windows::basic_handle.]

[indexterm2 lowest_layer_type..windows::basic_object_handle] 
A [link asio.reference.windows__basic_handle `windows::basic_handle`] is always the lowest layer. 


  typedef basic_handle< ObjectHandleService > lowest_layer_type;


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

  [

    [[link asio.reference.windows__basic_handle.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_handle.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_handle.lowest_layer_type [*lowest_layer_type]]]
    [A basic_handle is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.windows__basic_handle.native_handle_type [*native_handle_type]]]
    [The native representation of a handle. ]
  
  ]

  [

    [[link asio.reference.windows__basic_handle.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.windows__basic_handle.assign [*assign]]]
    [Assign an existing native handle to the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.basic_handle [*basic_handle]]]
    [Construct a basic_handle without opening it. 

     Construct a basic_handle on an existing native handle. 

     Move-construct a basic_handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.close [*close]]]
    [Close the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 

     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.native_handle [*native_handle]]]
    [Get the native handle representation. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.operator_eq_ [*operator=]]]
    [Move-assign a basic_handle from another. ]
  ]
  
]

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

  [
    [[link asio.reference.windows__basic_handle.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle._basic_handle [*~basic_handle]]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

The [link asio.reference.windows__basic_handle `windows::basic_handle`] class template provides the ability to wrap a Windows handle.


[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]


['Inherited from windows::basic_handle.]

[indexterm2 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 native_handle_type..windows::basic_object_handle] 
The native representation of a handle. 


  typedef ObjectHandleService::native_handle_type 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 operator=..windows::basic_object_handle] 
Move-assign a [link asio.reference.windows__basic_object_handle `windows::basic_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 [link asio.reference.windows__basic_object_handle `windows::basic_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(io_service&) constructor`. 




[endsect]



[section:service_type windows::basic_object_handle::service_type]


['Inherited from basic_io_object.]

[indexterm2 service_type..windows::basic_object_handle] 
The type of the service that will be used to provide I/O operations. 


  typedef ObjectHandleService service_type;



[heading Requirements]

['Header: ][^asio/windows/basic_object_handle.hpp]

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


[endsect]


[section:wait windows::basic_object_handle::wait]

[indexterm2 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_random_access_handle windows::basic_random_access_handle]


Provides random-access handle functionality. 


  template<
      typename ``[link asio.reference.RandomAccessHandleService RandomAccessHandleService]`` = random_access_handle_service>
  class basic_random_access_handle :
    public windows::basic_handle< RandomAccessHandleService >


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_random_access_handle.lowest_layer_type [*lowest_layer_type]]]
    [A basic_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. ]
  
  ]

  [

    [[link asio.reference.windows__basic_random_access_handle.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.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]]]
    [Construct a basic_random_access_handle without opening it. 

     Construct a basic_random_access_handle on an existing native handle. 

     Move-construct a basic_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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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 basic_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. ]
  ]
  
]

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

  [
    [[link asio.reference.windows__basic_random_access_handle.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

The [link asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] class template 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 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...]]``

  asio::error_code ``[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_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_handle.]


Assign an existing native handle to the handle. 


  asio::error_code 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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some_at(
      uint64_t offset,
      const MutableBufferSequence & buffers,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some_at(
      uint64_t offset,
      const ConstBufferSequence & buffers,
      WriteHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 basic_random_access_handle..windows::basic_random_access_handle] 
Construct a [link asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] without opening it. 


  explicit ``[link asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload1 basic_random_access_handle]``(
      asio::io_service & io_service);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload1 more...]]``


Construct a [link asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] on an existing native handle. 


  ``[link asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload2 basic_random_access_handle]``(
      asio::io_service & io_service,
      const native_handle_type & handle);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload2 more...]]``


Move-construct a [link asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] from another. 


  ``[link asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload3 basic_random_access_handle]``(
      basic_random_access_handle && other);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload3 more...]]``


[section:overload1 windows::basic_random_access_handle::basic_random_access_handle (1 of 3 overloads)]


Construct a [link asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] without opening it. 


  basic_random_access_handle(
      asio::io_service & io_service);


This constructor creates a random-access handle without opening it. The handle needs to be opened before data can be written to or read from it.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the random-access handle will use to dispatch handlers for any asynchronous operations performed on the handle. ]]

]




[endsect]



[section:overload2 windows::basic_random_access_handle::basic_random_access_handle (2 of 3 overloads)]


Construct a [link asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] on an existing native handle. 


  basic_random_access_handle(
      asio::io_service & io_service,
      const native_handle_type & handle);


This constructor creates a random-access handle object to hold an existing native handle.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the random-access handle will use to dispatch handlers for any asynchronous operations performed on the handle.]]

[[handle][The new underlying handle implementation.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload3 windows::basic_random_access_handle::basic_random_access_handle (3 of 3 overloads)]


Move-construct a [link asio.reference.windows__basic_random_access_handle `windows::basic_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 [link asio.reference.windows__basic_random_access_handle `windows::basic_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(io_service&)` constructor. 




[endsect]


[endsect]

[section:cancel windows::basic_random_access_handle::cancel]

[indexterm2 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...]]``

  asio::error_code ``[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_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_handle.]


Cancel all asynchronous operations associated with the handle. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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_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_handle.]


Close the handle. 


  asio::error_code 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]


['Inherited from basic_io_object.]

[indexterm2 executor_type..windows::basic_random_access_handle] 
The type of the executor associated with the object. 


  typedef asio::io_service::executor_type executor_type;


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

  [
    [[link asio.reference.io_service__executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.defer [*defer]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.dispatch [*dispatch]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_finished [*on_work_finished]]]
    [Inform the io_service that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_started [*on_work_started]]]
    [Inform the io_service that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.post [*post]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the io_service is running in the current thread. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_service__executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[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 basic_io_object.]

[indexterm2 get_executor..windows::basic_random_access_handle] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_implementation windows::basic_random_access_handle::get_implementation]

[indexterm2 get_implementation..windows::basic_random_access_handle] 
Get the underlying implementation of the I/O object. 


  implementation_type & ``[link asio.reference.windows__basic_random_access_handle.get_implementation.overload1 get_implementation]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.get_implementation.overload1 more...]]``

  const implementation_type & ``[link asio.reference.windows__basic_random_access_handle.get_implementation.overload2 get_implementation]``() const;
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.get_implementation.overload2 more...]]``


[section:overload1 windows::basic_random_access_handle::get_implementation (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  implementation_type & get_implementation();



[endsect]



[section:overload2 windows::basic_random_access_handle::get_implementation (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  const implementation_type & get_implementation() const;



[endsect]


[endsect]


[section:get_io_service windows::basic_random_access_handle::get_io_service]


['Inherited from basic_io_object.]

[indexterm2 get_io_service..windows::basic_random_access_handle] 
(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();


This function may be used to obtain the [link asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_service `io_service`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 




[endsect]


[section:get_service windows::basic_random_access_handle::get_service]

[indexterm2 get_service..windows::basic_random_access_handle] 
Get the service associated with the I/O object. 


  service_type & ``[link asio.reference.windows__basic_random_access_handle.get_service.overload1 get_service]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.get_service.overload1 more...]]``

  const service_type & ``[link asio.reference.windows__basic_random_access_handle.get_service.overload2 get_service]``() const;
  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.get_service.overload2 more...]]``


[section:overload1 windows::basic_random_access_handle::get_service (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  service_type & get_service();



[endsect]



[section:overload2 windows::basic_random_access_handle::get_service (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  const service_type & get_service() const;



[endsect]


[endsect]


[section:implementation_type windows::basic_random_access_handle::implementation_type]


['Inherited from basic_io_object.]

[indexterm2 implementation_type..windows::basic_random_access_handle] 
The underlying implementation type of I/O object. 


  typedef service_type::implementation_type implementation_type;



[heading Requirements]

['Header: ][^asio/windows/basic_random_access_handle.hpp]

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


[endsect]



[section:is_open windows::basic_random_access_handle::is_open]


['Inherited from windows::basic_handle.]

[indexterm2 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 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_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 a [link asio.reference.windows__basic_handle `windows::basic_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_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 a [link asio.reference.windows__basic_handle `windows::basic_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_handle.]

[indexterm2 lowest_layer_type..windows::basic_random_access_handle] 
A [link asio.reference.windows__basic_handle `windows::basic_handle`] is always the lowest layer. 


  typedef basic_handle< RandomAccessHandleService > lowest_layer_type;


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

  [

    [[link asio.reference.windows__basic_handle.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_handle.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_handle.lowest_layer_type [*lowest_layer_type]]]
    [A basic_handle is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.windows__basic_handle.native_handle_type [*native_handle_type]]]
    [The native representation of a handle. ]
  
  ]

  [

    [[link asio.reference.windows__basic_handle.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.windows__basic_handle.assign [*assign]]]
    [Assign an existing native handle to the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.basic_handle [*basic_handle]]]
    [Construct a basic_handle without opening it. 

     Construct a basic_handle on an existing native handle. 

     Move-construct a basic_handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.close [*close]]]
    [Close the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 

     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.native_handle [*native_handle]]]
    [Get the native handle representation. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.operator_eq_ [*operator=]]]
    [Move-assign a basic_handle from another. ]
  ]
  
]

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

  [
    [[link asio.reference.windows__basic_handle.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle._basic_handle [*~basic_handle]]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

The [link asio.reference.windows__basic_handle `windows::basic_handle`] class template provides the ability to wrap a Windows handle.


[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_handle.]

[indexterm2 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 native_handle_type..windows::basic_random_access_handle] 
The native representation of a handle. 


  typedef RandomAccessHandleService::native_handle_type 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 operator=..windows::basic_random_access_handle] 
Move-assign a [link asio.reference.windows__basic_random_access_handle `windows::basic_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 [link asio.reference.windows__basic_random_access_handle `windows::basic_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(io_service&)` constructor. 




[endsect]


[section:read_some_at windows::basic_random_access_handle::read_some_at]

[indexterm2 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:service_type windows::basic_random_access_handle::service_type]


['Inherited from basic_io_object.]

[indexterm2 service_type..windows::basic_random_access_handle] 
The type of the service that will be used to provide I/O operations. 


  typedef RandomAccessHandleService service_type;



[heading Requirements]

['Header: ][^asio/windows/basic_random_access_handle.hpp]

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


[endsect]


[section:write_some_at windows::basic_random_access_handle::write_some_at]

[indexterm2 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_stream_handle windows::basic_stream_handle]


Provides stream-oriented handle functionality. 


  template<
      typename ``[link asio.reference.StreamHandleService StreamHandleService]`` = stream_handle_service>
  class basic_stream_handle :
    public windows::basic_handle< StreamHandleService >


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

  [

    [[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.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_stream_handle.lowest_layer_type [*lowest_layer_type]]]
    [A basic_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. ]
  
  ]

  [

    [[link asio.reference.windows__basic_stream_handle.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.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]]]
    [Construct a basic_stream_handle without opening it. 

     Construct a basic_stream_handle on an existing native handle. 

     Move-construct a basic_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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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 basic_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. ]
  ]
  
]

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

  [
    [[link asio.reference.windows__basic_stream_handle.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

The [link asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] class template 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 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...]]``

  asio::error_code ``[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_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_handle.]


Assign an existing native handle to the handle. 


  asio::error_code assign(
      const native_handle_type & handle,
      asio::error_code & ec);



[endsect]


[endsect]


[section:async_read_some windows::basic_stream_handle::async_read_some]

[indexterm2 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some(
      const MutableBufferSequence & buffers,
      ReadHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some(
      const ConstBufferSequence & buffers,
      WriteHandler && handler);


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. Invocation of the handler will be performed in a manner equivalent to using `asio::io_service::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 basic_stream_handle..windows::basic_stream_handle] 
Construct a [link asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] without opening it. 


  explicit ``[link asio.reference.windows__basic_stream_handle.basic_stream_handle.overload1 basic_stream_handle]``(
      asio::io_service & io_service);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.basic_stream_handle.overload1 more...]]``


Construct a [link asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] on an existing native handle. 


  ``[link asio.reference.windows__basic_stream_handle.basic_stream_handle.overload2 basic_stream_handle]``(
      asio::io_service & io_service,
      const native_handle_type & handle);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.basic_stream_handle.overload2 more...]]``


Move-construct a [link asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] from another. 


  ``[link asio.reference.windows__basic_stream_handle.basic_stream_handle.overload3 basic_stream_handle]``(
      basic_stream_handle && other);
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.basic_stream_handle.overload3 more...]]``


[section:overload1 windows::basic_stream_handle::basic_stream_handle (1 of 3 overloads)]


Construct a [link asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] without opening it. 


  basic_stream_handle(
      asio::io_service & io_service);


This constructor creates a stream handle without opening it. The handle needs to be opened and then connected or accepted before data can be sent or received on it.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the stream handle will use to dispatch handlers for any asynchronous operations performed on the handle. ]]

]




[endsect]



[section:overload2 windows::basic_stream_handle::basic_stream_handle (2 of 3 overloads)]


Construct a [link asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] on an existing native handle. 


  basic_stream_handle(
      asio::io_service & io_service,
      const native_handle_type & handle);


This constructor creates a stream handle object to hold an existing native handle.


[heading Parameters]
    

[variablelist
  
[[io_service][The [link asio.reference.io_service `io_service`] object that the stream handle will use to dispatch handlers for any asynchronous operations performed on the handle.]]

[[handle][The new underlying handle implementation.]]

]


[heading Exceptions]
    

[variablelist
  
[[asio::system_error][Thrown on failure. ]]

]




[endsect]



[section:overload3 windows::basic_stream_handle::basic_stream_handle (3 of 3 overloads)]


Move-construct a [link asio.reference.windows__basic_stream_handle `windows::basic_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 [link asio.reference.windows__basic_stream_handle `windows::basic_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(io_service&) constructor`. 




[endsect]


[endsect]

[section:cancel windows::basic_stream_handle::cancel]

[indexterm2 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...]]``

  asio::error_code ``[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_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_handle.]


Cancel all asynchronous operations associated with the handle. 


  asio::error_code 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 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...]]``

  asio::error_code ``[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_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_handle.]


Close the handle. 


  asio::error_code 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]


['Inherited from basic_io_object.]

[indexterm2 executor_type..windows::basic_stream_handle] 
The type of the executor associated with the object. 


  typedef asio::io_service::executor_type executor_type;


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

  [
    [[link asio.reference.io_service__executor_type.context [*context]]]
    [Obtain the underlying execution context. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.defer [*defer]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.dispatch [*dispatch]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_finished [*on_work_finished]]]
    [Inform the io_service that some work is no longer outstanding. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.on_work_started [*on_work_started]]]
    [Inform the io_service that it has some outstanding work to do. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.post [*post]]]
    [Request the io_service to invoke the given function object. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.running_in_this_thread [*running_in_this_thread]]]
    [Determine whether the io_service is running in the current thread. ]
  ]
  
]

[heading Friends]
[table
  [[Name][Description]]

  [
    [[link asio.reference.io_service__executor_type.operator_not__eq_ [*operator!=]]]
    [Compare two executors for inequality. ]
  ]
  
  [
    [[link asio.reference.io_service__executor_type.operator_eq__eq_ [*operator==]]]
    [Compare two executors for equality. ]
  ]
  
]


[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 basic_io_object.]

[indexterm2 get_executor..windows::basic_stream_handle] 
Get the executor associated with the object. 


  executor_type get_executor();



[endsect]


[section:get_implementation windows::basic_stream_handle::get_implementation]

[indexterm2 get_implementation..windows::basic_stream_handle] 
Get the underlying implementation of the I/O object. 


  implementation_type & ``[link asio.reference.windows__basic_stream_handle.get_implementation.overload1 get_implementation]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.get_implementation.overload1 more...]]``

  const implementation_type & ``[link asio.reference.windows__basic_stream_handle.get_implementation.overload2 get_implementation]``() const;
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.get_implementation.overload2 more...]]``


[section:overload1 windows::basic_stream_handle::get_implementation (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  implementation_type & get_implementation();



[endsect]



[section:overload2 windows::basic_stream_handle::get_implementation (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the underlying implementation of the I/O object. 


  const implementation_type & get_implementation() const;



[endsect]


[endsect]


[section:get_io_service windows::basic_stream_handle::get_io_service]


['Inherited from basic_io_object.]

[indexterm2 get_io_service..windows::basic_stream_handle] 
(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_service `io_service`] associated with the object. 


  asio::io_service & get_io_service();


This function may be used to obtain the [link asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.


[heading Return Value]
      
A reference to the [link asio.reference.io_service `io_service`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 




[endsect]


[section:get_service windows::basic_stream_handle::get_service]

[indexterm2 get_service..windows::basic_stream_handle] 
Get the service associated with the I/O object. 


  service_type & ``[link asio.reference.windows__basic_stream_handle.get_service.overload1 get_service]``();
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.get_service.overload1 more...]]``

  const service_type & ``[link asio.reference.windows__basic_stream_handle.get_service.overload2 get_service]``() const;
  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.get_service.overload2 more...]]``


[section:overload1 windows::basic_stream_handle::get_service (1 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  service_type & get_service();



[endsect]



[section:overload2 windows::basic_stream_handle::get_service (2 of 2 overloads)]


['Inherited from basic_io_object.]


Get the service associated with the I/O object. 


  const service_type & get_service() const;



[endsect]


[endsect]


[section:implementation_type windows::basic_stream_handle::implementation_type]


['Inherited from basic_io_object.]

[indexterm2 implementation_type..windows::basic_stream_handle] 
The underlying implementation type of I/O object. 


  typedef service_type::implementation_type implementation_type;



[heading Requirements]

['Header: ][^asio/windows/basic_stream_handle.hpp]

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


[endsect]



[section:is_open windows::basic_stream_handle::is_open]


['Inherited from windows::basic_handle.]

[indexterm2 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 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_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 a [link asio.reference.windows__basic_handle `windows::basic_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_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 a [link asio.reference.windows__basic_handle `windows::basic_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_handle.]

[indexterm2 lowest_layer_type..windows::basic_stream_handle] 
A [link asio.reference.windows__basic_handle `windows::basic_handle`] is always the lowest layer. 


  typedef basic_handle< StreamHandleService > lowest_layer_type;


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

  [

    [[link asio.reference.windows__basic_handle.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_handle.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_handle.lowest_layer_type [*lowest_layer_type]]]
    [A basic_handle is always the lowest layer. ]
  
  ]

  [

    [[link asio.reference.windows__basic_handle.native_handle_type [*native_handle_type]]]
    [The native representation of a handle. ]
  
  ]

  [

    [[link asio.reference.windows__basic_handle.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.windows__basic_handle.assign [*assign]]]
    [Assign an existing native handle to the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.basic_handle [*basic_handle]]]
    [Construct a basic_handle without opening it. 

     Construct a basic_handle on an existing native handle. 

     Move-construct a basic_handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.close [*close]]]
    [Close the handle. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.get_executor [*get_executor]]]
    [Get the executor associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service associated with the object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.lowest_layer [*lowest_layer]]]
    [Get a reference to the lowest layer. 

     Get a const reference to the lowest layer. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.native_handle [*native_handle]]]
    [Get the native handle representation. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.operator_eq_ [*operator=]]]
    [Move-assign a basic_handle from another. ]
  ]
  
]

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

  [
    [[link asio.reference.windows__basic_handle.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_handle._basic_handle [*~basic_handle]]]
    [Protected destructor to prevent deletion through this type. ]
  ]
  
]

The [link asio.reference.windows__basic_handle `windows::basic_handle`] class template provides the ability to wrap a Windows handle.


[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_handle.]

[indexterm2 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 native_handle_type..windows::basic_stream_handle] 
The native representation of a handle. 


  typedef StreamHandleService::native_handle_type 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 operator=..windows::basic_stream_handle] 
Move-assign a [link asio.reference.windows__basic_stream_handle `windows::basic_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 [link asio.reference.windows__basic_stream_handle `windows::basic_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(io_service&) constructor`. 




[endsect]


[section:read_some windows::basic_stream_handle::read_some]

[indexterm2 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:service_type windows::basic_stream_handle::service_type]


['Inherited from basic_io_object.]

[indexterm2 service_type..windows::basic_stream_handle] 
The type of the service that will be used to provide I/O operations. 


  typedef StreamHandleService service_type;



[heading Requirements]

['Header: ][^asio/windows/basic_stream_handle.hpp]

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


[endsect]


[section:write_some windows::basic_stream_handle::write_some]

[indexterm2 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__object_handle windows::object_handle]

[indexterm1 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.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_object_handle.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_object_handle.lowest_layer_type [*lowest_layer_type]]]
    [A basic_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. ]
  
  ]

  [

    [[link asio.reference.windows__basic_object_handle.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.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]]]
    [Construct a basic_object_handle without opening it. 

     Construct a basic_object_handle on an existing native handle. 

     Move-construct a basic_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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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 a basic_object_handle from another. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.wait [*wait]]]
    [Perform a blocking wait on the object handle. ]
  ]
  
]

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

  [
    [[link asio.reference.windows__basic_object_handle.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_object_handle.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

The [link asio.reference.windows__basic_object_handle `windows::basic_object_handle`] class template 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__object_handle_service windows::object_handle_service]


Default service implementation for an object handle. 


  class object_handle_service :
    public io_service::service


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

  [

    [[link asio.reference.windows__object_handle_service.implementation_type [*implementation_type]]]
    [The type of an object handle implementation. ]
  
  ]

  [

    [[link asio.reference.windows__object_handle_service.native_handle_type [*native_handle_type]]]
    [The native handle type. ]
  
  ]

]

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

  [
    [[link asio.reference.windows__object_handle_service.assign [*assign]]]
    [Assign an existing native handle to an object handle. ]
  ]
  
  [
    [[link asio.reference.windows__object_handle_service.async_wait [*async_wait]]]
    [Start an asynchronous wait. ]
  ]
  
  [
    [[link asio.reference.windows__object_handle_service.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__object_handle_service.close [*close]]]
    [Close an object handle implementation. ]
  ]
  
  [
    [[link asio.reference.windows__object_handle_service.construct [*construct]]]
    [Construct a new object handle implementation. ]
  ]
  
  [
    [[link asio.reference.windows__object_handle_service.destroy [*destroy]]]
    [Destroy an object handle implementation. ]
  ]
  
  [
    [[link asio.reference.windows__object_handle_service.get_io_service [*get_io_service]]]
    [Get the io_service object that owns the service. ]
  ]
  
  [
    [[link asio.reference.windows__object_handle_service.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__object_handle_service.move_assign [*move_assign]]]
    [Move-assign from another object handle implementation. ]
  ]
  
  [
    [[link asio.reference.windows__object_handle_service.move_construct [*move_construct]]]
    [Move-construct a new object handle implementation. ]
  ]
  
  [
    [[link asio.reference.windows__object_handle_service.native_handle [*native_handle]]]
    [Get the native handle implementation. ]
  ]
  
  [
    [[link asio.reference.windows__object_handle_service.object_handle_service [*object_handle_service]]]
    [Construct a new object handle service for the specified io_service. ]
  ]
  
  [
    [[link asio.reference.windows__object_handle_service.wait [*wait]]]
    []
  ]
  
]

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

  [
    [[link asio.reference.windows__object_handle_service.id [*id]]]
    [The unique service identifier. ]
  ]

]

[heading Requirements]

['Header: ][^asio/windows/object_handle_service.hpp]

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


[section:assign windows::object_handle_service::assign]

[indexterm2 assign..windows::object_handle_service] 
Assign an existing native handle to an object handle. 


  asio::error_code assign(
      implementation_type & impl,
      const native_handle_type & handle,
      asio::error_code & ec);



[endsect]



[section:async_wait windows::object_handle_service::async_wait]

[indexterm2 async_wait..windows::object_handle_service] 
Start an asynchronous wait. 


  template<
      typename ``[link asio.reference.WaitHandler WaitHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
      implementation_type & impl,
      WaitHandler && handler);



[endsect]



[section:cancel windows::object_handle_service::cancel]

[indexterm2 cancel..windows::object_handle_service] 
Cancel all asynchronous operations associated with the handle. 


  asio::error_code cancel(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:close windows::object_handle_service::close]

[indexterm2 close..windows::object_handle_service] 
Close an object handle implementation. 


  asio::error_code close(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:construct windows::object_handle_service::construct]

[indexterm2 construct..windows::object_handle_service] 
Construct a new object handle implementation. 


  void construct(
      implementation_type & impl);



[endsect]



[section:destroy windows::object_handle_service::destroy]

[indexterm2 destroy..windows::object_handle_service] 
Destroy an object handle implementation. 


  void destroy(
      implementation_type & impl);



[endsect]



[section:get_io_service windows::object_handle_service::get_io_service]


['Inherited from io_service.]

[indexterm2 get_io_service..windows::object_handle_service] 
Get the [link asio.reference.io_service `io_service`] object that owns the service. 


  asio::io_service & get_io_service();



[endsect]



[section:id windows::object_handle_service::id]

[indexterm2 id..windows::object_handle_service] 
The unique service identifier. 


  static asio::io_service::id id;



[endsect]



[section:implementation_type windows::object_handle_service::implementation_type]

[indexterm2 implementation_type..windows::object_handle_service] 
The type of an object handle implementation. 


  typedef implementation_defined implementation_type;



[heading Requirements]

['Header: ][^asio/windows/object_handle_service.hpp]

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


[endsect]



[section:is_open windows::object_handle_service::is_open]

[indexterm2 is_open..windows::object_handle_service] 
Determine whether the handle is open. 


  bool is_open(
      const implementation_type & impl) const;



[endsect]



[section:move_assign windows::object_handle_service::move_assign]

[indexterm2 move_assign..windows::object_handle_service] 
Move-assign from another object handle implementation. 


  void move_assign(
      implementation_type & impl,
      object_handle_service & other_service,
      implementation_type & other_impl);



[endsect]



[section:move_construct windows::object_handle_service::move_construct]

[indexterm2 move_construct..windows::object_handle_service] 
Move-construct a new object handle implementation. 


  void move_construct(
      implementation_type & impl,
      implementation_type & other_impl);



[endsect]



[section:native_handle windows::object_handle_service::native_handle]

[indexterm2 native_handle..windows::object_handle_service] 
Get the native handle implementation. 


  native_handle_type native_handle(
      implementation_type & impl);



[endsect]



[section:native_handle_type windows::object_handle_service::native_handle_type]

[indexterm2 native_handle_type..windows::object_handle_service] 
The native handle type. 


  typedef implementation_defined native_handle_type;



[heading Requirements]

['Header: ][^asio/windows/object_handle_service.hpp]

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


[endsect]



[section:object_handle_service windows::object_handle_service::object_handle_service]

[indexterm2 object_handle_service..windows::object_handle_service] 
Construct a new object handle service for the specified [link asio.reference.io_service `io_service`]. 


  object_handle_service(
      asio::io_service & io_service);



[endsect]



[section:wait windows::object_handle_service::wait]

[indexterm2 wait..windows::object_handle_service] 

  void wait(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[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]]]
    [Construct an empty overlapped_ptr. 

     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. 

     Reset to contain the specified handler, freeing any current OVERLAPPED object. ]
  ]
  
  [
    [[link asio.reference.windows__overlapped_ptr._overlapped_ptr [*~overlapped_ptr]]]
    [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 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 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 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 ``[link asio.reference.Handler Handler]``>
  explicit ``[link asio.reference.windows__overlapped_ptr.overlapped_ptr.overload2 overlapped_ptr]``(
      asio::io_service & io_service,
      Handler && handler);
  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_ptr.overlapped_ptr.overload2 more...]]``


[section:overload1 windows::overlapped_ptr::overlapped_ptr (1 of 2 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 2 overloads)]


Construct an [link asio.reference.windows__overlapped_ptr `windows::overlapped_ptr`] to contain the specified handler. 


  template<
      typename ``[link asio.reference.Handler Handler]``>
  overlapped_ptr(
      asio::io_service & io_service,
      Handler && handler);



[endsect]


[endsect]


[section:release windows::overlapped_ptr::release]

[indexterm2 release..windows::overlapped_ptr] 
Release ownership of the OVERLAPPED object. 


  OVERLAPPED * release();



[endsect]


[section:reset windows::overlapped_ptr::reset]

[indexterm2 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 ``[link asio.reference.Handler Handler]``>
  void ``[link asio.reference.windows__overlapped_ptr.reset.overload2 reset]``(
      asio::io_service & io_service,
      Handler && handler);
  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_ptr.reset.overload2 more...]]``


[section:overload1 windows::overlapped_ptr::reset (1 of 2 overloads)]


Reset to empty. 


  void reset();



[endsect]



[section:overload2 windows::overlapped_ptr::reset (2 of 2 overloads)]


Reset to contain the specified handler, freeing any current OVERLAPPED object. 


  template<
      typename ``[link asio.reference.Handler Handler]``>
  void reset(
      asio::io_service & io_service,
      Handler && handler);



[endsect]


[endsect]


[section:_overlapped_ptr windows::overlapped_ptr::~overlapped_ptr]

[indexterm2 ~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 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.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_random_access_handle.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_random_access_handle.lowest_layer_type [*lowest_layer_type]]]
    [A basic_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. ]
  
  ]

  [

    [[link asio.reference.windows__basic_random_access_handle.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.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]]]
    [Construct a basic_random_access_handle without opening it. 

     Construct a basic_random_access_handle on an existing native handle. 

     Move-construct a basic_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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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 basic_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. ]
  ]
  
]

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

  [
    [[link asio.reference.windows__basic_random_access_handle.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_random_access_handle.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

The [link asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] class template 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__random_access_handle_service windows::random_access_handle_service]


Default service implementation for a random-access handle. 


  class random_access_handle_service :
    public io_service::service


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

  [

    [[link asio.reference.windows__random_access_handle_service.implementation_type [*implementation_type]]]
    [The type of a random-access handle implementation. ]
  
  ]

  [

    [[link asio.reference.windows__random_access_handle_service.native_handle_type [*native_handle_type]]]
    [The native handle type. ]
  
  ]

]

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

  [
    [[link asio.reference.windows__random_access_handle_service.assign [*assign]]]
    [Assign an existing native handle to a random-access handle. ]
  ]
  
  [
    [[link asio.reference.windows__random_access_handle_service.async_read_some_at [*async_read_some_at]]]
    [Start an asynchronous read at the specified offset. ]
  ]
  
  [
    [[link asio.reference.windows__random_access_handle_service.async_write_some_at [*async_write_some_at]]]
    [Start an asynchronous write at the specified offset. ]
  ]
  
  [
    [[link asio.reference.windows__random_access_handle_service.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__random_access_handle_service.close [*close]]]
    [Close a random-access handle implementation. ]
  ]
  
  [
    [[link asio.reference.windows__random_access_handle_service.construct [*construct]]]
    [Construct a new random-access handle implementation. ]
  ]
  
  [
    [[link asio.reference.windows__random_access_handle_service.destroy [*destroy]]]
    [Destroy a random-access handle implementation. ]
  ]
  
  [
    [[link asio.reference.windows__random_access_handle_service.get_io_service [*get_io_service]]]
    [Get the io_service object that owns the service. ]
  ]
  
  [
    [[link asio.reference.windows__random_access_handle_service.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__random_access_handle_service.move_assign [*move_assign]]]
    [Move-assign from another random-access handle implementation. ]
  ]
  
  [
    [[link asio.reference.windows__random_access_handle_service.move_construct [*move_construct]]]
    [Move-construct a new random-access handle implementation. ]
  ]
  
  [
    [[link asio.reference.windows__random_access_handle_service.native_handle [*native_handle]]]
    [Get the native handle implementation. ]
  ]
  
  [
    [[link asio.reference.windows__random_access_handle_service.random_access_handle_service [*random_access_handle_service]]]
    [Construct a new random-access handle service for the specified io_service. ]
  ]
  
  [
    [[link asio.reference.windows__random_access_handle_service.read_some_at [*read_some_at]]]
    [Read some data from the specified offset. ]
  ]
  
  [
    [[link asio.reference.windows__random_access_handle_service.write_some_at [*write_some_at]]]
    [Write the given data at the specified offset. ]
  ]
  
]

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

  [
    [[link asio.reference.windows__random_access_handle_service.id [*id]]]
    [The unique service identifier. ]
  ]

]

[heading Requirements]

['Header: ][^asio/windows/random_access_handle_service.hpp]

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


[section:assign windows::random_access_handle_service::assign]

[indexterm2 assign..windows::random_access_handle_service] 
Assign an existing native handle to a random-access handle. 


  asio::error_code assign(
      implementation_type & impl,
      const native_handle_type & handle,
      asio::error_code & ec);



[endsect]



[section:async_read_some_at windows::random_access_handle_service::async_read_some_at]

[indexterm2 async_read_some_at..windows::random_access_handle_service] 
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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some_at(
      implementation_type & impl,
      uint64_t offset,
      const MutableBufferSequence & buffers,
      ReadHandler && handler);



[endsect]



[section:async_write_some_at windows::random_access_handle_service::async_write_some_at]

[indexterm2 async_write_some_at..windows::random_access_handle_service] 
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.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some_at(
      implementation_type & impl,
      uint64_t offset,
      const ConstBufferSequence & buffers,
      WriteHandler && handler);



[endsect]



[section:cancel windows::random_access_handle_service::cancel]

[indexterm2 cancel..windows::random_access_handle_service] 
Cancel all asynchronous operations associated with the handle. 


  asio::error_code cancel(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:close windows::random_access_handle_service::close]

[indexterm2 close..windows::random_access_handle_service] 
Close a random-access handle implementation. 


  asio::error_code close(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:construct windows::random_access_handle_service::construct]

[indexterm2 construct..windows::random_access_handle_service] 
Construct a new random-access handle implementation. 


  void construct(
      implementation_type & impl);



[endsect]



[section:destroy windows::random_access_handle_service::destroy]

[indexterm2 destroy..windows::random_access_handle_service] 
Destroy a random-access handle implementation. 


  void destroy(
      implementation_type & impl);



[endsect]



[section:get_io_service windows::random_access_handle_service::get_io_service]


['Inherited from io_service.]

[indexterm2 get_io_service..windows::random_access_handle_service] 
Get the [link asio.reference.io_service `io_service`] object that owns the service. 


  asio::io_service & get_io_service();



[endsect]



[section:id windows::random_access_handle_service::id]

[indexterm2 id..windows::random_access_handle_service] 
The unique service identifier. 


  static asio::io_service::id id;



[endsect]



[section:implementation_type windows::random_access_handle_service::implementation_type]

[indexterm2 implementation_type..windows::random_access_handle_service] 
The type of a random-access handle implementation. 


  typedef implementation_defined implementation_type;



[heading Requirements]

['Header: ][^asio/windows/random_access_handle_service.hpp]

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


[endsect]



[section:is_open windows::random_access_handle_service::is_open]

[indexterm2 is_open..windows::random_access_handle_service] 
Determine whether the handle is open. 


  bool is_open(
      const implementation_type & impl) const;



[endsect]



[section:move_assign windows::random_access_handle_service::move_assign]

[indexterm2 move_assign..windows::random_access_handle_service] 
Move-assign from another random-access handle implementation. 


  void move_assign(
      implementation_type & impl,
      random_access_handle_service & other_service,
      implementation_type & other_impl);



[endsect]



[section:move_construct windows::random_access_handle_service::move_construct]

[indexterm2 move_construct..windows::random_access_handle_service] 
Move-construct a new random-access handle implementation. 


  void move_construct(
      implementation_type & impl,
      implementation_type & other_impl);



[endsect]



[section:native_handle windows::random_access_handle_service::native_handle]

[indexterm2 native_handle..windows::random_access_handle_service] 
Get the native handle implementation. 


  native_handle_type native_handle(
      implementation_type & impl);



[endsect]



[section:native_handle_type windows::random_access_handle_service::native_handle_type]

[indexterm2 native_handle_type..windows::random_access_handle_service] 
The native handle type. 


  typedef implementation_defined native_handle_type;



[heading Requirements]

['Header: ][^asio/windows/random_access_handle_service.hpp]

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


[endsect]



[section:random_access_handle_service windows::random_access_handle_service::random_access_handle_service]

[indexterm2 random_access_handle_service..windows::random_access_handle_service] 
Construct a new random-access handle service for the specified [link asio.reference.io_service `io_service`]. 


  random_access_handle_service(
      asio::io_service & io_service);



[endsect]



[section:read_some_at windows::random_access_handle_service::read_some_at]

[indexterm2 read_some_at..windows::random_access_handle_service] 
Read some data from the specified offset. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_some_at(
      implementation_type & impl,
      uint64_t offset,
      const MutableBufferSequence & buffers,
      asio::error_code & ec);



[endsect]



[section:write_some_at windows::random_access_handle_service::write_some_at]

[indexterm2 write_some_at..windows::random_access_handle_service] 
Write the given data at the specified offset. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_some_at(
      implementation_type & impl,
      uint64_t offset,
      const ConstBufferSequence & buffers,
      asio::error_code & ec);



[endsect]



[endsect]


[section:windows__stream_handle windows::stream_handle]

[indexterm1 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.executor_type [*executor_type]]]
    [The type of the executor associated with the object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_stream_handle.implementation_type [*implementation_type]]]
    [The underlying implementation type of I/O object. ]
  
  ]

  [

    [[link asio.reference.windows__basic_stream_handle.lowest_layer_type [*lowest_layer_type]]]
    [A basic_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. ]
  
  ]

  [

    [[link asio.reference.windows__basic_stream_handle.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.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]]]
    [Construct a basic_stream_handle without opening it. 

     Construct a basic_stream_handle on an existing native handle. 

     Move-construct a basic_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.get_io_service [*get_io_service]]]
    [(Deprecated: Use get_executor().) Get the io_service 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. 

     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 basic_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. ]
  ]
  
]

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

  [
    [[link asio.reference.windows__basic_stream_handle.get_implementation [*get_implementation]]]
    [Get the underlying implementation of the I/O object. ]
  ]
  
  [
    [[link asio.reference.windows__basic_stream_handle.get_service [*get_service]]]
    [Get the service associated with the I/O object. ]
  ]
  
]

The [link asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] class template 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:windows__stream_handle_service windows::stream_handle_service]


Default service implementation for a stream handle. 


  class stream_handle_service :
    public io_service::service


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

  [

    [[link asio.reference.windows__stream_handle_service.implementation_type [*implementation_type]]]
    [The type of a stream handle implementation. ]
  
  ]

  [

    [[link asio.reference.windows__stream_handle_service.native_handle_type [*native_handle_type]]]
    [The native handle type. ]
  
  ]

]

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

  [
    [[link asio.reference.windows__stream_handle_service.assign [*assign]]]
    [Assign an existing native handle to a stream handle. ]
  ]
  
  [
    [[link asio.reference.windows__stream_handle_service.async_read_some [*async_read_some]]]
    [Start an asynchronous read. ]
  ]
  
  [
    [[link asio.reference.windows__stream_handle_service.async_write_some [*async_write_some]]]
    [Start an asynchronous write. ]
  ]
  
  [
    [[link asio.reference.windows__stream_handle_service.cancel [*cancel]]]
    [Cancel all asynchronous operations associated with the handle. ]
  ]
  
  [
    [[link asio.reference.windows__stream_handle_service.close [*close]]]
    [Close a stream handle implementation. ]
  ]
  
  [
    [[link asio.reference.windows__stream_handle_service.construct [*construct]]]
    [Construct a new stream handle implementation. ]
  ]
  
  [
    [[link asio.reference.windows__stream_handle_service.destroy [*destroy]]]
    [Destroy a stream handle implementation. ]
  ]
  
  [
    [[link asio.reference.windows__stream_handle_service.get_io_service [*get_io_service]]]
    [Get the io_service object that owns the service. ]
  ]
  
  [
    [[link asio.reference.windows__stream_handle_service.is_open [*is_open]]]
    [Determine whether the handle is open. ]
  ]
  
  [
    [[link asio.reference.windows__stream_handle_service.move_assign [*move_assign]]]
    [Move-assign from another stream handle implementation. ]
  ]
  
  [
    [[link asio.reference.windows__stream_handle_service.move_construct [*move_construct]]]
    [Move-construct a new stream handle implementation. ]
  ]
  
  [
    [[link asio.reference.windows__stream_handle_service.native_handle [*native_handle]]]
    [Get the native handle implementation. ]
  ]
  
  [
    [[link asio.reference.windows__stream_handle_service.read_some [*read_some]]]
    [Read some data from the stream. ]
  ]
  
  [
    [[link asio.reference.windows__stream_handle_service.stream_handle_service [*stream_handle_service]]]
    [Construct a new stream handle service for the specified io_service. ]
  ]
  
  [
    [[link asio.reference.windows__stream_handle_service.write_some [*write_some]]]
    [Write the given data to the stream. ]
  ]
  
]

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

  [
    [[link asio.reference.windows__stream_handle_service.id [*id]]]
    [The unique service identifier. ]
  ]

]

[heading Requirements]

['Header: ][^asio/windows/stream_handle_service.hpp]

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


[section:assign windows::stream_handle_service::assign]

[indexterm2 assign..windows::stream_handle_service] 
Assign an existing native handle to a stream handle. 


  asio::error_code assign(
      implementation_type & impl,
      const native_handle_type & handle,
      asio::error_code & ec);



[endsect]



[section:async_read_some windows::stream_handle_service::async_read_some]

[indexterm2 async_read_some..windows::stream_handle_service] 
Start an asynchronous read. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
      typename ``[link asio.reference.ReadHandler ReadHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some(
      implementation_type & impl,
      const MutableBufferSequence & buffers,
      ReadHandler && handler);



[endsect]



[section:async_write_some windows::stream_handle_service::async_write_some]

[indexterm2 async_write_some..windows::stream_handle_service] 
Start an asynchronous write. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename ``[link asio.reference.WriteHandler WriteHandler]``>
  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some(
      implementation_type & impl,
      const ConstBufferSequence & buffers,
      WriteHandler && handler);



[endsect]



[section:cancel windows::stream_handle_service::cancel]

[indexterm2 cancel..windows::stream_handle_service] 
Cancel all asynchronous operations associated with the handle. 


  asio::error_code cancel(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:close windows::stream_handle_service::close]

[indexterm2 close..windows::stream_handle_service] 
Close a stream handle implementation. 


  asio::error_code close(
      implementation_type & impl,
      asio::error_code & ec);



[endsect]



[section:construct windows::stream_handle_service::construct]

[indexterm2 construct..windows::stream_handle_service] 
Construct a new stream handle implementation. 


  void construct(
      implementation_type & impl);



[endsect]



[section:destroy windows::stream_handle_service::destroy]

[indexterm2 destroy..windows::stream_handle_service] 
Destroy a stream handle implementation. 


  void destroy(
      implementation_type & impl);



[endsect]



[section:get_io_service windows::stream_handle_service::get_io_service]


['Inherited from io_service.]

[indexterm2 get_io_service..windows::stream_handle_service] 
Get the [link asio.reference.io_service `io_service`] object that owns the service. 


  asio::io_service & get_io_service();



[endsect]



[section:id windows::stream_handle_service::id]

[indexterm2 id..windows::stream_handle_service] 
The unique service identifier. 


  static asio::io_service::id id;



[endsect]



[section:implementation_type windows::stream_handle_service::implementation_type]

[indexterm2 implementation_type..windows::stream_handle_service] 
The type of a stream handle implementation. 


  typedef implementation_defined implementation_type;



[heading Requirements]

['Header: ][^asio/windows/stream_handle_service.hpp]

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


[endsect]



[section:is_open windows::stream_handle_service::is_open]

[indexterm2 is_open..windows::stream_handle_service] 
Determine whether the handle is open. 


  bool is_open(
      const implementation_type & impl) const;



[endsect]



[section:move_assign windows::stream_handle_service::move_assign]

[indexterm2 move_assign..windows::stream_handle_service] 
Move-assign from another stream handle implementation. 


  void move_assign(
      implementation_type & impl,
      stream_handle_service & other_service,
      implementation_type & other_impl);



[endsect]



[section:move_construct windows::stream_handle_service::move_construct]

[indexterm2 move_construct..windows::stream_handle_service] 
Move-construct a new stream handle implementation. 


  void move_construct(
      implementation_type & impl,
      implementation_type & other_impl);



[endsect]



[section:native_handle windows::stream_handle_service::native_handle]

[indexterm2 native_handle..windows::stream_handle_service] 
Get the native handle implementation. 


  native_handle_type native_handle(
      implementation_type & impl);



[endsect]



[section:native_handle_type windows::stream_handle_service::native_handle_type]

[indexterm2 native_handle_type..windows::stream_handle_service] 
The native handle type. 


  typedef implementation_defined native_handle_type;



[heading Requirements]

['Header: ][^asio/windows/stream_handle_service.hpp]

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


[endsect]



[section:read_some windows::stream_handle_service::read_some]

[indexterm2 read_some..windows::stream_handle_service] 
Read some data from the stream. 


  template<
      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
  std::size_t read_some(
      implementation_type & impl,
      const MutableBufferSequence & buffers,
      asio::error_code & ec);



[endsect]



[section:stream_handle_service windows::stream_handle_service::stream_handle_service]

[indexterm2 stream_handle_service..windows::stream_handle_service] 
Construct a new stream handle service for the specified [link asio.reference.io_service `io_service`]. 


  stream_handle_service(
      asio::io_service & io_service);



[endsect]



[section:write_some windows::stream_handle_service::write_some]

[indexterm2 write_some..windows::stream_handle_service] 
Write the given data to the stream. 


  template<
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
  std::size_t write_some(
      implementation_type & impl,
      const ConstBufferSequence & buffers,
      asio::error_code & ec);



[endsect]



[endsect]

[section:wrap wrap]

[indexterm1 wrap] 
Associate an object of type `T` with an executor of type `Executor`. 

    
  template<
      typename ``[link asio.reference.Executor Executor]``,
      typename T>
  executor_wrapper< typename decay< T >::type, Executor > ``[link asio.reference.wrap.overload1 wrap]``(
      const Executor & ex,
      T && t,
      typename enable_if< is_executor< Executor >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.wrap.overload1 more...]]``

  template<
      typename ExecutionContext,
      typename T>
  executor_wrapper< typename decay< T >::type, typename ExecutionContext::executor_type > ``[link asio.reference.wrap.overload2 wrap]``(
      ExecutionContext & ctx,
      T && t,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.wrap.overload2 more...]]``

[heading Requirements]

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

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


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


Associate an object of type `T` with an executor of type `Executor`. 


  template<
      typename ``[link asio.reference.Executor Executor]``,
      typename T>
  executor_wrapper< typename decay< T >::type, Executor > wrap(
      const Executor & ex,
      T && t,
      typename enable_if< is_executor< Executor >::value >::type *  = 0);



[endsect]



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


Associate an object of type `T` with an execution context's executor. 


  template<
      typename ExecutionContext,
      typename T>
  executor_wrapper< typename decay< T >::type, typename ExecutionContext::executor_type > wrap(
      ExecutionContext & ctx,
      T && t,
      typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);



[endsect]


[endsect]

[section:write write]

[indexterm1 write] 
Write a certain amount of 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...]]``

  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename 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 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...]]``

  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``>
  std::size_t ``[link asio.reference.write.overload5 write]``(
      SyncWriteStream & s,
      DynamicBufferSequence && buffers,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.write.overload5 more...]]``

  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``>
  std::size_t ``[link asio.reference.write.overload6 write]``(
      SyncWriteStream & s,
      DynamicBufferSequence && buffers,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.write.overload6 more...]]``

  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``,
      typename CompletionCondition>
  std::size_t ``[link asio.reference.write.overload7 write]``(
      SyncWriteStream & s,
      DynamicBufferSequence && buffers,
      CompletionCondition completion_condition,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.write.overload7 more...]]``

  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``,
      typename CompletionCondition>
  std::size_t ``[link asio.reference.write.overload8 write]``(
      SyncWriteStream & s,
      DynamicBufferSequence && buffers,
      CompletionCondition completion_condition,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::value >::type *  = 0);
  ``  [''''&raquo;''' [link asio.reference.write.overload8 more...]]``

  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...]]``

  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename Allocator,
      typename 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 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...]]``

[heading Requirements]

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

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


[section:overload1 write (1 of 12 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 12 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 12 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 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 12 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 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 12 overloads)]


Write all of the supplied data to a stream before returning. 


  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``>
  std::size_t write(
      SyncWriteStream & s,
      DynamicBufferSequence && buffers,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::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 12 overloads)]


Write all of the supplied data to a stream before returning. 


  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``>
  std::size_t write(
      SyncWriteStream & s,
      DynamicBufferSequence && buffers,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::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 12 overloads)]


Write a certain amount of data to a stream before returning. 


  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``,
      typename CompletionCondition>
  std::size_t write(
      SyncWriteStream & s,
      DynamicBufferSequence && buffers,
      CompletionCondition completion_condition,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::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 12 overloads)]


Write a certain amount of data to a stream before returning. 


  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename ``[link asio.reference.DynamicBufferSequence DynamicBufferSequence]``,
      typename CompletionCondition>
  std::size_t write(
      SyncWriteStream & s,
      DynamicBufferSequence && buffers,
      CompletionCondition completion_condition,
      asio::error_code & ec,
      typename enable_if< is_dynamic_buffer_sequence< DynamicBufferSequence >::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 12 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 12 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 12 overloads)]


Write a certain amount of data to a stream before returning. 


  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename Allocator,
      typename 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 12 overloads)]


Write a certain amount of data to a stream before returning. 


  template<
      typename ``[link asio.reference.SyncWriteStream SyncWriteStream]``,
      typename Allocator,
      typename 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]


[endsect]

[section:write_at write_at]

[indexterm1 write_at] 
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]``>
  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...]]``

  template<
      typename ``[link asio.reference.SyncRandomAccessWriteDevice SyncRandomAccessWriteDevice]``,
      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
      typename 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 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...]]``

  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...]]``

  template<
      typename ``[link asio.reference.SyncRandomAccessWriteDevice SyncRandomAccessWriteDevice]``,
      typename Allocator,
      typename 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 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 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 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 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 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 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]]]
    [Construct a yield context to represent the specified coroutine. 

     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]