From c09221f357effe1a5a0fc0e7d7902eba1ab0484d Mon Sep 17 00:00:00 2001 From: Rich E Date: Thu, 22 Apr 2021 15:10:31 -0400 Subject: [PATCH 1/5] fix: fix LOG call syntax (#301) Related: https://github.com/socketio/socket.io-client-cpp/issues/212 --- src/internal/sio_client_impl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/internal/sio_client_impl.cpp b/src/internal/sio_client_impl.cpp index 2eab3ad5..5b331f23 100644 --- a/src/internal/sio_client_impl.cpp +++ b/src/internal/sio_client_impl.cpp @@ -286,7 +286,7 @@ namespace sio if(ec || m_con.expired()) { if (ec != asio::error::operation_aborted) - LOG("ping exit,con is expired?"<expires_from_now(milliseconds(m_ping_interval), ec); - if(ec)LOG("ec:"<async_wait(std::bind(&client_impl::ping,this, std::placeholders::_1)); LOG("On handshake,sid:"< Date: Thu, 22 Apr 2021 15:11:08 -0400 Subject: [PATCH 2/5] fix: fix ASIO_STANDALONE release build trying to use boost::random (#301) --- src/internal/sio_client_impl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/internal/sio_client_impl.h b/src/internal/sio_client_impl.h index 577b1dd2..735fe502 100644 --- a/src/internal/sio_client_impl.h +++ b/src/internal/sio_client_impl.h @@ -4,7 +4,7 @@ #include #ifdef _WIN32 #define _WEBSOCKETPP_CPP11_THREAD_ -//#define _WEBSOCKETPP_CPP11_RANDOM_DEVICE_ +#define _WEBSOCKETPP_CPP11_RANDOM_DEVICE_ #define _WEBSOCKETPP_NO_CPP11_FUNCTIONAL_ #define INTIALIZER(__TYPE__) #else From 71897e8ed8f7c60214ac86c392c61bc1d7439c73 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 12 Oct 2021 10:32:33 +0200 Subject: [PATCH 3/5] feat: support TLSv1.2 and newer Backported from master: https://github.com/socketio/socket.io-client-cpp/commit/82d39a90ef118500a0329d214eec331db983bd74 --- src/internal/sio_client_impl.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/internal/sio_client_impl.cpp b/src/internal/sio_client_impl.cpp index 5b331f23..c7568874 100644 --- a/src/internal/sio_client_impl.cpp +++ b/src/internal/sio_client_impl.cpp @@ -577,11 +577,12 @@ namespace sio #if SIO_TLS client_impl::context_ptr client_impl::on_tls_init(connection_hdl conn) { - context_ptr ctx = context_ptr(new asio::ssl::context(asio::ssl::context::tlsv1)); + context_ptr ctx = context_ptr(new asio::ssl::context(asio::ssl::context::tls)); asio::error_code ec; ctx->set_options(asio::ssl::context::default_workarounds | - asio::ssl::context::no_sslv2 | - asio::ssl::context::single_dh_use,ec); + asio::ssl::context::no_tlsv1 | + asio::ssl::context::no_tlsv1_1 | + asio::ssl::context::single_dh_use,ec); if(ec) { cerr<<"Init tls failed,reason:"<< ec.message()< Date: Sat, 14 Sep 2024 09:12:01 +0800 Subject: [PATCH 4/5] support sleep baby --- examples/Console/main.cpp | 231 +++++++++++++++++++++++--------------- 1 file changed, 139 insertions(+), 92 deletions(-) diff --git a/examples/Console/main.cpp b/examples/Console/main.cpp index 9a95dfb2..971b9d88 100755 --- a/examples/Console/main.cpp +++ b/examples/Console/main.cpp @@ -26,6 +26,10 @@ #define MAIN_FUNC int main(int argc ,const char* args[]) #endif +#include + +using json = nlohmann::json; + using namespace sio; using namespace std; std::mutex _lock; @@ -33,6 +37,111 @@ std::mutex _lock; std::condition_variable_any _cond; bool connect_finish = false; +sio::message::ptr createObject(json o); + +nlohmann::json createJson(sio::message::ptr sio) +{ + // return json + nlohmann::json json; + + try { + // browse flags, we consider it can only be array/vector or object/map + if (sio->get_flag() == sio::message::flag_array) { + for (int i = 0; i < int(sio->get_vector().size()); ++i) { + if (sio->get_vector()[i]->get_flag() == sio::message::flag_object || + sio->get_vector()[i]->get_flag() == sio::message::flag_array) { + json[i] = createJson(sio->get_vector()[i]); + } else if (sio->get_vector()[i]->get_flag() == sio::message::flag_integer) { + json[i] = sio->get_vector()[i]->get_int(); + } else if (sio->get_vector()[i]->get_flag() == sio::message::flag_double) { + json[i] = sio->get_vector()[i]->get_double(); + } else if (sio->get_vector()[i]->get_flag() == sio::message::flag_string) { + json[i] = sio->get_vector()[i]->get_string(); + } else if (sio->get_vector()[i]->get_flag() == sio::message::flag_boolean) { + json[i] = (sio->get_vector()[i]->get_bool() ? "true" : "false"); + } else if (sio->get_vector()[i]->get_flag() == sio::message::flag_null) { + // json[i] = "null"; // do not set json[i] so that it's set to json-null properly + } else { + std::cout << "Unknown flag in vector: " << sio->get_flag() << ", i is " << i << std::endl; + } + } + } else if (sio->get_flag() == sio::message::flag_object) { + for (auto it = sio->get_map().cbegin(); it != sio->get_map().cend(); ++it) { + if (it->second->get_flag() == sio::message::flag_object || + it->second->get_flag() == sio::message::flag_array) { + json[it->first] = createJson(it->second); + } else if (it->second->get_flag() == sio::message::flag_integer) { + json[it->first] = it->second->get_int(); + } else if (it->second->get_flag() == sio::message::flag_double) { + json[it->first] = it->second->get_double(); + } else if (it->second->get_flag() == sio::message::flag_string) { + json[it->first] = it->second->get_string(); + } else if (it->second->get_flag() == sio::message::flag_boolean) { + json[it->first] = it->second->get_bool(); + } else if (it->second->get_flag() == sio::message::flag_null) { + // json[it->first] = "null"; // do not set json[i] so that it's set to json-null properly + } else { + std::cout << "Unknown flag in object: " << sio->get_flag() << ", it first is " << it->first << std::endl; + } + } + } else { + std::cout << "Unknown flag in createJson function: " << sio->get_flag() << std::endl; + } + } catch (nlohmann::json::exception &e) { + std::cout << "JSON exception caught in " << __FUNCTION__ << " (message: " << e.what() << ")" << std::endl; + } + + // return + return json; +} + +sio::message::ptr createArray(json o) +{ + sio::message::ptr array = array_message::create(); + + for (json::iterator it = o.begin(); it != o.end(); ++it) { + + auto v = it.value(); + if (v.is_boolean()) { + array->get_vector().push_back(bool_message::create(v.get())); + } else if (v.is_number_integer()) { + array->get_vector().push_back(int_message::create(v.get())); + } else if (v.is_string()) { + array->get_vector().push_back(string_message::create(v.get())); + } else if (v.is_array()) { + array->get_vector().push_back(createArray(v)); + } else if (v.is_object()) { + array->get_vector().push_back(createObject(v)); + } + } + return array; +} + +sio::message::ptr createObject(json o) +{ + sio::message::ptr object = object_message::create(); + + for (json::iterator it = o.begin(); it != o.end(); ++it) { + auto key = it.key(); + auto v = it.value(); + + if (v.is_boolean()) { + object->get_map()[key] = bool_message::create(v.get()); + } else if (v.is_number_integer()) { + object->get_map()[key] = int_message::create(v.get()); + } else if (v.is_string()) { + object->get_map()[key] = string_message::create(v.get()); + } else if (v.is_array()) { + json childObject = v; + object->get_map()[key] = createArray(v); + } else if (v.is_object()) { + json childObject = v; + object->get_map()[key] = createObject(childObject); + } + } + return object; +} + class connection_listener { sio::client &handler; @@ -71,115 +180,53 @@ socket::ptr current_socket; void bind_events() { - current_socket->on("new message", sio::socket::event_listener_aux([&](string const& name, message::ptr const& data, bool isAck,message::list &ack_resp) - { - _lock.lock(); - string user = data->get_map()["username"]->get_string(); - string message = data->get_map()["message"]->get_string(); - EM(user<<":"<on("user joined",sio::socket::event_listener_aux([&](string const& name, message::ptr const& data, bool isAck,message::list &ack_resp) - { - _lock.lock(); - string user = data->get_map()["username"]->get_string(); - participants = data->get_map()["numUsers"]->get_int(); - bool plural = participants !=1; - - // abc " - HIGHLIGHT(user<<" joined"<<"\nthere"<<(plural?" are ":"'s ")<< participants<<(plural?" participants":" participant")); - _lock.unlock(); - })); - current_socket->on("user left", sio::socket::event_listener_aux([&](string const& name, message::ptr const& data, bool isAck,message::list &ack_resp) - { - _lock.lock(); - string user = data->get_map()["username"]->get_string(); - participants = data->get_map()["numUsers"]->get_int(); - bool plural = participants !=1; - HIGHLIGHT(user<<" left"<<"\nthere"<<(plural?" are ":"'s ")<< participants<<(plural?" participants":" participant")); - _lock.unlock(); - })); + current_socket->on("data_RT", sio::socket::event_listener_aux([&](string const& name, message::ptr const& data, bool isAck,message::list &ack_resp) + { + std::cout << "data_RT" << std::endl; + std::cout << "flag:" << data->get_flag() <get_flag() == sio::message::flag_object ) { + nlohmann::json j_data; + j_data = createJson(data); + std::cout << "data:" << j_data << std::endl; + } + })); + + return; } MAIN_FUNC { - sio::client h; connection_listener l(h); h.set_open_listener(std::bind(&connection_listener::on_connected, &l)); h.set_close_listener(std::bind(&connection_listener::on_close, &l,std::placeholders::_1)); h.set_fail_listener(std::bind(&connection_listener::on_fail, &l)); - h.connect("http://127.0.0.1:3000"); + + h.connect("ws://openapi.sleepthing.com"); + + std::cout<<"Do Try Connect ..."<on("login", sio::socket::event_listener_aux([&](string const& name, message::ptr const& data, bool isAck,message::list &ack_resp){ - _lock.lock(); - participants = data->get_map()["numUsers"]->get_int(); - bool plural = participants !=1; - HIGHLIGHT("Welcome to Socket.IO Chat-\nthere"<<(plural?" are ":"'s ")<< participants<<(plural?" participants":" participant")); - _cond.notify_all(); - _lock.unlock(); - current_socket->off("login"); - })); - current_socket->emit("add user", nickname); + + bind_events(); + + json j; + j["clientID"] = "B03508EE8A334D81"; + + sio::message::ptr object = createObject(j); + current_socket->emit("ASK_JOIN_C", object); + _lock.lock(); - if (participants<0) { - _cond.wait(_lock); - } + _cond.wait(_lock); _lock.unlock(); - bind_events(); - - HIGHLIGHT("Start to chat,commands:\n'$exit' : exit chat\n'$nsp ' : change namespace"); - for (std::string line; std::getline(std::cin, line);) { - if(line.length()>0) - { - if(line == "$exit") - { - break; - } - else if(line.length() > 5&&line.substr(0,5) == "$nsp ") - { - string new_nsp = line.substr(5); - if(new_nsp == current_socket->get_namespace()) - { - continue; - } - current_socket->off_all(); - current_socket->off_error(); - //per socket.io, default nsp should never been closed. - if(current_socket->get_namespace() != "/") - { - current_socket->close(); - } - current_socket = h.socket(new_nsp); - bind_events(); - //if change to default nsp, we do not need to login again (since it is not closed). - if(current_socket->get_namespace() == "/") - { - continue; - } - goto Login; - } - current_socket->emit("new message", line); - _lock.lock(); - EM("\t\t\t"< Date: Sat, 14 Sep 2024 10:30:01 +0800 Subject: [PATCH 5/5] support https --- examples/Console/CMakeLists.txt | 6 +++--- examples/Console/main.cpp | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/examples/Console/CMakeLists.txt b/examples/Console/CMakeLists.txt index 907c5d18..219f84e5 100644 --- a/examples/Console/CMakeLists.txt +++ b/examples/Console/CMakeLists.txt @@ -1,10 +1,10 @@ cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR) -include(${CMAKE_CURRENT_SOURCE_DIR}/../../CMakeLists.txt) +# include(${CMAKE_CURRENT_SOURCE_DIR}/../../CMakeLists.txt) add_executable(sio_console_demo main.cpp) set_property(TARGET sio_console_demo PROPERTY CXX_STANDARD 11) set_property(TARGET sio_console_demo PROPERTY CXX_STANDARD_REQUIRED ON) -target_link_libraries(sio_console_demo sioclient) -target_link_libraries(sio_console_demo pthread ) +target_link_libraries(sio_console_demo sioclient_tls) +target_link_libraries(sio_console_demo pthread ssl crypto) message(STATUS ${Boost_INCLUDE_DIRS} ) #target_include_directories(sio_console_demo PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../src" ${Boost_INCLUDE_DIRS} ) diff --git a/examples/Console/main.cpp b/examples/Console/main.cpp index 971b9d88..d0e235f4 100755 --- a/examples/Console/main.cpp +++ b/examples/Console/main.cpp @@ -203,7 +203,7 @@ MAIN_FUNC h.set_close_listener(std::bind(&connection_listener::on_close, &l,std::placeholders::_1)); h.set_fail_listener(std::bind(&connection_listener::on_fail, &l)); - h.connect("ws://openapi.sleepthing.com"); + h.connect("https://openapi.sleepthing.com"); std::cout<<"Do Try Connect ..."<