Closed shivank1111 closed 8 months ago
Could you please provide your sample code?
I have also replaced the file of "message_generator.hpp" in all the available places.
advanced_server.cpp
is already using message_generator
what did you replace with?
https://www.boost.org/doc/libs/1_82_0/boost/beast/http/message_generator.hpp
This code only, the same code only. Sample code of advanced_server.cpp is from here only "https://github.com/boostorg/beast/tree/develop/example/advanced/server"
I don't know but while compiling only, it's giving these errors. I have tried several times but still the issue is persisting. Kindly help me in solving this issue.
Could you please provide the exact code you are trying to compile?
// Copyright (c) 2016-2019 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: Advanced server
//
//------------------------------------------------------------------------------
#include <boost/beast/core.hpp>
#include <boost/beast/http.hpp>
#include <boost/beast/websocket.hpp>
#include <boost/beast/version.hpp>
#include <boost/asio/bind_executor.hpp>
#include <boost/asio/dispatch.hpp>
#include <boost/asio/signal_set.hpp>
#include <boost/asio/strand.hpp>
#include <boost/make_unique.hpp>
#include <boost/optional.hpp>
#include <algorithm>
#include <cstdlib>
#include <functional>
#include <iostream>
#include <memory>
#include <queue>
#include <string>
#include <thread>
#include <vector>
namespace beast = boost::beast; // from <boost/beast.hpp>
namespace http = beast::http; // from <boost/beast/http.hpp>
namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
namespace net = boost::asio; // from <boost/asio.hpp>
using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
// Return a reasonable mime type based on the extension of a file.
beast::string_view
mime_type(beast::string_view path)
{
using beast::iequals;
auto const ext = [&path]
{
auto const pos = path.rfind(".");
if(pos == beast::string_view::npos)
return beast::string_view{};
return path.substr(pos);
}();
if(iequals(ext, ".htm")) return "text/html";
if(iequals(ext, ".html")) return "text/html";
if(iequals(ext, ".php")) return "text/html";
if(iequals(ext, ".css")) return "text/css";
if(iequals(ext, ".txt")) return "text/plain";
if(iequals(ext, ".js")) return "application/javascript";
if(iequals(ext, ".json")) return "application/json";
if(iequals(ext, ".xml")) return "application/xml";
if(iequals(ext, ".swf")) return "application/x-shockwave-flash";
if(iequals(ext, ".flv")) return "video/x-flv";
if(iequals(ext, ".png")) return "image/png";
if(iequals(ext, ".jpe")) return "image/jpeg";
if(iequals(ext, ".jpeg")) return "image/jpeg";
if(iequals(ext, ".jpg")) return "image/jpeg";
if(iequals(ext, ".gif")) return "image/gif";
if(iequals(ext, ".bmp")) return "image/bmp";
if(iequals(ext, ".ico")) return "image/vnd.microsoft.icon";
if(iequals(ext, ".tiff")) return "image/tiff";
if(iequals(ext, ".tif")) return "image/tiff";
if(iequals(ext, ".svg")) return "image/svg+xml";
if(iequals(ext, ".svgz")) return "image/svg+xml";
return "application/text";
}
// Append an HTTP rel-path to a local filesystem path.
// The returned path is normalized for the platform.
std::string
path_cat(
beast::string_view base,
beast::string_view path)
{
if(base.empty())
return std::string(path);
std::string result(base);
#ifdef BOOST_MSVC
char constexpr path_separator = '\\';
if(result.back() == path_separator)
result.resize(result.size() - 1);
result.append(path.data(), path.size());
for(auto& c : result)
if(c == '/')
c = path_separator;
#else
char constexpr path_separator = '/';
if(result.back() == path_separator)
result.resize(result.size() - 1);
result.append(path.data(), path.size());
#endif
return result;
}
// Return a response for the given request.
//
// The concrete type of the response message (which depends on the
// request), is type-erased in message_generator.
template <class Body, class Allocator>
http::message_generator
handle_request(
beast::string_view doc_root,
http::request<Body, http::basic_fields<Allocator>>&& req)
{
// Returns a bad request response
auto const bad_request =
[&req](beast::string_view why)
{
http::response<http::string_body> res{http::status::bad_request, req.version()};
res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
res.set(http::field::content_type, "text/html");
res.keep_alive(req.keep_alive());
res.body() = std::string(why);
res.prepare_payload();
return res;
};
// Returns a not found response
auto const not_found =
[&req](beast::string_view target)
{
http::response<http::string_body> res{http::status::not_found, req.version()};
res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
res.set(http::field::content_type, "text/html");
res.keep_alive(req.keep_alive());
res.body() = "The resource '" + std::string(target) + "' was not found.";
res.prepare_payload();
return res;
};
// Returns a server error response
auto const server_error =
[&req](beast::string_view what)
{
http::response<http::string_body> res{http::status::internal_server_error, req.version()};
res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
res.set(http::field::content_type, "text/html");
res.keep_alive(req.keep_alive());
res.body() = "An error occurred: '" + std::string(what) + "'";
res.prepare_payload();
return res;
};
// Make sure we can handle the method
if( req.method() != http::verb::get &&
req.method() != http::verb::head)
return bad_request("Unknown HTTP-method");
// Request path must be absolute and not contain "..".
if( req.target().empty() ||
req.target()[0] != '/' ||
req.target().find("..") != beast::string_view::npos)
return bad_request("Illegal request-target");
// Build the path to the requested file
std::string path = path_cat(doc_root, req.target());
if(req.target().back() == '/')
path.append("index.html");
// Attempt to open the file
beast::error_code ec;
http::file_body::value_type body;
body.open(path.c_str(), beast::file_mode::scan, ec);
// Handle the case where the file doesn't exist
if(ec == beast::errc::no_such_file_or_directory)
return not_found(req.target());
// Handle an unknown error
if(ec)
return server_error(ec.message());
// Cache the size since we need it after the move
auto const size = body.size();
// Respond to HEAD request
if(req.method() == http::verb::head)
{
http::response<http::empty_body> res{http::status::ok, req.version()};
res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
res.set(http::field::content_type, mime_type(path));
res.content_length(size);
res.keep_alive(req.keep_alive());
return res;
}
// Respond to GET request
http::response<http::file_body> res{
std::piecewise_construct,
std::make_tuple(std::move(body)),
std::make_tuple(http::status::ok, req.version())};
res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
res.set(http::field::content_type, mime_type(path));
res.content_length(size);
res.keep_alive(req.keep_alive());
return res;
}
//------------------------------------------------------------------------------
// Report a failure
void
fail(beast::error_code ec, char const* what)
{
std::cerr << what << ": " << ec.message() << "\n";
}
// Echoes back all received WebSocket messages
class websocket_session : public std::enable_shared_from_this<websocket_session>
{
websocket::stream<beast::tcp_stream> ws_;
beast::flat_buffer buffer_;
public:
// Take ownership of the socket
explicit
websocket_session(tcp::socket&& socket)
: ws_(std::move(socket))
{
}
// Start the asynchronous accept operation
template<class Body, class Allocator>
void
do_accept(http::request<Body, http::basic_fields<Allocator>> req)
{
// Set suggested timeout settings for the websocket
ws_.set_option(
websocket::stream_base::timeout::suggested(
beast::role_type::server));
// Set a decorator to change the Server of the handshake
ws_.set_option(websocket::stream_base::decorator(
[](websocket::response_type& res)
{
res.set(http::field::server,
std::string(BOOST_BEAST_VERSION_STRING) +
" advanced-server");
}));
// Accept the websocket handshake
ws_.async_accept(
req,
beast::bind_front_handler(
&websocket_session::on_accept,
shared_from_this()));
}
private:
void
on_accept(beast::error_code ec)
{
if(ec)
return fail(ec, "accept");
// Read a message
do_read();
}
void
do_read()
{
// Read a message into our buffer
ws_.async_read(
buffer_,
beast::bind_front_handler(
&websocket_session::on_read,
shared_from_this()));
}
void
on_read(
beast::error_code ec,
std::size_t bytes_transferred)
{
boost::ignore_unused(bytes_transferred);
// This indicates that the websocket_session was closed
if(ec == websocket::error::closed)
return;
if(ec)
fail(ec, "read");
// Echo the message
ws_.text(ws_.got_text());
ws_.async_write(
buffer_.data(),
beast::bind_front_handler(
&websocket_session::on_write,
shared_from_this()));
}
void
on_write(
beast::error_code ec,
std::size_t bytes_transferred)
{
boost::ignore_unused(bytes_transferred);
if(ec)
return fail(ec, "write");
// Clear the buffer
buffer_.consume(buffer_.size());
// Do another read
do_read();
}
};
//------------------------------------------------------------------------------
// Handles an HTTP server connection
class http_session : public std::enable_shared_from_this<http_session>
{
beast::tcp_stream stream_;
beast::flat_buffer buffer_;
std::shared_ptr<std::string const> doc_root_;
static constexpr std::size_t queue_limit = 8; // max responses
std::queue<http::message_generator> response_queue_;
// The parser is stored in an optional container so we can
// construct it from scratch it at the beginning of each new message.
boost::optional<http::request_parser<http::string_body>> parser_;
public:
// Take ownership of the socket
http_session(
tcp::socket&& socket,
std::shared_ptr<std::string const> const& doc_root)
: stream_(std::move(socket))
, doc_root_(doc_root)
{
static_assert(queue_limit > 0,
"queue limit must be positive");
}
// Start the session
void
run()
{
// We need to be executing within a strand to perform async operations
// on the I/O objects in this session. Although not strictly necessary
// for single-threaded contexts, this example code is written to be
// thread-safe by default.
net::dispatch(
stream_.get_executor(),
beast::bind_front_handler(
&http_session::do_read,
this->shared_from_this()));
}
private:
void
do_read()
{
// Construct a new parser for each message
parser_.emplace();
// Apply a reasonable limit to the allowed size
// of the body in bytes to prevent abuse.
parser_->body_limit(10000);
// Set the timeout.
stream_.expires_after(std::chrono::seconds(30));
// Read a request using the parser-oriented interface
http::async_read(
stream_,
buffer_,
*parser_,
beast::bind_front_handler(
&http_session::on_read,
shared_from_this()));
}
void
on_read(beast::error_code ec, std::size_t bytes_transferred)
{
boost::ignore_unused(bytes_transferred);
// This means they closed the connection
if(ec == http::error::end_of_stream)
return do_close();
if(ec)
return fail(ec, "read");
// See if it is a WebSocket Upgrade
if(websocket::is_upgrade(parser_->get()))
{
// Create a websocket session, transferring ownership
// of both the socket and the HTTP request.
std::make_shared<websocket_session>(
stream_.release_socket())->do_accept(parser_->release());
return;
}
// Send the response
queue_write(handle_request(*doc_root_, parser_->release()));
// If we aren't at the queue limit, try to pipeline another request
if (response_queue_.size() < queue_limit)
do_read();
}
void
queue_write(http::message_generator response)
{
// Allocate and store the work
response_queue_.push(std::move(response));
// If there was no previous work, start the write loop
if (response_queue_.size() == 1)
do_write();
}
// Called to start/continue the write-loop. Should not be called when
// write_loop is already active.
void
do_write()
{
if(! response_queue_.empty())
{
bool keep_alive = response_queue_.front().keep_alive();
beast::async_write(
stream_,
std::move(response_queue_.front()),
beast::bind_front_handler(
&http_session::on_write,
shared_from_this(),
keep_alive));
}
}
void
on_write(
bool keep_alive,
beast::error_code ec,
std::size_t bytes_transferred)
{
boost::ignore_unused(bytes_transferred);
if(ec)
return fail(ec, "write");
if(! keep_alive)
{
// This means we should close the connection, usually because
// the response indicated the "Connection: close" semantic.
return do_close();
}
// Resume the read if it has been paused
if(response_queue_.size() == queue_limit)
do_read();
response_queue_.pop();
do_write();
}
void
do_close()
{
// Send a TCP shutdown
beast::error_code ec;
stream_.socket().shutdown(tcp::socket::shutdown_send, ec);
// At this point the connection is closed gracefully
}
};
//------------------------------------------------------------------------------
// Accepts incoming connections and launches the sessions
class listener : public std::enable_shared_from_this<listener>
{
net::io_context& ioc_;
tcp::acceptor acceptor_;
std::shared_ptr<std::string const> doc_root_;
public:
listener(
net::io_context& ioc,
tcp::endpoint endpoint,
std::shared_ptr<std::string const> const& doc_root)
: ioc_(ioc)
, acceptor_(net::make_strand(ioc))
, doc_root_(doc_root)
{
beast::error_code ec;
// Open the acceptor
acceptor_.open(endpoint.protocol(), ec);
if(ec)
{
fail(ec, "open");
return;
}
// Allow address reuse
acceptor_.set_option(net::socket_base::reuse_address(true), ec);
if(ec)
{
fail(ec, "set_option");
return;
}
// Bind to the server address
acceptor_.bind(endpoint, ec);
if(ec)
{
fail(ec, "bind");
return;
}
// Start listening for connections
acceptor_.listen(
net::socket_base::max_listen_connections, ec);
if(ec)
{
fail(ec, "listen");
return;
}
}
// Start accepting incoming connections
void
run()
{
// We need to be executing within a strand to perform async operations
// on the I/O objects in this session. Although not strictly necessary
// for single-threaded contexts, this example code is written to be
// thread-safe by default.
net::dispatch(
acceptor_.get_executor(),
beast::bind_front_handler(
&listener::do_accept,
this->shared_from_this()));
}
private:
void
do_accept()
{
// The new connection gets its own strand
acceptor_.async_accept(
net::make_strand(ioc_),
beast::bind_front_handler(
&listener::on_accept,
shared_from_this()));
}
void
on_accept(beast::error_code ec, tcp::socket socket)
{
if(ec)
{
fail(ec, "accept");
}
else
{
// Create the http session and run it
std::make_shared<http_session>(
std::move(socket),
doc_root_)->run();
}
// Accept another connection
do_accept();
}
};
//------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
// Check command line arguments.
if (argc != 5)
{
std::cerr <<
"Usage: advanced-server <address> <port> <doc_root> <threads>\n" <<
"Example:\n" <<
" advanced-server 0.0.0.0 8080 . 1\n";
return EXIT_FAILURE;
}
auto const address = net::ip::make_address(argv[1]);
auto const port = static_cast<unsigned short>(std::atoi(argv[2]));
auto const doc_root = std::make_shared<std::string>(argv[3]);
auto const threads = std::max<int>(1, std::atoi(argv[4]));
// The io_context is required for all I/O
net::io_context ioc{threads};
// Create and launch a listening port
std::make_shared<listener>(
ioc,
tcp::endpoint{address, port},
doc_root)->run();
// Capture SIGINT and SIGTERM to perform a clean shutdown
net::signal_set signals(ioc, SIGINT, SIGTERM);
signals.async_wait(
[&](beast::error_code const&, int)
{
// Stop the `io_context`. This will cause `run()`
// to return immediately, eventually destroying the
// `io_context` and all of the sockets in it.
ioc.stop();
});
// Run the I/O service on the requested number of threads
std::vector<std::thread> v;
v.reserve(threads - 1);
for(auto i = threads - 1; i > 0; --i)
v.emplace_back(
[&ioc]
{
ioc.run();
});
ioc.run();
// (If we get here, it means we got a SIGINT or SIGTERM)
// Block until all the threads exit
for(auto& t : v)
t.join();
return EXIT_SUCCESS;
}
Please use a code block.
Apologies. Updated!
message_generator
has been added to Beast in Boost 1.81. It appears that you are using an older version of Boost.
If you don't have an up to date version of boost in your OS repository, you can follow the guideline here to build a new version from srouce.
Hi, I already have the latest versions. Moreover the important version is of Boost and that I am using Boost 1.82 version.
This is your code compiling fine using boost.1.82: https://godbolt.org/z/W3Wj1oEhr
Can you check your version of boost?
#include <boost/version.hpp>
#include <iostream>
int main()
{
std::cout << BOOST_LIB_VERSION << std::endl;
}
Hi, sorry for the late reply.
I have tried again after installing boost_1_84_0 version but while the above version program gave the output as "1_75". When I was using boost_1_82_0 version also, "1_75" was only coming. I am also attaching the ss for the same.
Still the message generator issue is not solved.
I have tried again after installing boost_1_84_0 version but while the above version program gave the output as "1_75".
This indicates you are including Boost version 1.75 headers, and the encountered error originates from this version. The newer version might have been installed in a different location; try to locate it and pass the location to the compiler:
g++ -I /path/to/boost_1_82_0 ...
Hi, I made some changes and then while running the version.cpp file, it's giving as "Boost version: 1.83.0" but still the advanced_server.cpp is giving the same error.
I had one more doubt, the versions are giving discrepancies like if I run version.cpp then it's giving as "Boost version: 1.83.0" but if I run this particular command " cat /usr/include/boost/version.hpp | grep "BOOST_LIB_VERSION" " then, this is giving "#define BOOST_LIB_VERSION "1_53" " i.e., the default boost version. I have tried several times but still not able to solve it. I am unable to find the reason from where it is taking that particular path.
Kindly help me with the same.
How did you install the new version of Boost? I think the issue lies here.
I downloaded it from Boost Library and followed the steps afterwards.
I have tried again after installing boost_1_84_0 version but while the above version program gave the output as "1_75".
This indicates you are including Boost version 1.75 headers, and the encountered error originates from this version. The newer version might have been installed in a different location; try to locate it and pass the location to the compiler:
g++ -I /path/to/boost_1_82_0 ...
have you tried this?
Yes, I have. Now I have the solved the version part also. In the usr/include path I changed the latest boost. Now it's showing 1.83 but that message generator issue is not solved.
Yes, I have. Now I have the solved the version part also How did you solve that? Please try to compile the source like this:
g++ -I /path/to/boost_1_82_0 ...
Change the path to point to the extracted boost directory.
I have tried that also.
What error you get with just compiling this:
#include <boost/beast/http/message_generator.hpp>
int main(){}
When I ran "message_generaor.hpp" file using the command " g++ -std=c++11 message_generator.hpp -o message", It successfully compiled but the executable file(./message) was showing permission denied. (-bash: ./message: Permission denied
When I ran "message_generaor.hpp" file using the command " g++ -std=c++11 message_generator.hpp -o message", It successfully compiled but the executable file(./message) was showing permission denied. (-bash: ./message: Permission denied
What is the content of message_generaor.hpp
?
// Copyright (c) 2022 Seth Heeren (sgheeren 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
//
#ifndef BOOST_BEAST_HTTP_MESSAGE_GENERATOR_HPP
#define BOOST_BEAST_HTTP_MESSAGE_GENERATOR_HPP
#include <boost/beast/core/span.hpp>
#include <boost/beast/http/message.hpp>
#include <boost/beast/http/serializer.hpp>
#include <memory>
namespace boost {
namespace beast {
namespace http {
/** Type-erased buffers generator for @ref http::message
Implements the BuffersGenerator concept for any concrete instance of the
@ref http::message template.
@ref http::message_generator takes ownership of a message on construction,
erasing the concrete type from the interface.
This makes it practical for use in server applications to implement request
handling:
@code
template <class Body, class Fields>
http::message_generator handle_request(
string_view doc_root,
http::request<Body, Fields>&& request);
@endcode
The @ref beast::write and @ref beast::async_write operations are provided
for BuffersGenerator. The @ref http::message::keep_alive property is made
available for use after writing the message.
*/
class message_generator
{
public:
using const_buffers_type = span<net::const_buffer>;
template <bool isRequest, class Body, class Fields>
message_generator(http::message<isRequest, Body, Fields>&&);
/// `BuffersGenerator`
bool is_done() const {
return impl_->is_done();
}
/// `BuffersGenerator`
const_buffers_type
prepare(error_code& ec)
{
return impl_->prepare(ec);
}
/// `BuffersGenerator`
void
consume(std::size_t n)
{
impl_->consume(n);
}
/// Returns the result of `m.keep_alive()` on the underlying message
bool
keep_alive() const noexcept
{
return impl_->keep_alive();
}
private:
struct impl_base
{
virtual ~impl_base() = default;
virtual bool is_done() = 0;
virtual const_buffers_type prepare(error_code& ec) = 0;
virtual void consume(std::size_t n) = 0;
virtual bool keep_alive() const noexcept = 0;
};
std::unique_ptr<impl_base> impl_;
template <bool isRequest, class Body, class Fields>
struct generator_impl;
};
} // namespace http
} // namespace beast
} // namespace boost
#include <boost/beast/http/impl/message_generator.hpp>
#endif
What happens when you try to compile the following source code:
#include <boost/beast/http/message_generator.hpp>
int main(){}
If I compile only these 2 lines then whole lot of errors are coming.
``In file included from /usr/include/c++/4.8.2/initializer_list:36:0, from /usr/local/include/boost/core/data.hpp:11, from /usr/local/include/boost/core/span.hpp:11, from /usr/local/include/boost/beast/core/span.hpp:14, from /usr/local/include/boost/beast/http/message_generator.hpp:12, from Message.cpp:1: /usr/include/c++/4.8.2/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
^
In file included from /usr/local/include/boost/core/span.hpp:11:0,
from /usr/local/include/boost/beast/core/span.hpp:14,
from /usr/local/include/boost/beast/http/message_generator.hpp:12,
from Message.cpp:1:
/usr/local/include/boost/core/data.hpp:17:8: error: ‘constexpr’ does not name a type
inline constexpr auto
^
/usr/local/include/boost/core/data.hpp:17:8: note: C++11 ‘constexpr’ only available with -std=c++11 or -std=gnu++11
/usr/local/include/boost/core/data.hpp:24:8: error: ‘constexpr’ does not name a type
inline constexpr auto
^
/usr/local/include/boost/core/data.hpp:24:8: note: C++11 ‘constexpr’ only available with -std=c++11 or -std=gnu++11
/usr/local/include/boost/core/data.hpp:31:8: error: ‘constexpr’ does not name a type
inline constexpr T
^
/usr/local/include/boost/core/data.hpp:31:8: note: C++11 ‘constexpr’ only available with -std=c++11 or -std=gnu++11
/usr/local/include/boost/core/data.hpp:38:8: error: ‘constexpr’ does not name a type
inline constexpr const T
^
/usr/local/include/boost/core/data.hpp:38:8: note: C++11 ‘constexpr’ only available with -std=c++11 or -std=gnu++11
In file included from /usr/local/include/boost/beast/core/span.hpp:14:0,
from /usr/local/include/boost/beast/http/message_generator.hpp:12,
from Message.cpp:1:
/usr/local/include/boost/core/span.hpp:18:1: error: ‘constexpr’ does not name a type
constexpr std::size_t dynamic_extent = static_cast
^
/usr/local/include/boost/container/detail/config_begin.hpp:55:28: error: expected ‘}’ before end of line /usr/local/include/boost/container/detail/config_begin.hpp:55:28: error: expected declaration before end of line [root@localhost evsnotify]# ``
Please use -std=c++11
switch in the compile command.
It's compiling.
Attaching the SS.
Still the error is coming. I am using this command line to run: g++ -std=c++11 -I/home/evsnotify/boost_1_84_0/boost advanced_server.cpp -o advance -lpthread -lboost_system -lboost_filesystem -lboost_coroutine
Please provide the generated error message in a code block.
Sure. I made cross checked at the paths this is showing error nut there I haven't changed anything.
advanced_server.cpp: In instantiation of ‘boost::beast::http::message_generator handle_request(boost::beast::string_view, boost::beast::http::request<Body, boost::beast::http::basic_fields<Allocator> >&&) [with Body = boost::beast::http::basic_string_body<char>; Allocator = std::allocator<char>; boost::beast::string_view = boost::core::basic_string_view<char>; boost::beast::http::request<Body, boost::beast::http::basic_fields<Allocator> > = boost::beast::http::message<true, boost::beast::http::basic_string_body<char>, boost::beast::http::basic_fields<std::allocator<char> > >]’: advanced_server.cpp:412:66: required from here advanced_server.cpp:194:16: error: cannot bind ‘boost::beast::http::response<boost::beast::http::empty_body> {aka boost::beast::http::message<false, boost::beast::http::empty_body, boost::beast::http::basic_fields<std::allocator<char> > >}’ lvalue to ‘boost::beast::http::message<false, boost::beast::http::empty_body, boost::beast::http::basic_fields<std::allocator<char> > >&&’ return res; ^ In file included from /usr/local/include/boost/beast/http/message_generator.hpp:97:0, from /usr/local/include/boost/beast/http.hpp:26, from advanced_server.cpp:17: /usr/local/include/boost/beast/http/impl/message_generator.hpp:22:1: error: initializing argument 1 of ‘boost::beast::http::message_generator::message_generator(boost::beast::http::message<isRequest, Body, Fields>&&) [with bool isRequest = false; Body = boost::beast::http::empty_body; Fields = boost::beast::http::basic_fields<std::allocator<char> >]’ message_generator::message_generator( ^ advanced_server.cpp:206:12: error: cannot bind ‘boost::beast::http::response<boost::beast::http::basic_file_body<boost::beast::file_posix> > {aka boost::beast::http::message<false, boost::beast::http::basic_file_body<boost::beast::file_posix>, boost::beast::http::basic_fields<std::allocator<char> > >}’ lvalue to ‘boost::beast::http::message<false, boost::beast::http::basic_file_body<boost::beast::file_posix>, boost::beast::http::basic_fields<std::allocator<char> > >&&’ return res; ^ In file included from /usr/local/include/boost/beast/http/message_generator.hpp:97:0, from /usr/local/include/boost/beast/http.hpp:26, from advanced_server.cpp:17: /usr/local/include/boost/beast/http/impl/message_generator.hpp:22:1: error: initializing argument 1 of ‘boost::beast::http::message_generator::message_generator(boost::beast::http::message<isRequest, Body, Fields>&&) [with bool isRequest = false; Body = boost::beast::http::basic_file_body<boost::beast::file_posix>; Fields = boost::beast::http::basic_fields<std::allocator<char> >]’ message_generator::message_generator(
Please provide the full error message. What is you compiler version?
The above error was the whole error. I have provided the ss of version of my compiler and also the error.
In the usr/include path I changed the latest boost. Now it's showing 1.83
Could you please explain how did you do that?
In the screenshot, I see you are passing -I/home/evsnotify/boost_1_84_0/boost
which is wrong it should be -I/home/evsnotify/boost_1_84_0
or -isystem /home/evsnotify/boost_1_84_0
I had done with Boost_1.83 before but since it was not happening I tried with Boost_1.84 version.
I am attaching the ss, same error came with Boost_1.83.
SS of the version changes.
My genuine doubt is that if I am giving the -I/ path to boost/ then does it matter that my system has any other boost version as default.
The error message shows the header files are included from /usr/local/...
which is not what you want if you are passing -I/home/evsnotify/boost_1_84_0
. (note you are passing an extra /boost to the path which should be removed).
Anyways, I think after updating Boost, the error message that you are facing now is because of using an old GCC version: https://godbolt.org/z/9jEjGaG7r Please try to update GCC to at least version 5.
If it is not possible to upgrade your compiler, you can replace these lines:
return res;
With:
return std::move(res);
I think this might resolve this specific issue.
Hi, Thankyou after installing the latest version of GCC Compiler, half problem was solved and after that when I ran a command to enable the scl then finally it compiled. But now when I am trying to connect through an online application of Rested (giving the same inputs as when I gave in the command line side, it's not responding. Can you please help me with the same.
It is hard to guess what might be wrong. try to debug each step in the application and see if you are accepting any connections or not.
Thankyou so much for the help.
PLEASE DON'T FORGET TO "STAR" THIS REPOSITORY :)
When reporting a bug please include the following:
Version of Beast
boost_1_82_0 version
Steps necessary to reproduce the problem
Only run on any centos 9 machine
All relevant compiler information
I tried with "g++ advanced_server.cpp -lpthread -lboost_system -lboost_filesystem -lboost_coroutine -o websock" and "g++ advanced_server.cpp -lpthread -lboost_system -lboost_filesystem -lboost_coroutine -I/home/beast-develop/include/boost -o websock" but error is persistent.
I have also replaced the file of "message_generator.hpp" in all the available places.
The more information you provide the sooner your issue can get resolved!