5 // Copyright (c) 2003-2017 Christopher M. Kohlhoff (chris at kohlhoff dot com)
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)
11 // Disable autolinking for unit tests.
12 #if !defined(BOOST_ALL_NO_LIB)
13 #define BOOST_ALL_NO_LIB 1
14 #endif // !defined(BOOST_ALL_NO_LIB)
16 // Test that header file is self-contained.
17 #include <boost/asio/ip/udp.hpp>
20 #include <boost/asio/io_context.hpp>
21 #include "../unit_test.hpp"
22 #include "../archetypes/async_result.hpp"
23 #include "../archetypes/deprecated_async_result.hpp"
24 #include "../archetypes/gettable_socket_option.hpp"
25 #include "../archetypes/io_control_command.hpp"
26 #include "../archetypes/settable_socket_option.hpp"
28 #if defined(BOOST_ASIO_HAS_BOOST_BIND)
29 # include <boost/bind.hpp>
30 #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
31 # include <functional>
32 #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
34 //------------------------------------------------------------------------------
36 // ip_udp_socket_compile test
37 // ~~~~~~~~~~~~~~~~~~~~~~~~~~
38 // The following test checks that all public member functions on the class
39 // ip::udp::socket compile and link correctly. Runtime failures are ignored.
41 namespace ip_udp_socket_compile
{
43 struct connect_handler
46 void operator()(const boost::system::error_code
&) {}
47 #if defined(BOOST_ASIO_HAS_MOVE)
48 connect_handler(connect_handler
&&) {}
50 connect_handler(const connect_handler
&);
51 #endif // defined(BOOST_ASIO_HAS_MOVE)
57 void operator()(const boost::system::error_code
&) {}
58 #if defined(BOOST_ASIO_HAS_MOVE)
59 wait_handler(wait_handler
&&) {}
61 wait_handler(const wait_handler
&);
62 #endif // defined(BOOST_ASIO_HAS_MOVE)
68 void operator()(const boost::system::error_code
&, std::size_t) {}
69 #if defined(BOOST_ASIO_HAS_MOVE)
70 send_handler(send_handler
&&) {}
72 send_handler(const send_handler
&);
73 #endif // defined(BOOST_ASIO_HAS_MOVE)
76 struct receive_handler
79 void operator()(const boost::system::error_code
&, std::size_t) {}
80 #if defined(BOOST_ASIO_HAS_MOVE)
81 receive_handler(receive_handler
&&) {}
83 receive_handler(const receive_handler
&);
84 #endif // defined(BOOST_ASIO_HAS_MOVE)
89 using namespace boost::asio
;
90 namespace ip
= boost::asio::ip
;
95 char mutable_char_buffer
[128] = "";
96 const char const_char_buffer
[128] = "";
97 socket_base::message_flags in_flags
= 0;
98 archetypes::settable_socket_option
<void> settable_socket_option1
;
99 archetypes::settable_socket_option
<int> settable_socket_option2
;
100 archetypes::settable_socket_option
<double> settable_socket_option3
;
101 archetypes::gettable_socket_option
<void> gettable_socket_option1
;
102 archetypes::gettable_socket_option
<int> gettable_socket_option2
;
103 archetypes::gettable_socket_option
<double> gettable_socket_option3
;
104 archetypes::io_control_command io_control_command
;
105 archetypes::lazy_handler lazy
;
106 #if !defined(BOOST_ASIO_NO_DEPRECATED)
107 archetypes::deprecated_lazy_handler dlazy
;
108 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
109 boost::system::error_code ec
;
111 // basic_datagram_socket constructors.
113 ip::udp::socket
socket1(ioc
);
114 ip::udp::socket
socket2(ioc
, ip::udp::v4());
115 ip::udp::socket
socket3(ioc
, ip::udp::v6());
116 ip::udp::socket
socket4(ioc
, ip::udp::endpoint(ip::udp::v4(), 0));
117 ip::udp::socket
socket5(ioc
, ip::udp::endpoint(ip::udp::v6(), 0));
118 #if !defined(BOOST_ASIO_WINDOWS_RUNTIME)
119 ip::udp::socket::native_handle_type native_socket1
120 = ::socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
121 ip::udp::socket
socket6(ioc
, ip::udp::v4(), native_socket1
);
122 #endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME)
124 #if defined(BOOST_ASIO_HAS_MOVE)
125 ip::udp::socket
socket7(std::move(socket6
));
126 #endif // defined(BOOST_ASIO_HAS_MOVE)
128 // basic_datagram_socket operators.
130 #if defined(BOOST_ASIO_HAS_MOVE)
131 socket1
= ip::udp::socket(ioc
);
132 socket1
= std::move(socket2
);
133 #endif // defined(BOOST_ASIO_HAS_MOVE)
135 // basic_io_object functions.
137 #if !defined(BOOST_ASIO_NO_DEPRECATED)
138 io_context
& ioc_ref
= socket1
.get_io_context();
140 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
142 ip::udp::socket::executor_type ex
= socket1
.get_executor();
145 // basic_socket functions.
147 ip::udp::socket::lowest_layer_type
& lowest_layer
= socket1
.lowest_layer();
150 const ip::udp::socket
& socket8
= socket1
;
151 const ip::udp::socket::lowest_layer_type
& lowest_layer2
152 = socket8
.lowest_layer();
155 socket1
.open(ip::udp::v4());
156 socket1
.open(ip::udp::v6());
157 socket1
.open(ip::udp::v4(), ec
);
158 socket1
.open(ip::udp::v6(), ec
);
160 #if !defined(BOOST_ASIO_WINDOWS_RUNTIME)
161 ip::udp::socket::native_handle_type native_socket2
162 = ::socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
163 socket1
.assign(ip::udp::v4(), native_socket2
);
164 ip::udp::socket::native_handle_type native_socket3
165 = ::socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
166 socket1
.assign(ip::udp::v4(), native_socket3
, ec
);
167 #endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME)
169 bool is_open
= socket1
.is_open();
178 ip::udp::socket::native_handle_type native_socket4
179 = socket1
.native_handle();
180 (void)native_socket4
;
185 bool at_mark1
= socket1
.at_mark();
187 bool at_mark2
= socket1
.at_mark(ec
);
190 std::size_t available1
= socket1
.available();
192 std::size_t available2
= socket1
.available(ec
);
195 socket1
.bind(ip::udp::endpoint(ip::udp::v4(), 0));
196 socket1
.bind(ip::udp::endpoint(ip::udp::v6(), 0));
197 socket1
.bind(ip::udp::endpoint(ip::udp::v4(), 0), ec
);
198 socket1
.bind(ip::udp::endpoint(ip::udp::v6(), 0), ec
);
200 socket1
.connect(ip::udp::endpoint(ip::udp::v4(), 0));
201 socket1
.connect(ip::udp::endpoint(ip::udp::v6(), 0));
202 socket1
.connect(ip::udp::endpoint(ip::udp::v4(), 0), ec
);
203 socket1
.connect(ip::udp::endpoint(ip::udp::v6(), 0), ec
);
205 socket1
.async_connect(ip::udp::endpoint(ip::udp::v4(), 0),
207 socket1
.async_connect(ip::udp::endpoint(ip::udp::v6(), 0),
209 int i1
= socket1
.async_connect(ip::udp::endpoint(ip::udp::v4(), 0), lazy
);
211 int i2
= socket1
.async_connect(ip::udp::endpoint(ip::udp::v6(), 0), lazy
);
213 #if !defined(BOOST_ASIO_NO_DEPRECATED)
214 double d1
= socket1
.async_connect(
215 ip::udp::endpoint(ip::udp::v4(), 0), dlazy
);
217 double d2
= socket1
.async_connect(
218 ip::udp::endpoint(ip::udp::v6(), 0), dlazy
);
220 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
222 socket1
.set_option(settable_socket_option1
);
223 socket1
.set_option(settable_socket_option1
, ec
);
224 socket1
.set_option(settable_socket_option2
);
225 socket1
.set_option(settable_socket_option2
, ec
);
226 socket1
.set_option(settable_socket_option3
);
227 socket1
.set_option(settable_socket_option3
, ec
);
229 socket1
.get_option(gettable_socket_option1
);
230 socket1
.get_option(gettable_socket_option1
, ec
);
231 socket1
.get_option(gettable_socket_option2
);
232 socket1
.get_option(gettable_socket_option2
, ec
);
233 socket1
.get_option(gettable_socket_option3
);
234 socket1
.get_option(gettable_socket_option3
, ec
);
236 socket1
.io_control(io_control_command
);
237 socket1
.io_control(io_control_command
, ec
);
239 bool non_blocking1
= socket1
.non_blocking();
241 socket1
.non_blocking(true);
242 socket1
.non_blocking(false, ec
);
244 bool non_blocking2
= socket1
.native_non_blocking();
246 socket1
.native_non_blocking(true);
247 socket1
.native_non_blocking(false, ec
);
249 ip::udp::endpoint endpoint1
= socket1
.local_endpoint();
250 ip::udp::endpoint endpoint2
= socket1
.local_endpoint(ec
);
252 ip::udp::endpoint endpoint3
= socket1
.remote_endpoint();
253 ip::udp::endpoint endpoint4
= socket1
.remote_endpoint(ec
);
255 socket1
.shutdown(socket_base::shutdown_both
);
256 socket1
.shutdown(socket_base::shutdown_both
, ec
);
258 socket1
.wait(socket_base::wait_read
);
259 socket1
.wait(socket_base::wait_write
, ec
);
261 socket1
.async_wait(socket_base::wait_read
, wait_handler());
262 int i3
= socket1
.async_wait(socket_base::wait_write
, lazy
);
264 #if !defined(BOOST_ASIO_NO_DEPRECATED)
265 double d3
= socket1
.async_wait(socket_base::wait_write
, dlazy
);
267 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
269 // basic_datagram_socket functions.
271 socket1
.send(buffer(mutable_char_buffer
));
272 socket1
.send(buffer(const_char_buffer
));
273 socket1
.send(null_buffers());
274 socket1
.send(buffer(mutable_char_buffer
), in_flags
);
275 socket1
.send(buffer(const_char_buffer
), in_flags
);
276 socket1
.send(null_buffers(), in_flags
);
277 socket1
.send(buffer(mutable_char_buffer
), in_flags
, ec
);
278 socket1
.send(buffer(const_char_buffer
), in_flags
, ec
);
279 socket1
.send(null_buffers(), in_flags
, ec
);
281 socket1
.async_send(buffer(mutable_char_buffer
), send_handler());
282 socket1
.async_send(buffer(const_char_buffer
), send_handler());
283 socket1
.async_send(null_buffers(), send_handler());
284 socket1
.async_send(buffer(mutable_char_buffer
), in_flags
, send_handler());
285 socket1
.async_send(buffer(const_char_buffer
), in_flags
, send_handler());
286 socket1
.async_send(null_buffers(), in_flags
, send_handler());
287 int i4
= socket1
.async_send(buffer(mutable_char_buffer
), lazy
);
289 int i5
= socket1
.async_send(buffer(const_char_buffer
), lazy
);
291 int i6
= socket1
.async_send(null_buffers(), lazy
);
293 int i7
= socket1
.async_send(buffer(mutable_char_buffer
), in_flags
, lazy
);
295 int i8
= socket1
.async_send(buffer(const_char_buffer
), in_flags
, lazy
);
297 int i9
= socket1
.async_send(null_buffers(), in_flags
, lazy
);
299 #if !defined(BOOST_ASIO_NO_DEPRECATED)
300 double d4
= socket1
.async_send(buffer(mutable_char_buffer
), dlazy
);
302 double d5
= socket1
.async_send(buffer(const_char_buffer
), dlazy
);
304 double d6
= socket1
.async_send(null_buffers(), dlazy
);
306 double d7
= socket1
.async_send(
307 buffer(mutable_char_buffer
), in_flags
, dlazy
);
309 double d8
= socket1
.async_send(buffer(const_char_buffer
), in_flags
, dlazy
);
311 double d9
= socket1
.async_send(null_buffers(), in_flags
, dlazy
);
313 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
315 socket1
.send_to(buffer(mutable_char_buffer
),
316 ip::udp::endpoint(ip::udp::v4(), 0));
317 socket1
.send_to(buffer(mutable_char_buffer
),
318 ip::udp::endpoint(ip::udp::v6(), 0));
319 socket1
.send_to(buffer(const_char_buffer
),
320 ip::udp::endpoint(ip::udp::v4(), 0));
321 socket1
.send_to(buffer(const_char_buffer
),
322 ip::udp::endpoint(ip::udp::v6(), 0));
323 socket1
.send_to(null_buffers(),
324 ip::udp::endpoint(ip::udp::v4(), 0));
325 socket1
.send_to(null_buffers(),
326 ip::udp::endpoint(ip::udp::v6(), 0));
327 socket1
.send_to(buffer(mutable_char_buffer
),
328 ip::udp::endpoint(ip::udp::v4(), 0), in_flags
);
329 socket1
.send_to(buffer(mutable_char_buffer
),
330 ip::udp::endpoint(ip::udp::v6(), 0), in_flags
);
331 socket1
.send_to(buffer(const_char_buffer
),
332 ip::udp::endpoint(ip::udp::v4(), 0), in_flags
);
333 socket1
.send_to(buffer(const_char_buffer
),
334 ip::udp::endpoint(ip::udp::v6(), 0), in_flags
);
335 socket1
.send_to(null_buffers(),
336 ip::udp::endpoint(ip::udp::v4(), 0), in_flags
);
337 socket1
.send_to(null_buffers(),
338 ip::udp::endpoint(ip::udp::v6(), 0), in_flags
);
339 socket1
.send_to(buffer(mutable_char_buffer
),
340 ip::udp::endpoint(ip::udp::v4(), 0), in_flags
, ec
);
341 socket1
.send_to(buffer(mutable_char_buffer
),
342 ip::udp::endpoint(ip::udp::v6(), 0), in_flags
, ec
);
343 socket1
.send_to(buffer(const_char_buffer
),
344 ip::udp::endpoint(ip::udp::v4(), 0), in_flags
, ec
);
345 socket1
.send_to(buffer(const_char_buffer
),
346 ip::udp::endpoint(ip::udp::v6(), 0), in_flags
, ec
);
347 socket1
.send_to(null_buffers(),
348 ip::udp::endpoint(ip::udp::v4(), 0), in_flags
, ec
);
349 socket1
.send_to(null_buffers(),
350 ip::udp::endpoint(ip::udp::v6(), 0), in_flags
, ec
);
352 socket1
.async_send_to(buffer(mutable_char_buffer
),
353 ip::udp::endpoint(ip::udp::v4(), 0), send_handler());
354 socket1
.async_send_to(buffer(mutable_char_buffer
),
355 ip::udp::endpoint(ip::udp::v6(), 0), send_handler());
356 socket1
.async_send_to(buffer(const_char_buffer
),
357 ip::udp::endpoint(ip::udp::v4(), 0), send_handler());
358 socket1
.async_send_to(buffer(const_char_buffer
),
359 ip::udp::endpoint(ip::udp::v6(), 0), send_handler());
360 socket1
.async_send_to(null_buffers(),
361 ip::udp::endpoint(ip::udp::v4(), 0), send_handler());
362 socket1
.async_send_to(null_buffers(),
363 ip::udp::endpoint(ip::udp::v6(), 0), send_handler());
364 socket1
.async_send_to(buffer(mutable_char_buffer
),
365 ip::udp::endpoint(ip::udp::v4(), 0), in_flags
, send_handler());
366 socket1
.async_send_to(buffer(mutable_char_buffer
),
367 ip::udp::endpoint(ip::udp::v6(), 0), in_flags
, send_handler());
368 socket1
.async_send_to(buffer(const_char_buffer
),
369 ip::udp::endpoint(ip::udp::v4(), 0), in_flags
, send_handler());
370 socket1
.async_send_to(buffer(const_char_buffer
),
371 ip::udp::endpoint(ip::udp::v6(), 0), in_flags
, send_handler());
372 socket1
.async_send_to(null_buffers(),
373 ip::udp::endpoint(ip::udp::v4(), 0), in_flags
, send_handler());
374 socket1
.async_send_to(null_buffers(),
375 ip::udp::endpoint(ip::udp::v6(), 0), in_flags
, send_handler());
376 int i10
= socket1
.async_send_to(buffer(mutable_char_buffer
),
377 ip::udp::endpoint(ip::udp::v4(), 0), lazy
);
379 int i11
= socket1
.async_send_to(buffer(mutable_char_buffer
),
380 ip::udp::endpoint(ip::udp::v6(), 0), lazy
);
382 int i12
= socket1
.async_send_to(buffer(const_char_buffer
),
383 ip::udp::endpoint(ip::udp::v4(), 0), lazy
);
385 int i13
= socket1
.async_send_to(buffer(const_char_buffer
),
386 ip::udp::endpoint(ip::udp::v6(), 0), lazy
);
388 int i14
= socket1
.async_send_to(null_buffers(),
389 ip::udp::endpoint(ip::udp::v4(), 0), lazy
);
391 int i15
= socket1
.async_send_to(null_buffers(),
392 ip::udp::endpoint(ip::udp::v6(), 0), lazy
);
394 int i16
= socket1
.async_send_to(buffer(mutable_char_buffer
),
395 ip::udp::endpoint(ip::udp::v4(), 0), in_flags
, lazy
);
397 int i17
= socket1
.async_send_to(buffer(mutable_char_buffer
),
398 ip::udp::endpoint(ip::udp::v6(), 0), in_flags
, lazy
);
400 int i18
= socket1
.async_send_to(buffer(const_char_buffer
),
401 ip::udp::endpoint(ip::udp::v4(), 0), in_flags
, lazy
);
403 int i19
= socket1
.async_send_to(buffer(const_char_buffer
),
404 ip::udp::endpoint(ip::udp::v6(), 0), in_flags
, lazy
);
406 int i20
= socket1
.async_send_to(null_buffers(),
407 ip::udp::endpoint(ip::udp::v4(), 0), in_flags
, lazy
);
409 int i21
= socket1
.async_send_to(null_buffers(),
410 ip::udp::endpoint(ip::udp::v6(), 0), in_flags
, lazy
);
412 #if !defined(BOOST_ASIO_NO_DEPRECATED)
413 double d10
= socket1
.async_send_to(buffer(mutable_char_buffer
),
414 ip::udp::endpoint(ip::udp::v4(), 0), dlazy
);
416 double d11
= socket1
.async_send_to(buffer(mutable_char_buffer
),
417 ip::udp::endpoint(ip::udp::v6(), 0), dlazy
);
419 double d12
= socket1
.async_send_to(buffer(const_char_buffer
),
420 ip::udp::endpoint(ip::udp::v4(), 0), dlazy
);
422 double d13
= socket1
.async_send_to(buffer(const_char_buffer
),
423 ip::udp::endpoint(ip::udp::v6(), 0), dlazy
);
425 double d14
= socket1
.async_send_to(null_buffers(),
426 ip::udp::endpoint(ip::udp::v4(), 0), dlazy
);
428 double d15
= socket1
.async_send_to(null_buffers(),
429 ip::udp::endpoint(ip::udp::v6(), 0), dlazy
);
431 double d16
= socket1
.async_send_to(buffer(mutable_char_buffer
),
432 ip::udp::endpoint(ip::udp::v4(), 0), in_flags
, dlazy
);
434 double d17
= socket1
.async_send_to(buffer(mutable_char_buffer
),
435 ip::udp::endpoint(ip::udp::v6(), 0), in_flags
, dlazy
);
437 double d18
= socket1
.async_send_to(buffer(const_char_buffer
),
438 ip::udp::endpoint(ip::udp::v4(), 0), in_flags
, dlazy
);
440 double d19
= socket1
.async_send_to(buffer(const_char_buffer
),
441 ip::udp::endpoint(ip::udp::v6(), 0), in_flags
, dlazy
);
443 double d20
= socket1
.async_send_to(null_buffers(),
444 ip::udp::endpoint(ip::udp::v4(), 0), in_flags
, dlazy
);
446 double d21
= socket1
.async_send_to(null_buffers(),
447 ip::udp::endpoint(ip::udp::v6(), 0), in_flags
, dlazy
);
449 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
451 socket1
.receive(buffer(mutable_char_buffer
));
452 socket1
.receive(null_buffers());
453 socket1
.receive(buffer(mutable_char_buffer
), in_flags
);
454 socket1
.receive(null_buffers(), in_flags
);
455 socket1
.receive(buffer(mutable_char_buffer
), in_flags
, ec
);
456 socket1
.receive(null_buffers(), in_flags
, ec
);
458 socket1
.async_receive(buffer(mutable_char_buffer
), receive_handler());
459 socket1
.async_receive(null_buffers(), receive_handler());
460 socket1
.async_receive(buffer(mutable_char_buffer
), in_flags
,
462 socket1
.async_receive(null_buffers(), in_flags
, receive_handler());
463 int i22
= socket1
.async_receive(buffer(mutable_char_buffer
), lazy
);
465 int i23
= socket1
.async_receive(null_buffers(), lazy
);
467 int i24
= socket1
.async_receive(buffer(mutable_char_buffer
),
470 int i25
= socket1
.async_receive(null_buffers(), in_flags
, lazy
);
472 #if !defined(BOOST_ASIO_NO_DEPRECATED)
473 double d22
= socket1
.async_receive(buffer(mutable_char_buffer
), dlazy
);
475 double d23
= socket1
.async_receive(null_buffers(), dlazy
);
477 double d24
= socket1
.async_receive(buffer(mutable_char_buffer
),
480 double d25
= socket1
.async_receive(null_buffers(), in_flags
, dlazy
);
482 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
484 ip::udp::endpoint endpoint
;
485 socket1
.receive_from(buffer(mutable_char_buffer
), endpoint
);
486 socket1
.receive_from(null_buffers(), endpoint
);
487 socket1
.receive_from(buffer(mutable_char_buffer
), endpoint
, in_flags
);
488 socket1
.receive_from(null_buffers(), endpoint
, in_flags
);
489 socket1
.receive_from(buffer(mutable_char_buffer
), endpoint
, in_flags
, ec
);
490 socket1
.receive_from(null_buffers(), endpoint
, in_flags
, ec
);
492 socket1
.async_receive_from(buffer(mutable_char_buffer
),
493 endpoint
, receive_handler());
494 socket1
.async_receive_from(null_buffers(),
495 endpoint
, receive_handler());
496 socket1
.async_receive_from(buffer(mutable_char_buffer
),
497 endpoint
, in_flags
, receive_handler());
498 socket1
.async_receive_from(null_buffers(),
499 endpoint
, in_flags
, receive_handler());
500 int i26
= socket1
.async_receive_from(buffer(mutable_char_buffer
),
503 int i27
= socket1
.async_receive_from(null_buffers(),
506 int i28
= socket1
.async_receive_from(buffer(mutable_char_buffer
),
507 endpoint
, in_flags
, lazy
);
509 int i29
= socket1
.async_receive_from(null_buffers(),
510 endpoint
, in_flags
, lazy
);
512 #if !defined(BOOST_ASIO_NO_DEPRECATED)
513 double d26
= socket1
.async_receive_from(buffer(mutable_char_buffer
),
516 double d27
= socket1
.async_receive_from(null_buffers(),
519 double d28
= socket1
.async_receive_from(buffer(mutable_char_buffer
),
520 endpoint
, in_flags
, dlazy
);
522 double d29
= socket1
.async_receive_from(null_buffers(),
523 endpoint
, in_flags
, dlazy
);
525 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
527 catch (std::exception
&)
532 } // namespace ip_udp_socket_compile
534 //------------------------------------------------------------------------------
536 // ip_udp_socket_runtime test
537 // ~~~~~~~~~~~~~~~~~~~~~~~~~~
538 // The following test checks the runtime operation of the ip::udp::socket class.
540 namespace ip_udp_socket_runtime
{
542 void handle_send(size_t expected_bytes_sent
,
543 const boost::system::error_code
& err
, size_t bytes_sent
)
545 BOOST_ASIO_CHECK(!err
);
546 BOOST_ASIO_CHECK(expected_bytes_sent
== bytes_sent
);
549 void handle_recv(size_t expected_bytes_recvd
,
550 const boost::system::error_code
& err
, size_t bytes_recvd
)
552 BOOST_ASIO_CHECK(!err
);
553 BOOST_ASIO_CHECK(expected_bytes_recvd
== bytes_recvd
);
558 using namespace std
; // For memcmp and memset.
559 using namespace boost::asio
;
560 namespace ip
= boost::asio::ip
;
562 #if defined(BOOST_ASIO_HAS_BOOST_BIND)
563 namespace bindns
= boost
;
564 #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
565 namespace bindns
= std
;
566 using std::placeholders::_1
;
567 using std::placeholders::_2
;
568 #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
572 ip::udp::socket
s1(ioc
, ip::udp::endpoint(ip::udp::v4(), 0));
573 ip::udp::endpoint target_endpoint
= s1
.local_endpoint();
574 target_endpoint
.address(ip::address_v4::loopback());
576 ip::udp::socket
s2(ioc
);
577 s2
.open(ip::udp::v4());
578 s2
.bind(ip::udp::endpoint(ip::udp::v4(), 0));
579 char send_msg
[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
580 s2
.send_to(buffer(send_msg
, sizeof(send_msg
)), target_endpoint
);
582 char recv_msg
[sizeof(send_msg
)];
583 ip::udp::endpoint sender_endpoint
;
584 size_t bytes_recvd
= s1
.receive_from(buffer(recv_msg
, sizeof(recv_msg
)),
587 BOOST_ASIO_CHECK(bytes_recvd
== sizeof(send_msg
));
588 BOOST_ASIO_CHECK(memcmp(send_msg
, recv_msg
, sizeof(send_msg
)) == 0);
590 memset(recv_msg
, 0, sizeof(recv_msg
));
592 target_endpoint
= sender_endpoint
;
593 s1
.async_send_to(buffer(send_msg
, sizeof(send_msg
)), target_endpoint
,
594 bindns::bind(handle_send
, sizeof(send_msg
), _1
, _2
));
595 s2
.async_receive_from(buffer(recv_msg
, sizeof(recv_msg
)), sender_endpoint
,
596 bindns::bind(handle_recv
, sizeof(recv_msg
), _1
, _2
));
600 BOOST_ASIO_CHECK(memcmp(send_msg
, recv_msg
, sizeof(send_msg
)) == 0);
603 } // namespace ip_udp_socket_runtime
605 //------------------------------------------------------------------------------
607 // ip_udp_resolver_compile test
608 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
609 // The following test checks that all public member functions on the class
610 // ip::udp::resolver compile and link correctly. Runtime failures are ignored.
612 namespace ip_udp_resolver_compile
{
614 struct resolve_handler
617 void operator()(const boost::system::error_code
&,
618 boost::asio::ip::udp::resolver::results_type
) {}
619 #if defined(BOOST_ASIO_HAS_MOVE)
620 resolve_handler(resolve_handler
&&) {}
622 resolve_handler(const resolve_handler
&);
623 #endif // defined(BOOST_ASIO_HAS_MOVE)
628 using namespace boost::asio
;
629 namespace ip
= boost::asio::ip
;
634 archetypes::lazy_handler lazy
;
635 #if !defined(BOOST_ASIO_NO_DEPRECATED)
636 archetypes::deprecated_lazy_handler dlazy
;
637 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
638 boost::system::error_code ec
;
639 #if !defined(BOOST_ASIO_NO_DEPRECATED)
640 ip::udp::resolver::query
q(ip::udp::v4(), "localhost", "0");
641 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
642 ip::udp::endpoint
e(ip::address_v4::loopback(), 0);
644 // basic_resolver constructors.
646 ip::udp::resolver
resolver(ioc
);
648 #if defined(BOOST_ASIO_HAS_MOVE)
649 ip::udp::resolver
resolver2(std::move(resolver
));
650 #endif // defined(BOOST_ASIO_HAS_MOVE)
652 // basic_resolver operators.
654 #if defined(BOOST_ASIO_HAS_MOVE)
655 resolver
= ip::udp::resolver(ioc
);
656 resolver
= std::move(resolver2
);
657 #endif // defined(BOOST_ASIO_HAS_MOVE)
659 // basic_io_object functions.
661 #if !defined(BOOST_ASIO_NO_DEPRECATED)
662 io_context
& ioc_ref
= resolver
.get_io_context();
664 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
666 ip::udp::resolver::executor_type ex
= resolver
.get_executor();
669 // basic_resolver functions.
673 #if !defined(BOOST_ASIO_NO_DEPRECATED)
674 ip::udp::resolver::results_type results1
= resolver
.resolve(q
);
677 ip::udp::resolver::results_type results2
= resolver
.resolve(q
, ec
);
679 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
681 ip::udp::resolver::results_type results3
= resolver
.resolve("", "");
684 ip::udp::resolver::results_type results4
= resolver
.resolve("", "", ec
);
687 ip::udp::resolver::results_type results5
=
688 resolver
.resolve("", "", ip::udp::resolver::flags());
691 ip::udp::resolver::results_type results6
=
692 resolver
.resolve("", "", ip::udp::resolver::flags(), ec
);
695 ip::udp::resolver::results_type results7
=
696 resolver
.resolve(ip::udp::v4(), "", "");
699 ip::udp::resolver::results_type results8
=
700 resolver
.resolve(ip::udp::v4(), "", "", ec
);
703 ip::udp::resolver::results_type results9
=
704 resolver
.resolve(ip::udp::v4(), "", "", ip::udp::resolver::flags());
707 ip::udp::resolver::results_type results10
=
708 resolver
.resolve(ip::udp::v4(), "", "", ip::udp::resolver::flags(), ec
);
711 ip::udp::resolver::results_type results11
= resolver
.resolve(e
);
714 ip::udp::resolver::results_type results12
= resolver
.resolve(e
, ec
);
717 #if !defined(BOOST_ASIO_NO_DEPRECATED)
718 resolver
.async_resolve(q
, resolve_handler());
719 int i1
= resolver
.async_resolve(q
, lazy
);
721 double d1
= resolver
.async_resolve(q
, dlazy
);
723 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
725 resolver
.async_resolve("", "", resolve_handler());
726 int i2
= resolver
.async_resolve("", "", lazy
);
728 #if !defined(BOOST_ASIO_NO_DEPRECATED)
729 double d2
= resolver
.async_resolve("", "", dlazy
);
731 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
733 resolver
.async_resolve("", "",
734 ip::udp::resolver::flags(), resolve_handler());
735 int i3
= resolver
.async_resolve("", "",
736 ip::udp::resolver::flags(), lazy
);
738 #if !defined(BOOST_ASIO_NO_DEPRECATED)
739 double d3
= resolver
.async_resolve("", "",
740 ip::udp::resolver::flags(), dlazy
);
742 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
744 resolver
.async_resolve(ip::udp::v4(), "", "", resolve_handler());
745 int i4
= resolver
.async_resolve(ip::udp::v4(), "", "", lazy
);
747 #if !defined(BOOST_ASIO_NO_DEPRECATED)
748 double d4
= resolver
.async_resolve(ip::udp::v4(), "", "", dlazy
);
750 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
752 resolver
.async_resolve(ip::udp::v4(),
753 "", "", ip::udp::resolver::flags(), resolve_handler());
754 int i5
= resolver
.async_resolve(ip::udp::v4(),
755 "", "", ip::udp::resolver::flags(), lazy
);
757 #if !defined(BOOST_ASIO_NO_DEPRECATED)
758 double d5
= resolver
.async_resolve(ip::udp::v4(),
759 "", "", ip::udp::resolver::flags(), dlazy
);
761 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
763 resolver
.async_resolve(e
, resolve_handler());
764 int i6
= resolver
.async_resolve(e
, lazy
);
766 #if !defined(BOOST_ASIO_NO_DEPRECATED)
767 double d6
= resolver
.async_resolve(e
, dlazy
);
769 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
771 catch (std::exception
&)
776 } // namespace ip_udp_resolver_compile
778 //------------------------------------------------------------------------------
780 BOOST_ASIO_TEST_SUITE
783 BOOST_ASIO_TEST_CASE(ip_udp_socket_compile::test
)
784 BOOST_ASIO_TEST_CASE(ip_udp_socket_runtime::test
)
785 BOOST_ASIO_TEST_CASE(ip_udp_resolver_compile::test
)