From 3e064ec63ed1eb14b6411cdc61600ef642dfb2f0 Mon Sep 17 00:00:00 2001 From: Benjamin Sergeant Date: Wed, 2 Jan 2019 08:17:03 -0800 Subject: [PATCH] add new broadcast server example --- examples/broadcast_server/.gitignore | 9 +++ examples/broadcast_server/CMakeLists.txt | 30 ++++++++ .../broadcast_server/broadcast_server.cpp | 73 +++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 examples/broadcast_server/.gitignore create mode 100644 examples/broadcast_server/CMakeLists.txt create mode 100644 examples/broadcast_server/broadcast_server.cpp diff --git a/examples/broadcast_server/.gitignore b/examples/broadcast_server/.gitignore new file mode 100644 index 00000000..477ba279 --- /dev/null +++ b/examples/broadcast_server/.gitignore @@ -0,0 +1,9 @@ +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 new file mode 100644 index 00000000..bd37cb50 --- /dev/null +++ b/examples/broadcast_server/CMakeLists.txt @@ -0,0 +1,30 @@ +# +# 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 11) + +option(USE_TLS "Add TLS support" ON) + +add_subdirectory(${PROJECT_SOURCE_DIR}/../.. ixwebsocket) + +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 new file mode 100644 index 00000000..5a1f6535 --- /dev/null +++ b/examples/broadcast_server/broadcast_server.cpp @@ -0,0 +1,73 @@ +/* + * 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::WebSocketCloseInfo& closeInfo, + const ix::WebSocketHttpHeaders& headers) + { + if (messageType == ix::WebSocket_MessageType_Open) + { + std::cerr << "New connection" << std::endl; + std::cerr << "Headers:" << std::endl; + for (auto it : 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) + { + 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; +}