1//
2// udp.cpp
3// ~~~~~~~
4//
5// Copyright (c) 2003-2015 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
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)
15
16// Test that header file is self-contained.
17#include <boost/asio/ip/udp.hpp>
18
19#include <cstring>
20#include <boost/asio/io_service.hpp>
21#include "../unit_test.hpp"
22#include "../archetypes/gettable_socket_option.hpp"
23#include "../archetypes/async_result.hpp"
24#include "../archetypes/io_control_command.hpp"
25#include "../archetypes/settable_socket_option.hpp"
26
27#if defined(BOOST_ASIO_HAS_BOOST_BIND)
28# include <boost/bind.hpp>
29#else // defined(BOOST_ASIO_HAS_BOOST_BIND)
30# include <functional>
31#endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
32
33//------------------------------------------------------------------------------
34
35// ip_udp_socket_compile test
36// ~~~~~~~~~~~~~~~~~~~~~~~~~~
37// The following test checks that all public member functions on the class
38// ip::udp::socket compile and link correctly. Runtime failures are ignored.
39
40namespace ip_udp_socket_compile {
41
42void connect_handler(const boost::system::error_code&)
43{
44}
45
46void send_handler(const boost::system::error_code&, std::size_t)
47{
48}
49
50void receive_handler(const boost::system::error_code&, std::size_t)
51{
52}
53
54void test()
55{
56 using namespace boost::asio;
57 namespace ip = boost::asio::ip;
58
59 try
60 {
61 io_service ios;
62 char mutable_char_buffer[128] = "";
63 const char const_char_buffer[128] = "";
64 socket_base::message_flags in_flags = 0;
65 archetypes::settable_socket_option<void> settable_socket_option1;
66 archetypes::settable_socket_option<int> settable_socket_option2;
67 archetypes::settable_socket_option<double> settable_socket_option3;
68 archetypes::gettable_socket_option<void> gettable_socket_option1;
69 archetypes::gettable_socket_option<int> gettable_socket_option2;
70 archetypes::gettable_socket_option<double> gettable_socket_option3;
71 archetypes::io_control_command io_control_command;
72 archetypes::lazy_handler lazy;
73 boost::system::error_code ec;
74
75 // basic_datagram_socket constructors.
76
77 ip::udp::socket socket1(ios);
78 ip::udp::socket socket2(ios, ip::udp::v4());
79 ip::udp::socket socket3(ios, ip::udp::v6());
80 ip::udp::socket socket4(ios, ip::udp::endpoint(ip::udp::v4(), 0));
81 ip::udp::socket socket5(ios, ip::udp::endpoint(ip::udp::v6(), 0));
82#if !defined(BOOST_ASIO_WINDOWS_RUNTIME)
83 ip::udp::socket::native_handle_type native_socket1
84 = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
85 ip::udp::socket socket6(ios, ip::udp::v4(), native_socket1);
86#endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME)
87
88#if defined(BOOST_ASIO_HAS_MOVE)
89 ip::udp::socket socket7(std::move(socket6));
90#endif // defined(BOOST_ASIO_HAS_MOVE)
91
92 // basic_datagram_socket operators.
93
94#if defined(BOOST_ASIO_HAS_MOVE)
95 socket1 = ip::udp::socket(ios);
96 socket1 = std::move(socket2);
97#endif // defined(BOOST_ASIO_HAS_MOVE)
98
99 // basic_io_object functions.
100
101 io_service& ios_ref = socket1.get_io_service();
102 (void)ios_ref;
103
104 // basic_socket functions.
105
106 ip::udp::socket::lowest_layer_type& lowest_layer = socket1.lowest_layer();
107 (void)lowest_layer;
108
109 const ip::udp::socket& socket8 = socket1;
110 const ip::udp::socket::lowest_layer_type& lowest_layer2
111 = socket8.lowest_layer();
112 (void)lowest_layer2;
113
114 socket1.open(protocol: ip::udp::v4());
115 socket1.open(protocol: ip::udp::v6());
116 socket1.open(protocol: ip::udp::v4(), ec);
117 socket1.open(protocol: ip::udp::v6(), ec);
118
119#if !defined(BOOST_ASIO_WINDOWS_RUNTIME)
120 ip::udp::socket::native_handle_type native_socket2
121 = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
122 socket1.assign(protocol: ip::udp::v4(), native_socket: native_socket2);
123 ip::udp::socket::native_handle_type native_socket3
124 = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
125 socket1.assign(protocol: ip::udp::v4(), native_socket: native_socket3, ec);
126#endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME)
127
128 bool is_open = socket1.is_open();
129 (void)is_open;
130
131 socket1.close();
132 socket1.close(ec);
133
134 ip::udp::socket::native_type native_socket4 = socket1.native();
135 (void)native_socket4;
136
137 ip::udp::socket::native_handle_type native_socket5
138 = socket1.native_handle();
139 (void)native_socket5;
140
141 socket1.cancel();
142 socket1.cancel(ec);
143
144 bool at_mark1 = socket1.at_mark();
145 (void)at_mark1;
146 bool at_mark2 = socket1.at_mark(ec);
147 (void)at_mark2;
148
149 std::size_t available1 = socket1.available();
150 (void)available1;
151 std::size_t available2 = socket1.available(ec);
152 (void)available2;
153
154 socket1.bind(endpoint: ip::udp::endpoint(ip::udp::v4(), 0));
155 socket1.bind(endpoint: ip::udp::endpoint(ip::udp::v6(), 0));
156 socket1.bind(endpoint: ip::udp::endpoint(ip::udp::v4(), 0), ec);
157 socket1.bind(endpoint: ip::udp::endpoint(ip::udp::v6(), 0), ec);
158
159 socket1.connect(peer_endpoint: ip::udp::endpoint(ip::udp::v4(), 0));
160 socket1.connect(peer_endpoint: ip::udp::endpoint(ip::udp::v6(), 0));
161 socket1.connect(peer_endpoint: ip::udp::endpoint(ip::udp::v4(), 0), ec);
162 socket1.connect(peer_endpoint: ip::udp::endpoint(ip::udp::v6(), 0), ec);
163
164 socket1.async_connect(peer_endpoint: ip::udp::endpoint(ip::udp::v4(), 0),
165 handler: &connect_handler);
166 socket1.async_connect(peer_endpoint: ip::udp::endpoint(ip::udp::v6(), 0),
167 handler: &connect_handler);
168 int i1 = socket1.async_connect(peer_endpoint: ip::udp::endpoint(ip::udp::v4(), 0), handler&: lazy);
169 (void)i1;
170 int i2 = socket1.async_connect(peer_endpoint: ip::udp::endpoint(ip::udp::v6(), 0), handler&: lazy);
171 (void)i2;
172
173 socket1.set_option(settable_socket_option1);
174 socket1.set_option(option: settable_socket_option1, ec);
175 socket1.set_option(settable_socket_option2);
176 socket1.set_option(option: settable_socket_option2, ec);
177 socket1.set_option(settable_socket_option3);
178 socket1.set_option(option: settable_socket_option3, ec);
179
180 socket1.get_option(option&: gettable_socket_option1);
181 socket1.get_option(option&: gettable_socket_option1, ec);
182 socket1.get_option(option&: gettable_socket_option2);
183 socket1.get_option(option&: gettable_socket_option2, ec);
184 socket1.get_option(option&: gettable_socket_option3);
185 socket1.get_option(option&: gettable_socket_option3, ec);
186
187 socket1.io_control(command&: io_control_command);
188 socket1.io_control(command&: io_control_command, ec);
189
190 bool non_blocking1 = socket1.non_blocking();
191 (void)non_blocking1;
192 socket1.non_blocking(mode: true);
193 socket1.non_blocking(mode: false, ec);
194
195 bool non_blocking2 = socket1.native_non_blocking();
196 (void)non_blocking2;
197 socket1.native_non_blocking(mode: true);
198 socket1.native_non_blocking(mode: false, ec);
199
200 ip::udp::endpoint endpoint1 = socket1.local_endpoint();
201 ip::udp::endpoint endpoint2 = socket1.local_endpoint(ec);
202
203 ip::udp::endpoint endpoint3 = socket1.remote_endpoint();
204 ip::udp::endpoint endpoint4 = socket1.remote_endpoint(ec);
205
206 socket1.shutdown(what: socket_base::shutdown_both);
207 socket1.shutdown(what: socket_base::shutdown_both, ec);
208
209 // basic_datagram_socket functions.
210
211 socket1.send(buffers: buffer(data&: mutable_char_buffer));
212 socket1.send(buffers: buffer(data: const_char_buffer));
213 socket1.send(buffers: null_buffers());
214 socket1.send(buffers: buffer(data&: mutable_char_buffer), flags: in_flags);
215 socket1.send(buffers: buffer(data: const_char_buffer), flags: in_flags);
216 socket1.send(buffers: null_buffers(), flags: in_flags);
217 socket1.send(buffers: buffer(data&: mutable_char_buffer), flags: in_flags, ec);
218 socket1.send(buffers: buffer(data: const_char_buffer), flags: in_flags, ec);
219 socket1.send(buffers: null_buffers(), flags: in_flags, ec);
220
221 socket1.async_send(buffers: buffer(data&: mutable_char_buffer), handler: &send_handler);
222 socket1.async_send(buffers: buffer(data: const_char_buffer), handler: &send_handler);
223 socket1.async_send(buffers: null_buffers(), handler: &send_handler);
224 socket1.async_send(buffers: buffer(data&: mutable_char_buffer), flags: in_flags, handler: &send_handler);
225 socket1.async_send(buffers: buffer(data: const_char_buffer), flags: in_flags, handler: &send_handler);
226 socket1.async_send(buffers: null_buffers(), flags: in_flags, handler: &send_handler);
227 int i3 = socket1.async_send(buffers: buffer(data&: mutable_char_buffer), handler&: lazy);
228 (void)i3;
229 int i4 = socket1.async_send(buffers: buffer(data: const_char_buffer), handler&: lazy);
230 (void)i4;
231 int i5 = socket1.async_send(buffers: null_buffers(), handler&: lazy);
232 (void)i5;
233 int i6 = socket1.async_send(buffers: buffer(data&: mutable_char_buffer), flags: in_flags, handler&: lazy);
234 (void)i6;
235 int i7 = socket1.async_send(buffers: buffer(data: const_char_buffer), flags: in_flags, handler&: lazy);
236 (void)i7;
237 int i8 = socket1.async_send(buffers: null_buffers(), flags: in_flags, handler&: lazy);
238 (void)i8;
239
240 socket1.send_to(buffers: buffer(data&: mutable_char_buffer),
241 destination: ip::udp::endpoint(ip::udp::v4(), 0));
242 socket1.send_to(buffers: buffer(data&: mutable_char_buffer),
243 destination: ip::udp::endpoint(ip::udp::v6(), 0));
244 socket1.send_to(buffers: buffer(data: const_char_buffer),
245 destination: ip::udp::endpoint(ip::udp::v4(), 0));
246 socket1.send_to(buffers: buffer(data: const_char_buffer),
247 destination: ip::udp::endpoint(ip::udp::v6(), 0));
248 socket1.send_to(buffers: null_buffers(),
249 destination: ip::udp::endpoint(ip::udp::v4(), 0));
250 socket1.send_to(buffers: null_buffers(),
251 destination: ip::udp::endpoint(ip::udp::v6(), 0));
252 socket1.send_to(buffers: buffer(data&: mutable_char_buffer),
253 destination: ip::udp::endpoint(ip::udp::v4(), 0), flags: in_flags);
254 socket1.send_to(buffers: buffer(data&: mutable_char_buffer),
255 destination: ip::udp::endpoint(ip::udp::v6(), 0), flags: in_flags);
256 socket1.send_to(buffers: buffer(data: const_char_buffer),
257 destination: ip::udp::endpoint(ip::udp::v4(), 0), flags: in_flags);
258 socket1.send_to(buffers: buffer(data: const_char_buffer),
259 destination: ip::udp::endpoint(ip::udp::v6(), 0), flags: in_flags);
260 socket1.send_to(buffers: null_buffers(),
261 destination: ip::udp::endpoint(ip::udp::v4(), 0), flags: in_flags);
262 socket1.send_to(buffers: null_buffers(),
263 destination: ip::udp::endpoint(ip::udp::v6(), 0), flags: in_flags);
264 socket1.send_to(buffers: buffer(data&: mutable_char_buffer),
265 destination: ip::udp::endpoint(ip::udp::v4(), 0), flags: in_flags, ec);
266 socket1.send_to(buffers: buffer(data&: mutable_char_buffer),
267 destination: ip::udp::endpoint(ip::udp::v6(), 0), flags: in_flags, ec);
268 socket1.send_to(buffers: buffer(data: const_char_buffer),
269 destination: ip::udp::endpoint(ip::udp::v4(), 0), flags: in_flags, ec);
270 socket1.send_to(buffers: buffer(data: const_char_buffer),
271 destination: ip::udp::endpoint(ip::udp::v6(), 0), flags: in_flags, ec);
272 socket1.send_to(buffers: null_buffers(),
273 destination: ip::udp::endpoint(ip::udp::v4(), 0), flags: in_flags, ec);
274 socket1.send_to(buffers: null_buffers(),
275 destination: ip::udp::endpoint(ip::udp::v6(), 0), flags: in_flags, ec);
276
277 socket1.async_send_to(buffers: buffer(data&: mutable_char_buffer),
278 destination: ip::udp::endpoint(ip::udp::v4(), 0), handler: &send_handler);
279 socket1.async_send_to(buffers: buffer(data&: mutable_char_buffer),
280 destination: ip::udp::endpoint(ip::udp::v6(), 0), handler: &send_handler);
281 socket1.async_send_to(buffers: buffer(data: const_char_buffer),
282 destination: ip::udp::endpoint(ip::udp::v4(), 0), handler: &send_handler);
283 socket1.async_send_to(buffers: buffer(data: const_char_buffer),
284 destination: ip::udp::endpoint(ip::udp::v6(), 0), handler: &send_handler);
285 socket1.async_send_to(buffers: null_buffers(),
286 destination: ip::udp::endpoint(ip::udp::v4(), 0), handler: &send_handler);
287 socket1.async_send_to(buffers: null_buffers(),
288 destination: ip::udp::endpoint(ip::udp::v6(), 0), handler: &send_handler);
289 socket1.async_send_to(buffers: buffer(data&: mutable_char_buffer),
290 destination: ip::udp::endpoint(ip::udp::v4(), 0), flags: in_flags, handler: &send_handler);
291 socket1.async_send_to(buffers: buffer(data&: mutable_char_buffer),
292 destination: ip::udp::endpoint(ip::udp::v6(), 0), flags: in_flags, handler: &send_handler);
293 socket1.async_send_to(buffers: buffer(data: const_char_buffer),
294 destination: ip::udp::endpoint(ip::udp::v4(), 0), flags: in_flags, handler: &send_handler);
295 socket1.async_send_to(buffers: buffer(data: const_char_buffer),
296 destination: ip::udp::endpoint(ip::udp::v6(), 0), flags: in_flags, handler: &send_handler);
297 socket1.async_send_to(buffers: null_buffers(),
298 destination: ip::udp::endpoint(ip::udp::v4(), 0), flags: in_flags, handler: &send_handler);
299 socket1.async_send_to(buffers: null_buffers(),
300 destination: ip::udp::endpoint(ip::udp::v6(), 0), flags: in_flags, handler: &send_handler);
301 int i9 = socket1.async_send_to(buffers: buffer(data&: mutable_char_buffer),
302 destination: ip::udp::endpoint(ip::udp::v4(), 0), handler&: lazy);
303 (void)i9;
304 int i10 = socket1.async_send_to(buffers: buffer(data&: mutable_char_buffer),
305 destination: ip::udp::endpoint(ip::udp::v6(), 0), handler&: lazy);
306 (void)i10;
307 int i11 = socket1.async_send_to(buffers: buffer(data: const_char_buffer),
308 destination: ip::udp::endpoint(ip::udp::v4(), 0), handler&: lazy);
309 (void)i11;
310 int i12 = socket1.async_send_to(buffers: buffer(data: const_char_buffer),
311 destination: ip::udp::endpoint(ip::udp::v6(), 0), handler&: lazy);
312 (void)i12;
313 int i13 = socket1.async_send_to(buffers: null_buffers(),
314 destination: ip::udp::endpoint(ip::udp::v4(), 0), handler&: lazy);
315 (void)i13;
316 int i14 = socket1.async_send_to(buffers: null_buffers(),
317 destination: ip::udp::endpoint(ip::udp::v6(), 0), handler&: lazy);
318 (void)i14;
319 int i15 = socket1.async_send_to(buffers: buffer(data&: mutable_char_buffer),
320 destination: ip::udp::endpoint(ip::udp::v4(), 0), flags: in_flags, handler&: lazy);
321 (void)i15;
322 int i16 = socket1.async_send_to(buffers: buffer(data&: mutable_char_buffer),
323 destination: ip::udp::endpoint(ip::udp::v6(), 0), flags: in_flags, handler&: lazy);
324 (void)i16;
325 int i17 = socket1.async_send_to(buffers: buffer(data: const_char_buffer),
326 destination: ip::udp::endpoint(ip::udp::v4(), 0), flags: in_flags, handler&: lazy);
327 (void)i17;
328 int i18 = socket1.async_send_to(buffers: buffer(data: const_char_buffer),
329 destination: ip::udp::endpoint(ip::udp::v6(), 0), flags: in_flags, handler&: lazy);
330 (void)i18;
331 int i19 = socket1.async_send_to(buffers: null_buffers(),
332 destination: ip::udp::endpoint(ip::udp::v4(), 0), flags: in_flags, handler&: lazy);
333 (void)i19;
334 int i20 = socket1.async_send_to(buffers: null_buffers(),
335 destination: ip::udp::endpoint(ip::udp::v6(), 0), flags: in_flags, handler&: lazy);
336 (void)i20;
337
338 socket1.receive(buffers: buffer(data&: mutable_char_buffer));
339 socket1.receive(buffers: null_buffers());
340 socket1.receive(buffers: buffer(data&: mutable_char_buffer), flags: in_flags);
341 socket1.receive(buffers: null_buffers(), flags: in_flags);
342 socket1.receive(buffers: buffer(data&: mutable_char_buffer), flags: in_flags, ec);
343 socket1.receive(buffers: null_buffers(), flags: in_flags, ec);
344
345 socket1.async_receive(buffers: buffer(data&: mutable_char_buffer), handler: &receive_handler);
346 socket1.async_receive(buffers: null_buffers(), handler: &receive_handler);
347 socket1.async_receive(buffers: buffer(data&: mutable_char_buffer), flags: in_flags,
348 handler: &receive_handler);
349 socket1.async_receive(buffers: null_buffers(), flags: in_flags, handler: &receive_handler);
350 int i21 = socket1.async_receive(buffers: buffer(data&: mutable_char_buffer), handler&: lazy);
351 (void)i21;
352 int i22 = socket1.async_receive(buffers: null_buffers(), handler&: lazy);
353 (void)i22;
354 int i23 = socket1.async_receive(buffers: buffer(data&: mutable_char_buffer),
355 flags: in_flags, handler&: lazy);
356 (void)i23;
357 int i24 = socket1.async_receive(buffers: null_buffers(), flags: in_flags, handler&: lazy);
358 (void)i24;
359
360 ip::udp::endpoint endpoint;
361 socket1.receive_from(buffers: buffer(data&: mutable_char_buffer), sender_endpoint&: endpoint);
362 socket1.receive_from(buffers: null_buffers(), sender_endpoint&: endpoint);
363 socket1.receive_from(buffers: buffer(data&: mutable_char_buffer), sender_endpoint&: endpoint, flags: in_flags);
364 socket1.receive_from(buffers: null_buffers(), sender_endpoint&: endpoint, flags: in_flags);
365 socket1.receive_from(buffers: buffer(data&: mutable_char_buffer), sender_endpoint&: endpoint, flags: in_flags, ec);
366 socket1.receive_from(buffers: null_buffers(), sender_endpoint&: endpoint, flags: in_flags, ec);
367
368 socket1.async_receive_from(buffers: buffer(data&: mutable_char_buffer),
369 sender_endpoint&: endpoint, handler: &receive_handler);
370 socket1.async_receive_from(buffers: null_buffers(),
371 sender_endpoint&: endpoint, handler: &receive_handler);
372 socket1.async_receive_from(buffers: buffer(data&: mutable_char_buffer),
373 sender_endpoint&: endpoint, flags: in_flags, handler: &receive_handler);
374 socket1.async_receive_from(buffers: null_buffers(),
375 sender_endpoint&: endpoint, flags: in_flags, handler: &receive_handler);
376 int i25 = socket1.async_receive_from(buffers: buffer(data&: mutable_char_buffer),
377 sender_endpoint&: endpoint, handler&: lazy);
378 (void)i25;
379 int i26 = socket1.async_receive_from(buffers: null_buffers(),
380 sender_endpoint&: endpoint, handler&: lazy);
381 (void)i26;
382 int i27 = socket1.async_receive_from(buffers: buffer(data&: mutable_char_buffer),
383 sender_endpoint&: endpoint, flags: in_flags, handler&: lazy);
384 (void)i27;
385 int i28 = socket1.async_receive_from(buffers: null_buffers(),
386 sender_endpoint&: endpoint, flags: in_flags, handler&: lazy);
387 (void)i28;
388 }
389 catch (std::exception&)
390 {
391 }
392}
393
394} // namespace ip_udp_socket_compile
395
396//------------------------------------------------------------------------------
397
398// ip_udp_socket_runtime test
399// ~~~~~~~~~~~~~~~~~~~~~~~~~~
400// The following test checks the runtime operation of the ip::udp::socket class.
401
402namespace ip_udp_socket_runtime {
403
404void handle_send(size_t expected_bytes_sent,
405 const boost::system::error_code& err, size_t bytes_sent)
406{
407 BOOST_ASIO_CHECK(!err);
408 BOOST_ASIO_CHECK(expected_bytes_sent == bytes_sent);
409}
410
411void handle_recv(size_t expected_bytes_recvd,
412 const boost::system::error_code& err, size_t bytes_recvd)
413{
414 BOOST_ASIO_CHECK(!err);
415 BOOST_ASIO_CHECK(expected_bytes_recvd == bytes_recvd);
416}
417
418void test()
419{
420 using namespace std; // For memcmp and memset.
421 using namespace boost::asio;
422 namespace ip = boost::asio::ip;
423
424#if defined(BOOST_ASIO_HAS_BOOST_BIND)
425 namespace bindns = boost;
426#else // defined(BOOST_ASIO_HAS_BOOST_BIND)
427 namespace bindns = std;
428 using std::placeholders::_1;
429 using std::placeholders::_2;
430#endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
431
432 io_service ios;
433
434 ip::udp::socket s1(ios, ip::udp::endpoint(ip::udp::v4(), 0));
435 ip::udp::endpoint target_endpoint = s1.local_endpoint();
436 target_endpoint.address(addr: ip::address_v4::loopback());
437
438 ip::udp::socket s2(ios);
439 s2.open(protocol: ip::udp::v4());
440 s2.bind(endpoint: ip::udp::endpoint(ip::udp::v4(), 0));
441 char send_msg[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
442 s2.send_to(buffers: buffer(data&: send_msg, max_size_in_bytes: sizeof(send_msg)), destination: target_endpoint);
443
444 char recv_msg[sizeof(send_msg)];
445 ip::udp::endpoint sender_endpoint;
446 size_t bytes_recvd = s1.receive_from(buffers: buffer(data&: recv_msg, max_size_in_bytes: sizeof(recv_msg)),
447 sender_endpoint);
448
449 BOOST_ASIO_CHECK(bytes_recvd == sizeof(send_msg));
450 BOOST_ASIO_CHECK(memcmp(send_msg, recv_msg, sizeof(send_msg)) == 0);
451
452 memset(s: recv_msg, c: 0, n: sizeof(recv_msg));
453
454 target_endpoint = sender_endpoint;
455 s1.async_send_to(buffers: buffer(data&: send_msg, max_size_in_bytes: sizeof(send_msg)), destination: target_endpoint,
456 handler: bindns::bind(f: handle_send, a1: sizeof(send_msg), a2: _1, a3: _2));
457 s2.async_receive_from(buffers: buffer(data&: recv_msg, max_size_in_bytes: sizeof(recv_msg)), sender_endpoint,
458 handler: bindns::bind(f: handle_recv, a1: sizeof(recv_msg), a2: _1, a3: _2));
459
460 ios.run();
461
462 BOOST_ASIO_CHECK(memcmp(send_msg, recv_msg, sizeof(send_msg)) == 0);
463}
464
465} // namespace ip_udp_socket_runtime
466
467//------------------------------------------------------------------------------
468
469// ip_udp_resolver_compile test
470// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
471// The following test checks that all public member functions on the class
472// ip::udp::resolver compile and link correctly. Runtime failures are ignored.
473
474namespace ip_udp_resolver_compile {
475
476void resolve_handler(const boost::system::error_code&,
477 boost::asio::ip::udp::resolver::iterator)
478{
479}
480
481void test()
482{
483 using namespace boost::asio;
484 namespace ip = boost::asio::ip;
485
486 try
487 {
488 io_service ios;
489 archetypes::lazy_handler lazy;
490 boost::system::error_code ec;
491 ip::udp::resolver::query q(ip::udp::v4(), "localhost", "0");
492 ip::udp::endpoint e(ip::address_v4::loopback(), 0);
493
494 // basic_resolver constructors.
495
496 ip::udp::resolver resolver(ios);
497
498 // basic_io_object functions.
499
500 io_service& ios_ref = resolver.get_io_service();
501 (void)ios_ref;
502
503 // basic_resolver functions.
504
505 resolver.cancel();
506
507 ip::udp::resolver::iterator iter1 = resolver.resolve(q);
508 (void)iter1;
509
510 ip::udp::resolver::iterator iter2 = resolver.resolve(q, ec);
511 (void)iter2;
512
513 ip::udp::resolver::iterator iter3 = resolver.resolve(e);
514 (void)iter3;
515
516 ip::udp::resolver::iterator iter4 = resolver.resolve(e, ec);
517 (void)iter4;
518
519 resolver.async_resolve(q, handler: &resolve_handler);
520 int i1 = resolver.async_resolve(q, handler&: lazy);
521 (void)i1;
522
523 resolver.async_resolve(e, handler: &resolve_handler);
524 int i2 = resolver.async_resolve(e, handler&: lazy);
525 (void)i2;
526 }
527 catch (std::exception&)
528 {
529 }
530}
531
532} // namespace ip_udp_resolver_compile
533
534//------------------------------------------------------------------------------
535
536BOOST_ASIO_TEST_SUITE
537(
538 "ip/udp",
539 BOOST_ASIO_TEST_CASE(ip_udp_socket_compile::test)
540 BOOST_ASIO_TEST_CASE(ip_udp_socket_runtime::test)
541 BOOST_ASIO_TEST_CASE(ip_udp_resolver_compile::test)
542)
543

source code of boost/libs/asio/test/ip/udp.cpp