Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
code cleanup
[simgrid.git] / examples / gras / ping / ping.c
1 /* $Id$ */
2
3 /* ping - ping/pong demo of GRAS features                                   */
4
5 /* Copyright (c) 2003, 2004, 2005 Martin Quinson. All rights reserved.      */
6
7 /* This program is free software; you can redistribute it and/or modify it
8  * under the terms of the license (GNU LGPL) which comes with this package. */
9
10 #include "gras.h"
11
12 XBT_LOG_NEW_DEFAULT_CATEGORY(Ping,"Messages specific to this example");
13
14 /* **********************************************************************
15  * Comon code
16  * **********************************************************************/
17
18 static void register_messages(void) {
19   gras_msgtype_declare("ping", gras_datadesc_by_name("int"));
20   gras_msgtype_declare("pong", gras_datadesc_by_name("int"));
21 }
22
23 /* **********************************************************************
24  * Server code
25  * **********************************************************************/
26
27 /* Global private data */
28 typedef struct {
29   gras_socket_t sock;
30   int endcondition;
31 } server_data_t;
32
33 /* Function prototypes */
34 int server_cb_ping_handler(gras_socket_t  expeditor,
35                            void          *payload_data);
36 int server (int argc,char *argv[]);
37
38
39 int server_cb_ping_handler(gras_socket_t  expeditor,
40                            void          *payload_data) {
41                              
42   xbt_error_t errcode;
43   int msg=*(int*)payload_data;
44
45   server_data_t *globals=(server_data_t*)gras_userdata_get();
46
47   globals->endcondition = 0;
48   INFO3("SERVER: >>>>>>>> Got message PING(%d) from %s:%d <<<<<<<<", 
49         msg, 
50         gras_socket_peer_name(expeditor), gras_socket_peer_port(expeditor));
51   
52   msg = 4321;
53   errcode = gras_msg_send(expeditor, gras_msgtype_by_name("pong"), &msg);
54
55   if (errcode != no_error) {
56     ERROR1("SERVER: Unable answer with PONG: %s\n", xbt_error_name(errcode));
57     gras_socket_close(globals->sock);
58     return 1;
59   }
60
61   INFO0("SERVER: >>>>>>>> Answed with PONG(4321) <<<<<<<<");
62   globals->endcondition = 1;
63   gras_socket_close(expeditor);
64   return 1;
65 }
66
67 int server (int argc,char *argv[]) {
68   xbt_error_t errcode;
69   server_data_t *globals;
70
71   int port = 4000;
72   
73   gras_init(&argc,argv, NULL);
74   globals=gras_userdata_new(server_data_t);
75    
76   if (argc == 2) {
77     port=atoi(argv[1]);
78   }
79
80   INFO1("Launch server (port=%d)", port);
81
82   if ((errcode=gras_socket_server(port,&(globals->sock)))) { 
83     CRITICAL1("Error %s encountered while opening the server socket",
84               xbt_error_name(errcode));
85     return 1;
86   }
87
88   register_messages();
89   register_messages();
90   gras_cb_register(gras_msgtype_by_name("ping"),&server_cb_ping_handler);
91
92   INFO1("SERVER: >>>>>>>> Listening on port %d <<<<<<<<",
93         gras_socket_my_port(globals->sock));
94   globals->endcondition=0;
95
96   errcode = gras_msg_handle(600.0);
97   if (errcode != no_error)
98     return errcode;
99   if (!globals->endcondition)
100      WARN0("An error occured, the endcondition was not set by the callback");
101   
102   if (!gras_if_RL())
103     gras_os_sleep(1,0);
104
105   gras_socket_close(globals->sock);
106   free(globals);
107   gras_exit();
108   INFO0("SERVER: Done.");
109   return no_error;
110 }
111
112 /* **********************************************************************
113  * Client code
114  * **********************************************************************/
115
116 /* Function prototypes */
117 int client (int argc,char *argv[]);
118
119 int client(int argc,char *argv[]) {
120   xbt_error_t errcode; 
121   gras_socket_t toserver; /* peer */
122
123   gras_socket_t from;
124   int ping, pong;
125
126   const char *host = "127.0.0.1";
127         int   port = 4000;
128
129   gras_init(&argc, argv, NULL);
130    
131   if (argc == 3) {
132     host=argv[1];
133     port=atoi(argv[2]);
134   } 
135
136   INFO2("Launch client (server on %s:%d)",host,port);
137   gras_os_sleep(1,0); /* Wait for the server startup */
138   if ((errcode=gras_socket_client(host,port,&toserver))) {
139     ERROR1("Client: Unable to connect to the server. Got %s",
140            xbt_error_name(errcode));
141     return 1;
142   }
143   INFO2("Client: Connected to %s:%d.",host,port);    
144
145
146   register_messages();
147
148   INFO2("Client: >>>>>>>> Connected to server which is on %s:%d <<<<<<<<", 
149         gras_socket_peer_name(toserver),gras_socket_peer_port(toserver));
150
151   ping = 1234;
152   errcode = gras_msg_send(toserver, gras_msgtype_by_name("ping"), &ping);
153   if (errcode != no_error) {
154     fprintf(stderr, "Client: Unable send PING to server (%s)\n",
155             xbt_error_name(errcode));
156     gras_socket_close(toserver);
157     return 1;
158   }
159   INFO3("Client: >>>>>>>> Message PING(%d) sent to %s:%d <<<<<<<<",
160         ping,
161         gras_socket_peer_name(toserver),gras_socket_peer_port(toserver));
162
163   if ((errcode=gras_msg_wait(6000,gras_msgtype_by_name("pong"),
164                              &from,&pong))) {
165     ERROR1("Client: Why can't I get my PONG message like everyone else (%s)?",
166            xbt_error_name(errcode));
167     gras_socket_close(toserver);
168     return 1;
169   }
170
171   INFO3("Client: >>>>>>>> Got PONG(%d) got from %s:%d <<<<<<<<", 
172         pong,
173         gras_socket_peer_name(from),gras_socket_peer_port(from));
174
175   gras_socket_close(toserver);
176   gras_exit();
177   INFO0("Client: Done.");
178   return 0;
179 }