//[network_connectiong //[tcp #include #include #include void tcp_setup() { boost::asio::io_context ioc; // Use ``__TCP_SOCKET__`` as the underlying stream. async_mqtt5::mqtt_client client(ioc, ""); } //] //[tls #include #include #include #include // External customization point. namespace async_mqtt5 { template struct tls_handshake_type> { static constexpr auto client = asio::ssl::stream_base::client; static constexpr auto server = asio::ssl::stream_base::server; }; // This client uses this funcction to indicate which hostname it is // attempting to connect to at the start of the handshaking process. template void assign_tls_sni( const authority_path& ap, boost::asio::ssl::context& ctx, boost::asio::ssl::stream& stream ) { SSL_set_tlsext_host_name(stream.native_handle(), ap.host.c_str()); } } // end namespace async_mqtt5 // The certificate file in PEM format. constexpr char certificate[] = "-----BEGIN CERTIFICATE-----\n" "...........................\n" "-----END CERTIFICATE-----\n" ; void ssl_setup() { boost::asio::io_context ioc; // Context satisfying ``__TlsContext__`` requirements that the underlying SSL stream will use. // The purpose of the context is to allow us to set up TLS/SSL-related options. // See ``__SSL__`` for more information and options. boost::asio::ssl::context context(boost::asio::ssl::context::tls_client); async_mqtt5::error_code ec; // Add the trusted certificate authority for performing verification. context.add_certificate_authority(boost::asio::buffer(certificate), ec); // Set peer verification mode used by the context. // This will verify that the server's certificate is valid and signed by a trusted certificate authority. context.set_verify_mode(boost::asio::ssl::verify_peer, ec); // Use ``__SSL_STREAM__`` as the ``__StreamType__`` with ``__SSL_CONTEXT__`` as the ``__TlsContext__``. async_mqtt5::mqtt_client< boost::asio::ssl::stream, boost::asio::ssl::context > client(ioc, "", std::move(context)); } //] //[websocket_tcp #include #include #include #include void websocket_tcp_setup() { boost::asio::io_context ioc; // Use ``[beastreflink boost__beast__websocket__stream websocket::stream<__TCP_SOCKET__>]`` as the underlying stream. async_mqtt5::mqtt_client< boost::beast::websocket::stream > client(ioc, ""); } //] //[websocket_tls #include #include #include #include #include constexpr char ca[] = "-----BEGIN CERTIFICATE-----\n" "...........................\n" "-----END CERTIFICATE-----\n" ; namespace boost::beast::websocket { // ``[beastreflink boost__beast__websocket__async_teardown boost::beast::websocket::async_teardown]`` is a free function // designed to initiate the asynchronous teardown of a connection. // The specific behaviour of this function is based on the NextLayer type (Socket type) used to create the ``__WEBSOCKET_STREAM__``. // ``__Beast__`` library includes an implementation of this function for ``__TCP_SOCKET__``. // However, the callers are responsible for providing a suitable overload of this function for any other type, // such as ``__SSL_STREAM__`` as shown in this example. template void async_teardown( boost::beast::role_type role, asio::ssl::stream& stream, TeardownHandler&& handler ) { return stream.async_shutdown(std::forward(handler)); } } // end namespace boost::beast::websocket namespace async_mqtt5 { template struct tls_handshake_type> { static constexpr auto client = asio::ssl::stream_base::client; static constexpr auto server = asio::ssl::stream_base::server; }; template void assign_tls_sni( const authority_path& ap, asio::ssl::context& ctx, asio::ssl::stream& stream ) { ssl_set_tlsext_host_name(stream.native_handle(), ap.host.c_str()); } } // end namespace async_mqtt5 void websocket_tls_setup() { boost::asio::io_context ioc; boost::asio::ssl::context context(boost::asio::ssl::context::tls_client); async_mqtt5::error_code ec; context.add_certificate_authority(boost::asio::buffer(ca), ec); context.set_verify_mode(boost::asio::ssl::verify_peer, ec); async_mqtt5::mqtt_client< boost::beast::websocket::stream>, boost::asio::ssl::context > client(ioc, "", std::move(context)); } //] //]