From 7d513e1e11d49a80a50b0aebde4166de2916b91a Mon Sep 17 00:00:00 2001 From: Daniel Pocock Date: Fri, 31 May 2013 14:40:52 +0200 Subject: [PATCH 1/7] Fix typo --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index f4f54e9e16..43a8cf03b8 100644 --- a/readme.md +++ b/readme.md @@ -26,7 +26,7 @@ Major Features * Supports secure WebSockets (TLS), IPv6, and explicit proxies. * Flexible dependency management (C++11 Standard Library or Boost) * Interchangable network transport modules (iostream and Boost Asio) -* Portible, cross platform and architecture design +* Portable, cross platform and architecture design Get Involved ============ @@ -50,4 +50,4 @@ http://groups.google.com/group/websocketpp/ Author ====== -Peter Thorson - websocketpp@zaphoyd.com \ No newline at end of file +Peter Thorson - websocketpp@zaphoyd.com From ca108ac6930dbbbce3471238964393c3f092f736 Mon Sep 17 00:00:00 2001 From: Daniel Pocock Date: Fri, 31 May 2013 14:45:54 +0200 Subject: [PATCH 2/7] Add examples/sip_client based on examples/echo_client --- examples/sip_client/CMakeLists.txt | 11 ++++ examples/sip_client/SConscript | 23 ++++++++ examples/sip_client/echo_client.cpp | 82 +++++++++++++++++++++++++++++ 3 files changed, 116 insertions(+) create mode 100644 examples/sip_client/CMakeLists.txt create mode 100644 examples/sip_client/SConscript create mode 100644 examples/sip_client/echo_client.cpp diff --git a/examples/sip_client/CMakeLists.txt b/examples/sip_client/CMakeLists.txt new file mode 100644 index 0000000000..a3d6d3b2e5 --- /dev/null +++ b/examples/sip_client/CMakeLists.txt @@ -0,0 +1,11 @@ + +file (GLOB SOURCE_FILES *.cpp) +file (GLOB HEADER_FILES *.hpp) + +init_target (echo_client) + +build_executable (${TARGET_NAME} ${SOURCE_FILES} ${HEADER_FILES}) + +link_boost () +final_target () + diff --git a/examples/sip_client/SConscript b/examples/sip_client/SConscript new file mode 100644 index 0000000000..291ade5df0 --- /dev/null +++ b/examples/sip_client/SConscript @@ -0,0 +1,23 @@ +## Main development example +## + +Import('env') +Import('env_cpp11') +Import('boostlibs') +Import('platform_libs') +Import('polyfill_libs') + +env = env.Clone () +env_cpp11 = env_cpp11.Clone () + +prgs = [] + +# if a C++11 environment is avaliable build using that, otherwise use boost +if env_cpp11.has_key('WSPP_CPP11_ENABLED'): + ALL_LIBS = boostlibs(['system'],env_cpp11) + [platform_libs] + [polyfill_libs] + prgs += env_cpp11.Program('echo_client', ["echo_client.cpp"], LIBS = ALL_LIBS) +else: + ALL_LIBS = boostlibs(['system','regex','random'],env) + [platform_libs] + [polyfill_libs] + prgs += env.Program('echo_client', ["echo_client.cpp"], LIBS = ALL_LIBS) + +Return('prgs') diff --git a/examples/sip_client/echo_client.cpp b/examples/sip_client/echo_client.cpp new file mode 100644 index 0000000000..5ce319a9d8 --- /dev/null +++ b/examples/sip_client/echo_client.cpp @@ -0,0 +1,82 @@ +#include + +#include + +#include + +typedef websocketpp::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; + +int case_count = 0; + +void on_message(client* c, websocketpp::connection_hdl hdl, message_ptr msg) { + client::connection_ptr con = c->get_con_from_hdl(hdl); + + if (con->get_resource() == "/getCaseCount") { + std::cout << "Detected " << msg->get_payload() << " test cases." << std::endl; + case_count = atoi(msg->get_payload().c_str()); + } else { + c->send(hdl, msg->get_payload(), msg->get_opcode()); + } +} + +int main(int argc, char* argv[]) { + // Create a server endpoint + client echo_client; + + std::string uri = "ws://localhost:9001"; + + if (argc == 2) { + uri = argv[1]; + } + + try { + // We expect there to be a lot of errors, so suppress them + echo_client.clear_access_channels(websocketpp::log::alevel::all); + echo_client.clear_error_channels(websocketpp::log::elevel::all); + + // Initialize ASIO + echo_client.init_asio(); + + // Register our handlers + echo_client.set_message_handler(bind(&on_message,&echo_client,::_1,::_2)); + + websocketpp::lib::error_code ec; + client::connection_ptr con = echo_client.get_connection(uri+"/getCaseCount", ec); + echo_client.connect(con); + + // Start the ASIO io_service run loop + echo_client.run(); + + std::cout << "case count: " << case_count << std::endl; + + for (int i = 1; i <= case_count; i++) { + echo_client.reset(); + + std::stringstream url; + + url << uri << "/runCase?case=" << i << "&agent=WebSocket++/0.3.0-dev"; + + con = echo_client.get_connection(url.str(), ec); + + echo_client.connect(con); + + echo_client.run(); + } + + std::cout << "done" << std::endl; + + } catch (const std::exception & e) { + std::cout << e.what() << std::endl; + } catch (websocketpp::lib::error_code e) { + std::cout << e.message() << std::endl; + } catch (...) { + std::cout << "other exception" << std::endl; + } +} From a549f2b99e57f1213b010067d2e13cf175c7d174 Mon Sep 17 00:00:00 2001 From: Daniel Pocock Date: Fri, 31 May 2013 14:47:41 +0200 Subject: [PATCH 3/7] Renaming contents of sip_client from echo_client --- examples/sip_client/CMakeLists.txt | 2 +- examples/sip_client/SConscript | 4 ++-- .../{echo_client.cpp => sip_client.cpp} | 24 +++++++++---------- 3 files changed, 15 insertions(+), 15 deletions(-) rename examples/sip_client/{echo_client.cpp => sip_client.cpp} (76%) diff --git a/examples/sip_client/CMakeLists.txt b/examples/sip_client/CMakeLists.txt index a3d6d3b2e5..3ac386d562 100644 --- a/examples/sip_client/CMakeLists.txt +++ b/examples/sip_client/CMakeLists.txt @@ -2,7 +2,7 @@ file (GLOB SOURCE_FILES *.cpp) file (GLOB HEADER_FILES *.hpp) -init_target (echo_client) +init_target (sip_client) build_executable (${TARGET_NAME} ${SOURCE_FILES} ${HEADER_FILES}) diff --git a/examples/sip_client/SConscript b/examples/sip_client/SConscript index 291ade5df0..1ea8b1c5be 100644 --- a/examples/sip_client/SConscript +++ b/examples/sip_client/SConscript @@ -15,9 +15,9 @@ prgs = [] # if a C++11 environment is avaliable build using that, otherwise use boost if env_cpp11.has_key('WSPP_CPP11_ENABLED'): ALL_LIBS = boostlibs(['system'],env_cpp11) + [platform_libs] + [polyfill_libs] - prgs += env_cpp11.Program('echo_client', ["echo_client.cpp"], LIBS = ALL_LIBS) + prgs += env_cpp11.Program('sip_client', ["sip_client.cpp"], LIBS = ALL_LIBS) else: ALL_LIBS = boostlibs(['system','regex','random'],env) + [platform_libs] + [polyfill_libs] - prgs += env.Program('echo_client', ["echo_client.cpp"], LIBS = ALL_LIBS) + prgs += env.Program('sip_client', ["sip_client.cpp"], LIBS = ALL_LIBS) Return('prgs') diff --git a/examples/sip_client/echo_client.cpp b/examples/sip_client/sip_client.cpp similarity index 76% rename from examples/sip_client/echo_client.cpp rename to examples/sip_client/sip_client.cpp index 5ce319a9d8..04803be799 100644 --- a/examples/sip_client/echo_client.cpp +++ b/examples/sip_client/sip_client.cpp @@ -28,7 +28,7 @@ void on_message(client* c, websocketpp::connection_hdl hdl, message_ptr msg) { int main(int argc, char* argv[]) { // Create a server endpoint - client echo_client; + client sip_client; std::string uri = "ws://localhost:9001"; @@ -38,36 +38,36 @@ int main(int argc, char* argv[]) { try { // We expect there to be a lot of errors, so suppress them - echo_client.clear_access_channels(websocketpp::log::alevel::all); - echo_client.clear_error_channels(websocketpp::log::elevel::all); + sip_client.clear_access_channels(websocketpp::log::alevel::all); + sip_client.clear_error_channels(websocketpp::log::elevel::all); // Initialize ASIO - echo_client.init_asio(); + sip_client.init_asio(); // Register our handlers - echo_client.set_message_handler(bind(&on_message,&echo_client,::_1,::_2)); + sip_client.set_message_handler(bind(&on_message,&sip_client,::_1,::_2)); websocketpp::lib::error_code ec; - client::connection_ptr con = echo_client.get_connection(uri+"/getCaseCount", ec); - echo_client.connect(con); + client::connection_ptr con = sip_client.get_connection(uri+"/getCaseCount", ec); + sip_client.connect(con); // Start the ASIO io_service run loop - echo_client.run(); + sip_client.run(); std::cout << "case count: " << case_count << std::endl; for (int i = 1; i <= case_count; i++) { - echo_client.reset(); + sip_client.reset(); std::stringstream url; url << uri << "/runCase?case=" << i << "&agent=WebSocket++/0.3.0-dev"; - con = echo_client.get_connection(url.str(), ec); + con = sip_client.get_connection(url.str(), ec); - echo_client.connect(con); + sip_client.connect(con); - echo_client.run(); + sip_client.run(); } std::cout << "done" << std::endl; From 1dfa629ae46a0a55a3c2ba4770ffb1da89b32bc0 Mon Sep 17 00:00:00 2001 From: Daniel Pocock Date: Fri, 31 May 2013 15:45:34 +0200 Subject: [PATCH 4/7] Sending a SIP OPTIONS message --- examples/sip_client/sip_client.cpp | 58 ++++++++++++++++-------------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/examples/sip_client/sip_client.cpp b/examples/sip_client/sip_client.cpp index 04803be799..916bfce6f2 100644 --- a/examples/sip_client/sip_client.cpp +++ b/examples/sip_client/sip_client.cpp @@ -1,9 +1,13 @@ +#include + #include #include #include +#include + typedef websocketpp::client client; using websocketpp::lib::placeholders::_1; @@ -13,22 +17,31 @@ using websocketpp::lib::bind; // pull out the type of messages sent by our config typedef websocketpp::config::asio_client::message_type::ptr message_ptr; -int case_count = 0; +// Create a server endpoint +client sip_client; -void on_message(client* c, websocketpp::connection_hdl hdl, message_ptr msg) { - client::connection_ptr con = c->get_con_from_hdl(hdl); + +bool received; + +void on_open(websocketpp::connection_hdl hdl) { + // now it is safe to use the connection + std::cout << "connection ready" << std::endl; - if (con->get_resource() == "/getCaseCount") { - std::cout << "Detected " << msg->get_payload() << " test cases." << std::endl; - case_count = atoi(msg->get_payload().c_str()); - } else { - c->send(hdl, msg->get_payload(), msg->get_opcode()); - } + received=false; + // Send a SIP OPTIONS message to the server: + std::string SIP_msg="OPTIONS sip:carol@chicago.com SIP/2.0\r\nVia: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKhjhs8ass877\r\nMax-Forwards: 70\r\nTo: \r\nFrom: Alice ;tag=1928301774\r\nCall-ID: a84b4c76e66710\r\nCSeq: 63104 OPTIONS\r\nContact: \r\nAccept: application/sdp\r\nContent-Length: 0\r\n\r\n"; + sip_client.send(hdl, SIP_msg.c_str(), websocketpp::frame::opcode::text); +} + +void on_message(websocketpp::connection_hdl hdl, message_ptr msg) { + client::connection_ptr con = sip_client.get_con_from_hdl(hdl); + + std::cout << "Received a reply:" << std::endl; + fwrite(msg->get_payload().c_str(), msg->get_payload().size(), 1, stdout); + received=true; } int main(int argc, char* argv[]) { - // Create a server endpoint - client sip_client; std::string uri = "ws://localhost:9001"; @@ -45,29 +58,22 @@ int main(int argc, char* argv[]) { sip_client.init_asio(); // Register our handlers + sip_client.set_open_handler(bind(&on_open,&sip_client,::_1)); sip_client.set_message_handler(bind(&on_message,&sip_client,::_1,::_2)); websocketpp::lib::error_code ec; - client::connection_ptr con = sip_client.get_connection(uri+"/getCaseCount", ec); + client::connection_ptr con = sip_client.get_connection(uri, ec); + + // Specify the SIP subprotocol: + con.add_subprotocol("sip"); + sip_client.connect(con); // Start the ASIO io_service run loop sip_client.run(); - std::cout << "case count: " << case_count << std::endl; - - for (int i = 1; i <= case_count; i++) { - sip_client.reset(); - - std::stringstream url; - - url << uri << "/runCase?case=" << i << "&agent=WebSocket++/0.3.0-dev"; - - con = sip_client.get_connection(url.str(), ec); - - sip_client.connect(con); - - sip_client.run(); + while(!received) { + boost::this_thread::sleep(boost::posix_time::milliseconds(100)); } std::cout << "done" << std::endl; From 3dd3fd28d4cd981ed065ee9b69d9924da508573d Mon Sep 17 00:00:00 2001 From: Daniel Pocock Date: Fri, 31 May 2013 16:45:17 +0200 Subject: [PATCH 5/7] Correct the Via header for WS transport --- examples/sip_client/sip_client.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/sip_client/sip_client.cpp b/examples/sip_client/sip_client.cpp index 916bfce6f2..cb6affd168 100644 --- a/examples/sip_client/sip_client.cpp +++ b/examples/sip_client/sip_client.cpp @@ -29,7 +29,7 @@ void on_open(websocketpp::connection_hdl hdl) { received=false; // Send a SIP OPTIONS message to the server: - std::string SIP_msg="OPTIONS sip:carol@chicago.com SIP/2.0\r\nVia: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKhjhs8ass877\r\nMax-Forwards: 70\r\nTo: \r\nFrom: Alice ;tag=1928301774\r\nCall-ID: a84b4c76e66710\r\nCSeq: 63104 OPTIONS\r\nContact: \r\nAccept: application/sdp\r\nContent-Length: 0\r\n\r\n"; + std::string SIP_msg="OPTIONS sip:carol@chicago.com SIP/2.0\r\nVia: SIP/2.0/WS df7jal23ls0d.invalid;rport;branch=z9hG4bKhjhs8ass877\r\nMax-Forwards: 70\r\nTo: \r\nFrom: Alice ;tag=1928301774\r\nCall-ID: a84b4c76e66710\r\nCSeq: 63104 OPTIONS\r\nContact: \r\nAccept: application/sdp\r\nContent-Length: 0\r\n\r\n"; sip_client.send(hdl, SIP_msg.c_str(), websocketpp::frame::opcode::text); } From 45e305b5c25b9caf7185ea3937ed25ed52bfc7e0 Mon Sep 17 00:00:00 2001 From: Daniel Pocock Date: Fri, 31 May 2013 16:56:27 +0200 Subject: [PATCH 6/7] Fixes for sip_client new 0.3 API --- examples/sip_client/sip_client.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/sip_client/sip_client.cpp b/examples/sip_client/sip_client.cpp index cb6affd168..3a4de786f3 100644 --- a/examples/sip_client/sip_client.cpp +++ b/examples/sip_client/sip_client.cpp @@ -23,7 +23,7 @@ client sip_client; bool received; -void on_open(websocketpp::connection_hdl hdl) { +void on_open(client* c, websocketpp::connection_hdl hdl) { // now it is safe to use the connection std::cout << "connection ready" << std::endl; @@ -33,7 +33,7 @@ void on_open(websocketpp::connection_hdl hdl) { sip_client.send(hdl, SIP_msg.c_str(), websocketpp::frame::opcode::text); } -void on_message(websocketpp::connection_hdl hdl, message_ptr msg) { +void on_message(client* c, websocketpp::connection_hdl hdl, message_ptr msg) { client::connection_ptr con = sip_client.get_con_from_hdl(hdl); std::cout << "Received a reply:" << std::endl; @@ -65,7 +65,7 @@ int main(int argc, char* argv[]) { client::connection_ptr con = sip_client.get_connection(uri, ec); // Specify the SIP subprotocol: - con.add_subprotocol("sip"); + con->add_subprotocol("sip"); sip_client.connect(con); From de4ad9e7f3aebf81f86e40cfe56f5dca0e6b882d Mon Sep 17 00:00:00 2001 From: Daniel Pocock Date: Fri, 31 May 2013 16:59:06 +0200 Subject: [PATCH 7/7] Add README for sip_client --- examples/sip_client/README.txt | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 examples/sip_client/README.txt diff --git a/examples/sip_client/README.txt b/examples/sip_client/README.txt new file mode 100644 index 0000000000..ce3271c332 --- /dev/null +++ b/examples/sip_client/README.txt @@ -0,0 +1,22 @@ + + +Checkout the project from git + +At the top level, run cmake: + + cmake -G 'Unix Makefiles' \ + -D BUILD_EXAMPLES=ON \ + -D WEBSOCKETPP_ROOT=/tmp/cm1 \ + -D ENABLE_CPP11=OFF . + +and then make the example: + + make -C examples/sip_client + +Now run it: + + bin/sip_client ws://ws-server:80 + +It has been tested against the repro SIP proxy from reSIProcate + + http://www.resiprocate.org/WebRTC_and_SIP_Over_WebSockets