Tizen 2.1 base
[framework/uifw/ecore.git] / src / examples / ecore_con_server_simple_example.c
1 #include <stdio.h>
2 #include <Ecore.h>
3 #include <Ecore_Con.h>
4
5 #ifdef HAVE_CONFIG_H
6 # include "config.h"
7 #else
8 # define __UNUSED__
9 #endif
10
11 struct _Client
12 {
13    int sdata;
14 };
15
16 Eina_Bool
17 _add(void *data __UNUSED__, int type __UNUSED__, Ecore_Con_Event_Client_Add *ev)
18 {
19    char welcome[] = "hello! - sent from the server";
20    Ecore_Con_Server *srv;
21    Ecore_Con_Client *cl;
22    const Eina_List *clients, *l;
23
24    struct _Client *client = malloc(sizeof(*client));
25    client->sdata = 0;
26
27    printf("Client with ip %s, port %d, connected = %d!\n",
28           ecore_con_client_ip_get(ev->client),
29           ecore_con_client_port_get(ev->client),
30           ecore_con_client_connected_get(ev->client));
31
32    ecore_con_client_send(ev->client, welcome, sizeof(welcome));
33    ecore_con_client_flush(ev->client);
34
35    ecore_con_client_timeout_set(ev->client, 6);
36
37    ecore_con_client_data_set(ev->client, client);
38
39    srv = ecore_con_client_server_get(ev->client);
40    printf("Clients connected to this server:\n");
41    clients = ecore_con_server_clients_get(srv);
42    EINA_LIST_FOREACH(clients, l, cl)
43      printf("%s\n", ecore_con_client_ip_get(cl));
44
45    return ECORE_CALLBACK_RENEW;
46 }
47
48 Eina_Bool
49 _del(void *data __UNUSED__, int type __UNUSED__, Ecore_Con_Event_Client_Del *ev)
50 {
51    struct _Client *client;
52
53    if (!ev->client)
54      return ECORE_CALLBACK_RENEW;
55
56    client = ecore_con_client_data_get(ev->client);
57
58    printf("Lost client with ip %s!\n", ecore_con_client_ip_get(ev->client));
59    printf("Total data received from this client: %d\n", client->sdata);
60    printf("Client was connected for %0.3f seconds.\n",
61           ecore_con_client_uptime_get(ev->client));
62
63    if (client)
64      free(client);
65
66    ecore_con_client_del(ev->client);
67
68    return ECORE_CALLBACK_RENEW;
69 }
70
71 Eina_Bool
72 _data(void *data __UNUSED__, int type __UNUSED__, Ecore_Con_Event_Client_Data *ev)
73 {
74    char fmt[128];
75    struct _Client *client = ecore_con_client_data_get(ev->client);
76
77    snprintf(fmt, sizeof(fmt),
78             "Received %i bytes from client %s port %d:\n"
79             ">>>>>\n"
80             "%%.%is\n"
81             ">>>>>\n",
82             ev->size, ecore_con_client_ip_get(ev->client),
83             ecore_con_client_port_get(ev->client), ev->size);
84
85    printf(fmt, ev->data);
86
87    client->sdata += ev->size;
88
89    return ECORE_CALLBACK_RENEW;
90 }
91
92 int
93 main(void)
94 {
95    Ecore_Con_Server *svr;
96    Ecore_Con_Client *cl;
97    const Eina_List *clients, *l;
98
99    eina_init();
100    ecore_init();
101    ecore_con_init();
102
103    if (!(svr = ecore_con_server_add(ECORE_CON_REMOTE_TCP, "127.0.0.1", 8080, NULL)))
104      exit(1);
105
106    ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_ADD, (Ecore_Event_Handler_Cb)_add, NULL);
107    ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DEL, (Ecore_Event_Handler_Cb)_del, NULL);
108    ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DATA, (Ecore_Event_Handler_Cb)_data, NULL);
109
110    ecore_con_server_timeout_set(svr, 10);
111    ecore_con_server_client_limit_set(svr, 3, 0);
112
113    ecore_main_loop_begin();
114
115    clients = ecore_con_server_clients_get(svr);
116    printf("Clients connected to this server when exiting: %d\n",
117           eina_list_count(clients));
118    EINA_LIST_FOREACH(clients, l, cl)
119      {
120         printf("%s\n", ecore_con_client_ip_get(cl));
121         free(ecore_con_client_data_get(cl));
122      }
123
124    printf("Server was up for %0.3f seconds\n",
125           ecore_con_server_uptime_get(svr));
126
127    ecore_con_shutdown();
128    ecore_shutdown();
129    eina_shutdown();
130
131    return 0;
132 }
133