tcp.cpp 42 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346
  1. //
  2. // tcp.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. // Enable cancel() support on Windows.
  15. #define BOOST_ASIO_ENABLE_CANCELIO 1
  16. // Test that header file is self-contained.
  17. #include <boost/asio/ip/tcp.hpp>
  18. #include <cstring>
  19. #include <boost/asio/io_context.hpp>
  20. #include <boost/asio/read.hpp>
  21. #include <boost/asio/write.hpp>
  22. #include "../unit_test.hpp"
  23. #include "../archetypes/async_result.hpp"
  24. #include "../archetypes/gettable_socket_option.hpp"
  25. #include "../archetypes/io_control_command.hpp"
  26. #include "../archetypes/settable_socket_option.hpp"
  27. #if defined(BOOST_ASIO_HAS_BOOST_ARRAY)
  28. # include <boost/array.hpp>
  29. #else // defined(BOOST_ASIO_HAS_BOOST_ARRAY)
  30. # include <array>
  31. #endif // defined(BOOST_ASIO_HAS_BOOST_ARRAY)
  32. #if defined(BOOST_ASIO_HAS_BOOST_BIND)
  33. # include <boost/bind.hpp>
  34. #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
  35. # include <functional>
  36. #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
  37. //------------------------------------------------------------------------------
  38. // ip_tcp_compile test
  39. // ~~~~~~~~~~~~~~~~~~~
  40. // The following test checks that all nested classes, enums and constants in
  41. // ip::tcp compile and link correctly. Runtime failures are ignored.
  42. namespace ip_tcp_compile {
  43. void test()
  44. {
  45. using namespace boost::asio;
  46. namespace ip = boost::asio::ip;
  47. try
  48. {
  49. io_context ioc;
  50. ip::tcp::socket sock(ioc);
  51. // no_delay class.
  52. ip::tcp::no_delay no_delay1(true);
  53. sock.set_option(no_delay1);
  54. ip::tcp::no_delay no_delay2;
  55. sock.get_option(no_delay2);
  56. no_delay1 = true;
  57. (void)static_cast<bool>(no_delay1);
  58. (void)static_cast<bool>(!no_delay1);
  59. (void)static_cast<bool>(no_delay1.value());
  60. }
  61. catch (std::exception&)
  62. {
  63. }
  64. }
  65. } // namespace ip_tcp_compile
  66. //------------------------------------------------------------------------------
  67. // ip_tcp_runtime test
  68. // ~~~~~~~~~~~~~~~~~~~
  69. // The following test checks the runtime operation of the ip::tcp class.
  70. namespace ip_tcp_runtime {
  71. void test()
  72. {
  73. using namespace boost::asio;
  74. namespace ip = boost::asio::ip;
  75. io_context ioc;
  76. ip::tcp::socket sock(ioc, ip::tcp::v4());
  77. boost::system::error_code ec;
  78. // no_delay class.
  79. ip::tcp::no_delay no_delay1(true);
  80. BOOST_ASIO_CHECK(no_delay1.value());
  81. BOOST_ASIO_CHECK(static_cast<bool>(no_delay1));
  82. BOOST_ASIO_CHECK(!!no_delay1);
  83. sock.set_option(no_delay1, ec);
  84. BOOST_ASIO_CHECK(!ec);
  85. ip::tcp::no_delay no_delay2;
  86. sock.get_option(no_delay2, ec);
  87. BOOST_ASIO_CHECK(!ec);
  88. BOOST_ASIO_CHECK(no_delay2.value());
  89. BOOST_ASIO_CHECK(static_cast<bool>(no_delay2));
  90. BOOST_ASIO_CHECK(!!no_delay2);
  91. ip::tcp::no_delay no_delay3(false);
  92. BOOST_ASIO_CHECK(!no_delay3.value());
  93. BOOST_ASIO_CHECK(!static_cast<bool>(no_delay3));
  94. BOOST_ASIO_CHECK(!no_delay3);
  95. sock.set_option(no_delay3, ec);
  96. BOOST_ASIO_CHECK(!ec);
  97. ip::tcp::no_delay no_delay4;
  98. sock.get_option(no_delay4, ec);
  99. BOOST_ASIO_CHECK(!ec);
  100. BOOST_ASIO_CHECK(!no_delay4.value());
  101. BOOST_ASIO_CHECK(!static_cast<bool>(no_delay4));
  102. BOOST_ASIO_CHECK(!no_delay4);
  103. }
  104. } // namespace ip_tcp_runtime
  105. //------------------------------------------------------------------------------
  106. // ip_tcp_socket_compile test
  107. // ~~~~~~~~~~~~~~~~~~~~~~~~~~
  108. // The following test checks that all public member functions on the class
  109. // ip::tcp::socket compile and link correctly. Runtime failures are ignored.
  110. namespace ip_tcp_socket_compile {
  111. struct connect_handler
  112. {
  113. connect_handler() {}
  114. void operator()(const boost::system::error_code&) {}
  115. #if defined(BOOST_ASIO_HAS_MOVE)
  116. connect_handler(connect_handler&&) {}
  117. private:
  118. connect_handler(const connect_handler&);
  119. #endif // defined(BOOST_ASIO_HAS_MOVE)
  120. };
  121. struct wait_handler
  122. {
  123. wait_handler() {}
  124. void operator()(const boost::system::error_code&) {}
  125. #if defined(BOOST_ASIO_HAS_MOVE)
  126. wait_handler(wait_handler&&) {}
  127. private:
  128. wait_handler(const wait_handler&);
  129. #endif // defined(BOOST_ASIO_HAS_MOVE)
  130. };
  131. struct send_handler
  132. {
  133. send_handler() {}
  134. void operator()(const boost::system::error_code&, std::size_t) {}
  135. #if defined(BOOST_ASIO_HAS_MOVE)
  136. send_handler(send_handler&&) {}
  137. private:
  138. send_handler(const send_handler&);
  139. #endif // defined(BOOST_ASIO_HAS_MOVE)
  140. };
  141. struct receive_handler
  142. {
  143. receive_handler() {}
  144. void operator()(const boost::system::error_code&, std::size_t) {}
  145. #if defined(BOOST_ASIO_HAS_MOVE)
  146. receive_handler(receive_handler&&) {}
  147. private:
  148. receive_handler(const receive_handler&);
  149. #endif // defined(BOOST_ASIO_HAS_MOVE)
  150. };
  151. struct write_some_handler
  152. {
  153. write_some_handler() {}
  154. void operator()(const boost::system::error_code&, std::size_t) {}
  155. #if defined(BOOST_ASIO_HAS_MOVE)
  156. write_some_handler(write_some_handler&&) {}
  157. private:
  158. write_some_handler(const write_some_handler&);
  159. #endif // defined(BOOST_ASIO_HAS_MOVE)
  160. };
  161. struct read_some_handler
  162. {
  163. read_some_handler() {}
  164. void operator()(const boost::system::error_code&, std::size_t) {}
  165. #if defined(BOOST_ASIO_HAS_MOVE)
  166. read_some_handler(read_some_handler&&) {}
  167. private:
  168. read_some_handler(const read_some_handler&);
  169. #endif // defined(BOOST_ASIO_HAS_MOVE)
  170. };
  171. void test()
  172. {
  173. #if defined(BOOST_ASIO_HAS_BOOST_ARRAY)
  174. using boost::array;
  175. #else // defined(BOOST_ASIO_HAS_BOOST_ARRAY)
  176. using std::array;
  177. #endif // defined(BOOST_ASIO_HAS_BOOST_ARRAY)
  178. using namespace boost::asio;
  179. namespace ip = boost::asio::ip;
  180. try
  181. {
  182. io_context ioc;
  183. const io_context::executor_type ioc_ex = ioc.get_executor();
  184. char mutable_char_buffer[128] = "";
  185. const char const_char_buffer[128] = "";
  186. array<boost::asio::mutable_buffer, 2> mutable_buffers = {{
  187. boost::asio::buffer(mutable_char_buffer, 10),
  188. boost::asio::buffer(mutable_char_buffer + 10, 10) }};
  189. array<boost::asio::const_buffer, 2> const_buffers = {{
  190. boost::asio::buffer(const_char_buffer, 10),
  191. boost::asio::buffer(const_char_buffer + 10, 10) }};
  192. socket_base::message_flags in_flags = 0;
  193. archetypes::settable_socket_option<void> settable_socket_option1;
  194. archetypes::settable_socket_option<int> settable_socket_option2;
  195. archetypes::settable_socket_option<double> settable_socket_option3;
  196. archetypes::gettable_socket_option<void> gettable_socket_option1;
  197. archetypes::gettable_socket_option<int> gettable_socket_option2;
  198. archetypes::gettable_socket_option<double> gettable_socket_option3;
  199. archetypes::io_control_command io_control_command;
  200. archetypes::lazy_handler lazy;
  201. boost::system::error_code ec;
  202. // basic_stream_socket constructors.
  203. ip::tcp::socket socket1(ioc);
  204. ip::tcp::socket socket2(ioc, ip::tcp::v4());
  205. ip::tcp::socket socket3(ioc, ip::tcp::v6());
  206. ip::tcp::socket socket4(ioc, ip::tcp::endpoint(ip::tcp::v4(), 0));
  207. ip::tcp::socket socket5(ioc, ip::tcp::endpoint(ip::tcp::v6(), 0));
  208. #if !defined(BOOST_ASIO_WINDOWS_RUNTIME)
  209. ip::tcp::socket::native_handle_type native_socket1
  210. = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  211. ip::tcp::socket socket6(ioc, ip::tcp::v4(), native_socket1);
  212. #endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME)
  213. ip::tcp::socket socket7(ioc_ex);
  214. ip::tcp::socket socket8(ioc_ex, ip::tcp::v4());
  215. ip::tcp::socket socket9(ioc_ex, ip::tcp::v6());
  216. ip::tcp::socket socket10(ioc_ex, ip::tcp::endpoint(ip::tcp::v4(), 0));
  217. ip::tcp::socket socket11(ioc_ex, ip::tcp::endpoint(ip::tcp::v6(), 0));
  218. #if !defined(BOOST_ASIO_WINDOWS_RUNTIME)
  219. ip::tcp::socket::native_handle_type native_socket2
  220. = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  221. ip::tcp::socket socket12(ioc_ex, ip::tcp::v4(), native_socket2);
  222. #endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME)
  223. #if defined(BOOST_ASIO_HAS_MOVE)
  224. ip::tcp::socket socket13(std::move(socket5));
  225. #endif // defined(BOOST_ASIO_HAS_MOVE)
  226. // basic_stream_socket operators.
  227. #if defined(BOOST_ASIO_HAS_MOVE)
  228. socket1 = ip::tcp::socket(ioc);
  229. socket1 = std::move(socket2);
  230. #endif // defined(BOOST_ASIO_HAS_MOVE)
  231. // basic_io_object functions.
  232. ip::tcp::socket::executor_type ex = socket1.get_executor();
  233. (void)ex;
  234. // basic_socket functions.
  235. ip::tcp::socket::lowest_layer_type& lowest_layer = socket1.lowest_layer();
  236. (void)lowest_layer;
  237. const ip::tcp::socket& socket14 = socket1;
  238. const ip::tcp::socket::lowest_layer_type& lowest_layer2
  239. = socket14.lowest_layer();
  240. (void)lowest_layer2;
  241. socket1.open(ip::tcp::v4());
  242. socket1.open(ip::tcp::v6());
  243. socket1.open(ip::tcp::v4(), ec);
  244. socket1.open(ip::tcp::v6(), ec);
  245. #if !defined(BOOST_ASIO_WINDOWS_RUNTIME)
  246. ip::tcp::socket::native_handle_type native_socket3
  247. = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  248. socket1.assign(ip::tcp::v4(), native_socket3);
  249. ip::tcp::socket::native_handle_type native_socket4
  250. = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  251. socket1.assign(ip::tcp::v4(), native_socket4, ec);
  252. #endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME)
  253. bool is_open = socket1.is_open();
  254. (void)is_open;
  255. socket1.close();
  256. socket1.close(ec);
  257. socket1.release();
  258. socket1.release(ec);
  259. ip::tcp::socket::native_handle_type native_socket5
  260. = socket1.native_handle();
  261. (void)native_socket5;
  262. socket1.cancel();
  263. socket1.cancel(ec);
  264. bool at_mark1 = socket1.at_mark();
  265. (void)at_mark1;
  266. bool at_mark2 = socket1.at_mark(ec);
  267. (void)at_mark2;
  268. std::size_t available1 = socket1.available();
  269. (void)available1;
  270. std::size_t available2 = socket1.available(ec);
  271. (void)available2;
  272. socket1.bind(ip::tcp::endpoint(ip::tcp::v4(), 0));
  273. socket1.bind(ip::tcp::endpoint(ip::tcp::v6(), 0));
  274. socket1.bind(ip::tcp::endpoint(ip::tcp::v4(), 0), ec);
  275. socket1.bind(ip::tcp::endpoint(ip::tcp::v6(), 0), ec);
  276. socket1.connect(ip::tcp::endpoint(ip::tcp::v4(), 0));
  277. socket1.connect(ip::tcp::endpoint(ip::tcp::v6(), 0));
  278. socket1.connect(ip::tcp::endpoint(ip::tcp::v4(), 0), ec);
  279. socket1.connect(ip::tcp::endpoint(ip::tcp::v6(), 0), ec);
  280. socket1.async_connect(ip::tcp::endpoint(ip::tcp::v4(), 0),
  281. connect_handler());
  282. socket1.async_connect(ip::tcp::endpoint(ip::tcp::v6(), 0),
  283. connect_handler());
  284. int i1 = socket1.async_connect(ip::tcp::endpoint(ip::tcp::v4(), 0), lazy);
  285. (void)i1;
  286. int i2 = socket1.async_connect(ip::tcp::endpoint(ip::tcp::v6(), 0), lazy);
  287. (void)i2;
  288. socket1.set_option(settable_socket_option1);
  289. socket1.set_option(settable_socket_option1, ec);
  290. socket1.set_option(settable_socket_option2);
  291. socket1.set_option(settable_socket_option2, ec);
  292. socket1.set_option(settable_socket_option3);
  293. socket1.set_option(settable_socket_option3, ec);
  294. socket1.get_option(gettable_socket_option1);
  295. socket1.get_option(gettable_socket_option1, ec);
  296. socket1.get_option(gettable_socket_option2);
  297. socket1.get_option(gettable_socket_option2, ec);
  298. socket1.get_option(gettable_socket_option3);
  299. socket1.get_option(gettable_socket_option3, ec);
  300. socket1.io_control(io_control_command);
  301. socket1.io_control(io_control_command, ec);
  302. bool non_blocking1 = socket1.non_blocking();
  303. (void)non_blocking1;
  304. socket1.non_blocking(true);
  305. socket1.non_blocking(false, ec);
  306. bool non_blocking2 = socket1.native_non_blocking();
  307. (void)non_blocking2;
  308. socket1.native_non_blocking(true);
  309. socket1.native_non_blocking(false, ec);
  310. ip::tcp::endpoint endpoint1 = socket1.local_endpoint();
  311. (void)endpoint1;
  312. ip::tcp::endpoint endpoint2 = socket1.local_endpoint(ec);
  313. (void)endpoint2;
  314. ip::tcp::endpoint endpoint3 = socket1.remote_endpoint();
  315. (void)endpoint3;
  316. ip::tcp::endpoint endpoint4 = socket1.remote_endpoint(ec);
  317. (void)endpoint4;
  318. socket1.shutdown(socket_base::shutdown_both);
  319. socket1.shutdown(socket_base::shutdown_both, ec);
  320. socket1.wait(socket_base::wait_read);
  321. socket1.wait(socket_base::wait_write, ec);
  322. socket1.async_wait(socket_base::wait_read, wait_handler());
  323. int i3 = socket1.async_wait(socket_base::wait_write, lazy);
  324. (void)i3;
  325. // basic_stream_socket functions.
  326. socket1.send(buffer(mutable_char_buffer));
  327. socket1.send(buffer(const_char_buffer));
  328. socket1.send(mutable_buffers);
  329. socket1.send(const_buffers);
  330. socket1.send(null_buffers());
  331. socket1.send(buffer(mutable_char_buffer), in_flags);
  332. socket1.send(buffer(const_char_buffer), in_flags);
  333. socket1.send(mutable_buffers, in_flags);
  334. socket1.send(const_buffers, in_flags);
  335. socket1.send(null_buffers(), in_flags);
  336. socket1.send(buffer(mutable_char_buffer), in_flags, ec);
  337. socket1.send(buffer(const_char_buffer), in_flags, ec);
  338. socket1.send(mutable_buffers, in_flags, ec);
  339. socket1.send(const_buffers, in_flags, ec);
  340. socket1.send(null_buffers(), in_flags, ec);
  341. socket1.async_send(buffer(mutable_char_buffer), send_handler());
  342. socket1.async_send(buffer(const_char_buffer), send_handler());
  343. socket1.async_send(mutable_buffers, send_handler());
  344. socket1.async_send(const_buffers, send_handler());
  345. socket1.async_send(null_buffers(), send_handler());
  346. socket1.async_send(buffer(mutable_char_buffer), in_flags, send_handler());
  347. socket1.async_send(buffer(const_char_buffer), in_flags, send_handler());
  348. socket1.async_send(mutable_buffers, in_flags, send_handler());
  349. socket1.async_send(const_buffers, in_flags, send_handler());
  350. socket1.async_send(null_buffers(), in_flags, send_handler());
  351. int i4 = socket1.async_send(buffer(mutable_char_buffer), lazy);
  352. (void)i4;
  353. int i5 = socket1.async_send(buffer(const_char_buffer), lazy);
  354. (void)i5;
  355. int i6 = socket1.async_send(mutable_buffers, lazy);
  356. (void)i6;
  357. int i7 = socket1.async_send(const_buffers, lazy);
  358. (void)i7;
  359. int i8 = socket1.async_send(null_buffers(), lazy);
  360. (void)i8;
  361. int i9 = socket1.async_send(buffer(mutable_char_buffer), in_flags, lazy);
  362. (void)i9;
  363. int i10 = socket1.async_send(buffer(const_char_buffer), in_flags, lazy);
  364. (void)i10;
  365. int i11 = socket1.async_send(mutable_buffers, in_flags, lazy);
  366. (void)i11;
  367. int i12 = socket1.async_send(const_buffers, in_flags, lazy);
  368. (void)i12;
  369. int i13 = socket1.async_send(null_buffers(), in_flags, lazy);
  370. (void)i13;
  371. socket1.receive(buffer(mutable_char_buffer));
  372. socket1.receive(mutable_buffers);
  373. socket1.receive(null_buffers());
  374. socket1.receive(buffer(mutable_char_buffer), in_flags);
  375. socket1.receive(mutable_buffers, in_flags);
  376. socket1.receive(null_buffers(), in_flags);
  377. socket1.receive(buffer(mutable_char_buffer), in_flags, ec);
  378. socket1.receive(mutable_buffers, in_flags, ec);
  379. socket1.receive(null_buffers(), in_flags, ec);
  380. socket1.async_receive(buffer(mutable_char_buffer), receive_handler());
  381. socket1.async_receive(mutable_buffers, receive_handler());
  382. socket1.async_receive(null_buffers(), receive_handler());
  383. socket1.async_receive(buffer(mutable_char_buffer), in_flags,
  384. receive_handler());
  385. socket1.async_receive(mutable_buffers, in_flags, receive_handler());
  386. socket1.async_receive(null_buffers(), in_flags, receive_handler());
  387. int i14 = socket1.async_receive(buffer(mutable_char_buffer), lazy);
  388. (void)i14;
  389. int i15 = socket1.async_receive(mutable_buffers, lazy);
  390. (void)i15;
  391. int i16 = socket1.async_receive(null_buffers(), lazy);
  392. (void)i16;
  393. int i17 = socket1.async_receive(buffer(mutable_char_buffer), in_flags,
  394. lazy);
  395. (void)i17;
  396. int i18 = socket1.async_receive(mutable_buffers, in_flags, lazy);
  397. (void)i18;
  398. int i19 = socket1.async_receive(null_buffers(), in_flags, lazy);
  399. (void)i19;
  400. socket1.write_some(buffer(mutable_char_buffer));
  401. socket1.write_some(buffer(const_char_buffer));
  402. socket1.write_some(mutable_buffers);
  403. socket1.write_some(const_buffers);
  404. socket1.write_some(null_buffers());
  405. socket1.write_some(buffer(mutable_char_buffer), ec);
  406. socket1.write_some(buffer(const_char_buffer), ec);
  407. socket1.write_some(mutable_buffers, ec);
  408. socket1.write_some(const_buffers, ec);
  409. socket1.write_some(null_buffers(), ec);
  410. socket1.async_write_some(buffer(mutable_char_buffer), write_some_handler());
  411. socket1.async_write_some(buffer(const_char_buffer), write_some_handler());
  412. socket1.async_write_some(mutable_buffers, write_some_handler());
  413. socket1.async_write_some(const_buffers, write_some_handler());
  414. socket1.async_write_some(null_buffers(), write_some_handler());
  415. int i20 = socket1.async_write_some(buffer(mutable_char_buffer), lazy);
  416. (void)i20;
  417. int i21 = socket1.async_write_some(buffer(const_char_buffer), lazy);
  418. (void)i21;
  419. int i22 = socket1.async_write_some(mutable_buffers, lazy);
  420. (void)i22;
  421. int i23 = socket1.async_write_some(const_buffers, lazy);
  422. (void)i23;
  423. int i24 = socket1.async_write_some(null_buffers(), lazy);
  424. (void)i24;
  425. socket1.read_some(buffer(mutable_char_buffer));
  426. socket1.read_some(mutable_buffers);
  427. socket1.read_some(null_buffers());
  428. socket1.read_some(buffer(mutable_char_buffer), ec);
  429. socket1.read_some(mutable_buffers, ec);
  430. socket1.read_some(null_buffers(), ec);
  431. socket1.async_read_some(buffer(mutable_char_buffer), read_some_handler());
  432. socket1.async_read_some(mutable_buffers, read_some_handler());
  433. socket1.async_read_some(null_buffers(), read_some_handler());
  434. int i25 = socket1.async_read_some(buffer(mutable_char_buffer), lazy);
  435. (void)i25;
  436. int i26 = socket1.async_read_some(mutable_buffers, lazy);
  437. (void)i26;
  438. int i27 = socket1.async_read_some(null_buffers(), lazy);
  439. (void)i27;
  440. }
  441. catch (std::exception&)
  442. {
  443. }
  444. }
  445. } // namespace ip_tcp_socket_compile
  446. //------------------------------------------------------------------------------
  447. // ip_tcp_socket_runtime test
  448. // ~~~~~~~~~~~~~~~~~~~~~~~~~~
  449. // The following test checks the runtime operation of the ip::tcp::socket class.
  450. namespace ip_tcp_socket_runtime {
  451. static const char write_data[]
  452. = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  453. void handle_read_noop(const boost::system::error_code& err,
  454. size_t bytes_transferred, bool* called)
  455. {
  456. *called = true;
  457. BOOST_ASIO_CHECK(!err);
  458. BOOST_ASIO_CHECK(bytes_transferred == 0);
  459. }
  460. void handle_write_noop(const boost::system::error_code& err,
  461. size_t bytes_transferred, bool* called)
  462. {
  463. *called = true;
  464. BOOST_ASIO_CHECK(!err);
  465. BOOST_ASIO_CHECK(bytes_transferred == 0);
  466. }
  467. void handle_read(const boost::system::error_code& err,
  468. size_t bytes_transferred, bool* called)
  469. {
  470. *called = true;
  471. BOOST_ASIO_CHECK(!err);
  472. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  473. }
  474. void handle_write(const boost::system::error_code& err,
  475. size_t bytes_transferred, bool* called)
  476. {
  477. *called = true;
  478. BOOST_ASIO_CHECK(!err);
  479. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  480. }
  481. void handle_read_cancel(const boost::system::error_code& err,
  482. size_t bytes_transferred, bool* called)
  483. {
  484. *called = true;
  485. BOOST_ASIO_CHECK(err == boost::asio::error::operation_aborted);
  486. BOOST_ASIO_CHECK(bytes_transferred == 0);
  487. }
  488. void handle_read_eof(const boost::system::error_code& err,
  489. size_t bytes_transferred, bool* called)
  490. {
  491. *called = true;
  492. BOOST_ASIO_CHECK(err == boost::asio::error::eof);
  493. BOOST_ASIO_CHECK(bytes_transferred == 0);
  494. }
  495. void test()
  496. {
  497. using namespace std; // For memcmp.
  498. using namespace boost::asio;
  499. namespace ip = boost::asio::ip;
  500. #if defined(BOOST_ASIO_HAS_BOOST_BIND)
  501. namespace bindns = boost;
  502. #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
  503. namespace bindns = std;
  504. using std::placeholders::_1;
  505. using std::placeholders::_2;
  506. #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
  507. io_context ioc;
  508. ip::tcp::acceptor acceptor(ioc, ip::tcp::endpoint(ip::tcp::v4(), 0));
  509. ip::tcp::endpoint server_endpoint = acceptor.local_endpoint();
  510. server_endpoint.address(ip::address_v4::loopback());
  511. ip::tcp::socket client_side_socket(ioc);
  512. ip::tcp::socket server_side_socket(ioc);
  513. client_side_socket.connect(server_endpoint);
  514. acceptor.accept(server_side_socket);
  515. // No-op read.
  516. bool read_noop_completed = false;
  517. client_side_socket.async_read_some(
  518. boost::asio::mutable_buffer(0, 0),
  519. bindns::bind(handle_read_noop,
  520. _1, _2, &read_noop_completed));
  521. ioc.run();
  522. BOOST_ASIO_CHECK(read_noop_completed);
  523. // No-op write.
  524. bool write_noop_completed = false;
  525. client_side_socket.async_write_some(
  526. boost::asio::const_buffer(0, 0),
  527. bindns::bind(handle_write_noop,
  528. _1, _2, &write_noop_completed));
  529. ioc.restart();
  530. ioc.run();
  531. BOOST_ASIO_CHECK(write_noop_completed);
  532. // Read and write to transfer data.
  533. char read_buffer[sizeof(write_data)];
  534. bool read_completed = false;
  535. boost::asio::async_read(client_side_socket,
  536. boost::asio::buffer(read_buffer),
  537. bindns::bind(handle_read,
  538. _1, _2, &read_completed));
  539. bool write_completed = false;
  540. boost::asio::async_write(server_side_socket,
  541. boost::asio::buffer(write_data),
  542. bindns::bind(handle_write,
  543. _1, _2, &write_completed));
  544. ioc.restart();
  545. ioc.run();
  546. BOOST_ASIO_CHECK(read_completed);
  547. BOOST_ASIO_CHECK(write_completed);
  548. BOOST_ASIO_CHECK(memcmp(read_buffer, write_data, sizeof(write_data)) == 0);
  549. // Cancelled read.
  550. bool read_cancel_completed = false;
  551. boost::asio::async_read(server_side_socket,
  552. boost::asio::buffer(read_buffer),
  553. bindns::bind(handle_read_cancel,
  554. _1, _2, &read_cancel_completed));
  555. ioc.restart();
  556. ioc.poll();
  557. BOOST_ASIO_CHECK(!read_cancel_completed);
  558. server_side_socket.cancel();
  559. ioc.restart();
  560. ioc.run();
  561. BOOST_ASIO_CHECK(read_cancel_completed);
  562. // A read when the peer closes socket should fail with eof.
  563. bool read_eof_completed = false;
  564. boost::asio::async_read(client_side_socket,
  565. boost::asio::buffer(read_buffer),
  566. bindns::bind(handle_read_eof,
  567. _1, _2, &read_eof_completed));
  568. server_side_socket.close();
  569. ioc.restart();
  570. ioc.run();
  571. BOOST_ASIO_CHECK(read_eof_completed);
  572. }
  573. } // namespace ip_tcp_socket_runtime
  574. //------------------------------------------------------------------------------
  575. // ip_tcp_acceptor_compile test
  576. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  577. // The following test checks that all public member functions on the class
  578. // ip::tcp::acceptor compile and link correctly. Runtime failures are ignored.
  579. namespace ip_tcp_acceptor_compile {
  580. struct wait_handler
  581. {
  582. wait_handler() {}
  583. void operator()(const boost::system::error_code&) {}
  584. #if defined(BOOST_ASIO_HAS_MOVE)
  585. wait_handler(wait_handler&&) {}
  586. private:
  587. wait_handler(const wait_handler&);
  588. #endif // defined(BOOST_ASIO_HAS_MOVE)
  589. };
  590. struct accept_handler
  591. {
  592. accept_handler() {}
  593. void operator()(const boost::system::error_code&) {}
  594. #if defined(BOOST_ASIO_HAS_MOVE)
  595. accept_handler(accept_handler&&) {}
  596. private:
  597. accept_handler(const accept_handler&);
  598. #endif // defined(BOOST_ASIO_HAS_MOVE)
  599. };
  600. #if defined(BOOST_ASIO_HAS_MOVE)
  601. struct move_accept_handler
  602. {
  603. move_accept_handler() {}
  604. void operator()(
  605. const boost::system::error_code&, boost::asio::ip::tcp::socket) {}
  606. move_accept_handler(move_accept_handler&&) {}
  607. private:
  608. move_accept_handler(const move_accept_handler&) {}
  609. };
  610. struct move_accept_ioc_handler
  611. {
  612. move_accept_ioc_handler() {}
  613. void operator()(const boost::system::error_code&,
  614. boost::asio::basic_stream_socket<boost::asio::ip::tcp,
  615. boost::asio::io_context::executor_type>) {}
  616. move_accept_ioc_handler(move_accept_handler&&) {}
  617. private:
  618. move_accept_ioc_handler(const move_accept_handler&) {}
  619. };
  620. #endif // defined(BOOST_ASIO_HAS_MOVE)
  621. void test()
  622. {
  623. using namespace boost::asio;
  624. namespace ip = boost::asio::ip;
  625. try
  626. {
  627. io_context ioc;
  628. const io_context::executor_type ioc_ex = ioc.get_executor();
  629. ip::tcp::socket peer_socket1(ioc);
  630. boost::asio::basic_stream_socket<ip::tcp,
  631. io_context::executor_type> peer_socket2(ioc);
  632. ip::tcp::endpoint peer_endpoint;
  633. archetypes::settable_socket_option<void> settable_socket_option1;
  634. archetypes::settable_socket_option<int> settable_socket_option2;
  635. archetypes::settable_socket_option<double> settable_socket_option3;
  636. archetypes::gettable_socket_option<void> gettable_socket_option1;
  637. archetypes::gettable_socket_option<int> gettable_socket_option2;
  638. archetypes::gettable_socket_option<double> gettable_socket_option3;
  639. archetypes::io_control_command io_control_command;
  640. archetypes::lazy_handler lazy;
  641. boost::system::error_code ec;
  642. // basic_socket_acceptor constructors.
  643. ip::tcp::acceptor acceptor1(ioc);
  644. ip::tcp::acceptor acceptor2(ioc, ip::tcp::v4());
  645. ip::tcp::acceptor acceptor3(ioc, ip::tcp::v6());
  646. ip::tcp::acceptor acceptor4(ioc, ip::tcp::endpoint(ip::tcp::v4(), 0));
  647. ip::tcp::acceptor acceptor5(ioc, ip::tcp::endpoint(ip::tcp::v6(), 0));
  648. #if !defined(BOOST_ASIO_WINDOWS_RUNTIME)
  649. ip::tcp::acceptor::native_handle_type native_acceptor1
  650. = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  651. ip::tcp::acceptor acceptor6(ioc, ip::tcp::v4(), native_acceptor1);
  652. #endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME)
  653. ip::tcp::acceptor acceptor7(ioc_ex);
  654. ip::tcp::acceptor acceptor8(ioc_ex, ip::tcp::v4());
  655. ip::tcp::acceptor acceptor9(ioc_ex, ip::tcp::v6());
  656. ip::tcp::acceptor acceptor10(ioc_ex, ip::tcp::endpoint(ip::tcp::v4(), 0));
  657. ip::tcp::acceptor acceptor11(ioc_ex, ip::tcp::endpoint(ip::tcp::v6(), 0));
  658. #if !defined(BOOST_ASIO_WINDOWS_RUNTIME)
  659. ip::tcp::acceptor::native_handle_type native_acceptor2
  660. = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  661. ip::tcp::acceptor acceptor12(ioc_ex, ip::tcp::v4(), native_acceptor2);
  662. #endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME)
  663. #if defined(BOOST_ASIO_HAS_MOVE)
  664. ip::tcp::acceptor acceptor13(std::move(acceptor5));
  665. #endif // defined(BOOST_ASIO_HAS_MOVE)
  666. // basic_socket_acceptor operators.
  667. #if defined(BOOST_ASIO_HAS_MOVE)
  668. acceptor1 = ip::tcp::acceptor(ioc);
  669. acceptor1 = std::move(acceptor2);
  670. #endif // defined(BOOST_ASIO_HAS_MOVE)
  671. // basic_io_object functions.
  672. ip::tcp::acceptor::executor_type ex = acceptor1.get_executor();
  673. (void)ex;
  674. // basic_socket_acceptor functions.
  675. acceptor1.open(ip::tcp::v4());
  676. acceptor1.open(ip::tcp::v6());
  677. acceptor1.open(ip::tcp::v4(), ec);
  678. acceptor1.open(ip::tcp::v6(), ec);
  679. #if !defined(BOOST_ASIO_WINDOWS_RUNTIME)
  680. ip::tcp::acceptor::native_handle_type native_acceptor3
  681. = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  682. acceptor1.assign(ip::tcp::v4(), native_acceptor3);
  683. ip::tcp::acceptor::native_handle_type native_acceptor4
  684. = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  685. acceptor1.assign(ip::tcp::v4(), native_acceptor4, ec);
  686. #endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME)
  687. bool is_open = acceptor1.is_open();
  688. (void)is_open;
  689. acceptor1.close();
  690. acceptor1.close(ec);
  691. acceptor1.release();
  692. acceptor1.release(ec);
  693. ip::tcp::acceptor::native_handle_type native_acceptor5
  694. = acceptor1.native_handle();
  695. (void)native_acceptor5;
  696. acceptor1.cancel();
  697. acceptor1.cancel(ec);
  698. acceptor1.bind(ip::tcp::endpoint(ip::tcp::v4(), 0));
  699. acceptor1.bind(ip::tcp::endpoint(ip::tcp::v6(), 0));
  700. acceptor1.bind(ip::tcp::endpoint(ip::tcp::v4(), 0), ec);
  701. acceptor1.bind(ip::tcp::endpoint(ip::tcp::v6(), 0), ec);
  702. acceptor1.set_option(settable_socket_option1);
  703. acceptor1.set_option(settable_socket_option1, ec);
  704. acceptor1.set_option(settable_socket_option2);
  705. acceptor1.set_option(settable_socket_option2, ec);
  706. acceptor1.set_option(settable_socket_option3);
  707. acceptor1.set_option(settable_socket_option3, ec);
  708. acceptor1.get_option(gettable_socket_option1);
  709. acceptor1.get_option(gettable_socket_option1, ec);
  710. acceptor1.get_option(gettable_socket_option2);
  711. acceptor1.get_option(gettable_socket_option2, ec);
  712. acceptor1.get_option(gettable_socket_option3);
  713. acceptor1.get_option(gettable_socket_option3, ec);
  714. acceptor1.io_control(io_control_command);
  715. acceptor1.io_control(io_control_command, ec);
  716. bool non_blocking1 = acceptor1.non_blocking();
  717. (void)non_blocking1;
  718. acceptor1.non_blocking(true);
  719. acceptor1.non_blocking(false, ec);
  720. bool non_blocking2 = acceptor1.native_non_blocking();
  721. (void)non_blocking2;
  722. acceptor1.native_non_blocking(true);
  723. acceptor1.native_non_blocking(false, ec);
  724. ip::tcp::endpoint endpoint1 = acceptor1.local_endpoint();
  725. (void)endpoint1;
  726. ip::tcp::endpoint endpoint2 = acceptor1.local_endpoint(ec);
  727. (void)endpoint2;
  728. acceptor1.wait(socket_base::wait_read);
  729. acceptor1.wait(socket_base::wait_write, ec);
  730. acceptor1.async_wait(socket_base::wait_read, wait_handler());
  731. int i1 = acceptor1.async_wait(socket_base::wait_write, lazy);
  732. (void)i1;
  733. acceptor1.accept(peer_socket1);
  734. acceptor1.accept(peer_socket1, ec);
  735. acceptor1.accept(peer_socket1, peer_endpoint);
  736. acceptor1.accept(peer_socket1, peer_endpoint, ec);
  737. acceptor1.accept(peer_socket2);
  738. acceptor1.accept(peer_socket2, ec);
  739. acceptor1.accept(peer_socket2, peer_endpoint);
  740. acceptor1.accept(peer_socket2, peer_endpoint, ec);
  741. #if defined(BOOST_ASIO_HAS_MOVE)
  742. peer_socket1 = acceptor1.accept();
  743. peer_socket1 = acceptor1.accept(ioc);
  744. peer_socket1 = acceptor1.accept(ioc_ex);
  745. peer_socket1 = acceptor1.accept(peer_endpoint);
  746. peer_socket1 = acceptor1.accept(ioc, peer_endpoint);
  747. peer_socket1 = acceptor1.accept(ioc_ex, peer_endpoint);
  748. (void)peer_socket1;
  749. peer_socket2 = acceptor1.accept(ioc);
  750. peer_socket2 = acceptor1.accept(ioc_ex);
  751. peer_socket2 = acceptor1.accept(ioc, peer_endpoint);
  752. peer_socket2 = acceptor1.accept(ioc_ex, peer_endpoint);
  753. (void)peer_socket2;
  754. #endif // defined(BOOST_ASIO_HAS_MOVE)
  755. acceptor1.async_accept(peer_socket1, accept_handler());
  756. acceptor1.async_accept(peer_socket1, peer_endpoint, accept_handler());
  757. int i2 = acceptor1.async_accept(peer_socket1, lazy);
  758. (void)i2;
  759. int i3 = acceptor1.async_accept(peer_socket1, peer_endpoint, lazy);
  760. (void)i3;
  761. acceptor1.async_accept(peer_socket2, accept_handler());
  762. acceptor1.async_accept(peer_socket2, peer_endpoint, accept_handler());
  763. int i4 = acceptor1.async_accept(peer_socket2, lazy);
  764. (void)i4;
  765. int i5 = acceptor1.async_accept(peer_socket2, peer_endpoint, lazy);
  766. (void)i5;
  767. #if defined(BOOST_ASIO_HAS_MOVE)
  768. acceptor1.async_accept(move_accept_handler());
  769. acceptor1.async_accept(ioc, move_accept_handler());
  770. acceptor1.async_accept(ioc_ex, move_accept_handler());
  771. acceptor1.async_accept(ioc_ex, move_accept_ioc_handler());
  772. acceptor1.async_accept(peer_endpoint, move_accept_handler());
  773. acceptor1.async_accept(ioc, peer_endpoint, move_accept_handler());
  774. acceptor1.async_accept(ioc_ex, peer_endpoint, move_accept_handler());
  775. acceptor1.async_accept(ioc_ex, peer_endpoint, move_accept_ioc_handler());
  776. #endif // defined(BOOST_ASIO_HAS_MOVE)
  777. }
  778. catch (std::exception&)
  779. {
  780. }
  781. }
  782. } // namespace ip_tcp_acceptor_compile
  783. //------------------------------------------------------------------------------
  784. // ip_tcp_acceptor_runtime test
  785. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  786. // The following test checks the runtime operation of the ip::tcp::acceptor
  787. // class.
  788. namespace ip_tcp_acceptor_runtime {
  789. void handle_accept(const boost::system::error_code& err)
  790. {
  791. BOOST_ASIO_CHECK(!err);
  792. }
  793. void handle_connect(const boost::system::error_code& err)
  794. {
  795. BOOST_ASIO_CHECK(!err);
  796. }
  797. void test()
  798. {
  799. using namespace boost::asio;
  800. namespace ip = boost::asio::ip;
  801. io_context ioc;
  802. ip::tcp::acceptor acceptor(ioc, ip::tcp::endpoint(ip::tcp::v4(), 0));
  803. ip::tcp::endpoint server_endpoint = acceptor.local_endpoint();
  804. server_endpoint.address(ip::address_v4::loopback());
  805. ip::tcp::socket client_side_socket(ioc);
  806. ip::tcp::socket server_side_socket(ioc);
  807. client_side_socket.connect(server_endpoint);
  808. acceptor.accept(server_side_socket);
  809. client_side_socket.close();
  810. server_side_socket.close();
  811. client_side_socket.connect(server_endpoint);
  812. ip::tcp::endpoint client_endpoint;
  813. acceptor.accept(server_side_socket, client_endpoint);
  814. ip::tcp::endpoint client_side_local_endpoint
  815. = client_side_socket.local_endpoint();
  816. BOOST_ASIO_CHECK(client_side_local_endpoint.port() == client_endpoint.port());
  817. ip::tcp::endpoint server_side_remote_endpoint
  818. = server_side_socket.remote_endpoint();
  819. BOOST_ASIO_CHECK(server_side_remote_endpoint.port()
  820. == client_endpoint.port());
  821. client_side_socket.close();
  822. server_side_socket.close();
  823. acceptor.async_accept(server_side_socket, &handle_accept);
  824. client_side_socket.async_connect(server_endpoint, &handle_connect);
  825. ioc.run();
  826. client_side_socket.close();
  827. server_side_socket.close();
  828. acceptor.async_accept(server_side_socket, client_endpoint, &handle_accept);
  829. client_side_socket.async_connect(server_endpoint, &handle_connect);
  830. ioc.restart();
  831. ioc.run();
  832. client_side_local_endpoint = client_side_socket.local_endpoint();
  833. BOOST_ASIO_CHECK(client_side_local_endpoint.port() == client_endpoint.port());
  834. server_side_remote_endpoint = server_side_socket.remote_endpoint();
  835. BOOST_ASIO_CHECK(server_side_remote_endpoint.port()
  836. == client_endpoint.port());
  837. }
  838. } // namespace ip_tcp_acceptor_runtime
  839. //------------------------------------------------------------------------------
  840. // ip_tcp_resolver_compile test
  841. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  842. // The following test checks that all public member functions on the class
  843. // ip::tcp::resolver compile and link correctly. Runtime failures are ignored.
  844. namespace ip_tcp_resolver_compile {
  845. struct resolve_handler
  846. {
  847. resolve_handler() {}
  848. void operator()(const boost::system::error_code&,
  849. boost::asio::ip::tcp::resolver::results_type) {}
  850. #if defined(BOOST_ASIO_HAS_MOVE)
  851. resolve_handler(resolve_handler&&) {}
  852. private:
  853. resolve_handler(const resolve_handler&);
  854. #endif // defined(BOOST_ASIO_HAS_MOVE)
  855. };
  856. #if !defined(BOOST_ASIO_NO_DEPRECATED)
  857. struct legacy_resolve_handler
  858. {
  859. legacy_resolve_handler() {}
  860. void operator()(const boost::system::error_code&,
  861. boost::asio::ip::tcp::resolver::iterator) {}
  862. #if defined(BOOST_ASIO_HAS_MOVE)
  863. legacy_resolve_handler(legacy_resolve_handler&&) {}
  864. private:
  865. legacy_resolve_handler(const legacy_resolve_handler&);
  866. #endif // defined(BOOST_ASIO_HAS_MOVE)
  867. };
  868. #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
  869. void test()
  870. {
  871. using namespace boost::asio;
  872. namespace ip = boost::asio::ip;
  873. try
  874. {
  875. io_context ioc;
  876. const io_context::executor_type ioc_ex = ioc.get_executor();
  877. archetypes::lazy_handler lazy;
  878. boost::system::error_code ec;
  879. #if !defined(BOOST_ASIO_NO_DEPRECATED)
  880. ip::tcp::resolver::query q(ip::tcp::v4(), "localhost", "0");
  881. #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
  882. ip::tcp::endpoint e(ip::address_v4::loopback(), 0);
  883. // basic_resolver constructors.
  884. ip::tcp::resolver resolver(ioc);
  885. ip::tcp::resolver resolver2(ioc_ex);
  886. #if defined(BOOST_ASIO_HAS_MOVE)
  887. ip::tcp::resolver resolver3(std::move(resolver));
  888. #endif // defined(BOOST_ASIO_HAS_MOVE)
  889. // basic_resolver operators.
  890. #if defined(BOOST_ASIO_HAS_MOVE)
  891. resolver = ip::tcp::resolver(ioc);
  892. resolver = std::move(resolver3);
  893. #endif // defined(BOOST_ASIO_HAS_MOVE)
  894. // basic_io_object functions.
  895. ip::tcp::resolver::executor_type ex = resolver.get_executor();
  896. (void)ex;
  897. // basic_resolver functions.
  898. resolver.cancel();
  899. #if !defined(BOOST_ASIO_NO_DEPRECATED)
  900. ip::tcp::resolver::results_type results1 = resolver.resolve(q);
  901. (void)results1;
  902. ip::tcp::resolver::results_type results2 = resolver.resolve(q, ec);
  903. (void)results2;
  904. #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
  905. ip::tcp::resolver::results_type results3 = resolver.resolve("", "");
  906. (void)results3;
  907. ip::tcp::resolver::results_type results4 = resolver.resolve("", "", ec);
  908. (void)results4;
  909. ip::tcp::resolver::results_type results5 =
  910. resolver.resolve("", "", ip::tcp::resolver::flags());
  911. (void)results5;
  912. ip::tcp::resolver::results_type results6 =
  913. resolver.resolve("", "", ip::tcp::resolver::flags(), ec);
  914. (void)results6;
  915. ip::tcp::resolver::results_type results7 =
  916. resolver.resolve(ip::tcp::v4(), "", "");
  917. (void)results7;
  918. ip::tcp::resolver::results_type results8 =
  919. resolver.resolve(ip::tcp::v4(), "", "", ec);
  920. (void)results8;
  921. ip::tcp::resolver::results_type results9 =
  922. resolver.resolve(ip::tcp::v4(), "", "", ip::tcp::resolver::flags());
  923. (void)results9;
  924. ip::tcp::resolver::results_type results10 =
  925. resolver.resolve(ip::tcp::v4(), "", "", ip::tcp::resolver::flags(), ec);
  926. (void)results10;
  927. ip::tcp::resolver::results_type results11 = resolver.resolve(e);
  928. (void)results11;
  929. ip::tcp::resolver::results_type results12 = resolver.resolve(e, ec);
  930. (void)results12;
  931. #if !defined(BOOST_ASIO_NO_DEPRECATED)
  932. resolver.async_resolve(q, resolve_handler());
  933. resolver.async_resolve(q, legacy_resolve_handler());
  934. int i1 = resolver.async_resolve(q, lazy);
  935. (void)i1;
  936. #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
  937. resolver.async_resolve("", "", resolve_handler());
  938. #if !defined(BOOST_ASIO_NO_DEPRECATED)
  939. resolver.async_resolve("", "", legacy_resolve_handler());
  940. #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
  941. int i2 = resolver.async_resolve("", "", lazy);
  942. (void)i2;
  943. resolver.async_resolve("", "",
  944. ip::tcp::resolver::flags(), resolve_handler());
  945. #if !defined(BOOST_ASIO_NO_DEPRECATED)
  946. resolver.async_resolve("", "",
  947. ip::tcp::resolver::flags(), legacy_resolve_handler());
  948. #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
  949. int i3 = resolver.async_resolve("", "",
  950. ip::tcp::resolver::flags(), lazy);
  951. (void)i3;
  952. resolver.async_resolve(ip::tcp::v4(), "", "", resolve_handler());
  953. #if !defined(BOOST_ASIO_NO_DEPRECATED)
  954. resolver.async_resolve(ip::tcp::v4(), "", "", legacy_resolve_handler());
  955. #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
  956. int i4 = resolver.async_resolve(ip::tcp::v4(), "", "", lazy);
  957. (void)i4;
  958. resolver.async_resolve(ip::tcp::v4(),
  959. "", "", ip::tcp::resolver::flags(), resolve_handler());
  960. #if !defined(BOOST_ASIO_NO_DEPRECATED)
  961. resolver.async_resolve(ip::tcp::v4(),
  962. "", "", ip::tcp::resolver::flags(), legacy_resolve_handler());
  963. #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
  964. int i5 = resolver.async_resolve(ip::tcp::v4(),
  965. "", "", ip::tcp::resolver::flags(), lazy);
  966. (void)i5;
  967. resolver.async_resolve(e, resolve_handler());
  968. #if !defined(BOOST_ASIO_NO_DEPRECATED)
  969. resolver.async_resolve(e, legacy_resolve_handler());
  970. #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
  971. int i6 = resolver.async_resolve(e, lazy);
  972. (void)i6;
  973. }
  974. catch (std::exception&)
  975. {
  976. }
  977. }
  978. } // namespace ip_tcp_resolver_compile
  979. //------------------------------------------------------------------------------
  980. // ip_tcp_resolver_entry_compile test
  981. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  982. // The following test checks that all public member functions on the class
  983. // ip::tcp::resolver::entry compile and link correctly. Runtime failures are
  984. // ignored.
  985. namespace ip_tcp_resolver_entry_compile {
  986. void test()
  987. {
  988. using namespace boost::asio;
  989. namespace ip = boost::asio::ip;
  990. const ip::tcp::endpoint endpoint;
  991. const std::string host_name;
  992. const std::string service_name;
  993. const std::allocator<char> alloc;
  994. try
  995. {
  996. // basic_resolver_entry constructors.
  997. const ip::basic_resolver_entry<ip::tcp> entry1;
  998. ip::basic_resolver_entry<ip::tcp> entry2(endpoint, host_name, service_name);
  999. ip::basic_resolver_entry<ip::tcp> entry3(entry1);
  1000. #if defined(BOOST_ASIO_HAS_MOVE)
  1001. ip::basic_resolver_entry<ip::tcp> entry4(std::move(entry2));
  1002. #endif // defined(BOOST_ASIO_HAS_MOVE)
  1003. // basic_resolver_entry functions.
  1004. ip::tcp::endpoint e1 = entry1.endpoint();
  1005. (void)e1;
  1006. ip::tcp::endpoint e2 = entry1;
  1007. (void)e2;
  1008. std::string s1 = entry1.host_name();
  1009. (void)s1;
  1010. std::string s2 = entry1.host_name(alloc);
  1011. (void)s2;
  1012. std::string s3 = entry1.service_name();
  1013. (void)s3;
  1014. std::string s4 = entry1.service_name(alloc);
  1015. (void)s4;
  1016. }
  1017. catch (std::exception&)
  1018. {
  1019. }
  1020. }
  1021. } // namespace ip_tcp_resolver_entry_compile
  1022. //------------------------------------------------------------------------------
  1023. // ip_tcp_iostream_compile test
  1024. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  1025. // The following test checks that all public types and member functions on the
  1026. // class ip::tcp::iostream compile and link correctly. Runtime failures are
  1027. // ignored.
  1028. namespace ip_tcp_iostream_compile {
  1029. void test()
  1030. {
  1031. #if !defined(BOOST_ASIO_NO_IOSTREAM)
  1032. using namespace boost::asio;
  1033. namespace ip = boost::asio::ip;
  1034. boost::asio::io_context ioc;
  1035. boost::asio::ip::tcp::socket sock(ioc);
  1036. // basic_socket_iostream typedefs.
  1037. (void)static_cast<ip::tcp::iostream::protocol_type*>(0);
  1038. (void)static_cast<ip::tcp::iostream::endpoint_type*>(0);
  1039. (void)static_cast<ip::tcp::iostream::clock_type*>(0);
  1040. (void)static_cast<ip::tcp::iostream::time_point*>(0);
  1041. (void)static_cast<ip::tcp::iostream::duration*>(0);
  1042. (void)static_cast<ip::tcp::iostream::traits_type*>(0);
  1043. // basic_socket_iostream constructors.
  1044. ip::tcp::iostream ios1;
  1045. #if defined(BOOST_ASIO_HAS_STD_IOSTREAM_MOVE)
  1046. ip::tcp::iostream ios2(std::move(sock));
  1047. #endif // defined(BOOST_ASIO_HAS_STD_IOSTREAM_MOVE)
  1048. ip::tcp::iostream ios3("hostname", "service");
  1049. // basic_socket_iostream operators.
  1050. #if defined(BOOST_ASIO_HAS_STD_IOSTREAM_MOVE)
  1051. ios1 = ip::tcp::iostream();
  1052. ios2 = std::move(ios1);
  1053. #endif // defined(BOOST_ASIO_HAS_STD_IOSTREAM_MOVE)
  1054. // basic_socket_iostream members.
  1055. ios1.connect("hostname", "service");
  1056. ios1.close();
  1057. (void)static_cast<std::streambuf*>(ios1.rdbuf());
  1058. basic_socket<ip::tcp>& sref = ios1.socket();
  1059. (void)sref;
  1060. boost::system::error_code ec = ios1.error();
  1061. (void)ec;
  1062. ip::tcp::iostream::time_point tp = ios1.expiry();
  1063. (void)tp;
  1064. ios1.expires_at(tp);
  1065. ip::tcp::iostream::duration d;
  1066. ios1.expires_after(d);
  1067. // iostream operators.
  1068. int i = 0;
  1069. ios1 >> i;
  1070. ios1 << i;
  1071. #endif // !defined(BOOST_ASIO_NO_IOSTREAM)
  1072. }
  1073. } // namespace ip_tcp_iostream_compile
  1074. //------------------------------------------------------------------------------
  1075. BOOST_ASIO_TEST_SUITE
  1076. (
  1077. "ip/tcp",
  1078. BOOST_ASIO_TEST_CASE(ip_tcp_compile::test)
  1079. BOOST_ASIO_TEST_CASE(ip_tcp_runtime::test)
  1080. BOOST_ASIO_TEST_CASE(ip_tcp_socket_compile::test)
  1081. BOOST_ASIO_TEST_CASE(ip_tcp_socket_runtime::test)
  1082. BOOST_ASIO_TEST_CASE(ip_tcp_acceptor_compile::test)
  1083. BOOST_ASIO_TEST_CASE(ip_tcp_acceptor_runtime::test)
  1084. BOOST_ASIO_TEST_CASE(ip_tcp_resolver_compile::test)
  1085. BOOST_ASIO_TEST_CASE(ip_tcp_resolver_entry_compile::test)
  1086. BOOST_ASIO_TEST_CASE(ip_tcp_resolver_entry_compile::test)
  1087. BOOST_ASIO_COMPILE_TEST_CASE(ip_tcp_iostream_compile::test)
  1088. )