...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
These complete programs are intended to quickly impress upon readers the flavor of the library. Source code and build scripts for them are located in the example directory.
Use HTTP to make a GET request to a website and print the response:
File: example/http/client/sync/http_client_sync.cpp
#include <boost/beast/core.hpp> #include <boost/beast/http.hpp> #include <boost/beast/version.hpp> #include <boost/asio/connect.hpp> #include <boost/asio/ip/tcp.hpp> #include <cstdlib> #include <iostream> #include <string> using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp> namespace http = boost::beast::http; // from <boost/beast/http.hpp> // Performs an HTTP GET and prints the response int main(int argc, char** argv) { try { // Check command line arguments. if(argc != 4 && argc != 5) { std::cerr << "Usage: http-client-sync <host> <port> <target> [<HTTP version: 1.0 or 1.1(default)>]\n" << "Example:\n" << " http-client-sync www.example.com 80 /\n" << " http-client-sync www.example.com 80 / 1.0\n"; return EXIT_FAILURE; } auto const host = argv[1]; auto const port = argv[2]; auto const target = argv[3]; int version = argc == 5 && !std::strcmp("1.0", argv[4]) ? 10 : 11; // The io_context is required for all I/O boost::asio::io_context ioc; // These objects perform our I/O tcp::resolver resolver{ioc}; tcp::socket socket{ioc}; // Look up the domain name auto const results = resolver.resolve(host, port); // Make the connection on the IP address we get from a lookup boost::asio::connect(socket, results.begin(), results.end()); // Set up an HTTP GET request message http::request<http::string_body> req{http::verb::get, target, version}; req.set(http::field::host, host); req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING); // Send the HTTP request to the remote host http::write(socket, req); // This buffer is used for reading and must be persisted boost::beast::flat_buffer buffer; // Declare a container to hold the response http::response<http::dynamic_body> res; // Receive the HTTP response http::read(socket, buffer, res); // Write the message to standard out std::cout << res << std::endl; // Gracefully close the socket boost::system::error_code ec; socket.shutdown(tcp::socket::shutdown_both, ec); // not_connected happens sometimes // so don't bother reporting it. // if(ec && ec != boost::system::errc::not_connected) throw boost::system::system_error{ec}; // If we get here then the connection is closed gracefully } catch(std::exception const& e) { std::cerr << "Error: " << e.what() << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; }
Establish a WebSocket connection, send a message and receive the reply:
File: example/websocket/client/sync/websocket_client_sync.cpp
#include <boost/beast/core.hpp> #include <boost/beast/websocket.hpp> #include <boost/asio/connect.hpp> #include <boost/asio/ip/tcp.hpp> #include <cstdlib> #include <iostream> #include <string> using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp> namespace websocket = boost::beast::websocket; // from <boost/beast/websocket.hpp> // Sends a WebSocket message and prints the response int main(int argc, char** argv) { try { // Check command line arguments. if(argc != 4) { std::cerr << "Usage: websocket-client-sync <host> <port> <text>\n" << "Example:\n" << " websocket-client-sync echo.websocket.org 80 \"Hello, world!\"\n"; return EXIT_FAILURE; } auto const host = argv[1]; auto const port = argv[2]; auto const text = argv[3]; // The io_context is required for all I/O boost::asio::io_context ioc; // These objects perform our I/O tcp::resolver resolver{ioc}; websocket::stream<tcp::socket> ws{ioc}; // Look up the domain name auto const results = resolver.resolve(host, port); // Make the connection on the IP address we get from a lookup boost::asio::connect(ws.next_layer(), results.begin(), results.end()); // Perform the websocket handshake ws.handshake(host, "/"); // Send the message ws.write(boost::asio::buffer(std::string(text))); // This buffer will hold the incoming message boost::beast::multi_buffer buffer; // Read a message into our buffer ws.read(buffer); // Close the WebSocket connection ws.close(websocket::close_code::normal); // If we get here then the connection is closed gracefully // The buffers() function helps print a ConstBufferSequence std::cout << boost::beast::buffers(buffer.data()) << std::endl; } catch(std::exception const& e) { std::cerr << "Error: " << e.what() << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; }