socket_base.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650
  1. //
  2. // socket_base.cpp
  3. // ~~~~~~~~~~~~~~~
  4. //
  5. // Copyright (c) 2003-2019 Christopher M. Kohlhoff (chris at kohlhoff dot com)
  6. //
  7. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  8. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. // Disable autolinking for unit tests.
  11. #if !defined(BOOST_ALL_NO_LIB)
  12. #define BOOST_ALL_NO_LIB 1
  13. #endif // !defined(BOOST_ALL_NO_LIB)
  14. // Test that header file is self-contained.
  15. #include <boost/asio/socket_base.hpp>
  16. #include <boost/asio/io_context.hpp>
  17. #include <boost/asio/ip/tcp.hpp>
  18. #include <boost/asio/ip/udp.hpp>
  19. #include "unit_test.hpp"
  20. //------------------------------------------------------------------------------
  21. // socket_base_compile test
  22. // ~~~~~~~~~~~~~~~~~~~~~~~~
  23. // The following test checks that all nested classes, enums and constants in
  24. // socket_base compile and link correctly. Runtime failures are ignored.
  25. namespace socket_base_compile {
  26. void test()
  27. {
  28. using namespace boost::asio;
  29. namespace ip = boost::asio::ip;
  30. try
  31. {
  32. io_context ioc;
  33. ip::tcp::socket sock(ioc);
  34. char buf[1024];
  35. // shutdown_type enumeration.
  36. sock.shutdown(socket_base::shutdown_receive);
  37. sock.shutdown(socket_base::shutdown_send);
  38. sock.shutdown(socket_base::shutdown_both);
  39. // message_flags constants.
  40. sock.receive(buffer(buf), socket_base::message_peek);
  41. sock.receive(buffer(buf), socket_base::message_out_of_band);
  42. sock.send(buffer(buf), socket_base::message_do_not_route);
  43. // broadcast class.
  44. socket_base::broadcast broadcast1(true);
  45. sock.set_option(broadcast1);
  46. socket_base::broadcast broadcast2;
  47. sock.get_option(broadcast2);
  48. broadcast1 = true;
  49. (void)static_cast<bool>(broadcast1);
  50. (void)static_cast<bool>(!broadcast1);
  51. (void)static_cast<bool>(broadcast1.value());
  52. // debug class.
  53. socket_base::debug debug1(true);
  54. sock.set_option(debug1);
  55. socket_base::debug debug2;
  56. sock.get_option(debug2);
  57. debug1 = true;
  58. (void)static_cast<bool>(debug1);
  59. (void)static_cast<bool>(!debug1);
  60. (void)static_cast<bool>(debug1.value());
  61. // do_not_route class.
  62. socket_base::do_not_route do_not_route1(true);
  63. sock.set_option(do_not_route1);
  64. socket_base::do_not_route do_not_route2;
  65. sock.get_option(do_not_route2);
  66. do_not_route1 = true;
  67. (void)static_cast<bool>(do_not_route1);
  68. (void)static_cast<bool>(!do_not_route1);
  69. (void)static_cast<bool>(do_not_route1.value());
  70. // keep_alive class.
  71. socket_base::keep_alive keep_alive1(true);
  72. sock.set_option(keep_alive1);
  73. socket_base::keep_alive keep_alive2;
  74. sock.get_option(keep_alive2);
  75. keep_alive1 = true;
  76. (void)static_cast<bool>(keep_alive1);
  77. (void)static_cast<bool>(!keep_alive1);
  78. (void)static_cast<bool>(keep_alive1.value());
  79. // send_buffer_size class.
  80. socket_base::send_buffer_size send_buffer_size1(1024);
  81. sock.set_option(send_buffer_size1);
  82. socket_base::send_buffer_size send_buffer_size2;
  83. sock.get_option(send_buffer_size2);
  84. send_buffer_size1 = 1;
  85. (void)static_cast<int>(send_buffer_size1.value());
  86. // send_low_watermark class.
  87. socket_base::send_low_watermark send_low_watermark1(128);
  88. sock.set_option(send_low_watermark1);
  89. socket_base::send_low_watermark send_low_watermark2;
  90. sock.get_option(send_low_watermark2);
  91. send_low_watermark1 = 1;
  92. (void)static_cast<int>(send_low_watermark1.value());
  93. // receive_buffer_size class.
  94. socket_base::receive_buffer_size receive_buffer_size1(1024);
  95. sock.set_option(receive_buffer_size1);
  96. socket_base::receive_buffer_size receive_buffer_size2;
  97. sock.get_option(receive_buffer_size2);
  98. receive_buffer_size1 = 1;
  99. (void)static_cast<int>(receive_buffer_size1.value());
  100. // receive_low_watermark class.
  101. socket_base::receive_low_watermark receive_low_watermark1(128);
  102. sock.set_option(receive_low_watermark1);
  103. socket_base::receive_low_watermark receive_low_watermark2;
  104. sock.get_option(receive_low_watermark2);
  105. receive_low_watermark1 = 1;
  106. (void)static_cast<int>(receive_low_watermark1.value());
  107. // reuse_address class.
  108. socket_base::reuse_address reuse_address1(true);
  109. sock.set_option(reuse_address1);
  110. socket_base::reuse_address reuse_address2;
  111. sock.get_option(reuse_address2);
  112. reuse_address1 = true;
  113. (void)static_cast<bool>(reuse_address1);
  114. (void)static_cast<bool>(!reuse_address1);
  115. (void)static_cast<bool>(reuse_address1.value());
  116. // linger class.
  117. socket_base::linger linger1(true, 30);
  118. sock.set_option(linger1);
  119. socket_base::linger linger2;
  120. sock.get_option(linger2);
  121. linger1.enabled(true);
  122. (void)static_cast<bool>(linger1.enabled());
  123. linger1.timeout(1);
  124. (void)static_cast<int>(linger1.timeout());
  125. // out_of_band_inline class.
  126. socket_base::out_of_band_inline out_of_band_inline1(true);
  127. sock.set_option(out_of_band_inline1);
  128. socket_base::out_of_band_inline out_of_band_inline2;
  129. sock.get_option(out_of_band_inline2);
  130. out_of_band_inline1 = true;
  131. (void)static_cast<bool>(out_of_band_inline1);
  132. (void)static_cast<bool>(!out_of_band_inline1);
  133. (void)static_cast<bool>(out_of_band_inline1.value());
  134. // enable_connection_aborted class.
  135. socket_base::enable_connection_aborted enable_connection_aborted1(true);
  136. sock.set_option(enable_connection_aborted1);
  137. socket_base::enable_connection_aborted enable_connection_aborted2;
  138. sock.get_option(enable_connection_aborted2);
  139. enable_connection_aborted1 = true;
  140. (void)static_cast<bool>(enable_connection_aborted1);
  141. (void)static_cast<bool>(!enable_connection_aborted1);
  142. (void)static_cast<bool>(enable_connection_aborted1.value());
  143. // bytes_readable class.
  144. socket_base::bytes_readable bytes_readable;
  145. sock.io_control(bytes_readable);
  146. std::size_t bytes = bytes_readable.get();
  147. (void)bytes;
  148. }
  149. catch (std::exception&)
  150. {
  151. }
  152. }
  153. } // namespace socket_base_compile
  154. //------------------------------------------------------------------------------
  155. // socket_base_runtime test
  156. // ~~~~~~~~~~~~~~~~~~~~~~~~
  157. // The following test checks the runtime operation of the socket options and I/O
  158. // control commands defined in socket_base.
  159. namespace socket_base_runtime {
  160. void test()
  161. {
  162. using namespace boost::asio;
  163. namespace ip = boost::asio::ip;
  164. io_context ioc;
  165. ip::udp::socket udp_sock(ioc, ip::udp::v4());
  166. ip::tcp::socket tcp_sock(ioc, ip::tcp::v4());
  167. ip::tcp::acceptor tcp_acceptor(ioc, ip::tcp::v4());
  168. boost::system::error_code ec;
  169. // broadcast class.
  170. socket_base::broadcast broadcast1(true);
  171. BOOST_ASIO_CHECK(broadcast1.value());
  172. BOOST_ASIO_CHECK(static_cast<bool>(broadcast1));
  173. BOOST_ASIO_CHECK(!!broadcast1);
  174. udp_sock.set_option(broadcast1, ec);
  175. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  176. socket_base::broadcast broadcast2;
  177. udp_sock.get_option(broadcast2, ec);
  178. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  179. BOOST_ASIO_CHECK(broadcast2.value());
  180. BOOST_ASIO_CHECK(static_cast<bool>(broadcast2));
  181. BOOST_ASIO_CHECK(!!broadcast2);
  182. socket_base::broadcast broadcast3(false);
  183. BOOST_ASIO_CHECK(!broadcast3.value());
  184. BOOST_ASIO_CHECK(!static_cast<bool>(broadcast3));
  185. BOOST_ASIO_CHECK(!broadcast3);
  186. udp_sock.set_option(broadcast3, ec);
  187. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  188. socket_base::broadcast broadcast4;
  189. udp_sock.get_option(broadcast4, ec);
  190. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  191. BOOST_ASIO_CHECK(!broadcast4.value());
  192. BOOST_ASIO_CHECK(!static_cast<bool>(broadcast4));
  193. BOOST_ASIO_CHECK(!broadcast4);
  194. // debug class.
  195. socket_base::debug debug1(true);
  196. BOOST_ASIO_CHECK(debug1.value());
  197. BOOST_ASIO_CHECK(static_cast<bool>(debug1));
  198. BOOST_ASIO_CHECK(!!debug1);
  199. udp_sock.set_option(debug1, ec);
  200. #if defined(__linux__)
  201. // On Linux, only root can set SO_DEBUG.
  202. bool not_root = (ec == boost::asio::error::access_denied);
  203. BOOST_ASIO_CHECK(!ec || not_root);
  204. BOOST_ASIO_WARN_MESSAGE(!ec, "Must be root to set debug socket option");
  205. #else // defined(__linux__)
  206. # if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  207. // Option is not supported under Windows CE.
  208. BOOST_ASIO_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
  209. ec.value() << ", " << ec.message());
  210. # else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  211. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  212. # endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  213. #endif // defined(__linux__)
  214. socket_base::debug debug2;
  215. udp_sock.get_option(debug2, ec);
  216. #if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  217. // Option is not supported under Windows CE.
  218. BOOST_ASIO_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
  219. ec.value() << ", " << ec.message());
  220. #else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  221. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  222. # if defined(__linux__)
  223. BOOST_ASIO_CHECK(debug2.value() || not_root);
  224. BOOST_ASIO_CHECK(static_cast<bool>(debug2) || not_root);
  225. BOOST_ASIO_CHECK(!!debug2 || not_root);
  226. # else // defined(__linux__)
  227. BOOST_ASIO_CHECK(debug2.value());
  228. BOOST_ASIO_CHECK(static_cast<bool>(debug2));
  229. BOOST_ASIO_CHECK(!!debug2);
  230. # endif // defined(__linux__)
  231. #endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  232. socket_base::debug debug3(false);
  233. BOOST_ASIO_CHECK(!debug3.value());
  234. BOOST_ASIO_CHECK(!static_cast<bool>(debug3));
  235. BOOST_ASIO_CHECK(!debug3);
  236. udp_sock.set_option(debug3, ec);
  237. #if defined(__linux__)
  238. BOOST_ASIO_CHECK(!ec || not_root);
  239. #else // defined(__linux__)
  240. # if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  241. // Option is not supported under Windows CE.
  242. BOOST_ASIO_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
  243. ec.value() << ", " << ec.message());
  244. # else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  245. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  246. # endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  247. #endif // defined(__linux__)
  248. socket_base::debug debug4;
  249. udp_sock.get_option(debug4, ec);
  250. #if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  251. // Option is not supported under Windows CE.
  252. BOOST_ASIO_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
  253. ec.value() << ", " << ec.message());
  254. #else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  255. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  256. # if defined(__linux__)
  257. BOOST_ASIO_CHECK(!debug4.value() || not_root);
  258. BOOST_ASIO_CHECK(!static_cast<bool>(debug4) || not_root);
  259. BOOST_ASIO_CHECK(!debug4 || not_root);
  260. # else // defined(__linux__)
  261. BOOST_ASIO_CHECK(!debug4.value());
  262. BOOST_ASIO_CHECK(!static_cast<bool>(debug4));
  263. BOOST_ASIO_CHECK(!debug4);
  264. # endif // defined(__linux__)
  265. #endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  266. // do_not_route class.
  267. socket_base::do_not_route do_not_route1(true);
  268. BOOST_ASIO_CHECK(do_not_route1.value());
  269. BOOST_ASIO_CHECK(static_cast<bool>(do_not_route1));
  270. BOOST_ASIO_CHECK(!!do_not_route1);
  271. udp_sock.set_option(do_not_route1, ec);
  272. #if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  273. // Option is not supported under Windows CE.
  274. BOOST_ASIO_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
  275. ec.value() << ", " << ec.message());
  276. #else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  277. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  278. #endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  279. socket_base::do_not_route do_not_route2;
  280. udp_sock.get_option(do_not_route2, ec);
  281. #if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  282. // Option is not supported under Windows CE.
  283. BOOST_ASIO_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
  284. ec.value() << ", " << ec.message());
  285. #else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  286. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  287. BOOST_ASIO_CHECK(do_not_route2.value());
  288. BOOST_ASIO_CHECK(static_cast<bool>(do_not_route2));
  289. BOOST_ASIO_CHECK(!!do_not_route2);
  290. #endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  291. socket_base::do_not_route do_not_route3(false);
  292. BOOST_ASIO_CHECK(!do_not_route3.value());
  293. BOOST_ASIO_CHECK(!static_cast<bool>(do_not_route3));
  294. BOOST_ASIO_CHECK(!do_not_route3);
  295. udp_sock.set_option(do_not_route3, ec);
  296. #if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  297. // Option is not supported under Windows CE.
  298. BOOST_ASIO_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
  299. ec.value() << ", " << ec.message());
  300. #else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  301. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  302. #endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  303. socket_base::do_not_route do_not_route4;
  304. udp_sock.get_option(do_not_route4, ec);
  305. #if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  306. // Option is not supported under Windows CE.
  307. BOOST_ASIO_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
  308. ec.value() << ", " << ec.message());
  309. #else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  310. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  311. BOOST_ASIO_CHECK(!do_not_route4.value());
  312. BOOST_ASIO_CHECK(!static_cast<bool>(do_not_route4));
  313. BOOST_ASIO_CHECK(!do_not_route4);
  314. #endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  315. // keep_alive class.
  316. socket_base::keep_alive keep_alive1(true);
  317. BOOST_ASIO_CHECK(keep_alive1.value());
  318. BOOST_ASIO_CHECK(static_cast<bool>(keep_alive1));
  319. BOOST_ASIO_CHECK(!!keep_alive1);
  320. tcp_sock.set_option(keep_alive1, ec);
  321. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  322. socket_base::keep_alive keep_alive2;
  323. tcp_sock.get_option(keep_alive2, ec);
  324. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  325. BOOST_ASIO_CHECK(keep_alive2.value());
  326. BOOST_ASIO_CHECK(static_cast<bool>(keep_alive2));
  327. BOOST_ASIO_CHECK(!!keep_alive2);
  328. socket_base::keep_alive keep_alive3(false);
  329. BOOST_ASIO_CHECK(!keep_alive3.value());
  330. BOOST_ASIO_CHECK(!static_cast<bool>(keep_alive3));
  331. BOOST_ASIO_CHECK(!keep_alive3);
  332. tcp_sock.set_option(keep_alive3, ec);
  333. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  334. socket_base::keep_alive keep_alive4;
  335. tcp_sock.get_option(keep_alive4, ec);
  336. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  337. BOOST_ASIO_CHECK(!keep_alive4.value());
  338. BOOST_ASIO_CHECK(!static_cast<bool>(keep_alive4));
  339. BOOST_ASIO_CHECK(!keep_alive4);
  340. // send_buffer_size class.
  341. socket_base::send_buffer_size send_buffer_size1(4096);
  342. BOOST_ASIO_CHECK(send_buffer_size1.value() == 4096);
  343. tcp_sock.set_option(send_buffer_size1, ec);
  344. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  345. socket_base::send_buffer_size send_buffer_size2;
  346. tcp_sock.get_option(send_buffer_size2, ec);
  347. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  348. BOOST_ASIO_CHECK(send_buffer_size2.value() == 4096);
  349. socket_base::send_buffer_size send_buffer_size3(16384);
  350. BOOST_ASIO_CHECK(send_buffer_size3.value() == 16384);
  351. tcp_sock.set_option(send_buffer_size3, ec);
  352. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  353. socket_base::send_buffer_size send_buffer_size4;
  354. tcp_sock.get_option(send_buffer_size4, ec);
  355. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  356. BOOST_ASIO_CHECK(send_buffer_size4.value() == 16384);
  357. // send_low_watermark class.
  358. socket_base::send_low_watermark send_low_watermark1(4096);
  359. BOOST_ASIO_CHECK(send_low_watermark1.value() == 4096);
  360. tcp_sock.set_option(send_low_watermark1, ec);
  361. #if defined(WIN32) || defined(__linux__) || defined(__sun)
  362. BOOST_ASIO_CHECK(!!ec); // Not supported on Windows, Linux or Solaris.
  363. #else
  364. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  365. #endif
  366. socket_base::send_low_watermark send_low_watermark2;
  367. tcp_sock.get_option(send_low_watermark2, ec);
  368. #if defined(WIN32) || defined(__sun)
  369. BOOST_ASIO_CHECK(!!ec); // Not supported on Windows or Solaris.
  370. #elif defined(__linux__)
  371. BOOST_ASIO_CHECK(!ec); // Not supported on Linux but can get value.
  372. #else
  373. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  374. BOOST_ASIO_CHECK(send_low_watermark2.value() == 4096);
  375. #endif
  376. socket_base::send_low_watermark send_low_watermark3(8192);
  377. BOOST_ASIO_CHECK(send_low_watermark3.value() == 8192);
  378. tcp_sock.set_option(send_low_watermark3, ec);
  379. #if defined(WIN32) || defined(__linux__) || defined(__sun)
  380. BOOST_ASIO_CHECK(!!ec); // Not supported on Windows, Linux or Solaris.
  381. #else
  382. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  383. #endif
  384. socket_base::send_low_watermark send_low_watermark4;
  385. tcp_sock.get_option(send_low_watermark4, ec);
  386. #if defined(WIN32) || defined(__sun)
  387. BOOST_ASIO_CHECK(!!ec); // Not supported on Windows or Solaris.
  388. #elif defined(__linux__)
  389. BOOST_ASIO_CHECK(!ec); // Not supported on Linux but can get value.
  390. #else
  391. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  392. BOOST_ASIO_CHECK(send_low_watermark4.value() == 8192);
  393. #endif
  394. // receive_buffer_size class.
  395. socket_base::receive_buffer_size receive_buffer_size1(4096);
  396. BOOST_ASIO_CHECK(receive_buffer_size1.value() == 4096);
  397. tcp_sock.set_option(receive_buffer_size1, ec);
  398. #if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  399. // Option is not supported under Windows CE.
  400. BOOST_ASIO_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
  401. ec.value() << ", " << ec.message());
  402. #else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  403. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  404. #endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  405. socket_base::receive_buffer_size receive_buffer_size2;
  406. tcp_sock.get_option(receive_buffer_size2, ec);
  407. #if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  408. BOOST_ASIO_CHECK(!ec); // Not supported under Windows CE but can get value.
  409. #else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  410. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  411. BOOST_ASIO_CHECK(receive_buffer_size2.value() == 4096);
  412. #endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  413. socket_base::receive_buffer_size receive_buffer_size3(16384);
  414. BOOST_ASIO_CHECK(receive_buffer_size3.value() == 16384);
  415. tcp_sock.set_option(receive_buffer_size3, ec);
  416. #if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  417. // Option is not supported under Windows CE.
  418. BOOST_ASIO_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
  419. ec.value() << ", " << ec.message());
  420. #else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  421. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  422. #endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  423. socket_base::receive_buffer_size receive_buffer_size4;
  424. tcp_sock.get_option(receive_buffer_size4, ec);
  425. #if defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  426. BOOST_ASIO_CHECK(!ec); // Not supported under Windows CE but can get value.
  427. #else // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  428. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  429. BOOST_ASIO_CHECK(receive_buffer_size4.value() == 16384);
  430. #endif // defined(BOOST_ASIO_WINDOWS) && defined(UNDER_CE)
  431. // receive_low_watermark class.
  432. socket_base::receive_low_watermark receive_low_watermark1(4096);
  433. BOOST_ASIO_CHECK(receive_low_watermark1.value() == 4096);
  434. tcp_sock.set_option(receive_low_watermark1, ec);
  435. #if defined(WIN32) || defined(__sun)
  436. BOOST_ASIO_CHECK(!!ec); // Not supported on Windows or Solaris.
  437. #else
  438. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  439. #endif
  440. socket_base::receive_low_watermark receive_low_watermark2;
  441. tcp_sock.get_option(receive_low_watermark2, ec);
  442. #if defined(WIN32) || defined(__sun)
  443. BOOST_ASIO_CHECK(!!ec); // Not supported on Windows or Solaris.
  444. #else
  445. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  446. BOOST_ASIO_CHECK(receive_low_watermark2.value() == 4096);
  447. #endif
  448. socket_base::receive_low_watermark receive_low_watermark3(8192);
  449. BOOST_ASIO_CHECK(receive_low_watermark3.value() == 8192);
  450. tcp_sock.set_option(receive_low_watermark3, ec);
  451. #if defined(WIN32) || defined(__sun)
  452. BOOST_ASIO_CHECK(!!ec); // Not supported on Windows or Solaris.
  453. #else
  454. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  455. #endif
  456. socket_base::receive_low_watermark receive_low_watermark4;
  457. tcp_sock.get_option(receive_low_watermark4, ec);
  458. #if defined(WIN32) || defined(__sun)
  459. BOOST_ASIO_CHECK(!!ec); // Not supported on Windows or Solaris.
  460. #else
  461. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  462. BOOST_ASIO_CHECK(receive_low_watermark4.value() == 8192);
  463. #endif
  464. // reuse_address class.
  465. socket_base::reuse_address reuse_address1(true);
  466. BOOST_ASIO_CHECK(reuse_address1.value());
  467. BOOST_ASIO_CHECK(static_cast<bool>(reuse_address1));
  468. BOOST_ASIO_CHECK(!!reuse_address1);
  469. udp_sock.set_option(reuse_address1, ec);
  470. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  471. socket_base::reuse_address reuse_address2;
  472. udp_sock.get_option(reuse_address2, ec);
  473. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  474. BOOST_ASIO_CHECK(reuse_address2.value());
  475. BOOST_ASIO_CHECK(static_cast<bool>(reuse_address2));
  476. BOOST_ASIO_CHECK(!!reuse_address2);
  477. socket_base::reuse_address reuse_address3(false);
  478. BOOST_ASIO_CHECK(!reuse_address3.value());
  479. BOOST_ASIO_CHECK(!static_cast<bool>(reuse_address3));
  480. BOOST_ASIO_CHECK(!reuse_address3);
  481. udp_sock.set_option(reuse_address3, ec);
  482. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  483. socket_base::reuse_address reuse_address4;
  484. udp_sock.get_option(reuse_address4, ec);
  485. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  486. BOOST_ASIO_CHECK(!reuse_address4.value());
  487. BOOST_ASIO_CHECK(!static_cast<bool>(reuse_address4));
  488. BOOST_ASIO_CHECK(!reuse_address4);
  489. // linger class.
  490. socket_base::linger linger1(true, 60);
  491. BOOST_ASIO_CHECK(linger1.enabled());
  492. BOOST_ASIO_CHECK(linger1.timeout() == 60);
  493. tcp_sock.set_option(linger1, ec);
  494. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  495. socket_base::linger linger2;
  496. tcp_sock.get_option(linger2, ec);
  497. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  498. BOOST_ASIO_CHECK(linger2.enabled());
  499. BOOST_ASIO_CHECK(linger2.timeout() == 60);
  500. socket_base::linger linger3(false, 0);
  501. BOOST_ASIO_CHECK(!linger3.enabled());
  502. BOOST_ASIO_CHECK(linger3.timeout() == 0);
  503. tcp_sock.set_option(linger3, ec);
  504. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  505. socket_base::linger linger4;
  506. tcp_sock.get_option(linger4, ec);
  507. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  508. BOOST_ASIO_CHECK(!linger4.enabled());
  509. // enable_connection_aborted class.
  510. socket_base::enable_connection_aborted enable_connection_aborted1(true);
  511. BOOST_ASIO_CHECK(enable_connection_aborted1.value());
  512. BOOST_ASIO_CHECK(static_cast<bool>(enable_connection_aborted1));
  513. BOOST_ASIO_CHECK(!!enable_connection_aborted1);
  514. tcp_acceptor.set_option(enable_connection_aborted1, ec);
  515. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  516. socket_base::enable_connection_aborted enable_connection_aborted2;
  517. tcp_acceptor.get_option(enable_connection_aborted2, ec);
  518. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  519. BOOST_ASIO_CHECK(enable_connection_aborted2.value());
  520. BOOST_ASIO_CHECK(static_cast<bool>(enable_connection_aborted2));
  521. BOOST_ASIO_CHECK(!!enable_connection_aborted2);
  522. socket_base::enable_connection_aborted enable_connection_aborted3(false);
  523. BOOST_ASIO_CHECK(!enable_connection_aborted3.value());
  524. BOOST_ASIO_CHECK(!static_cast<bool>(enable_connection_aborted3));
  525. BOOST_ASIO_CHECK(!enable_connection_aborted3);
  526. tcp_acceptor.set_option(enable_connection_aborted3, ec);
  527. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  528. socket_base::enable_connection_aborted enable_connection_aborted4;
  529. tcp_acceptor.get_option(enable_connection_aborted4, ec);
  530. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  531. BOOST_ASIO_CHECK(!enable_connection_aborted4.value());
  532. BOOST_ASIO_CHECK(!static_cast<bool>(enable_connection_aborted4));
  533. BOOST_ASIO_CHECK(!enable_connection_aborted4);
  534. // bytes_readable class.
  535. socket_base::bytes_readable bytes_readable;
  536. udp_sock.io_control(bytes_readable, ec);
  537. BOOST_ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
  538. }
  539. } // namespace socket_base_runtime
  540. //------------------------------------------------------------------------------
  541. BOOST_ASIO_TEST_SUITE
  542. (
  543. "socket_base",
  544. BOOST_ASIO_TEST_CASE(socket_base_compile::test)
  545. BOOST_ASIO_TEST_CASE(socket_base_runtime::test)
  546. )