jeudi 24 décembre 2015

Using Autobahn|CPP to connect to API

I'm trying to use Autobahn|CPP in my C++-Program. I tried to run their example code from here. I've modified it a little bit (basically I just hardcoded the IP-Adress of the server). But it doesn't run. The error codes are very strange and I don't understand them. This is the code:

#include <autobahn/autobahn.hpp>
#include <boost/asio.hpp>
#include <iostream>
#include <memory>
#include <tuple>

void topic1(const autobahn::wamp_event& event)
{
    std::cerr << "received event: " << event.argument<uint64_t>(0) << std::endl;
}

int main()
{
    try {


        boost::asio::io_service io;
        boost::asio::ip::tcp::socket socket(io);

        auto session = std::make_shared<
                autobahn::wamp_session<boost::asio::ip::tcp::socket,
                boost::asio::ip::tcp::socket>>(io, socket, socket, true);


        boost::future<void> start_future;
        boost::future<void> join_future;

        boost::asio::ip::tcp::endpoint m_rawsocket_endpoint;
        m_rawsocket_endpoint = boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("173.236.42.218"), 80);


        socket.async_connect(m_rawsocket_endpoint,
            [&](boost::system::error_code ec) {
                if (!ec) {
                    std::cerr << "connected to server" << std::endl;

                    start_future = session->start().then([&](boost::future<bool> started) {
                        if (started.get()) {
                            std::cerr << "session started" << std::endl;
                            join_future = session->join("realm1").then([&](boost::future<uint64_t> s) {
                                std::cerr << "joined realm: " << s.get() << std::endl;
                                session->subscribe("com.examples.subscriptions.topic1", &topic1);
                            });
                        } else {
                            std::cerr << "failed to start session" << std::endl;
                            io.stop();
                        }
                    });
                } else {
                    std::cerr << "connect failed: " << ec.message() << std::endl;
                    io.stop();
                }
            }
        );

        std::cerr << "starting io service" << std::endl;
        io.run();
        std::cerr << "stopped io service" << std::endl;
    }
    catch (std::exception& e) {
        std::cerr << e.what() << std::endl;
        return 1;
    }
    return 0;
}

My project file (using QtCreator):

TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += main.cpp

QMAKE_CXXFLAGS += -std=c++11 -pthread

LIBS += -lpthread
LIBS += -lboost_system
LIBS += -lboost_random

The errors:

05:46:53: Running steps for project websocket...
05:46:53: Configuration unchanged, skipping qmake step.
05:46:53: Starting: "/usr/bin/make" 
/usr/lib/x86_64-linux-gnu/qt5/bin/qmake -spec linux-g++-64 CONFIG+=debug CONFIG+=declarative_debug CONFIG+=qml_debug -o Makefile ../websocket/websocket.pro
g++ -c -m64 -pipe -std=c++11 -pthread -g -Wall -W -fPIE -DQT_QML_DEBUG -DQT_DECLARATIVE_DEBUG -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I../websocket -I. -o main.o ../websocket/main.cpp
../websocket/main.cpp: In lambda function:
../websocket/main.cpp:43:30: error: no matching function for call to 'boost::future<long unsigned int>::then(main()::__lambda16::__lambda17::__lambda18)'
                             });
                              ^
../websocket/main.cpp:43:30: note: candidates are:
In file included from /usr/include/autobahn/wamp_session.hpp:45:0,
                 from /usr/include/autobahn/autobahn.hpp:36,
                 from ../websocket/main.cpp:1:
/usr/include/boost/thread/future.hpp:1598:9: note: template<class F> boost::future<typename boost::result_of<F(boost::future<R>&)>::type> boost::future<R>::then(F&&) [with F = F; R = long unsigned int]
         then(BOOST_THREAD_FWD_REF(F) func);
         ^
/usr/include/boost/thread/future.hpp:1598:9: note:   template argument deduction/substitution failed:
In file included from /usr/include/autobahn/wamp_session.hpp:45:0,
                 from /usr/include/autobahn/autobahn.hpp:36,
                 from ../websocket/main.cpp:1:
/usr/include/boost/thread/future.hpp: In substitution of 'template<class F> boost::future<typename boost::result_of<F(boost::future<R>&)>::type> boost::future<R>::then(F&&) [with F = F; R = long unsigned int] [with F = main()::__lambda16::__lambda17::__lambda18]':
../websocket/main.cpp:43:30:   required from here
/usr/include/boost/thread/future.hpp:3840:3: error: no type named 'type' in 'struct boost::result_of<main()::__lambda16::__lambda17::__lambda18(boost::future<long unsigned int>&)>'
   BOOST_THREAD_FUTURE<R>::then(BOOST_THREAD_FWD_REF(F) func)
   ^
In file included from /usr/include/autobahn/wamp_session.hpp:45:0,
                 from /usr/include/autobahn/autobahn.hpp:36,
                 from ../websocket/main.cpp:1:
/usr/include/boost/thread/future.hpp:1601:9: note: template<class F> boost::future<typename boost::result_of<F(boost::future<R>&)>::type> boost::future<R>::then(boost::launch, F&&) [with F = F; R = long unsigned int]
         then(launch policy, BOOST_THREAD_FWD_REF(F) func);
         ^
/usr/include/boost/thread/future.hpp:1601:9: note:   template argument deduction/substitution failed:
../websocket/main.cpp:43:30: note:   cannot convert '<lambda closure object>main()::__lambda16::__lambda17::__lambda18{(* & session)}' (type 'main()::__lambda16::__lambda17::__lambda18') to type 'boost::launch'
                             });
                              ^
../websocket/main.cpp: In lambda function:
../websocket/main.cpp:48:22: error: no matching function for call to 'boost::future<bool>::then(main()::__lambda16::__lambda17)'
                     });
                      ^
../websocket/main.cpp:48:22: note: candidates are:
In file included from /usr/include/autobahn/wamp_session.hpp:45:0,
                 from /usr/include/autobahn/autobahn.hpp:36,
                 from ../websocket/main.cpp:1:
/usr/include/boost/thread/future.hpp:1598:9: note: template<class F> boost::future<typename boost::result_of<F(boost::future<R>&)>::type> boost::future<R>::then(F&&) [with F = F; R = bool]
         then(BOOST_THREAD_FWD_REF(F) func);
         ^
/usr/include/boost/thread/future.hpp:1598:9: note:   template argument deduction/substitution failed:
In file included from /usr/include/autobahn/wamp_session.hpp:45:0,
                 from /usr/include/autobahn/autobahn.hpp:36,
                 from ../websocket/main.cpp:1:
/usr/include/boost/thread/future.hpp: In substitution of 'template<class F> boost::future<typename boost::result_of<F(boost::future<R>&)>::type> boost::future<R>::then(F&&) [with F = F; R = bool] [with F = main()::__lambda16::__lambda17]':
../websocket/main.cpp:48:22:   required from here
/usr/include/boost/thread/future.hpp:3840:3: error: no type named 'type' in 'struct boost::result_of<main()::__lambda16::__lambda17(boost::future<bool>&)>'
   BOOST_THREAD_FUTURE<R>::then(BOOST_THREAD_FWD_REF(F) func)
   ^
In file included from /usr/include/autobahn/wamp_session.hpp:45:0,
                 from /usr/include/autobahn/autobahn.hpp:36,
                 from ../websocket/main.cpp:1:
/usr/include/boost/thread/future.hpp:1601:9: note: template<class F> boost::future<typename boost::result_of<F(boost::future<R>&)>::type> boost::future<R>::then(boost::launch, F&&) [with F = F; R = bool]
         then(launch policy, BOOST_THREAD_FWD_REF(F) func);
         ^
/usr/include/boost/thread/future.hpp:1601:9: note:   template argument deduction/substitution failed:
../websocket/main.cpp:48:22: note:   cannot convert '<lambda closure object>main()::__lambda16::__lambda17{(* & join_future), (* & session), (* & io)}' (type 'main()::__lambda16::__lambda17') to type 'boost::launch'
                     });
                      ^
In file included from /usr/include/autobahn/wamp_session.hpp:360:0,
                 from /usr/include/autobahn/autobahn.hpp:36,
                 from ../websocket/main.cpp:1:
/usr/include/autobahn/wamp_session.ipp: In instantiation of 'void autobahn::wamp_session<IStream, OStream>::process_challenge(const wamp_message&) [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; autobahn::wamp_message = std::vector<msgpack::v1::object>]':
/usr/include/autobahn/wamp_session.ipp:1297:38:   required from 'void autobahn::wamp_session<IStream, OStream>::got_message(const msgpack::v1::object&, std::unique_ptr<msgpack::v1::zone>&&) [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]'
/usr/include/autobahn/wamp_session.ipp:1251:54:   required from 'void autobahn::wamp_session<IStream, OStream>::got_message_body(const boost::system::error_code&) [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]'
/usr/include/autobahn/wamp_session.ipp:1225:18:   required from 'void autobahn::wamp_session<IStream, OStream>::got_message_header(const boost::system::error_code&) [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]'
/usr/include/autobahn/wamp_session.ipp:1207:14:   required from 'void autobahn::wamp_session<IStream, OStream>::receive_message() [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]'
/usr/include/autobahn/wamp_session.ipp:189:21:   required from 'void autobahn::wamp_session<IStream, OStream>::got_handshake_reply(const boost::system::error_code&) [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]'
/usr/include/autobahn/wamp_session.ipp:98:13:   required from 'autobahn::wamp_session<IStream, OStream>::start() [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]::__lambda0'
/usr/include/autobahn/wamp_session.ipp:96:28:   required from 'struct autobahn::wamp_session<IStream, OStream>::start() [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]::__lambda0'
/usr/include/autobahn/wamp_session.ipp:100:5:   required from 'boost::future<bool> autobahn::wamp_session<IStream, OStream>::start() [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]'
../websocket/main.cpp:37:51:   required from here
/usr/include/autobahn/wamp_session.ipp:744:25: error: no matching function for call to 'boost::future<autobahn::wamp_authenticate>::then(autobahn::wamp_session<IStream, OStream>::process_challenge(const wamp_message&) [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; autobahn::wamp_message = std::vector<msgpack::v1::object>]::__lambda13)'
     (*context_response) = on_challenge( challenge_object ).then( [=]( boost::future<wamp_authenticate> fu_auth ) {
                         ^
/usr/include/autobahn/wamp_session.ipp:744:25: note: candidates are:
In file included from /usr/include/autobahn/wamp_session.hpp:45:0,
                 from /usr/include/autobahn/autobahn.hpp:36,
                 from ../websocket/main.cpp:1:
/usr/include/boost/thread/future.hpp:1598:9: note: template<class F> boost::future<typename boost::result_of<F(boost::future<R>&)>::type> boost::future<R>::then(F&&) [with F = F; R = autobahn::wamp_authenticate]
         then(BOOST_THREAD_FWD_REF(F) func);
         ^
/usr/include/boost/thread/future.hpp:1598:9: note:   template argument deduction/substitution failed:
In file included from /usr/include/autobahn/wamp_session.hpp:45:0,
                 from /usr/include/autobahn/autobahn.hpp:36,
                 from ../websocket/main.cpp:1:
/usr/include/boost/thread/future.hpp: In substitution of 'template<class F> boost::future<typename boost::result_of<F(boost::future<R>&)>::type> boost::future<R>::then(F&&) [with F = F; R = autobahn::wamp_authenticate] [with F = autobahn::wamp_session<IStream, OStream>::process_challenge(const wamp_message&) [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; autobahn::wamp_message = std::vector<msgpack::v1::object>]::__lambda13]':
/usr/include/autobahn/wamp_session.ipp:744:25:   required from 'void autobahn::wamp_session<IStream, OStream>::process_challenge(const wamp_message&) [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; autobahn::wamp_message = std::vector<msgpack::v1::object>]'
/usr/include/autobahn/wamp_session.ipp:1297:38:   required from 'void autobahn::wamp_session<IStream, OStream>::got_message(const msgpack::v1::object&, std::unique_ptr<msgpack::v1::zone>&&) [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]'
/usr/include/autobahn/wamp_session.ipp:1251:54:   required from 'void autobahn::wamp_session<IStream, OStream>::got_message_body(const boost::system::error_code&) [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]'
/usr/include/autobahn/wamp_session.ipp:1225:18:   required from 'void autobahn::wamp_session<IStream, OStream>::got_message_header(const boost::system::error_code&) [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]'
/usr/include/autobahn/wamp_session.ipp:1207:14:   required from 'void autobahn::wamp_session<IStream, OStream>::receive_message() [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]'
/usr/include/autobahn/wamp_session.ipp:189:21:   required from 'void autobahn::wamp_session<IStream, OStream>::got_handshake_reply(const boost::system::error_code&) [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]'
/usr/include/autobahn/wamp_session.ipp:98:13:   required from 'autobahn::wamp_session<IStream, OStream>::start() [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]::__lambda0'
/usr/include/autobahn/wamp_session.ipp:96:28:   required from 'struct autobahn::wamp_session<IStream, OStream>::start() [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]::__lambda0'
/usr/include/autobahn/wamp_session.ipp:100:5:   required from 'boost::future<bool> autobahn::wamp_session<IStream, OStream>::start() [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]'
../websocket/main.cpp:37:51:   required from here
/usr/include/boost/thread/future.hpp:3840:3: error: no type named 'type' in 'struct boost::result_of<autobahn::wamp_session<IStream, OStream>::process_challenge(const wamp_message&) [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; autobahn::wamp_message = std::vector<msgpack::v1::object>]::__lambda13(boost::future<autobahn::wamp_authenticate>&)>'
   BOOST_THREAD_FUTURE<R>::then(BOOST_THREAD_FWD_REF(F) func)
   ^
In file included from /usr/include/autobahn/wamp_session.hpp:45:0,
                 from /usr/include/autobahn/autobahn.hpp:36,
                 from ../websocket/main.cpp:1:
/usr/include/autobahn/wamp_session.ipp: In instantiation of 'void autobahn::wamp_session<IStream, OStream>::process_challenge(const wamp_message&) [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; autobahn::wamp_message = std::vector<msgpack::v1::object>]':
/usr/include/autobahn/wamp_session.ipp:1297:38:   required from 'void autobahn::wamp_session<IStream, OStream>::got_message(const msgpack::v1::object&, std::unique_ptr<msgpack::v1::zone>&&) [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]'
/usr/include/autobahn/wamp_session.ipp:1251:54:   required from 'void autobahn::wamp_session<IStream, OStream>::got_message_body(const boost::system::error_code&) [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]'
/usr/include/autobahn/wamp_session.ipp:1225:18:   required from 'void autobahn::wamp_session<IStream, OStream>::got_message_header(const boost::system::error_code&) [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]'
/usr/include/autobahn/wamp_session.ipp:1207:14:   required from 'void autobahn::wamp_session<IStream, OStream>::receive_message() [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]'
/usr/include/autobahn/wamp_session.ipp:189:21:   required from 'void autobahn::wamp_session<IStream, OStream>::got_handshake_reply(const boost::system::error_code&) [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]'
/usr/include/autobahn/wamp_session.ipp:98:13:   required from 'autobahn::wamp_session<IStream, OStream>::start() [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]::__lambda0'
/usr/include/autobahn/wamp_session.ipp:96:28:   required from 'struct autobahn::wamp_session<IStream, OStream>::start() [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]::__lambda0'
/usr/include/autobahn/wamp_session.ipp:100:5:   required from 'boost::future<bool> autobahn::wamp_session<IStream, OStream>::start() [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>]'
../websocket/main.cpp:37:51:   required from here
/usr/include/boost/thread/future.hpp:1601:9: note: template<class F> boost::future<typename boost::result_of<F(boost::future<R>&)>::type> boost::future<R>::then(boost::launch, F&&) [with F = F; R = autobahn::wamp_authenticate]
         then(launch policy, BOOST_THREAD_FWD_REF(F) func);
         ^
/usr/include/boost/thread/future.hpp:1601:9: note:   template argument deduction/substitution failed:
In file included from /usr/include/autobahn/wamp_session.hpp:360:0,
                 from /usr/include/autobahn/autobahn.hpp:36,
                 from ../websocket/main.cpp:1:
/usr/include/autobahn/wamp_session.ipp:744:25: note:   cannot convert '<lambda closure object>autobahn::wamp_session<IStream, OStream>::process_challenge(const wamp_message&) [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; autobahn::wamp_message = std::vector<msgpack::v1::object>]::__lambda13{std::shared_ptr<boost::future<void> >((*(const std::shared_ptr<boost::future<void> >*)(& context_response))), ((autobahn::wamp_session<boost::asio::basic_stream_socket<boost::asio::ip::tcp>, boost::asio::basic_stream_socket<boost::asio::ip::tcp> >*)this)}' (type 'autobahn::wamp_session<IStream, OStream>::process_challenge(const wamp_message&) [with IStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; OStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; autobahn::wamp_message = std::vector<msgpack::v1::object>]::__lambda13') to type 'boost::launch'
     (*context_response) = on_challenge( challenge_object ).then( [=]( boost::future<wamp_authenticate> fu_auth ) {
                         ^
make: *** [main.o] Error 1
05:46:57: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project websocket (kit: Desktop)
When executing step 'Make'
05:46:57: Elapsed time: 00:04.

Maybe I have to include another library? I'm already including lboost_system and lboost_random but it seems like I need more. I've never really worked with the boost library so this is pretty hard to find out for me.

Aucun commentaire:

Enregistrer un commentaire