Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
9cc423a9f8ddf9fabc8f755d94b92f6eb8d1b967
[simgrid.git] / doc / gtut-files / 10-rpc.c
1 /* Copyright (c) 2006, 2007, 2009, 2010. The SimGrid Team.
2  * All rights reserved.                                                     */
3
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. */
6
7 #include <stdlib.h>
8 #include <gras.h>
9
10 XBT_LOG_NEW_DEFAULT_CATEGORY(test, "My little example");
11
12 typedef struct {
13   int done;
14 } server_data_t;
15 int server_done_cb(gras_msg_cb_ctx_t ctx, void *payload)
16 {
17   server_data_t *globals = (server_data_t *) gras_userdata_get();
18   globals->done = 1;
19   INFO0("Server done");
20
21   return 0;
22 }                               /* end_of_done_callback */
23
24 void message_declaration(void)
25 {
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"));
30
31   /* the other message allowing the client to stop the server after use */
32   gras_msgtype_declare("done", NULL);
33 }
34
35 int server_convert_i2a_cb(gras_msg_cb_ctx_t ctx, void *payload)
36 {
37   long data = *(long *) payload;
38   char *result;
39   char *p;
40
41   INFO1("Convert %ld to string", data);
42   result = bprintf("%ld", data);
43   INFO2("%ld converted to string: %s", data, result);
44
45   gras_msg_rpcreturn(60, ctx, &result);
46   free(result);
47   return 0;
48 }                               /* end_of_convert_callback */
49
50 int server_convert_a2i_cb(gras_msg_cb_ctx_t ctx, void *payload)
51 {
52   char *string = *(char **) payload;
53   long result;
54   char *p;
55
56   INFO1("Convert %s to long", string);
57   result = strtol(string, &p, 10);
58
59   if (*p != '\0')
60     THROW2(arg_error, 0,
61            "Error while converting %s: this does not seem to be a valid number (problem at '%s')",
62            string, p);
63
64   gras_msg_rpcreturn(60, ctx, &result);
65   return 0;
66 }                               /* end_of_convert_callback */
67
68
69 int server(int argc, char *argv[])
70 {
71   gras_socket_t mysock;         /* socket on which I listen */
72   server_data_t *globals;
73
74   gras_init(&argc, argv);
75
76   globals = gras_userdata_new(server_data_t *);
77   globals->done = 0;
78
79   message_declaration();
80   mysock = gras_socket_server(atoi(argv[1]));
81
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);
85
86   while (!globals->done) {
87     gras_msg_handle(-1);        /* blocking */
88   }
89
90   gras_exit();
91   return 0;
92 }
93
94 int client(int argc, char *argv[])
95 {
96   gras_socket_t mysock;         /* socket on which I listen */
97   gras_socket_t toserver;       /* socket used to write to the server */
98
99   gras_init(&argc, argv);
100
101   message_declaration();
102   mysock = gras_socket_server_range(1024, 10000, 0, 0);
103
104   VERB1("Client ready; listening on %d", gras_socket_my_port(mysock));
105
106   gras_os_sleep(1.5);           /* sleep 1 second and half */
107   toserver = gras_socket_client(argv[1], atoi(argv[2]));
108
109   long long_to_convert = 4321;
110   char *string_result;
111   INFO1("Ask to convert %ld", long_to_convert);
112   gras_msg_rpccall(toserver, 60, "convert i2a", &long_to_convert,
113                    &string_result);
114   INFO2("The server says that %ld is equal to \"%s\".", long_to_convert,
115         string_result);
116   free(string_result);
117
118   char *string_to_convert = "1234";
119   long long_result;
120   INFO1("Ask to convert %s", string_to_convert);
121   gras_msg_rpccall(toserver, 60, "convert a2i", &string_to_convert,
122                    &long_result);
123   INFO2("The server says that \"%s\" is equal to %d.", string_to_convert,
124         long_result);
125
126   xbt_ex_t e;
127   string_to_convert = "azerty";
128   TRY {
129     gras_msg_rpccall(toserver, 60, "convert a2i", &string_to_convert,
130                      &long_result);
131   } CATCH(e) {
132     INFO1
133         ("The server refuses to convert %s. Here is the received exception:",
134          string_to_convert);
135     xbt_ex_display(&e);
136     xbt_ex_free(e);
137     INFO0("Again, previous exception was excepted");
138   }
139
140   gras_msg_send(toserver, "done", NULL);
141   INFO0("Stopped the server");
142
143   gras_exit();
144   return 0;
145 }