Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Doc for examples icomms.
[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   server_data_t *globals=(server_data_t*)gras_userdata_get();
17   globals->done = 1;
18   INFO0("Server done");
19    
20   return 0;
21 } /* end_of_done_callback */
22
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"));
26  
27   /* the other message allowing the client to stop the server after use */
28   gras_msgtype_declare("done", NULL); 
29 }
30
31 int server_convert_i2a_cb(gras_msg_cb_ctx_t ctx, void *payload) {
32   long data = *(long*)payload;
33   char *result;
34   char *p;
35
36   INFO1("Convert %ld to string",data);  
37   result = bprintf("%ld", data);   
38   INFO2("%ld converted to string: %s",data,result);
39    
40   gras_msg_rpcreturn(60,ctx,&result);
41   free(result);
42   return 0;
43 } /* end_of_convert_callback */
44
45 int server_convert_a2i_cb(gras_msg_cb_ctx_t ctx, void *payload) {
46   char *string = *(char**)payload;
47   long result;
48   char *p;
49
50   INFO1("Convert %s to long",string);
51   result = strtol(string, &p, 10);
52    
53   if (*p != '\0')
54      THROW2(arg_error,0,"Error while converting %s: this does not seem to be a valid number (problem at '%s')",string,p);
55               
56   gras_msg_rpcreturn(60,ctx,&result);
57   return 0;
58 } /* end_of_convert_callback */
59
60
61 int server(int argc, char *argv[]) {
62   gras_socket_t mysock;   /* socket on which I listen */
63   server_data_t *globals;
64   
65   gras_init(&argc,argv);
66
67   globals=gras_userdata_new(server_data_t*);
68   globals->done=0;
69
70   message_declaration();
71   mysock = gras_socket_server(atoi(argv[1]));
72    
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);
76
77   while (!globals->done) {
78      gras_msg_handle(-1); /* blocking */
79   }
80     
81   gras_exit();
82   return 0;
83 }
84
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 */
88
89   gras_init(&argc,argv);
90
91   message_declaration();
92   mysock = gras_socket_server_range(1024, 10000, 0, 0);
93   
94   VERB1("Client ready; listening on %d", gras_socket_my_port(mysock));
95   
96   gras_os_sleep(1.5); /* sleep 1 second and half */
97   toserver = gras_socket_client(argv[1], atoi(argv[2]));
98   
99   long long_to_convert=4321;
100   char *string_result;
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);
104   free(string_result);
105    
106   char *string_to_convert="1234";
107   long long_result;
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);
111    
112   xbt_ex_t e;
113   string_to_convert = "azerty";
114   TRY {
115      gras_msg_rpccall(toserver, 60, "convert a2i", &string_to_convert, &long_result);
116   } CATCH(e) {
117      INFO1("The server refuses to convert %s. Here is the received exception:",string_to_convert);
118      xbt_ex_display(&e);
119      xbt_ex_free(e);
120      INFO0("Again, previous exception was excepted");
121   }     
122    
123   gras_msg_send(toserver,"done", NULL);
124   INFO0("Stopped the server");
125    
126   gras_exit();
127   return 0;
128 }