[/
 / 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:bsd_sockets The BSD Socket API and Boost.Asio]

The Boost.Asio library includes a low-level socket interface based on the BSD socket
API, which is widely implemented and supported by extensive literature. It is
also used as the basis for networking APIs in other languages, like Java. This
low-level interface is designed to support the development of efficient and
scalable applications. For example, it permits programmers to exert finer
control over the number of system calls, avoid redundant data copying, minimise
the use of resources like threads, and so on.

Unsafe and error prone aspects of the BSD socket API not included. For example,
the use of `int` to represent all sockets lacks type safety. The socket
representation in Boost.Asio uses a distinct type for each protocol, e.g. for TCP one
would use `ip::tcp::socket`, and for UDP one uses `ip::udp::socket`.

The following table shows the mapping between the BSD socket API and Boost.Asio:

[table
  [
    [BSD Socket API Elements]
    [Equivalents in Boost.Asio]
  ]
  [
    [socket descriptor - `int` (POSIX) or `SOCKET` (Windows)]
    [ For TCP: [link boost_asio.reference.ip__tcp.socket ip::tcp::socket],
               [link boost_asio.reference.ip__tcp.acceptor ip::tcp::acceptor]

      For UDP: [link boost_asio.reference.ip__udp.socket ip::udp::socket]

               [link boost_asio.reference.basic_socket basic_socket],
               [link boost_asio.reference.basic_stream_socket basic_stream_socket],
               [link boost_asio.reference.basic_datagram_socket basic_datagram_socket],
               [link boost_asio.reference.basic_raw_socket basic_raw_socket] ]
  ]
  [
    [`in_addr`,
     `in6_addr`]
    [          [link boost_asio.reference.ip__address ip::address],
               [link boost_asio.reference.ip__address ip::address_v4],
               [link boost_asio.reference.ip__address ip::address_v6] ]
  ]
  [
    [`sockaddr_in`,
     `sockaddr_in6`]
    [ For TCP: [link boost_asio.reference.ip__tcp.endpoint ip::tcp::endpoint]
    
      For UDP: [link boost_asio.reference.ip__udp.endpoint ip::udp::endpoint]

               [link boost_asio.reference.ip__basic_endpoint ip::basic_endpoint] ]
  ]
  [
    [`accept()`]
    [ For TCP: [link boost_asio.reference.basic_socket_acceptor.accept ip::tcp::acceptor::accept()]

               [link boost_asio.reference.basic_socket_acceptor.accept basic_socket_acceptor::accept()] ]
  ]
  [
    [`bind()`]
    [ For TCP: [link boost_asio.reference.basic_socket.bind ip::tcp::acceptor::bind()],
               [link boost_asio.reference.basic_socket.bind ip::tcp::socket::bind()]

      For UDP: [link boost_asio.reference.basic_socket.bind ip::udp::socket::bind()]

               [link boost_asio.reference.basic_socket.bind basic_socket::bind()] ]
  ]
  [
    [`close()`]
    [ For TCP: [link boost_asio.reference.basic_socket.close ip::tcp::acceptor::close()],
               [link boost_asio.reference.basic_socket.close ip::tcp::socket::close()]

      For UDP: [link boost_asio.reference.basic_socket.close ip::udp::socket::close()]

               [link boost_asio.reference.basic_socket.close basic_socket::close()] ]
  ]
  [
    [`connect()`]
    [ For TCP: [link boost_asio.reference.basic_socket.connect ip::tcp::socket::connect()]

      For UDP: [link boost_asio.reference.basic_socket.connect ip::udp::socket::connect()]

               [link boost_asio.reference.basic_socket.connect basic_socket::connect()] ]
  ]
  [
    [`getaddrinfo()`,
     `gethostbyaddr()`,
     `gethostbyname()`,
     `getnameinfo()`,
     `getservbyname()`,
     `getservbyport()`]
    [ For TCP: [link boost_asio.reference.ip__basic_resolver.resolve ip::tcp::resolver::resolve()],
               [link boost_asio.reference.ip__basic_resolver.async_resolve ip::tcp::resolver::async_resolve()]

      For UDP: [link boost_asio.reference.ip__basic_resolver.resolve ip::udp::resolver::resolve()],
               [link boost_asio.reference.ip__basic_resolver.async_resolve ip::udp::resolver::async_resolve()]

               [link boost_asio.reference.ip__basic_resolver.resolve ip::basic_resolver::resolve()],
               [link boost_asio.reference.ip__basic_resolver.async_resolve ip::basic_resolver::async_resolve()] ]
  ]
  [
    [`gethostname()`]
    [          [link boost_asio.reference.ip__host_name ip::host_name()] ]
  ]
  [
    [`getpeername()`]
    [ For TCP: [link boost_asio.reference.basic_socket.remote_endpoint ip::tcp::socket::remote_endpoint()]

      For UDP: [link boost_asio.reference.basic_socket.remote_endpoint ip::udp::socket::remote_endpoint()]

               [link boost_asio.reference.basic_socket.remote_endpoint basic_socket::remote_endpoint()] ]
  ]
  [
    [`getsockname()`]
    [ For TCP: [link boost_asio.reference.basic_socket.local_endpoint ip::tcp::acceptor::local_endpoint()],
               [link boost_asio.reference.basic_socket.local_endpoint ip::tcp::socket::local_endpoint()]

      For UDP: [link boost_asio.reference.basic_socket.local_endpoint ip::udp::socket::local_endpoint()]

               [link boost_asio.reference.basic_socket.local_endpoint basic_socket::local_endpoint()] ]
  ]
  [
    [`getsockopt()`]
    [ For TCP: [link boost_asio.reference.basic_socket.get_option ip::tcp::acceptor::get_option()],
               [link boost_asio.reference.basic_socket.get_option ip::tcp::socket::get_option()]

      For UDP: [link boost_asio.reference.basic_socket.get_option ip::udp::socket::get_option()]

               [link boost_asio.reference.basic_socket.get_option basic_socket::get_option()] ]
  ]
  [
    [`inet_addr()`,
     `inet_aton()`,
     `inet_pton()`]
    [          [link boost_asio.reference.ip__address.from_string ip::address::from_string()],
               [link boost_asio.reference.ip__address.from_string ip::address_v4::from_string()],
               [link boost_asio.reference.ip__address.from_string ip_address_v6::from_string()] ]
  ]
  [
    [`inet_ntoa()`,
     `inet_ntop()`]
    [          [link boost_asio.reference.ip__address.to_string ip::address::to_string()],
               [link boost_asio.reference.ip__address.to_string ip::address_v4::to_string()],
               [link boost_asio.reference.ip__address.to_string ip_address_v6::to_string()] ]
  ]
  [
    [`ioctl()`]
    [ For TCP: [link boost_asio.reference.basic_socket.io_control ip::tcp::socket::io_control()]

      For UDP: [link boost_asio.reference.basic_socket.io_control ip::udp::socket::io_control()]

               [link boost_asio.reference.basic_socket.io_control basic_socket::io_control()] ]
  ]
  [
    [`listen()`]
    [ For TCP: [link boost_asio.reference.basic_socket_acceptor.listen ip::tcp::acceptor::listen()]

               [link boost_asio.reference.basic_socket_acceptor.listen basic_socket_acceptor::listen()] ]
  ]
  [
    [`poll()`,
     `select()`,
     `pselect()`]
    [          [link boost_asio.reference.io_service.run io_service::run()],
               [link boost_asio.reference.io_service.run_one io_service::run_one()],
               [link boost_asio.reference.io_service.poll io_service::poll()],
               [link boost_asio.reference.io_service.poll_one io_service::poll_one()]

      Note: in conjunction with asynchronous operations. ]
  ]
  [
    [`readv()`,
     `recv()`,
     `read()`]
    [ For TCP: [link boost_asio.reference.basic_stream_socket.read_some ip::tcp::socket::read_some()],
               [link boost_asio.reference.basic_stream_socket.async_read_some ip::tcp::socket::async_read_some()],
               [link boost_asio.reference.basic_stream_socket.receive ip::tcp::socket::receive()],
               [link boost_asio.reference.basic_stream_socket.async_receive ip::tcp::socket::async_receive()]

      For UDP: [link boost_asio.reference.basic_datagram_socket.receive ip::udp::socket::receive()],
               [link boost_asio.reference.basic_datagram_socket.async_receive ip::udp::socket::async_receive()]

               [link boost_asio.reference.basic_stream_socket.read_some basic_stream_socket::read_some()],
               [link boost_asio.reference.basic_stream_socket.async_read_some basic_stream_socket::async_read_some()],
               [link boost_asio.reference.basic_stream_socket.receive basic_stream_socket::receive()],
               [link boost_asio.reference.basic_stream_socket.async_receive basic_stream_socket::async_receive()],
               [link boost_asio.reference.basic_datagram_socket.receive basic_datagram_socket::receive()],
               [link boost_asio.reference.basic_datagram_socket.async_receive basic_datagram_socket::async_receive()] ]
  ]
  [
    [`recvfrom()`]
    [ For UDP: [link boost_asio.reference.basic_datagram_socket.receive_from ip::udp::socket::receive_from()],
               [link boost_asio.reference.basic_datagram_socket.async_receive_from ip::udp::socket::async_receive_from()]

               [link boost_asio.reference.basic_datagram_socket.receive_from basic_datagram_socket::receive_from()],
               [link boost_asio.reference.basic_datagram_socket.async_receive_from basic_datagram_socket::async_receive_from()] ]
  ]
  [
    [`send()`,
     `write()`,
     `writev()`]
    [ For TCP: [link boost_asio.reference.basic_stream_socket.write_some ip::tcp::socket::write_some()],
               [link boost_asio.reference.basic_stream_socket.async_write_some ip::tcp::socket::async_write_some()],
               [link boost_asio.reference.basic_stream_socket.send ip::tcp::socket::send()],
               [link boost_asio.reference.basic_stream_socket.async_send ip::tcp::socket::async_send()]

      For UDP: [link boost_asio.reference.basic_datagram_socket.send ip::udp::socket::send()],
               [link boost_asio.reference.basic_datagram_socket.async_send ip::udp::socket::async_send()]

               [link boost_asio.reference.basic_stream_socket.write_some basic_stream_socket::write_some()],
               [link boost_asio.reference.basic_stream_socket.async_write_some basic_stream_socket::async_write_some()],
               [link boost_asio.reference.basic_stream_socket.send basic_stream_socket::send()],
               [link boost_asio.reference.basic_stream_socket.async_send basic_stream_socket::async_send()],
               [link boost_asio.reference.basic_datagram_socket.send basic_datagram_socket::send()],
               [link boost_asio.reference.basic_datagram_socket.async_send basic_datagram_socket::async_send()] ]
  ]
  [
    [`sendto()`]
    [ For UDP: [link boost_asio.reference.basic_datagram_socket.send_to ip::udp::socket::send_to()],
               [link boost_asio.reference.basic_datagram_socket.async_send_to ip::udp::socket::async_send_to()]

               [link boost_asio.reference.basic_datagram_socket.send_to basic_datagram_socket::send_to()],
               [link boost_asio.reference.basic_datagram_socket.async_send_to basic_datagram_socket::async_send_to()] ]
  ]
  [
    [`setsockopt()`]
    [ For TCP: [link boost_asio.reference.basic_socket.set_option ip::tcp::acceptor::set_option()],
               [link boost_asio.reference.basic_socket.set_option ip::tcp::socket::set_option()]

      For UDP: [link boost_asio.reference.basic_socket.set_option ip::udp::socket::set_option()]

               [link boost_asio.reference.basic_socket.set_option basic_socket::set_option()] ]
  ]
  [
    [`shutdown()`]
    [ For TCP: [link boost_asio.reference.basic_socket.shutdown ip::tcp::socket::shutdown()]

      For UDP: [link boost_asio.reference.basic_socket.shutdown ip::udp::socket::shutdown()]

               [link boost_asio.reference.basic_socket.shutdown basic_socket::shutdown()] ]
  ]
  [
    [`sockatmark()`]
    [ For TCP: [link boost_asio.reference.basic_socket.at_mark ip::tcp::socket::at_mark()]

               [link boost_asio.reference.basic_socket.at_mark basic_socket::at_mark()] ]
  ]
  [
    [`socket()`]
    [ For TCP: [link boost_asio.reference.basic_socket.open ip::tcp::acceptor::open()],
               [link boost_asio.reference.basic_socket.open ip::tcp::socket::open()]

      For UDP: [link boost_asio.reference.basic_socket.open ip::udp::socket::open()]

               [link boost_asio.reference.basic_socket.open basic_socket::open()] ]
  ]
  [
    [`socketpair()`]
    [          [link boost_asio.reference.local__connect_pair local::connect_pair()]

      Note: POSIX operating systems only. ]
  ]
]

[endsect]
