| | |
| | | #define ASIO_STANDALONE 1 |
| | | #include <websocketpp/client.hpp> |
| | | #include <websocketpp/common/thread.hpp> |
| | | #include <websocketpp/config/asio_no_tls_client.hpp> |
| | | #include <websocketpp/config/asio_client.hpp> |
| | | |
| | | #include "audio.h" |
| | | #include "nlohmann/json.hpp" |
| | |
| | | #endif |
| | | } |
| | | typedef websocketpp::config::asio_client::message_type::ptr message_ptr; |
| | | typedef websocketpp::lib::shared_ptr<websocketpp::lib::asio::ssl::context> |
| | | context_ptr; |
| | | using websocketpp::lib::bind; |
| | | using websocketpp::lib::placeholders::_1; |
| | | using websocketpp::lib::placeholders::_2; |
| | | context_ptr on_tls_init(websocketpp::connection_hdl) { |
| | | context_ptr ctx = websocketpp::lib::make_shared<asio::ssl::context>( |
| | | asio::ssl::context::sslv23); |
| | | |
| | | try { |
| | | ctx->set_options( |
| | | asio::ssl::context::default_workarounds | asio::ssl::context::no_sslv2 | |
| | | asio::ssl::context::no_sslv3 | asio::ssl::context::single_dh_use); |
| | | |
| | | } catch (std::exception& e) { |
| | | std::cout << e.what() << std::endl; |
| | | } |
| | | return ctx; |
| | | } |
| | | // template for tls or not config |
| | | template <typename T> |
| | | class websocket_client { |
| | | public: |
| | | typedef websocketpp::client<websocketpp::config::asio_client> client; |
| | | // typedef websocketpp::client<T> client; |
| | | // typedef websocketpp::client<websocketpp::config::asio_tls_client> |
| | | // wss_client; |
| | | typedef websocketpp::lib::lock_guard<websocketpp::lib::mutex> scoped_lock; |
| | | |
| | | websocket_client() : m_open(false), m_done(false) { |
| | | websocket_client(int is_ssl) : m_open(false), m_done(false) { |
| | | // set up access channels to only log interesting things |
| | | |
| | | m_client.clear_access_channels(websocketpp::log::alevel::all); |
| | | m_client.set_access_channels(websocketpp::log::alevel::connect); |
| | | m_client.set_access_channels(websocketpp::log::alevel::disconnect); |
| | |
| | | } |
| | | } |
| | | // This method will block until the connection is complete |
| | | |
| | | void run(const std::string& uri, const std::string& wav_path) { |
| | | // Create a new connection to the given URI |
| | | websocketpp::lib::error_code ec; |
| | | client::connection_ptr con = m_client.get_connection(uri, ec); |
| | | typename websocketpp::client<T>::connection_ptr con = |
| | | m_client.get_connection(uri, ec); |
| | | if (ec) { |
| | | m_client.get_alog().write(websocketpp::log::alevel::app, |
| | | "Get Connection Error: " + ec.message()); |
| | |
| | | m_client.connect(con); |
| | | |
| | | // Create a thread to run the ASIO io_service event loop |
| | | websocketpp::lib::thread asio_thread(&client::run, &m_client); |
| | | websocketpp::lib::thread asio_thread(&websocketpp::client<T>::run, |
| | | &m_client); |
| | | |
| | | send_wav_data(); |
| | | asio_thread.join(); |
| | |
| | | ec); |
| | | wait_a_bit(); |
| | | } |
| | | websocketpp::client<T> m_client; |
| | | |
| | | private: |
| | | client m_client; |
| | | websocketpp::connection_hdl m_hdl; |
| | | websocketpp::lib::mutex m_lock; |
| | | std::string wav_path; |
| | |
| | | }; |
| | | |
| | | int main(int argc, char* argv[]) { |
| | | if (argc < 5) { |
| | | printf("Usage: %s server_ip port wav_path threads_num\n", argv[0]); |
| | | if (argc < 6) { |
| | | printf("Usage: %s server_ip port wav_path threads_num is_ssl\n", argv[0]); |
| | | exit(-1); |
| | | } |
| | | std::string server_ip = argv[1]; |
| | | std::string port = argv[2]; |
| | | std::string wav_path = argv[3]; |
| | | int threads_num = atoi(argv[4]); |
| | | int is_ssl = atoi(argv[5]); |
| | | std::vector<websocketpp::lib::thread> client_threads; |
| | | |
| | | std::string uri = "ws://" + server_ip + ":" + port; |
| | | std::string uri = ""; |
| | | if (is_ssl == 1) { |
| | | uri = "wss://" + server_ip + ":" + port; |
| | | } else { |
| | | uri = "ws://" + server_ip + ":" + port; |
| | | } |
| | | |
| | | for (size_t i = 0; i < threads_num; i++) { |
| | | client_threads.emplace_back([uri, wav_path]() { |
| | | websocket_client c; |
| | | c.run(uri, wav_path); |
| | | client_threads.emplace_back([uri, wav_path, is_ssl]() { |
| | | if (is_ssl == 1) { |
| | | websocket_client<websocketpp::config::asio_tls_client> c(is_ssl); |
| | | |
| | | c.m_client.set_tls_init_handler(bind(&on_tls_init, ::_1)); |
| | | |
| | | c.run(uri, wav_path); |
| | | } else { |
| | | websocket_client<websocketpp::config::asio_client> c(is_ssl); |
| | | |
| | | c.run(uri, wav_path); |
| | | } |
| | | }); |
| | | } |
| | | |