2 // generic/raw_protocol.cpp
3 // ~~~~~~~~~~~~~~~~~~~~~~~~
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/generic/raw_protocol.hpp>
20 #include <boost/asio/io_context.hpp>
21 #include <boost/asio/ip/icmp.hpp>
22 #include "../unit_test.hpp"
24 #if defined(__cplusplus_cli) || defined(__cplusplus_winrt)
25 # define generic cpp_generic
28 //------------------------------------------------------------------------------
30 // generic_raw_protocol_socket_compile test
31 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
32 // The following test checks that all public member functions on the class
33 // generic::raw_socket::socket compile and link correctly. Runtime failures
36 namespace generic_raw_protocol_socket_compile
{
38 void connect_handler(const boost::system::error_code
&)
42 void send_handler(const boost::system::error_code
&, std::size_t)
46 void receive_handler(const boost::system::error_code
&, std::size_t)
52 using namespace boost::asio
;
53 namespace generic
= boost::asio::generic
;
54 typedef generic::raw_protocol rp
;
56 const int af_inet
= BOOST_ASIO_OS_DEF(AF_INET
);
57 const int ipproto_icmp
= BOOST_ASIO_OS_DEF(IPPROTO_ICMP
);
58 const int sock_raw
= BOOST_ASIO_OS_DEF(SOCK_RAW
);
63 char mutable_char_buffer
[128] = "";
64 const char const_char_buffer
[128] = "";
65 socket_base::message_flags in_flags
= 0;
66 socket_base::send_buffer_size socket_option
;
67 socket_base::bytes_readable io_control_command
;
68 boost::system::error_code ec
;
70 // basic_raw_socket constructors.
72 rp::socket
socket1(ioc
);
73 rp::socket
socket2(ioc
, rp(af_inet
, ipproto_icmp
));
74 rp::socket
socket3(ioc
, rp::endpoint());
75 #if !defined(BOOST_ASIO_WINDOWS_RUNTIME)
76 rp::socket::native_handle_type native_socket1
77 = ::socket(af_inet
, sock_raw
, 0);
78 rp::socket
socket4(ioc
, rp(af_inet
, ipproto_icmp
), native_socket1
);
79 #endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME)
81 #if defined(BOOST_ASIO_HAS_MOVE)
82 rp::socket
socket5(std::move(socket4
));
83 boost::asio::ip::icmp::socket
icmp_socket(ioc
);
84 rp::socket
socket6(std::move(icmp_socket
));
85 #endif // defined(BOOST_ASIO_HAS_MOVE)
87 // basic_datagram_socket operators.
89 #if defined(BOOST_ASIO_HAS_MOVE)
90 socket1
= rp::socket(ioc
);
91 socket1
= std::move(socket2
);
92 socket1
= boost::asio::ip::icmp::socket(ioc
);
93 #endif // defined(BOOST_ASIO_HAS_MOVE)
95 // basic_io_object functions.
97 rp::socket::executor_type ex
= socket1
.get_executor();
100 #if !defined(BOOST_ASIO_NO_DEPRECATED)
101 io_context
& ioc_ref
= socket1
.get_io_context();
104 io_context
& ioc_ref2
= socket1
.get_io_service();
106 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
108 // basic_socket functions.
110 rp::socket::lowest_layer_type
& lowest_layer
= socket1
.lowest_layer();
113 socket1
.open(rp(af_inet
, ipproto_icmp
));
114 socket1
.open(rp(af_inet
, ipproto_icmp
), ec
);
116 #if !defined(BOOST_ASIO_WINDOWS_RUNTIME)
117 rp::socket::native_handle_type native_socket2
118 = ::socket(af_inet
, sock_raw
, 0);
119 socket1
.assign(rp(af_inet
, ipproto_icmp
), native_socket2
);
120 rp::socket::native_handle_type native_socket3
121 = ::socket(af_inet
, sock_raw
, 0);
122 socket1
.assign(rp(af_inet
, ipproto_icmp
), native_socket3
, ec
);
123 #endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME)
125 bool is_open
= socket1
.is_open();
131 rp::socket::native_handle_type native_socket4
= socket1
.native_handle();
132 (void)native_socket4
;
137 bool at_mark1
= socket1
.at_mark();
139 bool at_mark2
= socket1
.at_mark(ec
);
142 std::size_t available1
= socket1
.available();
144 std::size_t available2
= socket1
.available(ec
);
147 socket1
.bind(rp::endpoint());
148 socket1
.bind(rp::endpoint(), ec
);
150 socket1
.connect(rp::endpoint());
151 socket1
.connect(rp::endpoint(), ec
);
153 socket1
.async_connect(rp::endpoint(), connect_handler
);
155 socket1
.set_option(socket_option
);
156 socket1
.set_option(socket_option
, ec
);
158 socket1
.get_option(socket_option
);
159 socket1
.get_option(socket_option
, ec
);
161 socket1
.io_control(io_control_command
);
162 socket1
.io_control(io_control_command
, ec
);
164 rp::endpoint endpoint1
= socket1
.local_endpoint();
165 rp::endpoint endpoint2
= socket1
.local_endpoint(ec
);
167 rp::endpoint endpoint3
= socket1
.remote_endpoint();
168 rp::endpoint endpoint4
= socket1
.remote_endpoint(ec
);
170 socket1
.shutdown(socket_base::shutdown_both
);
171 socket1
.shutdown(socket_base::shutdown_both
, ec
);
173 // basic_raw_socket functions.
175 socket1
.send(buffer(mutable_char_buffer
));
176 socket1
.send(buffer(const_char_buffer
));
177 socket1
.send(null_buffers());
178 socket1
.send(buffer(mutable_char_buffer
), in_flags
);
179 socket1
.send(buffer(const_char_buffer
), in_flags
);
180 socket1
.send(null_buffers(), in_flags
);
181 socket1
.send(buffer(mutable_char_buffer
), in_flags
, ec
);
182 socket1
.send(buffer(const_char_buffer
), in_flags
, ec
);
183 socket1
.send(null_buffers(), in_flags
, ec
);
185 socket1
.async_send(buffer(mutable_char_buffer
), send_handler
);
186 socket1
.async_send(buffer(const_char_buffer
), send_handler
);
187 socket1
.async_send(null_buffers(), send_handler
);
188 socket1
.async_send(buffer(mutable_char_buffer
), in_flags
, send_handler
);
189 socket1
.async_send(buffer(const_char_buffer
), in_flags
, send_handler
);
190 socket1
.async_send(null_buffers(), in_flags
, send_handler
);
192 socket1
.send_to(buffer(mutable_char_buffer
),
194 socket1
.send_to(buffer(const_char_buffer
),
196 socket1
.send_to(null_buffers(),
198 socket1
.send_to(buffer(mutable_char_buffer
),
199 rp::endpoint(), in_flags
);
200 socket1
.send_to(buffer(const_char_buffer
),
201 rp::endpoint(), in_flags
);
202 socket1
.send_to(null_buffers(),
203 rp::endpoint(), in_flags
);
204 socket1
.send_to(buffer(mutable_char_buffer
),
205 rp::endpoint(), in_flags
, ec
);
206 socket1
.send_to(buffer(const_char_buffer
),
207 rp::endpoint(), in_flags
, ec
);
208 socket1
.send_to(null_buffers(),
209 rp::endpoint(), in_flags
, ec
);
211 socket1
.async_send_to(buffer(mutable_char_buffer
),
212 rp::endpoint(), send_handler
);
213 socket1
.async_send_to(buffer(const_char_buffer
),
214 rp::endpoint(), send_handler
);
215 socket1
.async_send_to(null_buffers(),
216 rp::endpoint(), send_handler
);
217 socket1
.async_send_to(buffer(mutable_char_buffer
),
218 rp::endpoint(), in_flags
, send_handler
);
219 socket1
.async_send_to(buffer(const_char_buffer
),
220 rp::endpoint(), in_flags
, send_handler
);
221 socket1
.async_send_to(null_buffers(),
222 rp::endpoint(), in_flags
, send_handler
);
224 socket1
.receive(buffer(mutable_char_buffer
));
225 socket1
.receive(null_buffers());
226 socket1
.receive(buffer(mutable_char_buffer
), in_flags
);
227 socket1
.receive(null_buffers(), in_flags
);
228 socket1
.receive(buffer(mutable_char_buffer
), in_flags
, ec
);
229 socket1
.receive(null_buffers(), in_flags
, ec
);
231 socket1
.async_receive(buffer(mutable_char_buffer
), receive_handler
);
232 socket1
.async_receive(null_buffers(), receive_handler
);
233 socket1
.async_receive(buffer(mutable_char_buffer
), in_flags
,
235 socket1
.async_receive(null_buffers(), in_flags
, receive_handler
);
237 rp::endpoint endpoint
;
238 socket1
.receive_from(buffer(mutable_char_buffer
), endpoint
);
239 socket1
.receive_from(null_buffers(), endpoint
);
240 socket1
.receive_from(buffer(mutable_char_buffer
), endpoint
, in_flags
);
241 socket1
.receive_from(null_buffers(), endpoint
, in_flags
);
242 socket1
.receive_from(buffer(mutable_char_buffer
), endpoint
, in_flags
, ec
);
243 socket1
.receive_from(null_buffers(), endpoint
, in_flags
, ec
);
245 socket1
.async_receive_from(buffer(mutable_char_buffer
),
246 endpoint
, receive_handler
);
247 socket1
.async_receive_from(null_buffers(),
248 endpoint
, receive_handler
);
249 socket1
.async_receive_from(buffer(mutable_char_buffer
),
250 endpoint
, in_flags
, receive_handler
);
251 socket1
.async_receive_from(null_buffers(),
252 endpoint
, in_flags
, receive_handler
);
254 catch (std::exception
&)
259 } // namespace generic_raw_protocol_socket_compile
261 //------------------------------------------------------------------------------
263 BOOST_ASIO_TEST_SUITE
265 "generic/raw_protocol",
266 BOOST_ASIO_TEST_CASE(generic_raw_protocol_socket_compile::test
)