Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <boost/beast/core.hpp>
- #include <boost/beast/http.hpp>
- #include <boost/beast/version.hpp>
- #include <boost/asio.hpp>
- #include <chrono>
- #include <cstdlib>
- #include <ctime>
- #include <iostream>
- #include <memory>
- #include <string>
- namespace beast = boost::beast; // from <boost/beast.hpp>
- namespace http = beast::http; // from <boost/beast/http.hpp>
- namespace net = boost::asio; // from <boost/asio.hpp>
- using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
- class http_connection : public std::enable_shared_from_this<http_connection>
- {
- public:
- http_connection(tcp::socket socket)
- : socket_(std::move(socket))
- {
- }
- // Initiate the asynchronous operations associated with the connection.
- void
- start()
- {
- read_request();
- }
- private:
- // The socket for the currently connected client.
- tcp::socket socket_;
- // The buffer for performing reads.
- beast::flat_buffer buffer_{8192};
- // The request message.
- http::request<http::dynamic_body> request_;
- // The response message.
- http::response<http::dynamic_body> response_;
- // Asynchronously receive a complete request message.
- void
- read_request()
- {
- auto self = shared_from_this();
- http::async_read(
- socket_,
- buffer_,
- request_,
- [self](beast::error_code ec,
- std::size_t bytes_transferred)
- {
- boost::ignore_unused(bytes_transferred);
- if(!ec)
- self->process_request();
- });
- }
- // Determine what needs to be done with the request message.
- void
- process_request()
- {
- write_response();
- }
- // Asynchronously transmit the response message.
- void
- write_response()
- {
- // // The response message.
- http::response<boost::beast::http::dynamic_body> response_;
- response_.version(request_.version());
- response_.set(http::field::server, "Beast");
- response_.keep_alive(false);
- response_.result(boost::beast::http::status::not_found);
- response_.set(boost::beast::http::field::content_type, "text/plain");
- boost::beast::ostream(response_.body()) << "File not found\r\n";
- if (!socket_.is_open()) {
- return;
- }
- response_.prepare_payload();
- auto self(shared_from_this());
- boost::beast::http::async_write(
- socket_,
- response_,
- [self](boost::beast::error_code ec, std::size_t)
- {
- // self->socket_.shutdown(tcp::socket::shutdown_send, ec);
- // self->deadline_.cancel();
- });
- }
- };
- // "Loop" forever accepting new connections.
- void
- http_server(tcp::acceptor& acceptor, tcp::socket& socket)
- {
- acceptor.async_accept(socket,
- [&](beast::error_code ec)
- {
- if(!ec)
- std::make_shared<http_connection>(std::move(socket))->start();
- http_server(acceptor, socket);
- });
- }
- int
- main(int argc, char* argv[])
- {
- try
- {
- // Check command line arguments.
- if(argc != 3)
- {
- std::cerr << "Usage: " << argv[0] << " <address> <port>\n";
- std::cerr << " For IPv4, try:\n";
- std::cerr << " receiver 0.0.0.0 80\n";
- std::cerr << " For IPv6, try:\n";
- std::cerr << " receiver 0::0 80\n";
- return EXIT_FAILURE;
- }
- auto const address = net::ip::make_address(argv[1]);
- unsigned short port = static_cast<unsigned short>(std::atoi(argv[2]));
- net::io_service ioc{1};
- tcp::acceptor acceptor{ioc, {address, port}};
- tcp::socket socket{ioc};
- http_server(acceptor, socket);
- ioc.run();
- }
- catch(std::exception const& e)
- {
- std::cerr << "Error: " << e.what() << std::endl;
- return EXIT_FAILURE;
- }
- }
Add Comment
Please, Sign In to add comment