/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set et sw=2 ts=2: */ /*************************************************************************** * muniacli.cc * * Fri May 4 15:39:06 CEST 2012 * Copyright 2012 Bent Bisballe Nyeng * deva@aasimon.org ****************************************************************************/ /* * This file is part of Munia. * * Munia is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Munia 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Munia; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include #include #include #include #include #include enum demo_protocols { PROTOCOL_TASK, }; static int callback_task(struct libwebsocket_context *me, struct libwebsocket *wsi, enum libwebsocket_callback_reasons reason, void *user, void *in, size_t len) { unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 4096 + LWS_SEND_BUFFER_POST_PADDING]; int l; char msg[4096]; switch (reason) { case LWS_CALLBACK_CLOSED: fprintf(stderr, "mirror: LWS_CALLBACK_CLOSED\n"); // wsi_mirror = NULL; break; case LWS_CALLBACK_CLIENT_ESTABLISHED: libwebsocket_callback_on_writable(me, wsi); break; case LWS_CALLBACK_CLIENT_RECEIVE: fprintf(stderr, "rx %d '", (int)len); fwrite(in, len, 1, stderr); fprintf(stderr, "'\n"); libwebsocket_callback_on_writable(me, wsi); break; case LWS_CALLBACK_CLIENT_WRITEABLE: fgets(msg, sizeof(msg), stdin); printf("send...\n"); l = sprintf((char *)&buf[LWS_SEND_BUFFER_PRE_PADDING], "%s", msg); libwebsocket_write(wsi, &buf[LWS_SEND_BUFFER_PRE_PADDING], l, LWS_WRITE_TEXT); break; default: break; } return 0; } static struct libwebsocket_protocols protocols[] = { { "lws-task-protocol", callback_task, 0, }, { NULL, NULL, 0 } }; int client(const char *address, int port) { struct libwebsocket_context *context; struct libwebsocket *wsi_task = NULL; int ietf_version = -1; // latest context = libwebsocket_create_context(CONTEXT_PORT_NO_LISTEN, NULL, protocols, libwebsocket_internal_extensions, NULL, NULL, -1, -1, 0); 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 */ int n = 1; while(n >= 0) { n = libwebsocket_service(context, 1000); if (wsi_task == NULL) { wsi_task = libwebsocket_client_connect(context, address, port, 0, "/", address, address, protocols[PROTOCOL_TASK].name, ietf_version); if (wsi_task == NULL) { fprintf(stderr, "libwebsocket task connect failed\n"); return -1; } } else { /* fprintf(stderr, "closing mirror session\n"); libwebsocket_close_and_free_session(context, wsi_mirror, LWS_CLOSE_STATUS_GOINGAWAY); */ } } fprintf(stderr, "Exiting\n"); libwebsocket_context_destroy(context); return 0; } int main() { client("localhost", 10001); return 0; }