int main(int argc, char* argv[]) { setup_signal(SIGTERM, signal_exit); setup_signal(SIGINT, signal_exit); /* google log */ google::InitGoogleLogging(argv[0]); google::InstallFailureSignalHandler(); google::LogToStderr(); /* libwebsocket log */ lws_set_log_level(5, libwebsocket_log); try { terra::config c; c.set("zmq.broker-queue-endpoint", "tcp://localhost:60400"); c.set("websocket.interface", "0.0.0.0"); c.set("websocket.port", "60600"); terra::engine engine(c); while (run) { engine.dispatch(250); } } catch (const std::exception& e) { LOG(ERROR) << "ERROR: " << e.what(); } return EXIT_SUCCESS; }
int main(int argc, char **argv) { printf("Hello WebSocket World!\n"); signal(SIGINT, sighandler); struct lws_context_creation_info info; memset(&info, 0, sizeof info); lws_set_log_level(0xFFFF, NULL); info.port = CONTEXT_PORT_NO_LISTEN; info.protocols = protocols; info.extensions = libwebsocket_get_internal_extensions(); info.gid = -1; info.uid = -1; context_ = libwebsocket_create_context(&info); if (context_ == NULL) { fprintf(stderr, "Creating libwebsocket context failed\n"); return 1; } return 0; }
int ps_websockets_init (ps_transport_callbacks * callback) { if (g_atomic_int_get(&stopping)) { return -1; } if (callback == NULL) { return -1; } gateway = callback; struct lws * wsi; /* Set Log level */ lws_set_log_level (0, NULL); /* Prepare context */ struct lws_context_creation_info info; struct lws_client_connect_info cinfo; memset(&info, 0, sizeof info); memset(&cinfo, 0, sizeof cinfo); info.port = CONTEXT_PORT_NO_LISTEN; info.iface = NULL; info.protocols = wss_protocols; info.extensions = NULL; //lws_get_internal_extensions(); info.ssl_cert_filepath = NULL; info.ssl_private_key_filepath = NULL; info.gid = -1; info.uid = -1; info.options = 0; /* Create the websockets context */ wss = lws_create_context(&info); cinfo.context = wss; cinfo.ssl_connection = 0; cinfo.host = host; cinfo.address = host; cinfo.port = wsport; cinfo.path = path; cinfo.protocol = "ps-protocol"; //wss_protocols.name; GError * error = NULL; if (wss != NULL) { /* Connect to the server */ wsi = lws_client_connect_via_info (&cinfo); /*TODO: somehow, check if the connection is established?*/ wss_thread = g_thread_try_new("websockets thread", &ps_websockets_thread, wss, &error); if (!wss_thread) { g_atomic_int_set(&initialized, 0); PS_LOG (LOG_ERR,"Got error %d (%s) trying to launch the wss thread...\n", error->code, error->message ? error->message : "??"); return -1; } } /* done */ g_atomic_int_set(&initialized, 1); return 0; }
int main(int argc, char *argv[]) { int fd, n = 1, ret = 1, m; struct lejp_ctx ctx; char buf[128]; lws_set_log_level(7, NULL); lwsl_notice("libwebsockets-test-lejp (C) 2017 - 2018 [email protected]\n"); lwsl_notice(" usage: cat my.json | libwebsockets-test-lejp\n\n"); lejp_construct(&ctx, cb, NULL, tok, LWS_ARRAY_SIZE(tok)); fd = 0; while (n > 0) { n = read(fd, buf, sizeof(buf)); if (n <= 0) continue; m = lejp_parse(&ctx, (uint8_t *)buf, n); if (m < 0 && m != LEJP_CONTINUE) { lwsl_err("parse failed %d\n", m); goto bail; } } lwsl_notice("okay\n"); ret = 0; bail: lejp_destruct(&ctx); return ret; }
int discord_ws_init(struct im_connection *ic, discord_data *dd) { struct lws_context_creation_info info; memset(&info, 0, sizeof(info)); info.port = CONTEXT_PORT_NO_LISTEN; info.protocols = protocols; #ifndef LWS_NO_EXTENSIONS info.extensions = lws_get_internal_extensions(); #else info.extensions = NULL; #endif info.gid = -1; info.uid = -1; info.user = ic; lws_set_log_level(0, NULL); dd->lwsctx = lws_create_context(&info); if (dd->lwsctx == NULL) { return -1; } dd->lws = lws_client_connect(dd->lwsctx, dd->gateway->addr, dd->gateway->wss ? 443 : 80, dd->gateway->wss, dd->gateway->path, dd->gateway->addr, "discordapp.com", protocols[0].name, -1); return 0; }
int main(int argc, const char **argv) { struct lws_context_creation_info info; struct lws_context *context; const char *p; int result = 0, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE; if ((p = lws_cmdline_option(argc, argv, "-d"))) logs = atoi(p); lws_set_log_level(logs, NULL); lwsl_user("LWS gencrypto apis tests\n"); memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */ info.port = CONTEXT_PORT_NO_LISTEN; info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; context = lws_create_context(&info); if (!context) { lwsl_err("lws init failed\n"); return 1; } result |= test_genaes(context); result |= test_genec(context); lwsl_user("Completed: %s\n", result ? "FAIL" : "PASS"); lws_context_destroy(context); return result; }
int main(int argc, const char **argv) { struct lws_context_creation_info info; const char *p, *plugin_dirs[] = { "/usr/local/share/libwebsockets-test-server/plugins", NULL }; int n = 0, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE /* for LLL_ verbosity above NOTICE to be built into lws, * lws must have been configured and built with * -DCMAKE_BUILD_TYPE=DEBUG instead of =RELEASE */ /* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */ /* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */ /* | LLL_DEBUG */; if ((p = lws_cmdline_option(argc, argv, "-d"))) logs = atoi(p); lws_set_log_level(logs, NULL); lwsl_user("LWS minimal http server TLS | visit https://localhost:7681\n"); signal(SIGINT, sigint_handler); memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */ info.port = 7681; info.mounts = &mount; info.error_document_404 = "/404.html"; info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT | LWS_SERVER_OPTION_EXPLICIT_VHOSTS; info.ssl_cert_filepath = "localhost-100y.cert"; info.ssl_private_key_filepath = "localhost-100y.key"; info.plugin_dirs = plugin_dirs; info.pvo = &pvo; if (lws_cmdline_option(argc, argv, "-h")) info.options |= LWS_SERVER_OPTION_VHOST_UPG_STRICT_HOST_CHECK; context = lws_create_context(&info); if (!context) { lwsl_err("lws init failed\n"); return 1; } info.headers = &pvo_hsbph[3]; if (!lws_create_vhost(context, &info)) { lwsl_err("lws init failed\n"); return 1; } while (n >= 0 && !interrupted) n = lws_service(context, 1000); lws_context_destroy(context); return 0; }
bool FJavascriptWebSocketServer::Init(uint32 Port, FJavascriptWebSocketClientConnectedCallBack CallBack) { // setup log level. #if !UE_BUILD_SHIPPING lws_set_log_level(LLL_ERR | LLL_WARN | LLL_NOTICE | LLL_DEBUG | LLL_INFO, lws_debugLog_JS); #endif Protocols = new lws_protocols[3]; FMemory::Memzero(Protocols, sizeof(lws_protocols) * 3); Protocols[0].name = "binary"; Protocols[0].callback = [](lws *Wsi, lws_callback_reasons Reason, void *User, void *In, size_t Len) { auto context = lws_get_context(Wsi); return reinterpret_cast<FJavascriptWebSocketServer*>(lws_context_user(context))->unreal_networking_server(Wsi, Reason, User, In, Len); }; Protocols[0].per_session_data_size = sizeof(PerSessionDataServer); Protocols[0].rx_buffer_size = 10 * 1024 * 1024; Protocols[1].name = nullptr; Protocols[1].callback = nullptr; Protocols[1].per_session_data_size = 0; struct lws_context_creation_info Info; memset(&Info, 0, sizeof(lws_context_creation_info)); // look up libwebsockets.h for details. Info.port = Port; ServerPort = Port; // we listen on all available interfaces. Info.iface = NULL; Info.protocols = &Protocols[0]; // no extensions Info.extensions = NULL; Info.gid = -1; Info.uid = -1; Info.options = 0; // tack on this object. Info.user = this; Info.port = Port; Context = lws_create_context(&Info); if (Context == NULL) { ServerPort = 0; delete Protocols; Protocols = NULL; IsAlive = false; return false; // couldn't create a server. } ConnectedCallBack = CallBack; IsAlive = true; return true; }
bool FJavascriptWebSocketServer::Init(uint32 Port, FJavascriptWebSocketClientConnectedCallBack CallBack) { #if !PLATFORM_HTML5 // setup log level. #if !UE_BUILD_SHIPPING lws_set_log_level(LLL_ERR | LLL_WARN | LLL_NOTICE | LLL_DEBUG | LLL_INFO, libwebsocket_debugLog_JS); #endif Protocols = new libwebsocket_protocols[3]; FMemory::Memzero(Protocols, sizeof(libwebsocket_protocols) * 3); Protocols[0].name = "binary"; Protocols[0].callback = FJavascriptWebSocket::unreal_networking_server; Protocols[0].per_session_data_size = sizeof(PerSessionDataServer); Protocols[0].rx_buffer_size = 10 * 1024 * 1024; Protocols[1].name = nullptr; Protocols[1].callback = nullptr; Protocols[1].per_session_data_size = 0; struct lws_context_creation_info Info; memset(&Info, 0, sizeof(lws_context_creation_info)); // look up libwebsockets.h for details. Info.port = Port; // we listen on all available interfaces. Info.iface = NULL; Info.protocols = &Protocols[0]; // no extensions Info.extensions = NULL; Info.gid = -1; Info.uid = -1; Info.options = 0; // tack on this object. Info.user = this; Info.port = Port; Context = libwebsocket_create_context(&Info); if (Context == NULL) { return false; // couldn't create a server. } ConnectedCallBack = CallBack; //@HACK Context->user_space = this; #endif return true; }
void WebSocketOpcode_initialiseWebSocket(WebSocketOpcode *self, CSOUND *csound) { size_t argumentsCount = self->inputArgumentCount + self->outputArgumentCount; self->webSocket = csound->Calloc(csound, sizeof(WebSocket)); self->webSocket->protocols = csound->Calloc(csound, //Last protocol is null sizeof(struct libwebsocket_protocols) * (argumentsCount + 1)); size_t argumentIndex = 0; int i; for (i = 0; i < self->outputArgumentCount; ++i, ++argumentIndex) { self->webSocket->protocols[argumentIndex].name = self->outputArguments[i].name; self->webSocket->protocols[argumentIndex].callback = Websocket_callback; self->webSocket->protocols[argumentIndex].per_session_data_size = self->outputArguments[i].bytesCount; } for (i = 0; i < self->inputArgumentCount; ++i, ++argumentIndex) { self->webSocket->protocols[argumentIndex].name = self->inputArguments[i].name; self->webSocket->protocols[argumentIndex].callback = Websocket_callback; self->webSocket->protocols[argumentIndex].per_session_data_size = self->inputArguments[i].bytesCount; } self->webSocket->info.port = *self->arguments[self->outputArgumentCount]; self->webSocket->info.protocols = self->webSocket->protocols; self->webSocket->info.extensions = libwebsocket_get_internal_extensions(); self->webSocket->info.gid = -1; self->webSocket->info.uid = -1; self->webSocket->info.user = self; lws_set_log_level(LLL_ERR, NULL); self->webSocket->context = libwebsocket_create_context(&self->webSocket->info); self->webSocket->messageBuffer = csound->Calloc(csound, LWS_SEND_BUFFER_PRE_PADDING + (sizeof(char) * writeBufferBytesCount) + LWS_SEND_BUFFER_POST_PADDING); if (self->webSocket->context == NULL) { csound->Die(csound, Str("websocket: could not initialise websocket, Exiting")); } self->isRunning = true; self->webSocket->processThread = csound->CreateThread(WebSocketOpcode_processThread, self); }
int main(int argc, const char **argv) { struct lws_context_creation_info info; struct lws_context *context; const char *p; int n = 0, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE /* for LLL_ verbosity above NOTICE to be built into lws, * lws must have been configured and built with * -DCMAKE_BUILD_TYPE=DEBUG instead of =RELEASE */ /* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */ /* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */ /* | LLL_DEBUG */; signal(SIGINT, sigint_handler); if ((p = lws_cmdline_option(argc, argv, "-d"))) logs = atoi(p); lws_set_log_level(logs, NULL); lwsl_user("LWS minimal ws client + permessage-deflate + multifragment bulk message\n"); lwsl_user(" needs minimal-ws-server-pmd-bulk running to communicate with\n"); lwsl_user(" %s [-n (no exts)] [-c (compressible)]\n", argv[0]); memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */ info.port = CONTEXT_PORT_NO_LISTEN; info.protocols = protocols; info.pvo = &pvo; if (!lws_cmdline_option(argc, argv, "-n")) info.extensions = extensions; info.pt_serv_buf_size = 32 * 1024; if (lws_cmdline_option(argc, argv, "-c")) options |= 1; context = lws_create_context(&info); if (!context) { lwsl_err("lws init failed\n"); return 1; } while (n >= 0 && !interrupted) n = lws_service(context, 1000); lws_context_destroy(context); lwsl_user("Completed %s\n", interrupted == 2 ? "OK" : "failed"); return interrupted != 2; }
int main(int argc, const char **argv) { struct lws_context_creation_info info; struct lws_context *context; const char *p; int n = 0, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE /* for LLL_ verbosity above NOTICE to be built into lws, * lws must have been configured and built with * -DCMAKE_BUILD_TYPE=DEBUG instead of =RELEASE */ /* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */ /* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */ /* | LLL_DEBUG */; signal(SIGINT, sigint_handler); if ((p = lws_cmdline_option(argc, argv, "-d"))) logs = atoi(p); lws_set_log_level(logs, NULL); lwsl_user("LWS minimal raw file\n"); if (argc < 2) { lwsl_user("Usage: %s <file to monitor> " " eg, /dev/ttyUSB0 or /dev/input/event0 or " "/proc/self/fd/0\n", argv[0]); return 1; } signal(SIGINT, sigint_handler); memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */ info.port = CONTEXT_PORT_NO_LISTEN_SERVER; /* no listen socket for demo */ info.protocols = protocols; lws_strncpy(filepath, argv[1], sizeof(filepath)); context = lws_create_context(&info); if (!context) { lwsl_err("lws init failed\n"); return 1; } while (n >= 0 && !interrupted) n = lws_service(context, 1000); lws_context_destroy(context); return 0; }
IWebSocketServer::IWebSocketServer(int port) { curWebSocketServer = this; lws_set_log_level(0, NULL); // setup websocket context info struct lws_context_creation_info info; memset(&info, 0, sizeof info); info.port = port; info.protocols = protocols; info.gid = -1; info.uid = -1; context = libwebsocket_create_context(&info); if (context == NULL) throw "Websocket context create error"; }
int main(int argc, const char **argv) { struct lws_context_creation_info info; struct lws_context *context; const char *p; int n = 0, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE /* for LLL_ verbosity above NOTICE to be built into lws, * lws must have been configured and built with * -DCMAKE_BUILD_TYPE=DEBUG instead of =RELEASE */ /* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */ /* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */ /* | LLL_DEBUG */; signal(SIGINT, sigint_handler); if ((p = lws_cmdline_option(argc, argv, "-d"))) logs = atoi(p); lws_set_log_level(logs, NULL); lwsl_user("LWS minimal http server POST | visit http://localhost:7681\n"); memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */ info.port = 7681; info.protocols = protocols; info.mounts = &mount; info.options = LWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE; if (lws_cmdline_option(argc, argv, "-s")) { info.options |= LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; info.ssl_cert_filepath = "localhost-100y.cert"; info.ssl_private_key_filepath = "localhost-100y.key"; } context = lws_create_context(&info); if (!context) { lwsl_err("lws init failed\n"); return 1; } while (n >= 0 && !interrupted) n = lws_service(context, 1000); lws_context_destroy(context); return 0; }
int init() { int n = 0; //struct libwebsocket_context *context; int opts = 0; const char *iface = NULL; int syslog_options = LOG_PID | LOG_PERROR; unsigned int oldus = 0; struct lws_context_creation_info info; int debug_level = 7; memset(&info, 0, sizeof info); info.port = 9999; signal(SIGINT, sighandler); /* we will only try to log things according to our debug_level */ setlogmask(LOG_UPTO (LOG_DEBUG)); openlog("lwsts", syslog_options, LOG_DAEMON); /* tell the library what debug level to emit and to send it to syslog */ lws_set_log_level(debug_level, lwsl_emit_syslog); info.iface = iface; info.protocols = protocols; info.extensions = libwebsocket_get_internal_extensions(); info.ssl_cert_filepath = NULL; info.ssl_private_key_filepath = NULL; info.gid = -1; info.uid = -1; info.options = opts; context = libwebsocket_create_context(&info); if (context == NULL) { lwsl_err("libwebsocket init failed\n"); return -1; } closelog(); return 0; }//main
int main(int argc, const char **argv) { struct lws_context_creation_info info; struct lws_context *context; const char *p; int logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE /* for LLL_ verbosity above NOTICE to be built into lws, * lws must have been configured and built with * -DCMAKE_BUILD_TYPE=DEBUG instead of =RELEASE */ /* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */ /* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */ /* | LLL_DEBUG */; signal(SIGINT, sigint_handler); if ((p = lws_cmdline_option(argc, argv, "-d"))) logs = atoi(p); lws_set_log_level(logs, NULL); lwsl_user("LWS minimal ws server + threads | visit http://localhost:7681\n"); memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */ info.port = 7681; info.mounts = &mount; info.protocols = protocols; info.pvo = &pvo; /* per-vhost options */ info.options = LWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE; context = lws_create_context(&info); if (!context) { lwsl_err("lws init failed\n"); return 1; } /* start the threads that create content */ while (!interrupted) if (lws_service(context, 1000)) interrupted = 1; lws_context_destroy(context); return 0; }
//============================================================================== // WsInput //------------------------------------------------------------------------------ void WsInput::wsConnect(WsInput* wsinput) { libwebsocket_context *context; lws_context_creation_info info; int debug_level = 7; memset(&info,0,sizeof info); info.port = 7681; lws_set_log_level(debug_level,da); lwsl_notice("libwebsockets chat server -\n"); libwebsocket_protocols protocols[] = { { "input", WsInput::wsCallBackData, 0, 128 }, {NULL,NULL,0,0} /* terminator */ }; info.iface = nullptr; info.protocols = protocols; info.ssl_cert_filepath = nullptr; info.ssl_private_key_filepath = nullptr; info.gid = -1; info.uid = -1; info.options = 0; info.user = nullptr; context = libwebsocket_create_context(&info); for(;;) { int n = libwebsocket_service(context,10); if(n >= 0 && wsinput->_isend) { break; } } libwebsocket_context_destroy(context); wsinput->_isend = false; }
void init_lws(void) { struct lws_context_creation_info info; lws_set_log_level(7, lwsl_emit_syslog); os_memset(&info, 0, sizeof(info)); info.port = 80; info.fd_limit_per_thread = 12; info.max_http_header_pool = 1; info.max_http_header_data = 512; info.pt_serv_buf_size = 1500; info.keepalive_timeout = 5; //info.ws_ping_pong_interval = 30; info.options = LWS_SERVER_OPTION_EXPLICIT_VHOSTS; context = lws_create_context(&info); if (context == NULL) return; lws_get_fops(context)->open = esp8266_lws_fops_open; lws_get_fops(context)->close = esp8266_lws_fops_close; lws_get_fops(context)->read = esp8266_lws_fops_read; lws_get_fops(context)->seek_cur = esp8266_lws_fops_seek_cur; if (!lwsesp_is_booting_in_ap_mode()) { info.vhost_name = "station"; info.protocols = protocols_station; info.mounts = &mount_station; if (!lws_create_vhost(context, &info)) lwsl_err("Failed to create vhost station\n"); } else { info.vhost_name = "ap"; info.protocols = protocols_ap; info.mounts = &mount_ap; if (!lws_create_vhost(context, &info)) lwsl_err("Failed to create vhost ap\n"); } lws_protocol_init(context); }
FWebSocket::FWebSocket( const FInternetAddr& ServerAddress ) :IsServerSide(false) { #if !PLATFORM_HTML5 #if !UE_BUILD_SHIPPING lws_set_log_level(LLL_ERR | LLL_WARN | LLL_NOTICE | LLL_DEBUG | LLL_INFO, lws_debugLogS); #endif Protocols = new lws_protocols[3]; FMemory::Memzero(Protocols, sizeof(lws_protocols) * 3); Protocols[0].name = "binary"; Protocols[0].callback = unreal_networking_client; Protocols[0].per_session_data_size = 0; Protocols[0].rx_buffer_size = 10 * 1024 * 1024; Protocols[1].name = nullptr; Protocols[1].callback = nullptr; Protocols[1].per_session_data_size = 0; struct lws_context_creation_info Info; memset(&Info, 0, sizeof Info); Info.port = CONTEXT_PORT_NO_LISTEN; Info.protocols = &Protocols[0]; Info.gid = -1; Info.uid = -1; Info.user = this; Context = lws_create_context(&Info); check(Context); StrInetAddress = ServerAddress.ToString(false); InetPort = ServerAddress.GetPort(); #endif }
int main(int argc, const char **argv) { struct lws_context_creation_info info; struct lws_context *context; const char *p; int n = 0, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE /* for LLL_ verbosity above NOTICE to be built into lws, * lws must have been configured and built with * -DCMAKE_BUILD_TYPE=DEBUG instead of =RELEASE */ /* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */ /* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */ /* | LLL_DEBUG */; signal(SIGINT, sigint_handler); if ((p = lws_cmdline_option(argc, argv, "-d"))) logs = atoi(p); lws_set_log_level(logs, NULL); lwsl_user("LWS minimal ws client tx\n"); lwsl_user(" Run minimal-ws-broker and browse to that\n"); memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */ info.port = CONTEXT_PORT_NO_LISTEN; /* we do not run any server */ info.protocols = protocols; context = lws_create_context(&info); if (!context) { lwsl_err("lws init failed\n"); return 1; } while (n >= 0 && !interrupted) n = lws_service(context, 1000); lws_context_destroy(context); lwsl_user("Completed\n"); return 0; }
WebSocketQueue::WebSocketQueue() : messageSent_(false), nextUniqueSessionId_(0), maxSessionCount_(10) { //httpProtocol = &protocols[0]; //webSocketProtocol_ = &protocols_[0]; // server url will be ws://localhost:9000 int port = 9000; lws_set_log_level(7, lwsl_emit_syslog); // create connection struct lws_context_creation_info info = { 0 }; info.port = port; info.iface = nullptr; info.protocols = protocols; info.extensions = nullptr; info.ssl_cert_filepath = nullptr; info.ssl_private_key_filepath = nullptr; info.options = 0; info.user = this; // create libwebsocket context representing this server context_ = libwebsocket_create_context(&info); // make sure it starts if (context_ == NULL) { GATEY_LOG("libwebsocket init failed"); //TODO: throw exception return; } GATEY_LOG("starting server..."); }
bool FNetworkFileServerHttp::Init() { // setup log level. #if UE_BUILD_DEBUG lws_set_log_level( LLL_ERR | LLL_WARN | LLL_NOTICE | LLL_DEBUG , lws_debugLog); #endif struct lws_context_creation_info Info; memset(&Info,0,sizeof(lws_context_creation_info)); // look up libwebsockets.h for details. Info.port = Port; // we listen on all available interfaces. Info.iface = NULL; // serve only the http protocols. Info.protocols = Protocols; // no extensions Info.extensions = NULL; Info.gid = -1; Info.uid = -1; Info.options = 0; // tack on this object. Info.user = this; Context = lws_create_context(&Info); Port = Info.port; if (Context == NULL) { UE_LOG(LogFileServer, Fatal, TEXT(" Could not create a libwebsocket content for port : %d"), Port); return false; } Ready.Set(true); return true; }
JNIEXPORT jboolean JNICALL jni_initLws(JNIEnv *env, jobject obj) { if(context) return JNI_TRUE; // Attach the java virtual machine to this thread gJvm->AttachCurrentThread(&gEnv, NULL); // Set java global references to the class and object jclass cls = env->GetObjectClass(obj); gLwsServiceCls = (jclass) env->NewGlobalRef(cls); gLwsServiceObj = env->NewGlobalRef(obj); // Get the sendMessage method from the LwsService class (inherited from class ThreadService) sendMessageId = gEnv->GetMethodID(gLwsServiceCls, "sendMessage", "(ILjava/lang/Object;)V"); memset(&info, 0, sizeof(info)); info.port = CONTEXT_PORT_NO_LISTEN; info.protocols = protocols; #if !defined(LWS_WITHOUT_EXTENSIONS) info.extensions = exts; #endif info.gid = -1; info.uid = -1; lws_set_log_level( LLL_NOTICE | LLL_INFO | LLL_ERR | LLL_WARN | LLL_CLIENT, emit_log ); context = lws_create_context(&info); if( context == NULL ){ emit_log(LLL_ERR, "Creating libwebsocket context failed"); return JNI_FALSE; } isExit = 0; return JNI_TRUE; }
int main(int argc, char **argv) { char cert_path[1024]; char key_path[1024]; int n = 0; int use_ssl = 0; int opts = 0; char interface_name[128] = ""; const char *iface = NULL; #ifndef WIN32 int syslog_options = LOG_PID | LOG_PERROR; #endif unsigned int oldus = 0; struct lws_context_creation_info info; int debug_level = 7; #ifndef LWS_NO_DAEMONIZE int daemonize = 0; #endif memset(&info, 0, sizeof info); info.port = 7681; while (n >= 0) { n = getopt_long(argc, argv, "eci:hsap:d:Dr:", options, NULL); if (n < 0) continue; switch (n) { case 'e': opts |= LWS_SERVER_OPTION_LIBEV; break; #ifndef LWS_NO_DAEMONIZE case 'D': daemonize = 1; #ifndef WIN32 syslog_options &= ~LOG_PERROR; #endif break; #endif case 'd': debug_level = atoi(optarg); break; case 's': use_ssl = 1; break; case 'a': opts |= LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT; break; case 'p': info.port = atoi(optarg); break; case 'i': strncpy(interface_name, optarg, sizeof interface_name); interface_name[(sizeof interface_name) - 1] = '\0'; iface = interface_name; break; case 'c': close_testing = 1; fprintf(stderr, " Close testing mode -- closes on " "client after 50 dumb increments" "and suppresses lws_mirror spam\n"); break; case 'r': resource_path = optarg; printf("Setting resource path to \"%s\"\n", resource_path); break; case 'h': fprintf(stderr, "Usage: test-server " "[--port=<p>] [--ssl] " "[-d <log bitfield>] " "[--resource_path <path>]\n"); exit(1); } } #if !defined(LWS_NO_DAEMONIZE) && !defined(WIN32) /* * normally lock path would be /var/lock/lwsts or similar, to * simplify getting started without having to take care about * permissions or running as root, set to /tmp/.lwsts-lock */ if (daemonize && lws_daemonize("/tmp/.lwsts-lock")) { fprintf(stderr, "Failed to daemonize\n"); return 1; } #endif signal(SIGINT, sighandler); #ifndef WIN32 /* we will only try to log things according to our debug_level */ setlogmask(LOG_UPTO (LOG_DEBUG)); openlog("lwsts", syslog_options, LOG_DAEMON); #endif /* tell the library what debug level to emit and to send it to syslog */ lws_set_log_level(debug_level, lwsl_emit_syslog); lwsl_notice("libwebsockets test server - " "(C) Copyright 2010-2013 Andy Green <*****@*****.**> - " "licensed under LGPL2.1\n"); #ifdef EXTERNAL_POLL max_poll_elements = getdtablesize(); pollfds = malloc(max_poll_elements * sizeof (struct pollfd)); fd_lookup = malloc(max_poll_elements * sizeof (int)); if (pollfds == NULL || fd_lookup == NULL) { lwsl_err("Out of memory pollfds=%d\n", max_poll_elements); return -1; } #endif info.iface = iface; info.protocols = protocols; #ifndef LWS_NO_EXTENSIONS info.extensions = libwebsocket_get_internal_extensions(); #endif if (!use_ssl) { info.ssl_cert_filepath = NULL; info.ssl_private_key_filepath = NULL; } else { if (strlen(resource_path) > sizeof(cert_path) - 32) { lwsl_err("resource path too long\n"); return -1; } sprintf(cert_path, "%s/libwebsockets-test-server.pem", resource_path); if (strlen(resource_path) > sizeof(key_path) - 32) { lwsl_err("resource path too long\n"); return -1; } sprintf(key_path, "%s/libwebsockets-test-server.key.pem", resource_path); info.ssl_cert_filepath = cert_path; info.ssl_private_key_filepath = key_path; } info.gid = -1; info.uid = -1; info.options = opts; context = libwebsocket_create_context(&info); if (context == NULL) { lwsl_err("libwebsocket init failed\n"); return -1; } n = 0; while (n >= 0 && !force_exit) { struct timeval tv; gettimeofday(&tv, NULL); /* * This provokes the LWS_CALLBACK_SERVER_WRITEABLE for every * live websocket connection using the DUMB_INCREMENT protocol, * as soon as it can take more packets (usually immediately) */ if (((unsigned int)tv.tv_usec - oldus) > 50000) { libwebsocket_callback_on_writable_all_protocol(&protocols[PROTOCOL_DUMB_INCREMENT]); oldus = tv.tv_usec; } #ifdef EXTERNAL_POLL /* * this represents an existing server's single poll action * which also includes libwebsocket sockets */ n = poll(pollfds, count_pollfds, 50); if (n < 0) continue; if (n) for (n = 0; n < count_pollfds; n++) if (pollfds[n].revents) /* * returns immediately if the fd does not * match anything under libwebsockets * control */ if (libwebsocket_service_fd(context, &pollfds[n]) < 0) goto done; #else /* * If libwebsockets sockets are all we care about, * you can use this api which takes care of the poll() * and looping through finding who needed service. * * If no socket needs service, it'll return anyway after * the number of ms in the second argument. */ n = libwebsocket_service(context, 50); #endif } #ifdef EXTERNAL_POLL done: #endif libwebsocket_context_destroy(context); lwsl_notice("libwebsockets-test-server exited cleanly\n"); #ifndef WIN32 closelog(); #endif return 0; }
static int callback_minimal_broker(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len) { struct pss *pss = (struct pss *)user; int n; switch (reason) { case LWS_CALLBACK_PROTOCOL_INIT: goto try; case LWS_CALLBACK_CLIENT_CONNECTION_ERROR: lwsl_err("CLIENT_CONNECTION_ERROR: %s\n", in ? (char *)in : "(null)"); client_wsi = NULL; lws_timed_callback_vh_protocol(lws_get_vhost(wsi), lws_get_protocol(wsi), LWS_CALLBACK_USER, 1); break; /* --- client callbacks --- */ case LWS_CALLBACK_CLIENT_ESTABLISHED: lwsl_user("%s: established\n", __func__); lws_set_timer_usecs(wsi, 5 * LWS_USEC_PER_SEC); break; case LWS_CALLBACK_CLIENT_WRITEABLE: if (pss->send_a_ping) { uint8_t ping[LWS_PRE + 125]; int m; pss->send_a_ping = 0; n = 0; if (!zero_length_ping) n = lws_snprintf((char *)ping + LWS_PRE, 125, "ping body!"); lwsl_user("Sending PING %d...\n", n); m = lws_write(wsi, ping + LWS_PRE, n, LWS_WRITE_PING); if (m < n) { lwsl_err("sending ping failed: %d\n", m); return -1; } lws_callback_on_writable(wsi); } break; case LWS_CALLBACK_WS_CLIENT_DROP_PROTOCOL: client_wsi = NULL; lws_timed_callback_vh_protocol(lws_get_vhost(wsi), lws_get_protocol(wsi), LWS_CALLBACK_USER, 1); break; case LWS_CALLBACK_CLIENT_RECEIVE_PONG: lwsl_user("LWS_CALLBACK_CLIENT_RECEIVE_PONG\n"); lwsl_hexdump_notice(in, len); break; case LWS_CALLBACK_TIMER: /* we want to send a ws PING every few seconds */ pss->send_a_ping = 1; lws_callback_on_writable(wsi); lws_set_timer_usecs(wsi, 5 * LWS_USEC_PER_SEC); break; /* rate-limited client connect retries */ case LWS_CALLBACK_USER: lwsl_notice("%s: LWS_CALLBACK_USER\n", __func__); try: if (connect_client()) lws_timed_callback_vh_protocol(lws_get_vhost(wsi), lws_get_protocol(wsi), LWS_CALLBACK_USER, 1); break; default: break; } return lws_callback_http_dummy(wsi, reason, user, in, len); } static const struct lws_protocols protocols[] = { { "lws-ping-test", callback_minimal_broker, sizeof(struct pss), 0, }, { NULL, NULL, 0, 0 } }; static void sigint_handler(int sig) { interrupted = 1; } int main(int argc, const char **argv) { struct lws_context_creation_info info; const char *p; int n = 0, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE /* for LLL_ verbosity above NOTICE to be built into lws, * lws must have been configured and built with * -DCMAKE_BUILD_TYPE=DEBUG instead of =RELEASE */ /* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */ /* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */ /* | LLL_DEBUG */; signal(SIGINT, sigint_handler); if ((p = lws_cmdline_option(argc, argv, "-d"))) logs = atoi(p); lws_set_log_level(logs, NULL); lwsl_user("LWS minimal ws client PING\n"); memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */ info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; info.port = CONTEXT_PORT_NO_LISTEN; /* we do not run any server */ info.protocols = protocols; #if defined(LWS_WITH_MBEDTLS) /* * OpenSSL uses the system trust store. mbedTLS has to be told which * CA to trust explicitly. */ info.client_ssl_ca_filepath = "./libwebsockets.org.cer"; #endif if (lws_cmdline_option(argc, argv, "-z")) zero_length_ping = 1; if ((p = lws_cmdline_option(argc, argv, "--protocol"))) pro = p; if ((p = lws_cmdline_option(argc, argv, "--server"))) { server_address = p; pro = "lws-minimal"; ssl_connection |= LCCSCF_ALLOW_SELFSIGNED; } if ((p = lws_cmdline_option(argc, argv, "--port"))) port = atoi(p); /* * since we know this lws context is only ever going to be used with * one client wsis / fds / sockets at a time, let lws know it doesn't * have to use the default allocations for fd tables up to ulimit -n. * It will just allocate for 1 internal and 1 (+ 1 http2 nwsi) that we * will use. */ info.fd_limit_per_thread = 1 + 1 + 1; context = lws_create_context(&info); if (!context) { lwsl_err("lws init failed\n"); return 1; } while (n >= 0 && !interrupted) n = lws_service(context, 1000); lws_context_destroy(context); lwsl_user("Completed\n"); return 0; }
int main(int argc, char **argv) { int n = 0; int port = 7681; int use_ssl = 0; struct libwebsocket_context *context; int opts = 0; char interface_name[128] = ""; const char *_interface = NULL; char ssl_cert[256] = LOCAL_RESOURCE_PATH"/libwebsockets-test-server.pem"; char ssl_key[256] = LOCAL_RESOURCE_PATH"/libwebsockets-test-server.key.pem"; #ifndef _WIN32 int syslog_options = LOG_PID | LOG_PERROR; #endif int client = 0; int listen_port = 80; struct lws_context_creation_info info; char passphrase[256]; char uri[256] = "/"; #ifndef LWS_NO_CLIENT char address[256], ads_port[256 + 30]; int rate_us = 250000; unsigned int oldus = 0; struct libwebsocket *wsi; int disallow_selfsigned = 0; #endif int debug_level = 7; #ifndef LWS_NO_DAEMONIZE int daemonize = 0; #endif memset(&info, 0, sizeof info); #ifndef LWS_NO_CLIENT lwsl_notice("Built to support client operations\n"); #endif #ifndef LWS_NO_SERVER lwsl_notice("Built to support server operations\n"); #endif while (n >= 0) { n = getopt_long(argc, argv, "i:hsp:d:DC:k:P:vu:" #ifndef LWS_NO_CLIENT "c:r:" #endif , options, NULL); if (n < 0) continue; switch (n) { case 'P': strncpy(passphrase, optarg, sizeof(passphrase)); passphrase[sizeof(passphrase) - 1] = '\0'; info.ssl_private_key_password = passphrase; break; case 'C': strncpy(ssl_cert, optarg, sizeof(ssl_cert)); ssl_cert[sizeof(ssl_cert) - 1] = '\0'; disallow_selfsigned = 1; break; case 'k': strncpy(ssl_key, optarg, sizeof(ssl_key)); ssl_key[sizeof(ssl_key) - 1] = '\0'; break; case 'u': strncpy(uri, optarg, sizeof(uri)); uri[sizeof(uri) - 1] = '\0'; break; #ifndef LWS_NO_DAEMONIZE case 'D': daemonize = 1; #ifndef _WIN32 syslog_options &= ~LOG_PERROR; #endif break; #endif #ifndef LWS_NO_CLIENT case 'c': client = 1; strncpy(address, optarg, sizeof(address) - 1); address[sizeof(address) - 1] = '\0'; port = 80; break; case 'r': rate_us = atoi(optarg) * 1000; break; #endif 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 'v': versa = 1; 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\n" " --debug / -d <debug bitfield>\n" " --port / -p <port>\n" " --ssl-cert / -C <cert path>\n" " --ssl-key / -k <key path>\n" #ifndef LWS_NO_CLIENT " --client / -c <server IP>\n" " --ratems / -r <rate in ms>\n" #endif " --ssl / -s\n" " --passphrase / -P <passphrase>\n" " --interface / -i <interface>\n" #ifndef LWS_NO_DAEMONIZE " --daemonize / -D\n" #endif ); exit(1); } } #ifndef LWS_NO_DAEMONIZE /* * normally lock path would be /var/lock/lwsts or similar, to * simplify getting started without having to take care about * permissions or running as root, set to /tmp/.lwsts-lock */ #if defined(WIN32) || defined(_WIN32) #else if (!client && daemonize && lws_daemonize("/tmp/.lwstecho-lock")) { fprintf(stderr, "Failed to daemonize\n"); return 1; } #endif #endif #ifndef _WIN32 /* we will only try to log things according to our debug_level */ setlogmask(LOG_UPTO (LOG_DEBUG)); openlog("lwsts", syslog_options, LOG_DAEMON); #endif /* tell the library what debug level to emit and to send it to syslog */ lws_set_log_level(debug_level, lwsl_emit_syslog); lwsl_notice("libwebsockets echo test - " "(C) Copyright 2010-2015 Andy Green <*****@*****.**> - " "licensed under LGPL2.1\n"); #ifndef LWS_NO_CLIENT if (client) { lwsl_notice("Running in client mode\n"); listen_port = CONTEXT_PORT_NO_LISTEN; if (use_ssl && !disallow_selfsigned) { lwsl_info("allowing selfsigned\n"); use_ssl = 2; } else { lwsl_info("requiring server cert validation againts %s\n", ssl_cert); info.ssl_ca_filepath = ssl_cert; } } else { #endif #ifndef LWS_NO_SERVER lwsl_notice("Running in server mode\n"); listen_port = port; #endif #ifndef LWS_NO_CLIENT } #endif info.port = listen_port; info.iface = _interface; info.protocols = protocols; #ifndef LWS_NO_EXTENSIONS info.extensions = libwebsocket_get_internal_extensions(); #endif if (use_ssl && !client) { info.ssl_cert_filepath = ssl_cert; info.ssl_private_key_filepath = ssl_key; } else if (use_ssl && client) { info.ssl_cert_filepath = NULL; info.ssl_private_key_filepath = NULL; } info.gid = -1; info.uid = -1; info.options = opts; context = libwebsocket_create_context(&info); if (context == NULL) { lwsl_err("libwebsocket init failed\n"); return -1; } signal(SIGINT, sighandler); n = 0; while (n >= 0 && !force_exit) { #ifndef LWS_NO_CLIENT struct timeval tv; if (client && !state) { state = 1; lwsl_notice("Client connecting to %s:%u....\n", address, port); /* we are in client mode */ address[sizeof(address) - 1] = '\0'; sprintf(ads_port, "%s:%u", address, port & 65535); wsi = libwebsocket_client_connect(context, address, port, use_ssl, uri, ads_port, ads_port, NULL, -1); if (!wsi) { lwsl_err("Client failed to connect to %s:%u\n", address, port); goto bail; } } if (client && !versa) { gettimeofday(&tv, NULL); if (((unsigned int)tv.tv_usec - oldus) > (unsigned int)rate_us) { libwebsocket_callback_on_writable_all_protocol(&protocols[0]); oldus = tv.tv_usec; } } #endif n = libwebsocket_service(context, 10); } #ifndef LWS_NO_CLIENT bail: #endif libwebsocket_context_destroy(context); lwsl_notice("libwebsockets-test-echo exited cleanly\n"); #ifndef _WIN32 closelog(); #endif return 0; }
int main(int argc, const char **argv) { struct lws_context_creation_info info; struct lws_context *context; const char *p; int n = 0, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE /* for LLL_ verbosity above NOTICE to be built into lws, * lws must have been configured and built with * -DCMAKE_BUILD_TYPE=DEBUG instead of =RELEASE */ /* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */ /* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */ /* | LLL_DEBUG */; if ((p = lws_cmdline_option(argc, argv, "-d"))) logs = atoi(p); lws_set_log_level(logs, NULL); lwsl_user("LWS minimal http server-multivhost | visit http://localhost:7681 / 7682\n"); signal(SIGINT, sigint_handler); memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */ info.options = LWS_SERVER_OPTION_EXPLICIT_VHOSTS | LWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE; /* * Because of LWS_SERVER_OPTION_EXPLICIT_VHOSTS, this only creates * the context and no longer creates a default vhost */ context = lws_create_context(&info); if (!context) { lwsl_err("lws init failed\n"); return 1; } /* it's our job now to create the vhosts we want: * * - "localhost1" listen on 7681 and serve ./mount-origin-localhost1/ * - "localhost2" listen on 7682 and serve ./mount-origin-localhost2/ * - "localhost3" share 7682 and serve ./mount-origin-localhost3/ * * Note lws supports dynamic vhost creation and destruction at runtime. * When using multi-vhost with your own protocols, you must provide a * pvo for each vhost naming each protocol you want enabled on it. * minimal-ws-server-threads demonstrates how to provide pvos. */ info.port = 7681; info.mounts = &mount_localhost1; info.error_document_404 = "/404.html"; info.vhost_name = "localhost1"; if (!lws_create_vhost(context, &info)) { lwsl_err("Failed to create first vhost\n"); goto bail; } info.port = 7682; info.mounts = &mount_localhost2; info.error_document_404 = "/404.html"; info.vhost_name = "localhost2"; if (!lws_create_vhost(context, &info)) { lwsl_err("Failed to create second vhost\n"); goto bail; } /* a second vhost listens on port 7682 */ info.mounts = &mount_localhost3; info.error_document_404 = "/404.html"; info.vhost_name = "localhost3"; info.finalize = vh_destruction_notification; info.finalize_arg = NULL; if (!lws_create_vhost(context, &info)) { lwsl_err("Failed to create third vhost\n"); goto bail; } if (lws_cmdline_option(argc, argv, "--die-after-vhost")) { lwsl_warn("bailing after creating vhosts\n"); goto bail; } while (n >= 0 && !interrupted) n = lws_service(context, 1000); bail: lws_context_destroy(context); return 0; }
int main(int argc, const char **argv) { struct lws_context_creation_info info; struct lws_context *context; const char *p; int n = 0, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE /* for LLL_ verbosity above NOTICE to be built into lws, * lws must have been configured and built with * -DCMAKE_BUILD_TYPE=DEBUG instead of =RELEASE */ /* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */ /* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */ /* | LLL_DEBUG */; signal(SIGINT, sigint_handler); if ((p = lws_cmdline_option(argc, argv, "-d"))) logs = atoi(p); lws_set_log_level(logs, NULL); lwsl_user("LWS minimal http server dynamic | visit http://localhost:7681\n"); memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */ info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT | LWS_SERVER_OPTION_EXPLICIT_VHOSTS; /* for testing ah queue, not useful in real world */ if (lws_cmdline_option(argc, argv, "--ah1")) info.max_http_header_pool = 1; context = lws_create_context(&info); if (!context) { lwsl_err("lws init failed\n"); return 1; } /* http on 7681 */ info.port = 7681; info.protocols = protocols; info.mounts = &mount; info.vhost_name = "http"; if (!lws_create_vhost(context, &info)) { lwsl_err("Failed to create tls vhost\n"); goto bail; } /* https on 7682 */ info.port = 7682; info.error_document_404 = "/404.html"; info.ssl_cert_filepath = "localhost-100y.cert"; info.ssl_private_key_filepath = "localhost-100y.key"; info.vhost_name = "localhost"; if (!lws_create_vhost(context, &info)) { lwsl_err("Failed to create tls vhost\n"); goto bail; } while (n >= 0 && !interrupted) n = lws_service(context, 1000); bail: lws_context_destroy(context); return 0; }
int main(int argc, const char **argv) { struct lws_context_creation_info info; struct lws_client_connect_info i; struct lws_context *context; const char *p; int n = 0, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE /* * For LLL_ verbosity above NOTICE to be built into lws, * lws must have been configured and built with * -DCMAKE_BUILD_TYPE=DEBUG instead of =RELEASE * * | LLL_INFO | LLL_PARSER | LLL_HEADER | LLL_EXT | * LLL_CLIENT | LLL_LATENCY | LLL_DEBUG */ ; signal(SIGINT, sigint_handler); if ((p = lws_cmdline_option(argc, argv, "-d"))) logs = atoi(p); lws_set_log_level(logs, NULL); lwsl_user("LWS minimal http client [-d<verbosity>] [-l] [--h1]\n"); memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */ info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; info.port = CONTEXT_PORT_NO_LISTEN; /* we do not run any server */ info.protocols = protocols; #if defined(LWS_WITH_MBEDTLS) /* * OpenSSL uses the system trust store. mbedTLS has to be told which * CA to trust explicitly. */ info.client_ssl_ca_filepath = "./warmcat.com.cer"; #endif context = lws_create_context(&info); if (!context) { lwsl_err("lws init failed\n"); return 1; } memset(&i, 0, sizeof i); /* otherwise uninitialized garbage */ i.context = context; i.ssl_connection = LCCSCF_USE_SSL; if (lws_cmdline_option(argc, argv, "-l")) { i.port = 7681; i.address = "localhost"; i.ssl_connection |= LCCSCF_ALLOW_SELFSIGNED; } else { i.port = 443; i.address = "warmcat.com"; } if (lws_cmdline_option(argc, argv, "--h1")) i.alpn = "http/1.1"; i.path = "/"; i.host = i.address; i.origin = i.address; i.method = "GET"; i.protocol = protocols[0].name; i.pwsi = &client_wsi; lws_client_connect_via_info(&i); while (n >= 0 && client_wsi && !interrupted) n = lws_service(context, 1000); lws_context_destroy(context); lwsl_user("Completed: %s\n", bad ? "failed" : "OK"); return bad; }
int main(int argc, char **argv) { int n = 0, ret = 0, port = 7681, use_ssl = 0; unsigned int rl_dumb = 0, rl_mirror = 0; struct lws_context_creation_info info; struct lws_context *context; int ietf_version = -1; /* latest */ const char *address; memset(&info, 0, sizeof info); fprintf(stderr, "libwebsockets test client\n" "(C) Copyright 2010-2015 Andy Green <*****@*****.**> " "licensed under LGPL2.1\n"); if (argc < 2) goto usage; while (n >= 0) { n = getopt_long(argc, argv, "nuv:hsp:d:l", options, NULL); if (n < 0) continue; switch (n) { case 'd': lws_set_log_level(atoi(optarg), NULL); break; case 's': use_ssl = 2; /* 2 = allow selfsigned */ break; case 'p': port = atoi(optarg); break; case 'l': longlived = 1; break; case 'v': ietf_version = atoi(optarg); break; case 'u': deny_deflate = 1; break; case 'n': deny_mux = 1; break; case 'h': goto usage; } } if (optind >= argc) goto usage; signal(SIGINT, sighandler); address = argv[optind]; /* * create the websockets context. This tracks open connections and * knows how to route any traffic and which protocol version to use, * and if each connection is client or server side. * * For this client-only demo, we tell it to not listen on any port. */ info.port = CONTEXT_PORT_NO_LISTEN; info.protocols = protocols; #ifndef LWS_NO_EXTENSIONS info.extensions = lws_get_internal_extensions(); #endif info.gid = -1; info.uid = -1; context = lws_create_context(&info); if (context == NULL) { fprintf(stderr, "Creating libwebsocket context failed\n"); return 1; } /* * sit there servicing the websocket context to handle incoming * packets, and drawing random circles on the mirror protocol websocket * * nothing happens until the client websocket connection is * asynchronously established... calling lws_client_connect() only * instantiates the connection logically, lws_service() progresses it * asynchronously. */ while (!force_exit) { if (!wsi_dumb && ratelimit_connects(&rl_dumb, 2u)) { lwsl_notice("dumb: connecting\n"); wsi_dumb = lws_client_connect(context, address, port, use_ssl, "/", argv[optind], argv[optind], protocols[PROTOCOL_DUMB_INCREMENT].name, ietf_version); } if (!wsi_mirror && ratelimit_connects(&rl_mirror, 2u)) { lwsl_notice("mirror: connecting\n"); wsi_mirror = lws_client_connect(context, address, port, use_ssl, "/", argv[optind], argv[optind], protocols[PROTOCOL_LWS_MIRROR].name, ietf_version); } lws_service(context, 500); } lwsl_err("Exiting\n"); lws_context_destroy(context); return ret; usage: fprintf(stderr, "Usage: libwebsockets-test-client " "<server address> [--port=<p>] " "[--ssl] [-k] [-v <ver>] " "[-d <log bitfield>] [-l]\n"); return 1; }