diff --git a/CMakeLists.txt b/CMakeLists.txt index 2c8b1fd..60702e4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,24 +1,12 @@ cmake_minimum_required(VERSION 2.8) -#include(motor/cmake/set_system_include_flag.cmake) -#include(motor/cmake/address_sanitizer.cmake) - - -#include(motor/cmake/enable_gnu11.cmake) - -#include(motor/cmake/warning_settings.cmake) -#get_sane_warning_flags(warnings) - -#include(motor/cmake/join.cmake) -#join("${warnings}" " " warnings) -#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${warnings}") - +set(CMAKE_CSS_FLAGS "#{CMAKE_CSS_FLAGS} -Wdeprecated-declarations") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++ -g3") project(server) add_subdirectory(${PROJECT_SOURCE_DIR}/contrib/libwebsockets/) - +set(WITHOUT_TESTAPPS CACHE BOOL ON) find_package(Boost 1.48 REQUIRED) include_directories(${Boost_INCLUDE_DIRS}) @@ -28,7 +16,8 @@ set(boost ${Boost_LIBRARIES}) include_directories("${PROJECT_SOURCE_DIR}") include_directories(SYSTEM "${PROJECT_SOURCE_DIR}/contrib/libwebsockets/") -set(all_friggin_libraries ${boost} websockets_shared) +set(all_libraries ${boost} websockets) +file(GLOB all_files "*.cpp") -add_executable(server main.cpp) -target_link_libraries(server ${all_friggin_libraries}) +add_executable(server ${all_files}) +target_link_libraries(server ${all_libraries}) diff --git a/main.cpp b/main.cpp index 8444ad8..9e5b1b7 100644 --- a/main.cpp +++ b/main.cpp @@ -1,26 +1,3 @@ -/* - * libwebsockets-test-echo - libwebsockets echo test implementation - * - * This implements both the client and server sides. It defaults to - * serving, use --client to connect as client. - * - * Copyright (C) 2010-2013 Andy Green - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation: - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ #include #include @@ -37,24 +14,28 @@ struct User { }; websockets::TestProtocol default_protocol{ -[](User& user) -> int{ - user.index = uid++; - people_online[user.index] = ""; - return 0; -}, -[](User& user) -> int{ - people_online.erase(user.index); - return 0; -}, -[](User& user) -> std::string{ - std::string string_to_send = "Other People:"; - for(auto x : people_online) if(x.first != user.index) string_to_send += " " + x.second; - return string_to_send; -}, -[](User& user, std::string in) -> int{ - people_online[user.index] = in; - return 0; -} + // connection established + [](User& user) -> int{ + user.index = uid++; + people_online[user.index] = ""; + return 0; + }, + // connection closed + [](User& user) -> int{ + people_online.erase(user.index); + return 0; + }, + // write (will always come after receive) + [](User& user) -> std::string{ + std::string string_to_send = "Other People:"; + for(auto x : people_online) if(x.first != user.index) string_to_send += " " + x.second; + return string_to_send; + }, + // receive + [](User& user, std::string in) -> int{ + people_online[user.index] = in; + return 0; + } }; static libwebsocket_protocols protocols[] = { diff --git a/vanillabuild b/vanillabuild new file mode 100755 index 0000000..5732017 --- /dev/null +++ b/vanillabuild @@ -0,0 +1,7 @@ +#!/bin/bash + +mkdir -p build +cd build +cmake .. +make -j1 +cd .. diff --git a/websockets.cpp b/websockets.cpp new file mode 100644 index 0000000..bec876c --- /dev/null +++ b/websockets.cpp @@ -0,0 +1,75 @@ + +#include "websockets.h" + +namespace websockets { + + option options[] = { + { "help", no_argument, NULL, 'h' }, + { "port", required_argument, NULL, 'p' }, + { "ssl", no_argument, NULL, 's' }, + { "interface", required_argument, NULL, 'i' }, + { NULL, 0, 0, 0 } + }; + + int default_main(int argc, char **argv, libwebsocket_protocols* protocols){ + int port = 7681; + int use_ssl = 0; + char interface_name[128] = ""; + const char *interface = NULL; + + int n = 0; + while (n >= 0) { + n = getopt_long(argc, argv, "i:hsp:", options, NULL); + if (n < 0) continue; + + switch (n) { + case 's': + use_ssl = 1; /* 1 = take care about cert verification, 2 = allow anything */ + break; + case 'p': + port = atoi(optarg); + break; + case 'i': + strncpy(interface_name, optarg, sizeof interface_name); + interface_name[(sizeof interface_name) - 1] = '\0'; + interface = interface_name; + break; + case '?': + case 'h': + fprintf(stderr, "Usage: libwebsockets-test-echo [--ssl] [--port=

] [--interface=iface]"); + exit(1); + } + } + + websockets::Log log("lwsts", LOG_PID | LOG_PERROR, 7); + log.notice("Running in server mode\n"); + + lws_context_creation_info info; + memset(&info, 0, sizeof info); + + info.port = port; + info.iface = interface; + info.protocols = protocols; + info.gid = -1; + info.uid = -1; + + if (use_ssl) { + info.ssl_cert_filepath = "libwebsockets-test-server.pem"; + info.ssl_private_key_filepath = "libwebsockets-test-server.key.pem"; + } + + websockets::Context context(info); + + static bool force_exit = false; + signal(SIGINT, [](int){ force_exit = true; }); + + while (!force_exit) { + auto ret = libwebsocket_service(context.get_raw(), 10); + if(ret < 0) break; + } + + log.notice("libwebsockets-test-echo exited cleanly\n"); + return 0; + } + +} // namespace websockets diff --git a/websockets.h b/websockets.h index 8be6ec9..1e5774c 100644 --- a/websockets.h +++ b/websockets.h @@ -125,90 +125,6 @@ namespace websockets { #define WSstandard_protocol(name, protocol)\ { name, WSprotocol_callback(protocol), sizeof(decltype(protocol)::user_type) } - - static option options[] = { - { "help", no_argument, NULL, 'h' }, - { "debug", required_argument, NULL, 'd' }, - { "port", required_argument, NULL, 'p' }, - { "ssl", no_argument, NULL, 's' }, - { "interface", required_argument, NULL, 'i' }, - { NULL, 0, 0, 0 } - }; - - inline int default_main(int argc, char **argv, libwebsocket_protocols* protocols){ - int n = 0; - int port = 7681; - int use_ssl = 0; - int opts = 0; - char interface_name[128] = ""; - const char *interface = NULL; - int syslog_options = LOG_PID | LOG_PERROR; - int listen_port; - lws_context_creation_info info; - - int debug_level = 7; - - memset(&info, 0, sizeof info); - - while (n >= 0) { - n = getopt_long(argc, argv, "i:hsp:d:D" - , options, NULL); - if (n < 0) - continue; - switch (n) { - case 'd': - debug_level = atoi(optarg); - break; - case 's': - use_ssl = 1; /* 1 = take care about cert verification, 2 = allow anything */ - break; - case 'p': - port = atoi(optarg); - break; - case 'i': - strncpy(interface_name, optarg, sizeof interface_name); - interface_name[(sizeof interface_name) - 1] = '\0'; - interface = interface_name; - break; - case '?': - case 'h': - fprintf(stderr, "Usage: libwebsockets-test-echo " - "[--ssl] " - "[--port=

] " - "[-d ]\n"); - exit(1); - } - } - - websockets::Log log("lwsts", syslog_options, debug_level); - - log.notice("Running in server mode\n"); - listen_port = port; - - info.port = listen_port; - info.iface = interface; - info.protocols = protocols; - - if (use_ssl) { - info.ssl_cert_filepath = "libwebsockets-test-server.pem"; - info.ssl_private_key_filepath = "libwebsockets-test-server.key.pem"; - } - info.gid = -1; - info.uid = -1; - info.options = opts; - - static bool force_exit = false; - signal(SIGINT, [](int){ force_exit = true; }); - - websockets::Context context(info); - - while (!force_exit) { - auto ret = libwebsocket_service(context.get_raw(), 10); - if(ret < 0) break; - } - - log.notice("libwebsockets-test-echo exited cleanly\n"); - return 0; - } + int default_main(int argc, char **argv, libwebsocket_protocols* protocols); } // namespace websockets