add a devnull like sample code using libwebsockets C library, to see how many messages per second a client library can receive (answer is about the same as IXWebSocket)
This commit is contained in:
		
							
								
								
									
										189
									
								
								test/compatibility/cpp/libwebsockets/devnull_client.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										189
									
								
								test/compatibility/cpp/libwebsockets/devnull_client.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,189 @@ | ||||
| /* | ||||
|  * lws-minimal-ws-client | ||||
|  * | ||||
|  * Written in 2010-2019 by Andy Green <andy@warmcat.com> | ||||
|  * | ||||
|  * This file is made available under the Creative Commons CC0 1.0 | ||||
|  * Universal Public Domain Dedication. | ||||
|  * | ||||
|  * This demonstrates the a minimal ws client using lws. | ||||
|  * | ||||
|  * Original programs connects to https://libwebsockets.org/ and makes a | ||||
|  * wss connection to the dumb-increment protocol there.  While | ||||
|  * connected, it prints the numbers it is being sent by | ||||
|  * dumb-increment protocol. | ||||
|  * | ||||
|  * This is modified to make a test client which counts how much messages | ||||
|  * per second can be received. | ||||
|  * | ||||
|  * libwebsockets$ make && ./a.out | ||||
|  * g++ --std=c++14 -I/usr/local/opt/openssl/include devnull_client.cpp -lwebsockets | ||||
|  * messages received: 0 per second 0 total | ||||
|  * [2020/08/02 19:22:21:4774] U: LWS minimal ws client rx [-d <logs>] [--h2] | ||||
|  * [2020/08/02 19:22:21:4814] U: callback_dumb_increment: established | ||||
|  * messages received: 0 per second 0 total | ||||
|  * messages received: 180015 per second 180015 total | ||||
|  * messages received: 172866 per second 352881 total | ||||
|  * messages received: 176177 per second 529058 total | ||||
|  * messages received: 174191 per second 703249 total | ||||
|  * messages received: 193397 per second 896646 total | ||||
|  * messages received: 196385 per second 1093031 total | ||||
|  * messages received: 194593 per second 1287624 total | ||||
|  * messages received: 189484 per second 1477108 total | ||||
|  * messages received: 200825 per second 1677933 total | ||||
|  * messages received: 183542 per second 1861475 total | ||||
|  * ^C[2020/08/02 19:22:33:4450] U: Completed OK | ||||
|  *  | ||||
|  */ | ||||
|  | ||||
| #include <libwebsockets.h> | ||||
| #include <string.h> | ||||
| #include <signal.h> | ||||
|  | ||||
| #include <atomic> | ||||
| #include <thread> | ||||
| #include <iostream> | ||||
|  | ||||
| static int interrupted; | ||||
| static struct lws *client_wsi; | ||||
|  | ||||
| std::atomic<uint64_t> receivedCount(0); | ||||
|  | ||||
| static int | ||||
| callback_dumb_increment(struct lws *wsi, enum lws_callback_reasons reason, | ||||
|               void *user, void *in, size_t len) | ||||
| { | ||||
|         switch (reason) { | ||||
|  | ||||
|         /* because we are protocols[0] ... */ | ||||
|         case LWS_CALLBACK_CLIENT_CONNECTION_ERROR: | ||||
|                 lwsl_err("CLIENT_CONNECTION_ERROR: %s\n", | ||||
|                          in ? (char *)in : "(null)"); | ||||
|                 client_wsi = NULL; | ||||
|                 break; | ||||
|  | ||||
|         case LWS_CALLBACK_CLIENT_ESTABLISHED: | ||||
|                 lwsl_user("%s: established\n", __func__); | ||||
|                 break; | ||||
|  | ||||
|         case LWS_CALLBACK_CLIENT_RECEIVE: | ||||
|                 receivedCount++; | ||||
|                 break; | ||||
|  | ||||
|         case LWS_CALLBACK_CLIENT_CLOSED: | ||||
|                 client_wsi = NULL; | ||||
|                 break; | ||||
|  | ||||
|         default: | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|         return lws_callback_http_dummy(wsi, reason, user, in, len); | ||||
| } | ||||
|  | ||||
| static const struct lws_protocols protocols[] = { | ||||
|         { | ||||
|                 "dumb-increment-protocol", | ||||
|                 callback_dumb_increment, | ||||
|                 0, | ||||
|                 0, | ||||
|         }, | ||||
|         { NULL, NULL, 0, 0 } | ||||
| }; | ||||
|  | ||||
| static void | ||||
| sigint_handler(int sig) | ||||
| { | ||||
|         interrupted = 1; | ||||
| } | ||||
|  | ||||
| int main(int argc, const char **argv) | ||||
| { | ||||
|         uint64_t receivedCountTotal(0); | ||||
|         uint64_t receivedCountPerSecs(0); | ||||
|  | ||||
|         auto timer = [&receivedCountTotal, &receivedCountPerSecs] { | ||||
|             while (!interrupted) | ||||
|             { | ||||
|                 std::cerr << "messages received: " | ||||
|                           << receivedCountPerSecs | ||||
|                           << " per second " | ||||
|                           << receivedCountTotal  | ||||
|                           << " total" | ||||
|                           << std::endl; | ||||
|  | ||||
|                 receivedCountPerSecs = receivedCount - receivedCountTotal; | ||||
|                 receivedCountTotal += receivedCountPerSecs; | ||||
|  | ||||
|                 auto duration = std::chrono::seconds(1); | ||||
|                 std::this_thread::sleep_for(duration); | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         std::thread t1(timer); | ||||
|  | ||||
|         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 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 rx [-d <logs>] [--h2]\n"); | ||||
|  | ||||
|         memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */ | ||||
|         info.port = CONTEXT_PORT_NO_LISTEN; /* we do not run any server */ | ||||
|         info.protocols = protocols; | ||||
|         info.timeout_secs = 10; | ||||
|  | ||||
|         /* | ||||
|          * 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; | ||||
|         } | ||||
|  | ||||
|         memset(&i, 0, sizeof i); /* otherwise uninitialized garbage */ | ||||
|         i.context = context; | ||||
|         i.port = 8008; | ||||
|         i.address = "127.0.0.1"; | ||||
|         i.path = "/"; | ||||
|         i.host = i.address; | ||||
|         i.origin = i.address; | ||||
|         i.protocol = protocols[0].name; /* "dumb-increment-protocol" */ | ||||
|         i.pwsi = &client_wsi; | ||||
|  | ||||
|         if (lws_cmdline_option(argc, argv, "--h2")) | ||||
|                 i.alpn = "h2"; | ||||
|  | ||||
|         lws_client_connect_via_info(&i); | ||||
|  | ||||
|         while (n >= 0 && client_wsi && !interrupted) | ||||
|                 n = lws_service(context, 0); | ||||
|  | ||||
|         lws_context_destroy(context); | ||||
|  | ||||
|         lwsl_user("Completed %s\n", receivedCount > 10 ? "OK" : "Failed"); | ||||
|  | ||||
|         t1.join(); | ||||
|  | ||||
|         return receivedCount > 10; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user