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) {
16 server_data_t *globals=(server_data_t*)gras_userdata_get();
21 } /* end_of_done_callback */
23 void message_declaration(void) {
24 gras_msgtype_declare_rpc("convert a2i", gras_datadesc_by_name("string"), gras_datadesc_by_name("long"));
25 gras_msgtype_declare_rpc("convert i2a", gras_datadesc_by_name("long"), gras_datadesc_by_name("string"));
27 /* the other message allowing the client to stop the server after use */
28 gras_msgtype_declare("done", NULL);
31 int server_convert_i2a_cb(gras_msg_cb_ctx_t ctx, void *payload) {
32 long data = *(long*)payload;
36 INFO1("Convert %ld to string",data);
37 result = bprintf("%ld", data);
38 INFO2("%ld converted to string: %s",data,result);
40 gras_msg_rpcreturn(60,ctx,&result);
43 } /* end_of_convert_callback */
45 int server_convert_a2i_cb(gras_msg_cb_ctx_t ctx, void *payload) {
46 char *string = *(char**)payload;
50 INFO1("Convert %s to long",string);
51 result = strtol(string, &p, 10);
54 THROW2(arg_error,0,"Error while converting %s: this does not seem to be a valid number (problem at '%s')",string,p);
56 gras_msg_rpcreturn(60,ctx,&result);
58 } /* end_of_convert_callback */
61 int server(int argc, char *argv[]) {
62 gras_socket_t mysock; /* socket on which I listen */
63 server_data_t *globals;
65 gras_init(&argc,argv);
67 globals=gras_userdata_new(server_data_t*);
70 message_declaration();
71 mysock = gras_socket_server(atoi(argv[1]));
73 gras_cb_register("convert a2i",&server_convert_a2i_cb);
74 gras_cb_register("convert i2a",&server_convert_i2a_cb);
75 gras_cb_register("done",&server_done_cb);
77 while (!globals->done) {
78 gras_msg_handle(-1); /* blocking */
85 int client(int argc, char *argv[]) {
86 gras_socket_t mysock; /* socket on which I listen */
87 gras_socket_t toserver; /* socket used to write to the server */
89 gras_init(&argc,argv);
91 message_declaration();
92 mysock = gras_socket_server_range(1024, 10000, 0, 0);
94 VERB1("Client ready; listening on %d", gras_socket_my_port(mysock));
96 gras_os_sleep(1.5); /* sleep 1 second and half */
97 toserver = gras_socket_client(argv[1], atoi(argv[2]));
99 long long_to_convert=4321;
101 INFO1("Ask to convert %ld", long_to_convert);
102 gras_msg_rpccall(toserver, 60, "convert i2a", &long_to_convert, &string_result);
103 INFO2("The server says that %ld is equal to \"%s\".", long_to_convert, string_result);
106 char *string_to_convert="1234";
108 INFO1("Ask to convert %s", string_to_convert);
109 gras_msg_rpccall(toserver, 60, "convert a2i", &string_to_convert, &long_result);
110 INFO2("The server says that \"%s\" is equal to %d.", string_to_convert, long_result);
113 string_to_convert = "azerty";
115 gras_msg_rpccall(toserver, 60, "convert a2i", &string_to_convert, &long_result);
117 INFO1("The server refuses to convert %s. Here is the received exception:",string_to_convert);
120 INFO0("Again, previous exception was excepted");
123 gras_msg_send(toserver,"done", NULL);
124 INFO0("Stopped the server");