Logo AND Algorithmique Numérique Distribuée

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