[/
 / Copyright (c) 2003-2010 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:SocketService Socket service requirements]

A socket service must meet the requirements for an [link
boost_asio.reference.IoObjectService I/O object service], as well as the
additional requirements listed below.

In the table below, `X` denotes a socket service class for protocol [link
boost_asio.reference.Protocol `Protocol`], `a` denotes a value of type `X`,
`b` denotes a value of type `X::implementation_type`, `p` denotes a value of
type `Protocol`, `n` denotes a value of type `X::native_type`, `e` denotes a
value of type `Protocol::endpoint`, `ec` denotes a value of type `error_code`,
`s` denotes a value meeting [link boost_asio.reference.SettableSocketOption
`SettableSocketOption`] requirements, `g` denotes a value meeting [link
boost_asio.reference.GettableSocketOption `GettableSocketOption`]
requirements, `i` denotes a value meeting [link
boost_asio.reference.IoControlCommand `IoControlCommand`] requirements, `h`
denotes a value of type `socket_base::shutdown_type`, `ch` denotes a value
meeting [link boost_asio.reference.ConnectHandler `ConnectHandler`]
requirements, and `u` and `v` denote identifiers.

[table SocketService requirements
  [[expression] [return type] [assertion/note\npre/post-condition]]
  [
    [`X::native_type`]
    []
    [
      The implementation-defined native representation of a socket. Must
      satisfy the requirements of `CopyConstructible` types (C++ Std, 20.1.3),
      and the requirements of `Assignable` types (C++ Std, 23.1).
    ]
  ]
  [
    [`a.construct(b);`]
    []
    [
      From [link boost_asio.reference.IoObjectService IoObjectService]
      requirements.\n
      post: `!a.is_open(b)`.
    ]
  ]
  [
    [`a.destroy(b);`]
    []
    [
      From [link boost_asio.reference.IoObjectService IoObjectService]
      requirements. Implicitly cancels asynchronous operations, as if by calling
      `a.close(b, ec)`.
    ]
  ]
  [
    [``
      a.open(b, p, ec);
    ``]
    [`error_code`]
    [
      pre: `!a.is_open(b)`.\n
      post: `!!ec || a.is_open(b)`.
    ]
  ]
  [
    [``
      a.assign(b, p, n, ec);
    ``]
    [`error_code`]
    [
      pre: `!a.is_open(b)`.\n
      post: `!!ec || a.is_open(b)`.
    ]
  ]
  [
    [``
      a.is_open(b);
    ``]
    [`bool`]
    [
    ]
  ]
  [
    [``
      const X& u = a;
      const X::implementation_type& v = b;
      u.is_open(v);
    ``]
    [`bool`]
    [
    ]
  ]
  [
    [``
      a.close(b, ec);
    ``]
    [`error_code`]
    [
      If `a.is_open()` is true, causes any outstanding asynchronous operations
      to complete as soon as possible. Handlers for cancelled operations shall
      be passed the error code `error::operation_aborted`.\n
      post: `!a.is_open(b)`.
    ]
  ]
  [
    [``
      a.native(b);
    ``]
    [`X::native_type`]
    [
    ]
  ]
  [
    [``
      a.cancel(b, ec);
    ``]
    [`error_code`]
    [
      pre: `a.is_open(b)`.\n
      Causes any outstanding asynchronous operations to complete as soon as
      possible. Handlers for cancelled operations shall be passed the error
      code `error::operation_aborted`.
    ]
  ]
  [
    [``
      a.set_option(b, s, ec);
    ``]
    [`error_code`]
    [
      pre: `a.is_open(b)`.
    ]
  ]
  [
    [``
      a.get_option(b, g, ec);
    ``]
    [`error_code`]
    [
      pre: `a.is_open(b)`.
    ]
  ]
  [
    [``
      const X& u = a;
      const X::implementation_type& v = b;
      u.get_option(v, g, ec);
    ``]
    [`error_code`]
    [
      pre: `a.is_open(b)`.
    ]
  ]
  [
    [``
      a.io_control(b, i, ec);
    ``]
    [`error_code`]
    [
      pre: `a.is_open(b)`.
    ]
  ]
  [
    [``
      a.at_mark(b, ec);
    ``]
    [`bool`]
    [
      pre: `a.is_open(b)`.
    ]
  ]
  [
    [``
      const X& u = a;
      const X::implementation_type& v = b;
      u.at_mark(v, ec);
    ``]
    [`bool`]
    [
      pre: `a.is_open(b)`.
    ]
  ]
  [
    [``
      a.available(b, ec);
    ``]
    [`size_t`]
    [
      pre: `a.is_open(b)`.
    ]
  ]
  [
    [``
      const X& u = a;
      const X::implementation_type& v = b;
      u.available(v, ec);
    ``]
    [`size_t`]
    [
      pre: `a.is_open(b)`.
    ]
  ]
  [
    [``
      const typename Protocol::endpoint& u = e;
      a.bind(b, u, ec);
    ``]
    [`error_code`]
    [
      pre: `a.is_open(b)`.
    ]
  ]
  [
    [``
      a.shutdown(b, h, ec);
    ``]
    [`error_code`]
    [
      pre: `a.is_open(b)`.
    ]
  ]
  [
    [``
      a.local_endpoint(b, ec);
    ``]
    [`Protocol::endpoint`]
    [
      pre: `a.is_open(b)`.
    ]
  ]
  [
    [``
      const X& u = a;
      const X::implementation_type& v = b;
      u.local_endpoint(v, ec);
    ``]
    [`Protocol::endpoint`]
    [
      pre: `a.is_open(b)`.
    ]
  ]
  [
    [``
      a.remote_endpoint(b, ec);
    ``]
    [`Protocol::endpoint`]
    [
      pre: `a.is_open(b)`.
    ]
  ]
  [
    [``
      const X& u = a;
      const X::implementation_type& v = b;
      u.remote_endpoint(v, ec);
    ``]
    [`Protocol::endpoint`]
    [
      pre: `a.is_open(b)`.
    ]
  ]
  [
    [``
      const typename Protocol::endpoint& u = e;
      a.connect(b, u, ec);
    ``]
    [`error_code`]
    [
      pre: `a.is_open(b)`.
    ]
  ]
  [
    [``
      const typename Protocol::endpoint& u = e;
      a.async_connect(b, u, ch);
    ``]
    []
    [
      pre: `a.is_open(b)`.\n
      Initiates an asynchronous connect operation that is performed via the
      `io_service` object `a.io_service()` and behaves according to [link
      boost_asio.reference.asynchronous_operations asynchronous operation]
      requirements.
    ]
  ]
]

[endsect]
