123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650 |
- //
- // socket_base.cpp
- // ~~~~~~~~~~~~~~~
- //
- // Copyright (c) 2003-2019 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)
- //
- // Disable autolinking for unit tests.
- #if !defined(BOOST_ALL_NO_LIB)
- #define BOOST_ALL_NO_LIB 1
- #endif // !defined(BOOST_ALL_NO_LIB)
- // Test that header file is self-contained.
- #include <boost/asio/socket_base.hpp>
- #include <boost/asio/io_context.hpp>
- #include <boost/asio/ip/tcp.hpp>
- #include <boost/asio/ip/udp.hpp>
- #include "unit_test.hpp"
- //------------------------------------------------------------------------------
- // socket_base_compile test
- // ~~~~~~~~~~~~~~~~~~~~~~~~
- // The following test checks that all nested classes, enums and constants in
- // socket_base compile and link correctly. Runtime failures are ignored.
- namespace socket_base_compile {
- void test()
- {
- using namespace boost::asio;
- namespace ip = boost::asio::ip;
- try
- {
- io_context ioc;
- ip::tcp::socket sock(ioc);
- char buf[1024];
- // shutdown_type enumeration.
- sock.shutdown(socket_base::shutdown_receive);
- sock.shutdown(socket_base::shutdown_send);
- sock.shutdown(socket_base::shutdown_both);
- // message_flags constants.
- sock.receive(buffer(buf), socket_base::message_peek);
- sock.receive(buffer(buf), socket_base::message_out_of_band);
- sock.send(buffer(buf), socket_base::message_do_not_route);
- // broadcast class.
- socket_base::broadcast broadcast1(true);
- sock.set_option(broadcast1);
- socket_base::broadcast broadcast2;
- sock.get_option(broadcast2);
- broadcast1 = true;
- (void)static_cast<bool>(broadcast1);
- (void)static_cast<bool>(!broadcast1);
- (void)static_cast<bool>(broadcast1.value());
- // debug class.
- socket_base::debug debug1(true);
- sock.set_option(debug1);
- socket_base::debug debug2;
- sock.get_option(debug2);
- debug1 = true;
- (void)static_cast<bool>(debug1);
- (void)static_cast<bool>(!debug1);
- (void)static_cast<bool>(debug1.value());
- // do_not_route class.
- socket_base::do_not_route do_not_route1(true);
- sock.set_option(do_not_route1);
- socket_base::do_not_route do_not_route2;
- sock.get_option(do_not_route2);
- do_not_route1 = true;
- (void)static_cast<bool>(do_not_route1);
- (void)static_cast<bool>(!do_not_route1);
- (void)static_cast<bool>(do_not_route1.value());
- // keep_alive class.
- socket_base::keep_alive keep_alive1(true);
- sock.set_option(keep_alive1);
- socket_base::keep_alive keep_alive2;
- sock.get_option(keep_alive2);
- keep_alive1 = true;
- (void)static_cast<bool>(keep_alive1);
- (void)static_cast<bool>(!keep_alive1);
- (void)static_cast<bool>(keep_alive1.value());
- // send_buffer_size class.
- socket_base::send_buffer_size send_buffer_size1(1024);
- sock.set_option(send_buffer_size1);
- socket_base::send_buffer_size send_buffer_size2;
- sock.get_option(send_buffer_size2);
- send_buffer_size1 = 1;
- (void)static_cast<int>(send_buffer_size1.value());
- // send_low_watermark class.
- socket_base::send_low_watermark send_low_watermark1(128);
- sock.set_option(send_low_watermark1);
- socket_base::send_low_watermark send_low_watermark2;
- sock.get_option(send_low_watermark2);
- send_low_watermark1 = 1;
- (void)static_cast<int>(send_low_watermark1.value());
- // receive_buffer_size class.
- socket_base::receive_buffer_size receive_buffer_size1(1024);
- sock.set_option(receive_buffer_size1);
- socket_base::receive_buffer_size receive_buffer_size2;
- sock.get_option(receive_buffer_size2);
- receive_buffer_size1 = 1;
- (void)static_cast<int>(receive_buffer_size1.value());
- // receive_low_watermark class.
- socket_base::receive_low_watermark receive_low_watermark1(128);
- sock.set_option(receive_low_watermark1);
- socket_base::receive_low_watermark receive_low_watermark2;
- sock.get_option(receive_low_watermark2);
- receive_low_watermark1 = 1;
- (void)static_cast<int>(receive_low_watermark1.value());
- // reuse_address class.
- socket_base::reuse_address reuse_address1(true);
- sock.set_option(reuse_address1);
- socket_base::reuse_address reuse_address2;
- sock.get_option(reuse_address2);
- reuse_address1 = true;
- (void)static_cast<bool>(reuse_address1);
- (void)static_cast<bool>(!reuse_address1);
- (void)static_cast<bool>(reuse_address1.value());
- // linger class.
- socket_base::linger linger1(true, 30);
- sock.set_option(linger1);
- socket_base::linger linger2;
- sock.get_option(linger2);
- linger1.enabled(true);
- (void)static_cast<bool>(linger1.enabled());
- linger1.timeout(1);
- (void)static_cast<int>(linger1.timeout());
- // out_of_band_inline class.
- socket_base::out_of_band_inline out_of_band_inline1(true);
- sock.set_option(out_of_band_inline1);
- socket_base::out_of_band_inline out_of_band_inline2;
- sock.get_option(out_of_band_inline2);
- out_of_band_inline1 = true;
- (void)static_cast<bool>(out_of_band_inline1);
- (void)static_cast<bool>(!out_of_band_inline1);
- (void)static_cast<bool>(out_of_band_inline1.value());
- // enable_connection_aborted class.
- socket_base::enable_connection_aborted enable_connection_aborted1(true);
- sock.set_option(enable_connection_aborted1);
- socket_base::enable_connection_aborted enable_connection_aborted2;
- sock.get_option(enable_connection_aborted2);
- enable_connection_aborted1 = true;
- (void)static_cast<bool>(enable_connection_aborted1);
- (void)static_cast<bool>(!enable_connection_aborted1);
- (void)static_cast<bool>(enable_connection_aborted1.value());
- // bytes_readable class.
- socket_base::bytes_readable bytes_readable;
- sock.io_control(bytes_readable);
- std::size_t bytes = bytes_readable.get();
- (void)bytes;
- }
- catch (std::exception&)
- {
- }
- }
- } // namespace socket_base_compile
- //------------------------------------------------------------------------------
- // socket_base_runtime test
- // ~~~~~~~~~~~~~~~~~~~~~~~~
- // The following test checks the runtime operation of the socket options and I/O
- // control commands defined in socket_base.
- namespace socket_base_runtime {
- void test()
- {
- using namespace boost::asio;
- namespace ip = boost::asio::ip;
- io_context ioc;
- ip::udp::socket udp_sock(ioc, ip::udp::v4());
- ip::tcp::socket tcp_sock(ioc, ip::tcp::v4());
- ip::tcp::acceptor tcp_acceptor(ioc, ip::tcp::v4());
- boost::system::error_code ec;
- // broadcast class.
- socket_base::broadcast broadcast1(true);
- BOOST_ASIO_CHECK(broadcast1.value());
- BOOST_ASIO_CHECK(static_cast<bool>(broadcast1));
- BOOST_ASIO_CHECK(!!broadcast1);
- udp_sock.set_option(broadcast1, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- socket_base::broadcast broadcast2;
- udp_sock.get_option(broadcast2, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- BOOST_ASIO_CHECK(broadcast2.value());
- BOOST_ASIO_CHECK(static_cast<bool>(broadcast2));
- BOOST_ASIO_CHECK(!!broadcast2);
- socket_base::broadcast broadcast3(false);
- BOOST_ASIO_CHECK(!broadcast3.value());
- BOOST_ASIO_CHECK(!static_cast<bool>(broadcast3));
- BOOST_ASIO_CHECK(!broadcast3);
- udp_sock.set_option(broadcast3, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- socket_base::broadcast broadcast4;
- udp_sock.get_option(broadcast4, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- BOOST_ASIO_CHECK(!broadcast4.value());
- BOOST_ASIO_CHECK(!static_cast<bool>(broadcast4));
- BOOST_ASIO_CHECK(!broadcast4);
- // debug class.
- socket_base::debug debug1(true);
- BOOST_ASIO_CHECK(debug1.value());
- BOOST_ASIO_CHECK(static_cast<bool>(debug1));
- BOOST_ASIO_CHECK(!!debug1);
- udp_sock.set_option(debug1, ec);
- #if defined(__linux__)
- // On Linux, only root can set SO_DEBUG.
- bool not_root = (ec == boost::asio::error::access_denied);
- BOOST_ASIO_CHECK(!ec || not_root);
- BOOST_ASIO_WARN_MESSAGE(!ec, "Must be root to set debug socket option");
- #else // defined(__linux__)
- # if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- // Option is not supported under Windows CE.
- BOOST_ASIO_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
- ec.value() << ", " << ec.message());
- # else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- # endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- #endif // defined(__linux__)
- socket_base::debug debug2;
- udp_sock.get_option(debug2, ec);
- #if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- // Option is not supported under Windows CE.
- BOOST_ASIO_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
- ec.value() << ", " << ec.message());
- #else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- # if defined(__linux__)
- BOOST_ASIO_CHECK(debug2.value() || not_root);
- BOOST_ASIO_CHECK(static_cast<bool>(debug2) || not_root);
- BOOST_ASIO_CHECK(!!debug2 || not_root);
- # else // defined(__linux__)
- BOOST_ASIO_CHECK(debug2.value());
- BOOST_ASIO_CHECK(static_cast<bool>(debug2));
- BOOST_ASIO_CHECK(!!debug2);
- # endif // defined(__linux__)
- #endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- socket_base::debug debug3(false);
- BOOST_ASIO_CHECK(!debug3.value());
- BOOST_ASIO_CHECK(!static_cast<bool>(debug3));
- BOOST_ASIO_CHECK(!debug3);
- udp_sock.set_option(debug3, ec);
- #if defined(__linux__)
- BOOST_ASIO_CHECK(!ec || not_root);
- #else // defined(__linux__)
- # if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- // Option is not supported under Windows CE.
- BOOST_ASIO_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
- ec.value() << ", " << ec.message());
- # else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- # endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- #endif // defined(__linux__)
- socket_base::debug debug4;
- udp_sock.get_option(debug4, ec);
- #if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- // Option is not supported under Windows CE.
- BOOST_ASIO_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
- ec.value() << ", " << ec.message());
- #else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- # if defined(__linux__)
- BOOST_ASIO_CHECK(!debug4.value() || not_root);
- BOOST_ASIO_CHECK(!static_cast<bool>(debug4) || not_root);
- BOOST_ASIO_CHECK(!debug4 || not_root);
- # else // defined(__linux__)
- BOOST_ASIO_CHECK(!debug4.value());
- BOOST_ASIO_CHECK(!static_cast<bool>(debug4));
- BOOST_ASIO_CHECK(!debug4);
- # endif // defined(__linux__)
- #endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- // do_not_route class.
- socket_base::do_not_route do_not_route1(true);
- BOOST_ASIO_CHECK(do_not_route1.value());
- BOOST_ASIO_CHECK(static_cast<bool>(do_not_route1));
- BOOST_ASIO_CHECK(!!do_not_route1);
- udp_sock.set_option(do_not_route1, ec);
- #if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- // Option is not supported under Windows CE.
- BOOST_ASIO_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
- ec.value() << ", " << ec.message());
- #else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- #endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- socket_base::do_not_route do_not_route2;
- udp_sock.get_option(do_not_route2, ec);
- #if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- // Option is not supported under Windows CE.
- BOOST_ASIO_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
- ec.value() << ", " << ec.message());
- #else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- BOOST_ASIO_CHECK(do_not_route2.value());
- BOOST_ASIO_CHECK(static_cast<bool>(do_not_route2));
- BOOST_ASIO_CHECK(!!do_not_route2);
- #endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- socket_base::do_not_route do_not_route3(false);
- BOOST_ASIO_CHECK(!do_not_route3.value());
- BOOST_ASIO_CHECK(!static_cast<bool>(do_not_route3));
- BOOST_ASIO_CHECK(!do_not_route3);
- udp_sock.set_option(do_not_route3, ec);
- #if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- // Option is not supported under Windows CE.
- BOOST_ASIO_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
- ec.value() << ", " << ec.message());
- #else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- #endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- socket_base::do_not_route do_not_route4;
- udp_sock.get_option(do_not_route4, ec);
- #if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- // Option is not supported under Windows CE.
- BOOST_ASIO_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
- ec.value() << ", " << ec.message());
- #else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- BOOST_ASIO_CHECK(!do_not_route4.value());
- BOOST_ASIO_CHECK(!static_cast<bool>(do_not_route4));
- BOOST_ASIO_CHECK(!do_not_route4);
- #endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- // keep_alive class.
- socket_base::keep_alive keep_alive1(true);
- BOOST_ASIO_CHECK(keep_alive1.value());
- BOOST_ASIO_CHECK(static_cast<bool>(keep_alive1));
- BOOST_ASIO_CHECK(!!keep_alive1);
- tcp_sock.set_option(keep_alive1, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- socket_base::keep_alive keep_alive2;
- tcp_sock.get_option(keep_alive2, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- BOOST_ASIO_CHECK(keep_alive2.value());
- BOOST_ASIO_CHECK(static_cast<bool>(keep_alive2));
- BOOST_ASIO_CHECK(!!keep_alive2);
- socket_base::keep_alive keep_alive3(false);
- BOOST_ASIO_CHECK(!keep_alive3.value());
- BOOST_ASIO_CHECK(!static_cast<bool>(keep_alive3));
- BOOST_ASIO_CHECK(!keep_alive3);
- tcp_sock.set_option(keep_alive3, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- socket_base::keep_alive keep_alive4;
- tcp_sock.get_option(keep_alive4, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- BOOST_ASIO_CHECK(!keep_alive4.value());
- BOOST_ASIO_CHECK(!static_cast<bool>(keep_alive4));
- BOOST_ASIO_CHECK(!keep_alive4);
- // send_buffer_size class.
- socket_base::send_buffer_size send_buffer_size1(4096);
- BOOST_ASIO_CHECK(send_buffer_size1.value() == 4096);
- tcp_sock.set_option(send_buffer_size1, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- socket_base::send_buffer_size send_buffer_size2;
- tcp_sock.get_option(send_buffer_size2, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- BOOST_ASIO_CHECK(send_buffer_size2.value() == 4096);
- socket_base::send_buffer_size send_buffer_size3(16384);
- BOOST_ASIO_CHECK(send_buffer_size3.value() == 16384);
- tcp_sock.set_option(send_buffer_size3, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- socket_base::send_buffer_size send_buffer_size4;
- tcp_sock.get_option(send_buffer_size4, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- BOOST_ASIO_CHECK(send_buffer_size4.value() == 16384);
- // send_low_watermark class.
- socket_base::send_low_watermark send_low_watermark1(4096);
- BOOST_ASIO_CHECK(send_low_watermark1.value() == 4096);
- tcp_sock.set_option(send_low_watermark1, ec);
- #if defined(WIN32) || defined(__linux__) || defined(__sun)
- BOOST_ASIO_CHECK(!!ec); // Not supported on Windows, Linux or Solaris.
- #else
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- #endif
- socket_base::send_low_watermark send_low_watermark2;
- tcp_sock.get_option(send_low_watermark2, ec);
- #if defined(WIN32) || defined(__sun)
- BOOST_ASIO_CHECK(!!ec); // Not supported on Windows or Solaris.
- #elif defined(__linux__)
- BOOST_ASIO_CHECK(!ec); // Not supported on Linux but can get value.
- #else
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- BOOST_ASIO_CHECK(send_low_watermark2.value() == 4096);
- #endif
- socket_base::send_low_watermark send_low_watermark3(8192);
- BOOST_ASIO_CHECK(send_low_watermark3.value() == 8192);
- tcp_sock.set_option(send_low_watermark3, ec);
- #if defined(WIN32) || defined(__linux__) || defined(__sun)
- BOOST_ASIO_CHECK(!!ec); // Not supported on Windows, Linux or Solaris.
- #else
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- #endif
- socket_base::send_low_watermark send_low_watermark4;
- tcp_sock.get_option(send_low_watermark4, ec);
- #if defined(WIN32) || defined(__sun)
- BOOST_ASIO_CHECK(!!ec); // Not supported on Windows or Solaris.
- #elif defined(__linux__)
- BOOST_ASIO_CHECK(!ec); // Not supported on Linux but can get value.
- #else
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- BOOST_ASIO_CHECK(send_low_watermark4.value() == 8192);
- #endif
- // receive_buffer_size class.
- socket_base::receive_buffer_size receive_buffer_size1(4096);
- BOOST_ASIO_CHECK(receive_buffer_size1.value() == 4096);
- tcp_sock.set_option(receive_buffer_size1, ec);
- #if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- // Option is not supported under Windows CE.
- BOOST_ASIO_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
- ec.value() << ", " << ec.message());
- #else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- #endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- socket_base::receive_buffer_size receive_buffer_size2;
- tcp_sock.get_option(receive_buffer_size2, ec);
- #if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- BOOST_ASIO_CHECK(!ec); // Not supported under Windows CE but can get value.
- #else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- BOOST_ASIO_CHECK(receive_buffer_size2.value() == 4096);
- #endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- socket_base::receive_buffer_size receive_buffer_size3(16384);
- BOOST_ASIO_CHECK(receive_buffer_size3.value() == 16384);
- tcp_sock.set_option(receive_buffer_size3, ec);
- #if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- // Option is not supported under Windows CE.
- BOOST_ASIO_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
- ec.value() << ", " << ec.message());
- #else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- #endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- socket_base::receive_buffer_size receive_buffer_size4;
- tcp_sock.get_option(receive_buffer_size4, ec);
- #if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- BOOST_ASIO_CHECK(!ec); // Not supported under Windows CE but can get value.
- #else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- BOOST_ASIO_CHECK(receive_buffer_size4.value() == 16384);
- #endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
- // receive_low_watermark class.
- socket_base::receive_low_watermark receive_low_watermark1(4096);
- BOOST_ASIO_CHECK(receive_low_watermark1.value() == 4096);
- tcp_sock.set_option(receive_low_watermark1, ec);
- #if defined(WIN32) || defined(__sun)
- BOOST_ASIO_CHECK(!!ec); // Not supported on Windows or Solaris.
- #else
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- #endif
- socket_base::receive_low_watermark receive_low_watermark2;
- tcp_sock.get_option(receive_low_watermark2, ec);
- #if defined(WIN32) || defined(__sun)
- BOOST_ASIO_CHECK(!!ec); // Not supported on Windows or Solaris.
- #else
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- BOOST_ASIO_CHECK(receive_low_watermark2.value() == 4096);
- #endif
- socket_base::receive_low_watermark receive_low_watermark3(8192);
- BOOST_ASIO_CHECK(receive_low_watermark3.value() == 8192);
- tcp_sock.set_option(receive_low_watermark3, ec);
- #if defined(WIN32) || defined(__sun)
- BOOST_ASIO_CHECK(!!ec); // Not supported on Windows or Solaris.
- #else
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- #endif
- socket_base::receive_low_watermark receive_low_watermark4;
- tcp_sock.get_option(receive_low_watermark4, ec);
- #if defined(WIN32) || defined(__sun)
- BOOST_ASIO_CHECK(!!ec); // Not supported on Windows or Solaris.
- #else
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- BOOST_ASIO_CHECK(receive_low_watermark4.value() == 8192);
- #endif
- // reuse_address class.
- socket_base::reuse_address reuse_address1(true);
- BOOST_ASIO_CHECK(reuse_address1.value());
- BOOST_ASIO_CHECK(static_cast<bool>(reuse_address1));
- BOOST_ASIO_CHECK(!!reuse_address1);
- udp_sock.set_option(reuse_address1, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- socket_base::reuse_address reuse_address2;
- udp_sock.get_option(reuse_address2, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- BOOST_ASIO_CHECK(reuse_address2.value());
- BOOST_ASIO_CHECK(static_cast<bool>(reuse_address2));
- BOOST_ASIO_CHECK(!!reuse_address2);
- socket_base::reuse_address reuse_address3(false);
- BOOST_ASIO_CHECK(!reuse_address3.value());
- BOOST_ASIO_CHECK(!static_cast<bool>(reuse_address3));
- BOOST_ASIO_CHECK(!reuse_address3);
- udp_sock.set_option(reuse_address3, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- socket_base::reuse_address reuse_address4;
- udp_sock.get_option(reuse_address4, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- BOOST_ASIO_CHECK(!reuse_address4.value());
- BOOST_ASIO_CHECK(!static_cast<bool>(reuse_address4));
- BOOST_ASIO_CHECK(!reuse_address4);
- // linger class.
- socket_base::linger linger1(true, 60);
- BOOST_ASIO_CHECK(linger1.enabled());
- BOOST_ASIO_CHECK(linger1.timeout() == 60);
- tcp_sock.set_option(linger1, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- socket_base::linger linger2;
- tcp_sock.get_option(linger2, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- BOOST_ASIO_CHECK(linger2.enabled());
- BOOST_ASIO_CHECK(linger2.timeout() == 60);
- socket_base::linger linger3(false, 0);
- BOOST_ASIO_CHECK(!linger3.enabled());
- BOOST_ASIO_CHECK(linger3.timeout() == 0);
- tcp_sock.set_option(linger3, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- socket_base::linger linger4;
- tcp_sock.get_option(linger4, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- BOOST_ASIO_CHECK(!linger4.enabled());
- // enable_connection_aborted class.
- socket_base::enable_connection_aborted enable_connection_aborted1(true);
- BOOST_ASIO_CHECK(enable_connection_aborted1.value());
- BOOST_ASIO_CHECK(static_cast<bool>(enable_connection_aborted1));
- BOOST_ASIO_CHECK(!!enable_connection_aborted1);
- tcp_acceptor.set_option(enable_connection_aborted1, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- socket_base::enable_connection_aborted enable_connection_aborted2;
- tcp_acceptor.get_option(enable_connection_aborted2, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- BOOST_ASIO_CHECK(enable_connection_aborted2.value());
- BOOST_ASIO_CHECK(static_cast<bool>(enable_connection_aborted2));
- BOOST_ASIO_CHECK(!!enable_connection_aborted2);
- socket_base::enable_connection_aborted enable_connection_aborted3(false);
- BOOST_ASIO_CHECK(!enable_connection_aborted3.value());
- BOOST_ASIO_CHECK(!static_cast<bool>(enable_connection_aborted3));
- BOOST_ASIO_CHECK(!enable_connection_aborted3);
- tcp_acceptor.set_option(enable_connection_aborted3, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- socket_base::enable_connection_aborted enable_connection_aborted4;
- tcp_acceptor.get_option(enable_connection_aborted4, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- BOOST_ASIO_CHECK(!enable_connection_aborted4.value());
- BOOST_ASIO_CHECK(!static_cast<bool>(enable_connection_aborted4));
- BOOST_ASIO_CHECK(!enable_connection_aborted4);
- // bytes_readable class.
- socket_base::bytes_readable bytes_readable;
- udp_sock.io_control(bytes_readable, ec);
- BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
- }
- } // namespace socket_base_runtime
- //------------------------------------------------------------------------------
- BOOST_ASIO_TEST_SUITE
- (
- "socket_base",
- BOOST_ASIO_TEST_CASE(socket_base_compile::test)
- BOOST_ASIO_TEST_CASE(socket_base_runtime::test)
- )
|