| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 1 | /* | 
|  | 2 | * libwebsockets-test-client - libwebsockets test implementation | 
|  | 3 | * | 
|  | 4 | * Copyright (C) 2011 Andy Green <andy@warmcat.com> | 
|  | 5 | * | 
|  | 6 | *  This library is free software; you can redistribute it and/or | 
|  | 7 | *  modify it under the terms of the GNU Lesser General Public | 
|  | 8 | *  License as published by the Free Software Foundation: | 
|  | 9 | *  version 2.1 of the License. | 
|  | 10 | * | 
|  | 11 | *  This library is distributed in the hope that it will be useful, | 
|  | 12 | *  but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 13 | *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | 14 | *  Lesser General Public License for more details. | 
|  | 15 | * | 
|  | 16 | *  You should have received a copy of the GNU Lesser General Public | 
|  | 17 | *  License along with this library; if not, write to the Free Software | 
|  | 18 | *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | 
|  | 19 | *  MA  02110-1301  USA | 
|  | 20 | */ | 
|  | 21 |  | 
|  | 22 | #include <stdio.h> | 
|  | 23 | #include <stdlib.h> | 
|  | 24 | #include <unistd.h> | 
|  | 25 | #include <getopt.h> | 
|  | 26 | #include <string.h> | 
| Andy Green | 3886ec7 | 2013-02-11 14:32:02 +0800 | [diff] [blame] | 27 | #include <signal.h> | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 28 |  | 
| Joakim Soderberg | 7eadd58 | 2013-02-22 09:28:04 +0800 | [diff] [blame] | 29 | #ifdef CMAKE_BUILD | 
|  | 30 | #include "lws_config.h" | 
|  | 31 | #endif | 
|  | 32 |  | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 33 | #include "../lib/libwebsockets.h" | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 34 |  | 
| Andy Green | 990d506 | 2011-01-30 21:04:24 +0000 | [diff] [blame] | 35 | static unsigned int opts; | 
| Andy Green | b3ae0a3 | 2011-02-14 20:25:43 +0000 | [diff] [blame] | 36 | static int was_closed; | 
| Andy Green | 775884e | 2011-03-06 13:32:53 +0000 | [diff] [blame] | 37 | static int deny_deflate; | 
| Andy Green | 7448c7e | 2011-05-24 22:06:17 +0100 | [diff] [blame] | 38 | static int deny_mux; | 
| Andy Green | 4084af1 | 2011-05-24 22:06:17 +0100 | [diff] [blame] | 39 | static struct libwebsocket *wsi_mirror; | 
| Andy Green | 8e0c984 | 2013-02-09 14:10:04 +0800 | [diff] [blame] | 40 | static int mirror_lifetime = 0; | 
| Andy Green | 3886ec7 | 2013-02-11 14:32:02 +0800 | [diff] [blame] | 41 | static int force_exit = 0; | 
| Andy Green | 990d506 | 2011-01-30 21:04:24 +0000 | [diff] [blame] | 42 |  | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 43 | /* | 
|  | 44 | * This demo shows how to connect multiple websockets simultaneously to a | 
|  | 45 | * websocket server (there is no restriction on their having to be the same | 
|  | 46 | * server just it simplifies the demo). | 
|  | 47 | * | 
|  | 48 | *  dumb-increment-protocol:  we connect to the server and print the number | 
| Andy Green | 90c7cbc | 2011-01-27 06:26:52 +0000 | [diff] [blame] | 49 | *				we are given | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 50 | * | 
|  | 51 | *  lws-mirror-protocol: draws random circles, which are mirrored on to every | 
| Andy Green | 90c7cbc | 2011-01-27 06:26:52 +0000 | [diff] [blame] | 52 | *				client (see them being drawn in every browser | 
|  | 53 | *				session also using the test server) | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 54 | */ | 
|  | 55 |  | 
|  | 56 | enum demo_protocols { | 
|  | 57 |  | 
|  | 58 | PROTOCOL_DUMB_INCREMENT, | 
|  | 59 | PROTOCOL_LWS_MIRROR, | 
|  | 60 |  | 
|  | 61 | /* always last */ | 
|  | 62 | DEMO_PROTOCOL_COUNT | 
|  | 63 | }; | 
|  | 64 |  | 
|  | 65 |  | 
|  | 66 | /* dumb_increment protocol */ | 
|  | 67 |  | 
|  | 68 | static int | 
| Andy Green | 6ee372f | 2012-04-09 15:09:01 +0800 | [diff] [blame] | 69 | callback_dumb_increment(struct libwebsocket_context *this, | 
| Andy Green | 62c54d2 | 2011-02-14 09:14:25 +0000 | [diff] [blame] | 70 | struct libwebsocket *wsi, | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 71 | enum libwebsocket_callback_reasons reason, | 
|  | 72 | void *user, void *in, size_t len) | 
|  | 73 | { | 
|  | 74 | switch (reason) { | 
|  | 75 |  | 
| Andy Green | 4084af1 | 2011-05-24 22:06:17 +0100 | [diff] [blame] | 76 | case LWS_CALLBACK_CLOSED: | 
|  | 77 | fprintf(stderr, "LWS_CALLBACK_CLOSED\n"); | 
|  | 78 | was_closed = 1; | 
|  | 79 | break; | 
|  | 80 |  | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 81 | case LWS_CALLBACK_CLIENT_RECEIVE: | 
| Andy Green | 90c7cbc | 2011-01-27 06:26:52 +0000 | [diff] [blame] | 82 | ((char *)in)[len] = '\0'; | 
|  | 83 | fprintf(stderr, "rx %d '%s'\n", (int)len, (char *)in); | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 84 | break; | 
|  | 85 |  | 
| Andy Green | 775884e | 2011-03-06 13:32:53 +0000 | [diff] [blame] | 86 | /* because we are protocols[0] ... */ | 
|  | 87 |  | 
|  | 88 | case LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED: | 
| Andy Green | 7448c7e | 2011-05-24 22:06:17 +0100 | [diff] [blame] | 89 | if ((strcmp(in, "deflate-stream") == 0) && deny_deflate) { | 
|  | 90 | fprintf(stderr, "denied deflate-stream extension\n"); | 
|  | 91 | return 1; | 
|  | 92 | } | 
|  | 93 | if ((strcmp(in, "x-google-mux") == 0) && deny_mux) { | 
|  | 94 | fprintf(stderr, "denied x-google-mux extension\n"); | 
|  | 95 | return 1; | 
|  | 96 | } | 
|  | 97 |  | 
| Andy Green | 775884e | 2011-03-06 13:32:53 +0000 | [diff] [blame] | 98 | break; | 
|  | 99 |  | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 100 | default: | 
|  | 101 | break; | 
|  | 102 | } | 
|  | 103 |  | 
|  | 104 | return 0; | 
|  | 105 | } | 
|  | 106 |  | 
|  | 107 |  | 
|  | 108 | /* lws-mirror_protocol */ | 
|  | 109 |  | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 110 |  | 
|  | 111 | static int | 
| Andy Green | 8e0c984 | 2013-02-09 14:10:04 +0800 | [diff] [blame] | 112 | callback_lws_mirror(struct libwebsocket_context *context, | 
| Andy Green | 62c54d2 | 2011-02-14 09:14:25 +0000 | [diff] [blame] | 113 | struct libwebsocket *wsi, | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 114 | enum libwebsocket_callback_reasons reason, | 
|  | 115 | void *user, void *in, size_t len) | 
|  | 116 | { | 
| Andy Green | 90c7cbc | 2011-01-27 06:26:52 +0000 | [diff] [blame] | 117 | unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 4096 + | 
|  | 118 | LWS_SEND_BUFFER_POST_PADDING]; | 
| Andy Green | 3182ece | 2013-01-20 17:08:31 +0800 | [diff] [blame] | 119 | int l = 0; | 
|  | 120 | int n; | 
| Andy Green | 90c7cbc | 2011-01-27 06:26:52 +0000 | [diff] [blame] | 121 |  | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 122 | switch (reason) { | 
|  | 123 |  | 
| Andy Green | b3ae0a3 | 2011-02-14 20:25:43 +0000 | [diff] [blame] | 124 | case LWS_CALLBACK_CLOSED: | 
| Andy Green | ca0a129 | 2013-03-16 11:24:23 +0800 | [diff] [blame^] | 125 | fprintf(stderr, "mirror: LWS_CALLBACK_CLOSED mirror_lifetime=%d\n", mirror_lifetime); | 
| Andy Green | 4084af1 | 2011-05-24 22:06:17 +0100 | [diff] [blame] | 126 | wsi_mirror = NULL; | 
| Andy Green | b3ae0a3 | 2011-02-14 20:25:43 +0000 | [diff] [blame] | 127 | break; | 
|  | 128 |  | 
| Andy Green | 90c7cbc | 2011-01-27 06:26:52 +0000 | [diff] [blame] | 129 | case LWS_CALLBACK_CLIENT_ESTABLISHED: | 
|  | 130 |  | 
|  | 131 | /* | 
|  | 132 | * start the ball rolling, | 
| Andy Green | b6e6ebe | 2011-01-27 06:36:39 +0000 | [diff] [blame] | 133 | * LWS_CALLBACK_CLIENT_WRITEABLE will come next service | 
| Andy Green | 90c7cbc | 2011-01-27 06:26:52 +0000 | [diff] [blame] | 134 | */ | 
|  | 135 |  | 
| Andy Green | 8e0c984 | 2013-02-09 14:10:04 +0800 | [diff] [blame] | 136 | libwebsocket_callback_on_writable(context, wsi); | 
| Andy Green | 90c7cbc | 2011-01-27 06:26:52 +0000 | [diff] [blame] | 137 | break; | 
|  | 138 |  | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 139 | case LWS_CALLBACK_CLIENT_RECEIVE: | 
| Andy Green | 90c7cbc | 2011-01-27 06:26:52 +0000 | [diff] [blame] | 140 | /*		fprintf(stderr, "rx %d '%s'\n", (int)len, (char *)in); */ | 
|  | 141 | break; | 
|  | 142 |  | 
|  | 143 | case LWS_CALLBACK_CLIENT_WRITEABLE: | 
|  | 144 |  | 
| Andy Green | 3182ece | 2013-01-20 17:08:31 +0800 | [diff] [blame] | 145 | for (n = 0; n < 1; n++) | 
|  | 146 | l += sprintf((char *)&buf[LWS_SEND_BUFFER_PRE_PADDING + l], | 
| Andy Green | 90c7cbc | 2011-01-27 06:26:52 +0000 | [diff] [blame] | 147 | "c #%06X %d %d %d;", | 
|  | 148 | (int)random() & 0xffffff, | 
|  | 149 | (int)random() % 500, | 
|  | 150 | (int)random() % 250, | 
|  | 151 | (int)random() % 24); | 
|  | 152 |  | 
| Andy Green | fc7c5e4 | 2013-02-23 10:50:10 +0800 | [diff] [blame] | 153 | n = libwebsocket_write(wsi, | 
| Andy Green | 990d506 | 2011-01-30 21:04:24 +0000 | [diff] [blame] | 154 | &buf[LWS_SEND_BUFFER_PRE_PADDING], l, opts | LWS_WRITE_TEXT); | 
| Andy Green | 90c7cbc | 2011-01-27 06:26:52 +0000 | [diff] [blame] | 155 |  | 
| Andy Green | fc7c5e4 | 2013-02-23 10:50:10 +0800 | [diff] [blame] | 156 | if (n < 0) | 
|  | 157 | return -1; | 
|  | 158 | if (n < l) { | 
|  | 159 | lwsl_err("Partial write LWS_CALLBACK_CLIENT_WRITEABLE\n"); | 
|  | 160 | return -1; | 
|  | 161 | } | 
|  | 162 |  | 
| Andy Green | 8e0c984 | 2013-02-09 14:10:04 +0800 | [diff] [blame] | 163 | mirror_lifetime--; | 
|  | 164 | if (!mirror_lifetime) { | 
|  | 165 | fprintf(stderr, "closing mirror session\n"); | 
| Andy Green | 310655b | 2013-02-11 14:08:50 +0800 | [diff] [blame] | 166 | return -1; | 
| Andy Green | 8e0c984 | 2013-02-09 14:10:04 +0800 | [diff] [blame] | 167 | } else | 
|  | 168 | /* get notified as soon as we can write again */ | 
|  | 169 | libwebsocket_callback_on_writable(context, wsi); | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 170 | break; | 
|  | 171 |  | 
|  | 172 | default: | 
|  | 173 | break; | 
|  | 174 | } | 
|  | 175 |  | 
|  | 176 | return 0; | 
|  | 177 | } | 
|  | 178 |  | 
|  | 179 |  | 
|  | 180 | /* list of supported protocols and callbacks */ | 
|  | 181 |  | 
|  | 182 | static struct libwebsocket_protocols protocols[] = { | 
| Peter Hinz | 56885f3 | 2011-03-02 22:03:47 +0000 | [diff] [blame] | 183 | { | 
|  | 184 | "dumb-increment-protocol", | 
|  | 185 | callback_dumb_increment, | 
|  | 186 | 0, | 
| Andy Green | 5449511 | 2013-02-06 21:10:16 +0900 | [diff] [blame] | 187 | 20, | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 188 | }, | 
| Peter Hinz | 56885f3 | 2011-03-02 22:03:47 +0000 | [diff] [blame] | 189 | { | 
|  | 190 | "lws-mirror-protocol", | 
|  | 191 | callback_lws_mirror, | 
|  | 192 | 0, | 
| Andy Green | e7c97e8 | 2013-02-09 14:07:32 +0800 | [diff] [blame] | 193 | 128, | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 194 | }, | 
| Andy Green | 5449511 | 2013-02-06 21:10:16 +0900 | [diff] [blame] | 195 | { NULL, NULL, 0, 0 } /* end */ | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 196 | }; | 
|  | 197 |  | 
| Andy Green | 3886ec7 | 2013-02-11 14:32:02 +0800 | [diff] [blame] | 198 | void sighandler(int sig) | 
|  | 199 | { | 
|  | 200 | force_exit = 1; | 
|  | 201 | } | 
|  | 202 |  | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 203 | static struct option options[] = { | 
| Andy Green | 90c7cbc | 2011-01-27 06:26:52 +0000 | [diff] [blame] | 204 | { "help",	no_argument,		NULL, 'h' }, | 
| Andy Green | 46ef0cf | 2013-01-10 22:28:59 +0800 | [diff] [blame] | 205 | { "debug",      required_argument,      NULL, 'd' }, | 
| Andy Green | 90c7cbc | 2011-01-27 06:26:52 +0000 | [diff] [blame] | 206 | { "port",	required_argument,	NULL, 'p' }, | 
|  | 207 | { "ssl",	no_argument,		NULL, 's' }, | 
| Andy Green | bfb051f | 2011-02-09 08:49:14 +0000 | [diff] [blame] | 208 | { "version",	required_argument,	NULL, 'v' }, | 
| Andy Green | 775884e | 2011-03-06 13:32:53 +0000 | [diff] [blame] | 209 | { "undeflated",	no_argument,		NULL, 'u' }, | 
| Andy Green | 7448c7e | 2011-05-24 22:06:17 +0100 | [diff] [blame] | 210 | { "nomux",	no_argument,		NULL, 'n' }, | 
| Andy Green | 43063dd | 2013-01-13 11:58:18 +0800 | [diff] [blame] | 211 | { "longlived",	no_argument,		NULL, 'l' }, | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 212 | { NULL, 0, 0, 0 } | 
|  | 213 | }; | 
|  | 214 |  | 
|  | 215 |  | 
|  | 216 | int main(int argc, char **argv) | 
|  | 217 | { | 
|  | 218 | int n = 0; | 
| Andy Green | 93f98d7 | 2013-02-11 14:05:02 +0800 | [diff] [blame] | 219 | int ret = 0; | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 220 | int port = 7681; | 
|  | 221 | int use_ssl = 0; | 
|  | 222 | struct libwebsocket_context *context; | 
| Andy Green | 1efb63c | 2011-02-06 17:42:06 +0000 | [diff] [blame] | 223 | const char *address; | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 224 | struct libwebsocket *wsi_dumb; | 
| Andy Green | bfb051f | 2011-02-09 08:49:14 +0000 | [diff] [blame] | 225 | int ietf_version = -1; /* latest */ | 
| Andy Green | 43063dd | 2013-01-13 11:58:18 +0800 | [diff] [blame] | 226 | int longlived = 0; | 
| Andy Green | 1b26527 | 2013-02-09 14:01:09 +0800 | [diff] [blame] | 227 | struct lws_context_creation_info info; | 
|  | 228 |  | 
|  | 229 | memset(&info, 0, sizeof info); | 
| Andy Green | 90c7cbc | 2011-01-27 06:26:52 +0000 | [diff] [blame] | 230 |  | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 231 | fprintf(stderr, "libwebsockets test client\n" | 
| Andy Green | 46ef0cf | 2013-01-10 22:28:59 +0800 | [diff] [blame] | 232 | "(C) Copyright 2010-2013 Andy Green <andy@warmcat.com> " | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 233 | "licensed under LGPL2.1\n"); | 
|  | 234 |  | 
|  | 235 | if (argc < 2) | 
|  | 236 | goto usage; | 
|  | 237 |  | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 238 | while (n >= 0) { | 
| Andy Green | 5738c0e | 2013-01-21 09:53:35 +0800 | [diff] [blame] | 239 | n = getopt_long(argc, argv, "nuv:hsp:d:l", options, NULL); | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 240 | if (n < 0) | 
|  | 241 | continue; | 
|  | 242 | switch (n) { | 
| Andy Green | 46ef0cf | 2013-01-10 22:28:59 +0800 | [diff] [blame] | 243 | case 'd': | 
| Andy Green | de8f27a | 2013-01-12 09:17:42 +0800 | [diff] [blame] | 244 | lws_set_log_level(atoi(optarg), NULL); | 
| Andy Green | 46ef0cf | 2013-01-10 22:28:59 +0800 | [diff] [blame] | 245 | break; | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 246 | case 's': | 
| Andy Green | 90c7cbc | 2011-01-27 06:26:52 +0000 | [diff] [blame] | 247 | use_ssl = 2; /* 2 = allow selfsigned */ | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 248 | break; | 
|  | 249 | case 'p': | 
|  | 250 | port = atoi(optarg); | 
|  | 251 | break; | 
| Andy Green | 43063dd | 2013-01-13 11:58:18 +0800 | [diff] [blame] | 252 | case 'l': | 
|  | 253 | longlived = 1; | 
|  | 254 | break; | 
| Andy Green | bfb051f | 2011-02-09 08:49:14 +0000 | [diff] [blame] | 255 | case 'v': | 
|  | 256 | ietf_version = atoi(optarg); | 
|  | 257 | break; | 
| Andy Green | 775884e | 2011-03-06 13:32:53 +0000 | [diff] [blame] | 258 | case 'u': | 
|  | 259 | deny_deflate = 1; | 
|  | 260 | break; | 
| Andy Green | 7448c7e | 2011-05-24 22:06:17 +0100 | [diff] [blame] | 261 | case 'n': | 
|  | 262 | deny_mux = 1; | 
|  | 263 | break; | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 264 | case 'h': | 
|  | 265 | goto usage; | 
|  | 266 | } | 
|  | 267 | } | 
|  | 268 |  | 
| Andy Green | 1efb63c | 2011-02-06 17:42:06 +0000 | [diff] [blame] | 269 | if (optind >= argc) | 
|  | 270 | goto usage; | 
|  | 271 |  | 
| Andy Green | 3886ec7 | 2013-02-11 14:32:02 +0800 | [diff] [blame] | 272 | signal(SIGINT, sighandler); | 
|  | 273 |  | 
| Andy Green | 1efb63c | 2011-02-06 17:42:06 +0000 | [diff] [blame] | 274 | address = argv[optind]; | 
|  | 275 |  | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 276 | /* | 
|  | 277 | * create the websockets context.  This tracks open connections and | 
|  | 278 | * knows how to route any traffic and which protocol version to use, | 
|  | 279 | * and if each connection is client or server side. | 
|  | 280 | * | 
|  | 281 | * For this client-only demo, we tell it to not listen on any port. | 
|  | 282 | */ | 
|  | 283 |  | 
| Andy Green | 1b26527 | 2013-02-09 14:01:09 +0800 | [diff] [blame] | 284 | info.port = CONTEXT_PORT_NO_LISTEN; | 
|  | 285 | info.protocols = protocols; | 
| Andy Green | 3182ece | 2013-01-20 17:08:31 +0800 | [diff] [blame] | 286 | #ifndef LWS_NO_EXTENSIONS | 
| Joakim Soderberg | f272cb0 | 2013-02-13 09:29:26 +0800 | [diff] [blame] | 287 | info.extensions = libwebsocket_get_internal_extensions(); | 
| Andy Green | 3182ece | 2013-01-20 17:08:31 +0800 | [diff] [blame] | 288 | #endif | 
| Andy Green | 1b26527 | 2013-02-09 14:01:09 +0800 | [diff] [blame] | 289 | info.gid = -1; | 
|  | 290 | info.uid = -1; | 
|  | 291 |  | 
|  | 292 | context = libwebsocket_create_context(&info); | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 293 | if (context == NULL) { | 
|  | 294 | fprintf(stderr, "Creating libwebsocket context failed\n"); | 
|  | 295 | return 1; | 
|  | 296 | } | 
|  | 297 |  | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 298 | /* create a client websocket using dumb increment protocol */ | 
|  | 299 |  | 
| Andy Green | 90c7cbc | 2011-01-27 06:26:52 +0000 | [diff] [blame] | 300 | wsi_dumb = libwebsocket_client_connect(context, address, port, use_ssl, | 
| Andy Green | 1efb63c | 2011-02-06 17:42:06 +0000 | [diff] [blame] | 301 | "/", argv[optind], argv[optind], | 
| Andy Green | bfb051f | 2011-02-09 08:49:14 +0000 | [diff] [blame] | 302 | protocols[PROTOCOL_DUMB_INCREMENT].name, ietf_version); | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 303 |  | 
|  | 304 | if (wsi_dumb == NULL) { | 
|  | 305 | fprintf(stderr, "libwebsocket dumb connect failed\n"); | 
| Andy Green | 93f98d7 | 2013-02-11 14:05:02 +0800 | [diff] [blame] | 306 | ret = 1; | 
|  | 307 | goto bail; | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 308 | } | 
|  | 309 |  | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 310 | fprintf(stderr, "Websocket connections opened\n"); | 
|  | 311 |  | 
|  | 312 | /* | 
|  | 313 | * sit there servicing the websocket context to handle incoming | 
|  | 314 | * packets, and drawing random circles on the mirror protocol websocket | 
|  | 315 | */ | 
|  | 316 |  | 
|  | 317 | n = 0; | 
| Andy Green | 3886ec7 | 2013-02-11 14:32:02 +0800 | [diff] [blame] | 318 | while (n >= 0 && !was_closed && !force_exit) { | 
| Andy Green | 8e0c984 | 2013-02-09 14:10:04 +0800 | [diff] [blame] | 319 | n = libwebsocket_service(context, 10); | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 320 |  | 
| Andy Green | 3928f61 | 2012-07-20 12:58:38 +0800 | [diff] [blame] | 321 | if (n < 0) | 
|  | 322 | continue; | 
|  | 323 |  | 
| Andy Green | 8e0c984 | 2013-02-09 14:10:04 +0800 | [diff] [blame] | 324 | if (wsi_mirror) | 
|  | 325 | continue; | 
|  | 326 |  | 
|  | 327 | /* create a client websocket using mirror protocol */ | 
|  | 328 |  | 
|  | 329 | wsi_mirror = libwebsocket_client_connect(context, | 
|  | 330 | address, port, use_ssl,  "/", | 
|  | 331 | argv[optind], argv[optind], | 
|  | 332 | protocols[PROTOCOL_LWS_MIRROR].name, ietf_version); | 
|  | 333 |  | 
| Andy Green | 4084af1 | 2011-05-24 22:06:17 +0100 | [diff] [blame] | 334 | if (wsi_mirror == NULL) { | 
| Andy Green | 8e0c984 | 2013-02-09 14:10:04 +0800 | [diff] [blame] | 335 | fprintf(stderr, "libwebsocket " | 
|  | 336 | "dumb connect failed\n"); | 
| Andy Green | 93f98d7 | 2013-02-11 14:05:02 +0800 | [diff] [blame] | 337 | ret = 1; | 
|  | 338 | goto bail; | 
| Andy Green | 4084af1 | 2011-05-24 22:06:17 +0100 | [diff] [blame] | 339 | } | 
| Andy Green | 8e0c984 | 2013-02-09 14:10:04 +0800 | [diff] [blame] | 340 |  | 
|  | 341 | mirror_lifetime = 10 + (random() & 1023); | 
|  | 342 | /* useful to test single connection stability */ | 
|  | 343 | if (longlived) | 
|  | 344 | mirror_lifetime += 50000; | 
|  | 345 |  | 
|  | 346 | fprintf(stderr, "opened mirror connection with " | 
|  | 347 | "%d lifetime\n", mirror_lifetime); | 
|  | 348 |  | 
|  | 349 | /* | 
|  | 350 | * mirror_lifetime is decremented each send, when it reaches | 
|  | 351 | * zero the connection is closed in the send callback. | 
|  | 352 | * When the close callback comes, wsi_mirror is set to NULL | 
|  | 353 | * so a new connection will be opened | 
|  | 354 | */ | 
| Andy Green | 4084af1 | 2011-05-24 22:06:17 +0100 | [diff] [blame] | 355 | } | 
|  | 356 |  | 
| Andy Green | 93f98d7 | 2013-02-11 14:05:02 +0800 | [diff] [blame] | 357 | bail: | 
| Andy Green | b3ae0a3 | 2011-02-14 20:25:43 +0000 | [diff] [blame] | 358 | fprintf(stderr, "Exiting\n"); | 
|  | 359 |  | 
| Andy Green | 6964bb5 | 2011-01-23 16:50:33 +0000 | [diff] [blame] | 360 | libwebsocket_context_destroy(context); | 
|  | 361 |  | 
| Andy Green | 93f98d7 | 2013-02-11 14:05:02 +0800 | [diff] [blame] | 362 | return ret; | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 363 |  | 
|  | 364 | usage: | 
|  | 365 | fprintf(stderr, "Usage: libwebsockets-test-client " | 
| Andy Green | 46ef0cf | 2013-01-10 22:28:59 +0800 | [diff] [blame] | 366 | "<server address> [--port=<p>] " | 
|  | 367 | "[--ssl] [-k] [-v <ver>] " | 
| Andy Green | 43063dd | 2013-01-13 11:58:18 +0800 | [diff] [blame] | 368 | "[-d <log bitfield>] [-l]\n"); | 
| Andy Green | 4739e5c | 2011-01-22 12:51:57 +0000 | [diff] [blame] | 369 | return 1; | 
|  | 370 | } |