0

以下の構成で crossbar.io ルーターを使用しています。C++ プログラムが session.join() 呼び出しでスタックしているようです。

    {
       "controller": {
       },
       "workers": [
          {
             "type": "router",
             "realms": [
             {
                "name" : "thinqbot",
                "permissions": [
                            {
                               "uri": "*",
                   "join" : true,
                               "publish": true,
                               "subscribe": true,
                               "call": true,
                               "register": true
                            }
                         ]
             }
         ],
             "transports": [
                {
                   "type": "web",
                   "endpoint":
               {
                      "type": "tcp",
                      "port": 8080
                   },
                   "paths": {
                      "/": {
                         "type": "static",
                         "directory": ".."
                      },
                      "ws": {
                         "type": "websocket"
                      }
                   }
                },
            {
                   "type": "rawsocket",
                   "serializer" : "json",
                   "endpoint":
               {
                      "type": "unix",
              "path" : "/home/rk/router.sock"
                   }
            },
            {
                   "type": "rawsocket",
                   "serializer" : "json",
                   "endpoint":
               {
                      "type": "tcp",
                      "port": 8082
                   }
            }
             ]
          }
       ]
    }

対応する C++ コード。

int 
main (int ac, char **av, char **env) 
{
   try 
   {
      asio::io_service io;
      tcp::socket socket(io);
      tcp::resolver resolver(io);
      auto endpoint_iterator = resolver.resolve({"127.0.0.1", "8082"});
      bool debug = true;
      autobahn::session<tcp::socket, tcp::socket> session(io, socket, socket, debug);
      future<void> session_future;
      std::cerr<<"\nTrying to connect to server ...";
      boost::asio::async_connect(socket, endpoint_iterator,
         [&](boost::system::error_code ec, tcp::resolver::iterator){
     if(!ec){
     std::cerr << "\nConnected to server" << endl;
     session.start();
     std::cerr<<"\nSession started.";
     session_future = session.join("realm1").then([&](future<uint64_t> s){
         std::cerr << "\nSession joined to realm with session ID " << s.get() << endl;
         auto c0 = session.call("com.thinqbot.ping")
         .then([](future<any> f){
             std::cerr<<"\nping() invoked successfully";
             });
         c0.wait();
         auto finish = when_all(std::move(c0));
         finish.then([&](decltype(finish)){
             session.publish("com.thinqbot.hello");
             std::cerr<<"\nhello event published";
             session.leave().then([&](future<string> reason){
                 std::cerr << "\nSession left [" << reason.get() << "]" << endl;
                 io.stop();
                 }).wait();
             });
         });
     } else {
               std::cerr << "\nCould not connect to server: " << ec.message() << endl;
            }
         }
      );
      io.run();
   }
   catch (std::exception& e) 
   {
      std::cerr << e.what() << endl;
      return 1;
   }
   return 0;
}

ルーターにログオンします。2014-09-15 14:05:31+0530 [コントローラー 3457] ログを開きました。

2014-09-15 14:05:31+0530 [コントローラー 3457] ============================ Crossbar.io = =============================

2014-09-15 14:05:31+0530 [コントローラー 3457] Crossbar.io 0.9.7-6 開始

2014-09-15 14:05:31+0530 [コントローラー 3457] 最適な Twisted リアクターを自動的に選択

2014-09-15 14:05:31+0530 [コントローラー 3457] ツイスト リアクターの実行 twisted.internet.epollreactor.EPollReactor

2014-09-15 14:05:31+0530 [コントローラー 3457] EPollReactor リアクターを使用して CPython で実行

2014-09-15 14:05:31+0530 [コントローラ 3457] ノード ディレクトリから開始 /home/rk/work/wamp/.crossbar

2014-09-15 14:05:31+0530 [コントローラー 3457] ローカル構成 '/home/rk/work/wamp/.crossbar/config.json' から開始

2014-09-15 14:05:31+0530 [コントローラー 3457] 環境で WAMPlets が検出されませんでした。

2014-09-15 14:05:31+0530 [コントローラー 3457] ID 'worker1' でルーターを起動しています..

2014-09-15 14:05:31+0530 [ルーター 3460] ログを開きました。

2014-09-15 14:05:31+0530 [ルーター 3460] EPollReactor リアクターを使用して CPython で実行

2014-09-15 14:05:31+0530 [ルーター 3460] イベント ループに入る..

2014-09-15 14:05:31+0530 [コントローラー 3457] ID 'worker1' および PID 3460 のルーターが開始されました

2014-09-15 14:05:31+0530 [コントローラー 3457] ルーター 'worker1': レルム 'realm1' が開始されました

2014-09-15 14:05:31+0530 [ルーター 3460] 8080 で始まるサイト

2014-09-15 14:05:31+0530 [コントローラー 3457] ルーター 'worker1': トランスポート 'transport1' が開始されました

2014-09-15 14:05:31+0530 [Router 3460] u'/home/rk/router.sock' で始まる CrossbarWampRawSocketServerFactory

2014-09-15 14:05:31+0530 [コントローラー 3457] ルーター 'worker1': トランスポート 'transport2' が開始されました

2014-09-15 14:05:31+0530 [ルーター 3460] 8082 から始まる CrossbarWampRawSocketServerFactory

2014-09-15 14:05:31+0530 [コントローラー 3457] ルーター 'worker1': トランスポート 'transport3' が開始されました

4

1 に答える 1

0

クライアントとルーターの間でシリアライゼーションの不一致がありました。ルーターは json を予期していましたが、クライアントは msgpack を送信していました。C++ クライアントを使用する場合は、シリアライザーを msgpack に変更する必要があります。クロスバー msgpack シリアライザーをインストールする必要があります。より詳細なエラー レポートを作成するには、構成のトランスポート スタンザに "debug": true を追加してください。

于 2014-09-16T11:07:10.723 に答える