forked from boostorg/beast
		
	Refactor all examples:
fix #575, fix #604, fix #608, fix #634, fix #712 All examples are rewritten: * Using Best Practices * Mostly self-contained * New examples to complete the feature matrix * The server-framework example is removed
This commit is contained in:
		
							
								
								
									
										124
									
								
								example/websocket/server/sync-ssl/websocket_server_sync_ssl.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								example/websocket/server/sync-ssl/websocket_server_sync_ssl.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,124 @@ | ||||
| // | ||||
| // Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail dot com) | ||||
| // | ||||
| // Distributed under the Boost Software License, Version 1.0. (See accompanying | ||||
| // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | ||||
| // | ||||
| // Official repository: https://github.com/boostorg/beast | ||||
| // | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // | ||||
| // Example: WebSocket SSL server, synchronous | ||||
| // | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| #include "example/common/server_certificate.hpp" | ||||
|  | ||||
| #include <boost/beast/core.hpp> | ||||
| #include <boost/beast/websocket.hpp> | ||||
| #include <boost/beast/websocket/ssl.hpp> | ||||
| #include <boost/asio/ip/tcp.hpp> | ||||
| #include <boost/asio/ssl/stream.hpp> | ||||
| #include <cstdlib> | ||||
| #include <functional> | ||||
| #include <iostream> | ||||
| #include <string> | ||||
| #include <thread> | ||||
|  | ||||
| using tcp = boost::asio::ip::tcp;               // from <boost/asio/ip/tcp.hpp> | ||||
| namespace ssl = boost::asio::ssl;               // from <boost/asio/ssl.hpp> | ||||
| namespace websocket = boost::beast::websocket;  // from <boost/beast/websocket.hpp> | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| // Echoes back all received WebSocket messages | ||||
| void | ||||
| do_session(tcp::socket& socket, ssl::context& ctx) | ||||
| { | ||||
|     try | ||||
|     { | ||||
|         // Construct the websocket stream around the socket | ||||
|         websocket::stream<ssl::stream<tcp::socket&>> ws{socket, ctx}; | ||||
|  | ||||
|         // Perform the SSL handshake | ||||
|         ws.next_layer().handshake(ssl::stream_base::server); | ||||
|  | ||||
|         // Accept the websocket handshake | ||||
|         ws.accept(); | ||||
|  | ||||
|         for(;;) | ||||
|         { | ||||
|             // This buffer will hold the incoming message | ||||
|             boost::beast::multi_buffer buffer; | ||||
|  | ||||
|             // Read a message | ||||
|             ws.read(buffer); | ||||
|  | ||||
|             // Echo the message back | ||||
|             ws.text(ws.got_text()); | ||||
|             ws.write(buffer.data()); | ||||
|         } | ||||
|     } | ||||
|     catch(boost::system::system_error const& se) | ||||
|     { | ||||
|         // This indicates that the session was closed | ||||
|         if(se.code() != websocket::error::closed) | ||||
|             std::cerr << "Error: " << se.code().message() << std::endl; | ||||
|     } | ||||
|     catch(std::exception const& e) | ||||
|     { | ||||
|         std::cerr << "Error: " << e.what() << std::endl; | ||||
|     } | ||||
| } | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| int main(int argc, char* argv[]) | ||||
| { | ||||
|     try | ||||
|     { | ||||
|         // Check command line arguments. | ||||
|         if (argc != 3) | ||||
|         { | ||||
|             std::cerr << | ||||
|                 "Usage: websocket-server-sync-ssl <address> <port>\n" << | ||||
|                 "Example:\n" << | ||||
|                 "    websocket-server-sync-ssl 0.0.0.0 8080\n"; | ||||
|             return EXIT_FAILURE; | ||||
|         } | ||||
|         auto const address = boost::asio::ip::address::from_string(argv[1]); | ||||
|         auto const port = static_cast<unsigned short>(std::atoi(argv[2])); | ||||
|  | ||||
|         // The io_service is required for all I/O | ||||
|         boost::asio::io_service ios{1}; | ||||
|  | ||||
|         // The SSL context is required, and holds certificates | ||||
|         ssl::context ctx{ssl::context::sslv23}; | ||||
|  | ||||
|         // This holds the self-signed certificate used by the server | ||||
|         load_server_certificate(ctx); | ||||
|  | ||||
|         // The acceptor receives incoming connections | ||||
|         tcp::acceptor acceptor{ios, {address, port}}; | ||||
|         for(;;) | ||||
|         { | ||||
|             // This will receive the new connection | ||||
|             tcp::socket socket{ios}; | ||||
|  | ||||
|             // Block until we get a connection | ||||
|             acceptor.accept(socket); | ||||
|  | ||||
|             // Launch the session, transferring ownership of the socket | ||||
|             std::thread{std::bind( | ||||
|                 &do_session, | ||||
|                 std::move(socket), | ||||
|                 std::ref(ctx))}.detach(); | ||||
|         } | ||||
|     } | ||||
|     catch (const std::exception& e) | ||||
|     { | ||||
|         std::cerr << "Error: " << e.what() << std::endl; | ||||
|         return EXIT_FAILURE; | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user