1 /* Copyright (c) 2006, 2007, 2009, 2010. The SimGrid Team.
2 * All rights reserved. */
4 /* This program is free software; you can redistribute it and/or modify it
5 * under the terms of the license (GNU LGPL) which comes with this package. */
10 XBT_LOG_NEW_DEFAULT_CATEGORY(test, "My little example");
15 int server_done_cb(gras_msg_cb_ctx_t ctx, void *payload)
17 server_data_t *globals = (server_data_t *) gras_userdata_get();
19 XBT_INFO("Server done");
22 } /* end_of_done_callback */
24 void message_declaration(void)
26 gras_msgtype_declare_rpc("convert a2i", gras_datadesc_by_name("string"),
27 gras_datadesc_by_name("long"));
28 gras_msgtype_declare_rpc("convert i2a", gras_datadesc_by_name("long"),
29 gras_datadesc_by_name("string"));
31 /* the other message allowing the client to stop the server after use */
32 gras_msgtype_declare("done", NULL);
35 int server_convert_i2a_cb(gras_msg_cb_ctx_t ctx, void *payload)
37 long data = *(long *) payload;
41 XBT_INFO("Convert %ld to string", data);
42 result = bprintf("%ld", data);
43 XBT_INFO("%ld converted to string: %s", data, result);
45 gras_msg_rpcreturn(60, ctx, &result);
48 } /* end_of_convert_callback */
50 int server_convert_a2i_cb(gras_msg_cb_ctx_t ctx, void *payload)
52 char *string = *(char **) payload;
56 XBT_INFO("Convert %s to long", string);
57 result = strtol(string, &p, 10);
61 "Error while converting %s: this does not seem to be a valid number (problem at '%s')",
64 gras_msg_rpcreturn(60, ctx, &result);
66 } /* end_of_convert_callback */
69 int server(int argc, char *argv[])
71 gras_socket_t mysock; /* socket on which I listen */
72 server_data_t *globals;
74 gras_init(&argc, argv);
76 globals = gras_userdata_new(server_data_t *);
79 message_declaration();
80 mysock = gras_socket_server(atoi(argv[1]));
82 gras_cb_register("convert a2i", &server_convert_a2i_cb);
83 gras_cb_register("convert i2a", &server_convert_i2a_cb);
84 gras_cb_register("done", &server_done_cb);
86 while (!globals->done) {
87 gras_msg_handle(-1); /* blocking */
94 int client(int argc, char *argv[])
96 gras_socket_t mysock; /* socket on which I listen */
97 gras_socket_t toserver; /* socket used to write to the server */
99 gras_init(&argc, argv);
101 message_declaration();
102 mysock = gras_socket_server_range(1024, 10000, 0, 0);
104 XBT_VERB("Client ready; listening on %d", gras_socket_my_port(mysock));
106 gras_os_sleep(1.5); /* sleep 1 second and half */
107 toserver = gras_socket_client(argv[1], atoi(argv[2]));
109 long long_to_convert = 4321;
111 XBT_INFO("Ask to convert %ld", long_to_convert);
112 gras_msg_rpccall(toserver, 60, "convert i2a", &long_to_convert,
114 XBT_INFO("The server says that %ld is equal to \"%s\".", long_to_convert,
118 char *string_to_convert = "1234";
120 XBT_INFO("Ask to convert %s", string_to_convert);
121 gras_msg_rpccall(toserver, 60, "convert a2i", &string_to_convert,
123 XBT_INFO("The server says that \"%s\" is equal to %d.", string_to_convert,
127 string_to_convert = "azerty";
129 gras_msg_rpccall(toserver, 60, "convert a2i", &string_to_convert,
134 ("The server refuses to convert %s. Here is the received exception:",
138 XBT_INFO("Again, previous exception was excepted");
141 gras_msg_send(toserver, "done", NULL);
142 XBT_INFO("Stopped the server");