Logo AND Algorithmique Numérique Distribuée

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