0

webscokettpp c++​​ クライアントを使用して、Web サーバーから投稿されたデータを読み取ります。c++ クライアント dll を呼び出してソケットにポストされたデータを取得および表示するテスト ボタンを備えた ac# UI アプリケーションがあります。テスト ボタンがクリックされると、データが 2 回目の UI に適切に投稿されます。既存の接続を閉じて、新しい接続を開いて結果を再度取得します。しかし、最初の実行後、プログラムは決して c.run(); から戻りません。次のコードで。https://github.com/zaphoyd/websocketpp/blob/master/examples/echo_client/echo_client.cppの例を使用しています

 #include <websocketpp/config/asio_no_tls_client.hpp>
 #include <websocketpp/client.hpp>

 #include <iostream>

    typedef websocketpp::client<websocketpp::config::asio_client> client;

    using websocketpp::lib::placeholders::_1;
    using websocketpp::lib::placeholders::_2;
    using websocketpp::lib::bind;

    // pull out the type of messages sent by our config
    typedef websocketpp::config::asio_client::message_type::ptr message_ptr;

    // This message handler will be invoked once for each incoming message. It
    // prints the message and then sends a copy of the message back to the server.
    void on_message(client* c, websocketpp::connection_hdl hdl, message_ptr msg) {
        std::cout << "on_message called with hdl: " << hdl.lock().get()
                  << " and message: " << msg->get_payload()
                  << std::endl;

         if(pt.get<std::string>("test") = "close" ){
          //Code reaches here after end of first run but never comes out of c.run()
            c->close(hdl, websocketpp::close::status::normal, "Success");
            hdl.reset();
         }

        websocketpp::lib::error_code ec;

        c->send(hdl, msg->get_payload(), msg->get_opcode(), ec);
        if (ec) {
            std::cout << "Echo failed because: " << ec.message() << std::endl;
        }
    }

    int main(int argc, char* argv[]) {
        // Create a client endpoint
        client c;

        std::string uri = "ws://localhost:9002";

        if (argc == 2) {
            uri = argv[1];
        }

        try {
            // Set logging to be pretty verbose (everything except message payloads)
            c.set_access_channels(websocketpp::log::alevel::all);
            c.clear_access_channels(websocketpp::log::alevel::frame_payload);

            // Initialize ASIO
            c.init_asio();

            // Register our message handler
            c.set_message_handler(bind(&on_message,&c,::_1,::_2));

            websocketpp::lib::error_code ec;
            client::connection_ptr con = c.get_connection(uri, ec);
            if (ec) {
                std::cout << "could not create connection because: " << ec.message() << std::endl;
                return 0;
            }

            // Note that connect here only requests a connection. No network messages are
            // exchanged until the event loop starts running in the next line.
            c.connect(con);

            // Start the ASIO io_service run loop
            // this will cause a single connection to be made to the server. c.run()
            // will exit when this connection is closed.
            c.run();
        } catch (websocketpp::exception const & e) {
            std::cout << e.what() << std::endl;
        }
    }

条件 if(pt.get("test") = "close" ) が発生したときに c.run() から出るメイン メソッドへの方法を見つけようとしています。

4

1 に答える 1