4 XBT_LOG_NEW_DEFAULT_CATEGORY(test,"My little example");
9 int server_done_cb(gras_msg_cb_ctx_t ctx, void *payload) {
10 server_data_t *globals=(server_data_t*)gras_userdata_get();
15 } /* end_of_done_callback */
17 void message_declaration(void) {
18 gras_msgtype_declare_rpc("convert a2i", gras_datadesc_by_name("string"), gras_datadesc_by_name("long"));
19 gras_msgtype_declare_rpc("convert i2a", gras_datadesc_by_name("long"), gras_datadesc_by_name("string"));
21 /* the other message allowing the client to stop the server after use */
22 gras_msgtype_declare("done", NULL);
25 int server_convert_i2a_cb(gras_msg_cb_ctx_t ctx, void *payload) {
26 long data = *(long*)payload;
30 INFO1("Convert %ld to string",data);
31 result = bprintf("%ld", data);
32 INFO2("%ld converted to string: %s",data,result);
34 gras_msg_rpcreturn(60,ctx,&result);
37 } /* end_of_convert_callback */
39 int server_convert_a2i_cb(gras_msg_cb_ctx_t ctx, void *payload) {
40 char *string = *(char**)payload;
44 INFO1("Convert %s to long",string);
45 result = strtol(string, &p, 10);
48 THROW2(arg_error,0,"Error while converting %s: this does not seem to be a valid number (problem at '%s')",string,p);
50 gras_msg_rpcreturn(60,ctx,&result);
52 } /* end_of_convert_callback */
55 int server(int argc, char *argv[]) {
56 gras_socket_t mysock; /* socket on which I listen */
57 server_data_t *globals;
59 gras_init(&argc,argv);
61 globals=gras_userdata_new(server_data_t*);
64 message_declaration();
65 mysock = gras_socket_server(atoi(argv[1]));
67 gras_cb_register("convert a2i",&server_convert_a2i_cb);
68 gras_cb_register("convert i2a",&server_convert_i2a_cb);
69 gras_cb_register("done",&server_done_cb);
71 while (!globals->done) {
72 gras_msg_handle(-1); /* blocking */
79 int client(int argc, char *argv[]) {
80 gras_socket_t mysock; /* socket on which I listen */
81 gras_socket_t toserver; /* socket used to write to the server */
83 gras_init(&argc,argv);
85 message_declaration();
86 mysock = gras_socket_server_range(1024, 10000, 0, 0);
88 VERB1("Client ready; listening on %d", gras_socket_my_port(mysock));
90 gras_os_sleep(1.5); /* sleep 1 second and half */
91 toserver = gras_socket_client(argv[1], atoi(argv[2]));
93 long long_to_convert=4321;
95 INFO1("Ask to convert %ld", long_to_convert);
96 gras_msg_rpccall(toserver, 60, "convert i2a", &long_to_convert, &string_result);
97 INFO2("The server says that %ld is equal to \"%s\".", long_to_convert, string_result);
100 char *string_to_convert="1234";
102 INFO1("Ask to convert %s", string_to_convert);
103 gras_msg_rpccall(toserver, 60, "convert a2i", &string_to_convert, &long_result);
104 INFO2("The server says that \"%s\" is equal to %d.", string_to_convert, long_result);
107 string_to_convert = "azerty";
109 gras_msg_rpccall(toserver, 60, "convert a2i", &string_to_convert, &long_result);
111 INFO1("The server refuses to convert %s. Here is the received exception:",string_to_convert);
113 INFO0("Again, previous exception was excepted");
116 gras_msg_send(toserver,"done", NULL);
117 INFO0("Stopped the server");