From 1c775cb759e670ca23aea25d423d90cbba336f11 Mon Sep 17 00:00:00 2001 From: Benjamin Sergeant Date: Fri, 22 Feb 2019 21:13:56 -0800 Subject: [PATCH] add echo and broadcast server as ws sub-commands --- examples/broadcast_server/.gitignore | 9 --- examples/broadcast_server/CMakeLists.txt | 28 ------- .../broadcast_server/broadcast_server.cpp | 75 ------------------- examples/echo_server/CMakeLists.txt | 28 ------- examples/echo_server/echo_server.cpp | 68 ----------------- makefile | 2 +- ws/CMakeLists.txt | 4 +- ws/docker_build.sh | 2 + ws/ws.cpp | 18 +++++ ws/ws_broadcast_server.cpp | 72 ++++++++++++++++++ ws/ws_echo_server.cpp | 68 +++++++++++++++++ 11 files changed, 164 insertions(+), 210 deletions(-) delete mode 100644 examples/broadcast_server/.gitignore delete mode 100644 examples/broadcast_server/CMakeLists.txt delete mode 100644 examples/broadcast_server/broadcast_server.cpp delete mode 100644 examples/echo_server/CMakeLists.txt delete mode 100644 examples/echo_server/echo_server.cpp create mode 100644 ws/ws_broadcast_server.cpp create mode 100644 ws/ws_echo_server.cpp diff --git a/examples/broadcast_server/.gitignore b/examples/broadcast_server/.gitignore deleted file mode 100644 index 477ba279..00000000 --- a/examples/broadcast_server/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -CMakeCache.txt -package-lock.json -CMakeFiles -ixwebsocket_unittest -cmake_install.cmake -node_modules -ixwebsocket -Makefile -build diff --git a/examples/broadcast_server/CMakeLists.txt b/examples/broadcast_server/CMakeLists.txt deleted file mode 100644 index fbab35f9..00000000 --- a/examples/broadcast_server/CMakeLists.txt +++ /dev/null @@ -1,28 +0,0 @@ -# -# Author: Benjamin Sergeant -# Copyright (c) 2018 Machine Zone, Inc. All rights reserved. -# - -cmake_minimum_required (VERSION 3.4.1) -project (broadcast_server) - -# There's -Weverything too for clang -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic -Wshorten-64-to-32") - -set (OPENSSL_PREFIX /usr/local/opt/openssl) # Homebrew openssl - -set (CMAKE_CXX_STANDARD 14) - -option(USE_TLS "Add TLS support" ON) - -include_directories(broadcast_server .) - -add_executable(broadcast_server - broadcast_server.cpp) - -if (APPLE AND USE_TLS) - target_link_libraries(broadcast_server "-framework foundation" "-framework security") -endif() - -target_link_libraries(broadcast_server ixwebsocket) -install(TARGETS broadcast_server DESTINATION bin) diff --git a/examples/broadcast_server/broadcast_server.cpp b/examples/broadcast_server/broadcast_server.cpp deleted file mode 100644 index f0ab7740..00000000 --- a/examples/broadcast_server/broadcast_server.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - * broadcast_server.cpp - * Author: Benjamin Sergeant - * Copyright (c) 2018 Machine Zone, Inc. All rights reserved. - */ - -#include -#include -#include - -int main(int argc, char** argv) -{ - int port = 8080; - if (argc == 2) - { - std::stringstream ss; - ss << argv[1]; - ss >> port; - } - - ix::WebSocketServer server(port); - - server.setOnConnectionCallback( - [&server](std::shared_ptr webSocket) - { - webSocket->setOnMessageCallback( - [webSocket, &server](ix::WebSocketMessageType messageType, - const std::string& str, - size_t wireSize, - const ix::WebSocketErrorInfo& error, - const ix::WebSocketOpenInfo& openInfo, - const ix::WebSocketCloseInfo& closeInfo) - { - if (messageType == ix::WebSocket_MessageType_Open) - { - std::cerr << "New connection" << std::endl; - std::cerr << "Uri: " << openInfo.uri << std::endl; - std::cerr << "Headers:" << std::endl; - for (auto it : openInfo.headers) - { - std::cerr << it.first << ": " << it.second << std::endl; - } - } - else if (messageType == ix::WebSocket_MessageType_Close) - { - std::cerr << "Closed connection" << std::endl; - } - else if (messageType == ix::WebSocket_MessageType_Message) - { - std::cerr << "Received " << wireSize << " bytes" << std::endl; - for (auto&& client : server.getClients()) - { - if (client != webSocket) - { - client->send(str); - } - } - } - } - ); - } - ); - - auto res = server.listen(); - if (!res.first) - { - std::cerr << res.second << std::endl; - return 1; - } - - server.start(); - server.wait(); - - return 0; -} diff --git a/examples/echo_server/CMakeLists.txt b/examples/echo_server/CMakeLists.txt deleted file mode 100644 index 07afd709..00000000 --- a/examples/echo_server/CMakeLists.txt +++ /dev/null @@ -1,28 +0,0 @@ -# -# Author: Benjamin Sergeant -# Copyright (c) 2018 Machine Zone, Inc. All rights reserved. -# - -cmake_minimum_required (VERSION 3.4.1) -project (echo_server) - -# There's -Weverything too for clang -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic -Wshorten-64-to-32") - -set (OPENSSL_PREFIX /usr/local/opt/openssl) # Homebrew openssl - -set (CMAKE_CXX_STANDARD 14) - -option(USE_TLS "Add TLS support" ON) - -include_directories(echo_server .) - -add_executable(echo_server - echo_server.cpp) - -if (APPLE AND USE_TLS) - target_link_libraries(echo_server "-framework foundation" "-framework security") -endif() - -target_link_libraries(echo_server ixwebsocket) -install(TARGETS echo_server DESTINATION bin) diff --git a/examples/echo_server/echo_server.cpp b/examples/echo_server/echo_server.cpp deleted file mode 100644 index 5d9b21e7..00000000 --- a/examples/echo_server/echo_server.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - * echo_server.cpp - * Author: Benjamin Sergeant - * Copyright (c) 2018 Machine Zone, Inc. All rights reserved. - */ - -#include -#include -#include - -int main(int argc, char** argv) -{ - int port = 8080; - if (argc == 2) - { - std::stringstream ss; - ss << argv[1]; - ss >> port; - } - - ix::WebSocketServer server(port); - - server.setOnConnectionCallback( - [&server](std::shared_ptr webSocket) - { - webSocket->setOnMessageCallback( - [webSocket, &server](ix::WebSocketMessageType messageType, - const std::string& str, - size_t wireSize, - const ix::WebSocketErrorInfo& error, - const ix::WebSocketOpenInfo& openInfo, - const ix::WebSocketCloseInfo& closeInfo) - { - if (messageType == ix::WebSocket_MessageType_Open) - { - std::cerr << "New connection" << std::endl; - std::cerr << "Uri: " << openInfo.uri << std::endl; - std::cerr << "Headers:" << std::endl; - for (auto it : openInfo.headers) - { - std::cerr << it.first << ": " << it.second << std::endl; - } - } - else if (messageType == ix::WebSocket_MessageType_Close) - { - std::cerr << "Closed connection" << std::endl; - } - else if (messageType == ix::WebSocket_MessageType_Message) - { - webSocket->send(str); - } - } - ); - } - ); - - auto res = server.listen(); - if (!res.first) - { - std::cerr << res.second << std::endl; - return 1; - } - - server.start(); - server.wait(); - - return 0; -} diff --git a/makefile b/makefile index 7b01a7b2..7b73f543 100644 --- a/makefile +++ b/makefile @@ -4,7 +4,7 @@ all: brew brew: - mkdir -p build && (cd build ; cmake .. ; make) + mkdir -p build && (cd build ; cmake .. ; make -j install) .PHONY: docker docker: diff --git a/ws/CMakeLists.txt b/ws/CMakeLists.txt index fdee2e33..4ca1bdbb 100644 --- a/ws/CMakeLists.txt +++ b/ws/CMakeLists.txt @@ -7,7 +7,7 @@ cmake_minimum_required (VERSION 3.4.1) project (ws) # There's -Weverything too for clang -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic -Wshorten-64-to-32") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic") set (CMAKE_CXX_STANDARD 14) @@ -23,6 +23,8 @@ add_executable(ws ixcrypto/IXHash.cpp ixcrypto/IXUuid.cpp + ws_broadcast_server.cpp + ws_echo_server.cpp ws_chat.cpp ws_connect.cpp ws_transfer.cpp diff --git a/ws/docker_build.sh b/ws/docker_build.sh index d1dadffd..bb90913c 100644 --- a/ws/docker_build.sh +++ b/ws/docker_build.sh @@ -28,6 +28,8 @@ g++ --std=c++14 \ ixcrypto/IXBase64.cpp \ ixcrypto/IXHash.cpp \ ixcrypto/IXUuid.cpp \ + ws_broadcast_server.cpp \ + ws_echo_server.cpp \ ws_chat.cpp \ ws_connect.cpp \ ws_transfer.cpp \ diff --git a/ws/ws.cpp b/ws/ws.cpp index b2871aa4..9bdf0b6c 100644 --- a/ws/ws.cpp +++ b/ws/ws.cpp @@ -16,6 +16,10 @@ namespace ix { + int ws_echo_server_main(int port); + + int ws_broadcast_server_main(int port); + int ws_chat_main(const std::string& url, const std::string& user); @@ -57,6 +61,12 @@ int main(int argc, char** argv) chatApp->add_option("url", url, "Connection url")->required(); chatApp->add_option("user", user, "User name")->required(); + CLI::App* echoServerApp = app.add_subcommand("echo_server", "Echo server"); + echoServerApp->add_option("--port", port, "Connection url"); + + CLI::App* broadcastServerApp = app.add_subcommand("broadcast_server", "Broadcasting server"); + broadcastServerApp->add_option("--port", port, "Connection url"); + CLI11_PARSE(app, argc, argv); if (app.got_subcommand("transfer")) @@ -80,6 +90,14 @@ int main(int argc, char** argv) { return ix::ws_chat_main(url, user); } + else if (app.got_subcommand("echo_server")) + { + return ix::ws_echo_server_main(port); + } + else if (app.got_subcommand("broadcast_server")) + { + return ix::ws_broadcast_server_main(port); + } else { assert(false); diff --git a/ws/ws_broadcast_server.cpp b/ws/ws_broadcast_server.cpp new file mode 100644 index 00000000..4dfe000d --- /dev/null +++ b/ws/ws_broadcast_server.cpp @@ -0,0 +1,72 @@ +/* + * ws_broadcast_server.cpp + * Author: Benjamin Sergeant + * Copyright (c) 2018 Machine Zone, Inc. All rights reserved. + */ + +#include +#include +#include + +namespace ix +{ + int ws_broadcast_server_main(int port) + { + std::cout << "Listening on port " << port << std::endl; + + ix::WebSocketServer server(port); + + server.setOnConnectionCallback( + [&server](std::shared_ptr webSocket) + { + webSocket->setOnMessageCallback( + [webSocket, &server](ix::WebSocketMessageType messageType, + const std::string& str, + size_t wireSize, + const ix::WebSocketErrorInfo& error, + const ix::WebSocketOpenInfo& openInfo, + const ix::WebSocketCloseInfo& closeInfo) + { + if (messageType == ix::WebSocket_MessageType_Open) + { + std::cerr << "New connection" << std::endl; + std::cerr << "Uri: " << openInfo.uri << std::endl; + std::cerr << "Headers:" << std::endl; + for (auto it : openInfo.headers) + { + std::cerr << it.first << ": " << it.second << std::endl; + } + } + else if (messageType == ix::WebSocket_MessageType_Close) + { + std::cerr << "Closed connection" << std::endl; + } + else if (messageType == ix::WebSocket_MessageType_Message) + { + std::cerr << "Received " << wireSize << " bytes" << std::endl; + for (auto&& client : server.getClients()) + { + if (client != webSocket) + { + client->send(str); + } + } + } + } + ); + } + ); + + auto res = server.listen(); + if (!res.first) + { + std::cerr << res.second << std::endl; + return 1; + } + + server.start(); + server.wait(); + + return 0; + } +} diff --git a/ws/ws_echo_server.cpp b/ws/ws_echo_server.cpp new file mode 100644 index 00000000..37a831b1 --- /dev/null +++ b/ws/ws_echo_server.cpp @@ -0,0 +1,68 @@ +/* + * ws_broadcast_server.cpp + * Author: Benjamin Sergeant + * Copyright (c) 2018 Machine Zone, Inc. All rights reserved. + */ + +#include +#include +#include + +namespace ix +{ + int ws_echo_server_main(int port) + { + std::cout << "Listening on port " << port << std::endl; + + ix::WebSocketServer server(port); + + server.setOnConnectionCallback( + [&server](std::shared_ptr webSocket) + { + webSocket->setOnMessageCallback( + [webSocket, &server](ix::WebSocketMessageType messageType, + const std::string& str, + size_t wireSize, + const ix::WebSocketErrorInfo& error, + const ix::WebSocketOpenInfo& openInfo, + const ix::WebSocketCloseInfo& closeInfo) + { + if (messageType == ix::WebSocket_MessageType_Open) + { + std::cerr << "New connection" << std::endl; + std::cerr << "Uri: " << openInfo.uri << std::endl; + std::cerr << "Headers:" << std::endl; + for (auto it : openInfo.headers) + { + std::cerr << it.first << ": " << it.second << std::endl; + } + } + else if (messageType == ix::WebSocket_MessageType_Close) + { + std::cerr << "Closed connection" << std::endl; + } + else if (messageType == ix::WebSocket_MessageType_Message) + { + std::cerr << "Received " + << wireSize << " bytes" + << std::endl; + webSocket->send(str); + } + } + ); + } + ); + + auto res = server.listen(); + if (!res.first) + { + std::cerr << res.second << std::endl; + return 1; + } + + server.start(); + server.wait(); + + return 0; + } +}