barbieri pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=2d2dc4de4b63a4fef5c38786211443ccc5e9157d
commit 2d2dc4de4b63a4fef5c38786211443ccc5e9157d Author: Gustavo Sverzut Barbieri <barbi...@profusion.mobi> Date: Wed Dec 7 15:53:52 2016 -0200 ecore_con_server_example: allow more features and protocols to be used. Instead of a single SSL connection, allow for local, tcp and udp, optional flush and delete-after-write (--single-message) and echo mode. Very similar to ecore_ipc_server_example.c --- src/examples/ecore/ecore_con_server_example.c | 229 +++++++++++++++++++++----- 1 file changed, 190 insertions(+), 39 deletions(-) diff --git a/src/examples/ecore/ecore_con_server_example.c b/src/examples/ecore/ecore_con_server_example.c index e835ab0..ddf62e2 100644 --- a/src/examples/ecore/ecore_con_server_example.c +++ b/src/examples/ecore/ecore_con_server_example.c @@ -8,85 +8,236 @@ #include <stdio.h> #include <Ecore.h> #include <Ecore_Con.h> +#include <Ecore_Getopt.h> /* Ecore_Con server example * 2010 Mike Blumenkrantz */ -#ifdef HAVE_GNUTLS -#include <gnutls/gnutls.h> +static int retval = EXIT_SUCCESS; +static Eina_Bool echo = EINA_FALSE; +static Eina_Bool do_flush = EINA_FALSE; +static Eina_Bool single_message = EINA_FALSE; -static void -tls_log_func(int level, const char *str) +Eina_Bool +_add(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) { - fprintf(stderr, "|<%d>| %s", level, str); + Ecore_Con_Event_Client_Add *ev = event; + + printf("INFO: client added %p: %s\n", ev->client, ecore_con_client_ip_get(ev->client)); + + if (!echo) + { + ecore_con_client_send(ev->client, "Hello World!", strlen("Hello World!")); + if (do_flush) ecore_con_client_flush(ev->client); + if (single_message) ecore_con_client_del(ev->client); + } + + return ECORE_CALLBACK_RENEW; } -#endif Eina_Bool -_add(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Con_Event_Client_Add *ev) +_del(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) { - printf("Client with ip %s connected!\n", ecore_con_client_ip_get(ev->client)); - ecore_con_client_send(ev->client, "hello!", 6); -// ecore_con_client_flush(ev->client); - ecore_con_client_timeout_set(ev->client, 5); + Ecore_Con_Event_Client_Del *ev = event; + printf("INFO: client deleted %p: %s!\n", ev->client, ecore_con_client_ip_get(ev->client)); + ecore_con_client_del(ev->client); return ECORE_CALLBACK_RENEW; } Eina_Bool -_del(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Con_Event_Client_Del *ev) +_data(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) { - printf("Lost client with ip %s!\n", ecore_con_client_ip_get(ev->client)); - ecore_main_loop_quit(); + Ecore_Con_Event_Client_Data *ev = event; + + printf("INFO: client data %p: %s\n" + "INFO: - size: %d\n" + "-- BEGIN DATA --\n", + ev->client, ecore_con_client_ip_get(ev->client), + ev->size); + + fwrite(ev->data, ev->size, 1, stdout); + puts("-- END DATA --"); + + if (echo) + { + ecore_con_client_send(ev->client, ev->data, ev->size); + if (do_flush) ecore_con_client_flush(ev->client); + if (single_message) ecore_con_client_del(ev->client); + } + return ECORE_CALLBACK_RENEW; } + Eina_Bool -_data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Con_Event_Client_Data *ev) +_write(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) { - char fmt[128]; - - snprintf(fmt, sizeof(fmt), - "Received %i bytes from client:\n" - ">>>>>\n" - "%%.%is\n" - ">>>>>\n", - ev->size, ev->size); - - printf(fmt, ev->data); + Ecore_Con_Event_Client_Write *ev = event; + printf("Sent %d bytes to client %s\n", ev->size, ecore_con_client_ip_get(ev->client)); return ECORE_CALLBACK_RENEW; } +static const char *types_strs[] = { + "tcp", + "udp", + "ssl", + "mcast", + "local-user", + "local-system", + NULL +}; + +static const Ecore_Getopt options = { + "ecore_con_server_example", /* program name */ + NULL, /* usage line */ + "1", /* version */ + "(C) 2016 Enlightenment Project; 2010 Mike Blumenkrantz", /* copyright */ + "BSD 2-Clause", /* license */ + /* long description, may be multiline and contain \n */ + "Example of ecore_con_server_add() usage.\n", + EINA_FALSE, + { + ECORE_GETOPT_CHOICE('t', "type", "Server type to use, defaults to 'tcp'", types_strs), + + ECORE_GETOPT_STORE_INT('l', "clients-limit", + "If set will limit number of clients to accept"), + ECORE_GETOPT_STORE_TRUE('r', "clients-reject-excess", + "Immediately reject excess clients (over limit)"), + + ECORE_GETOPT_STORE_TRUE('e', "echo", + "Behave as 'echo' server, send back to client all the data receive"), + ECORE_GETOPT_STORE_TRUE('f', "flush", "Force a flush after every send call."), + ECORE_GETOPT_STORE_TRUE('m', "single-message", "Send a single message and delete the client."), + + ECORE_GETOPT_VERSION('V', "version"), + ECORE_GETOPT_COPYRIGHT('C', "copyright"), + ECORE_GETOPT_LICENSE('L', "license"), + ECORE_GETOPT_HELP('h', "help"), + + ECORE_GETOPT_STORE_METAVAR_STR(0, NULL, "The server name.", "name"), + ECORE_GETOPT_STORE_METAVAR_INT(0, NULL, "The server port.", "port"), + + ECORE_GETOPT_SENTINEL + } +}; + int -main() +main(int argc, char **argv) { + Ecore_Con_Type type; + char *name = NULL; + char *type_choice = NULL; + int clients_limit = -1; + int port = -1; + Eina_Bool clients_reject_excess = EINA_FALSE; + Eina_Bool quit_option = EINA_FALSE; + Ecore_Getopt_Value values[] = { + ECORE_GETOPT_VALUE_STR(type_choice), + + ECORE_GETOPT_VALUE_INT(clients_limit), + ECORE_GETOPT_VALUE_BOOL(clients_reject_excess), + + ECORE_GETOPT_VALUE_BOOL(echo), + ECORE_GETOPT_VALUE_BOOL(do_flush), + ECORE_GETOPT_VALUE_BOOL(single_message), + + /* standard block to provide version, copyright, license and help */ + ECORE_GETOPT_VALUE_BOOL(quit_option), /* -V/--version quits */ + ECORE_GETOPT_VALUE_BOOL(quit_option), /* -C/--copyright quits */ + ECORE_GETOPT_VALUE_BOOL(quit_option), /* -L/--license quits */ + ECORE_GETOPT_VALUE_BOOL(quit_option), /* -h/--help quits */ + + /* positional argument */ + ECORE_GETOPT_VALUE_STR(name), + ECORE_GETOPT_VALUE_INT(port), + + ECORE_GETOPT_VALUE_NONE /* sentinel */ + }; + int args; Ecore_Con_Server *svr; + eina_init(); ecore_init(); ecore_con_init(); -#ifdef HAVE_GNUTLS - gnutls_global_set_log_level(9); - gnutls_global_set_log_function(tls_log_func); -#endif - -/* to use a PEM certificate with TLS and SSL3, uncomment the lines below */ - if (!(svr = ecore_con_server_add(ECORE_CON_REMOTE_TCP | ECORE_CON_USE_TLS | ECORE_CON_USE_SSL3 | ECORE_CON_LOAD_CERT, "127.0.0.1", 8080, NULL))) -/* to use simple tcp with ssl/tls, use this line */ -// if (!ecore_con_server_add(ECORE_CON_REMOTE_TCP | ECORE_CON_USE_SSL3, "127.0.0.1", 8080, NULL)) - exit(1); + args = ecore_getopt_parse(&options, values, argc, argv); + if (args < 0) + { + fputs("ERROR: Could not parse command line options.\n", stderr); + retval = EXIT_FAILURE; + goto end; + } + + if (quit_option) goto end; + + args = ecore_getopt_parse_positional(&options, values, argc, argv, args); + if (args < 0) + { + fputs("ERROR: Could not parse positional arguments.\n", stderr); + retval = EXIT_FAILURE; + goto end; + } + + if (!type_choice) type_choice = "tcp"; + + if (strcmp(type_choice, "tcp") == 0) + type = ECORE_CON_REMOTE_TCP; + else if (strcmp(type_choice, "udp") == 0) + type = ECORE_CON_REMOTE_UDP; + else if (strcmp(type_choice, "ssl") == 0) + type = ECORE_CON_REMOTE_TCP | ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT; + else if (strcmp(type_choice, "local-user") == 0) + type = ECORE_CON_LOCAL_USER; + else if (strcmp(type_choice, "system") == 0) + type = ECORE_CON_LOCAL_SYSTEM; + else if (strcmp(type_choice, "mcast") == 0) + type = ECORE_CON_REMOTE_MCAST; + else + { + fprintf(stderr, "ERROR: unsupported --type/-t '%s'\n", type_choice); + retval = EXIT_FAILURE; + goto end; + } + + svr = ecore_con_server_add(type, name, port, NULL); + if (!svr) goto end; + + if (strcmp(type_choice, "ssl") == 0) + { + if (!ecore_con_ssl_server_cert_add(svr, "server.pem")) + { + fprintf(stderr, "ERROR: could not add cert: server.pem\n"); + goto no_mainloop; + } + if (!ecore_con_ssl_server_privkey_add(svr, "server.pem")) + { + fprintf(stderr, "ERROR: could not add privkey: server.pem\n"); + goto no_mainloop; + } + } - ecore_con_ssl_server_cert_add(svr, "server.pem"); - ecore_con_ssl_server_privkey_add(svr, "server.pem"); /* set event handler for client connect */ ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_ADD, (Ecore_Event_Handler_Cb)_add, NULL); /* set event handler for client disconnect */ ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DEL, (Ecore_Event_Handler_Cb)_del, NULL); /* set event handler for receiving client data */ ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DATA, (Ecore_Event_Handler_Cb)_data, NULL); +/* set event handler that notifies of sent data */ + ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_WRITE, (Ecore_Event_Handler_Cb)_write, NULL); /* start server */ ecore_main_loop_begin(); -} + no_mainloop: + ecore_con_server_del(svr); + svr = NULL; + + end: + ecore_con_shutdown(); + ecore_shutdown(); + eina_shutdown(); + + return retval; +} --