Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Readd this dead code to the tarball since removing it cleanly is harder
[simgrid.git] / examples / ping / ping.c
1 /* $Id$ */
2
3 /* ping - ping/pong demo of GRAS features                                   */
4
5 /* Copyright (c) 2003, 2004 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 <stdio.h>
11 #include <stdlib.h>
12 #include <signal.h>
13
14 #include "gras.h"
15
16 XBT_LOG_NEW_DEFAULT_CATEGORY(Ping,"Messages specific to this example");
17
18 /* **********************************************************************
19  * Comon code
20  * **********************************************************************/
21
22 typedef struct {
23   int dummy;
24 } msg_ping_t;
25
26 /* Function prototypes */
27 void register_messages(void);
28
29 /* Code */
30 void register_messages(void) {
31
32   gras_msgtype_declare("ping", gras_datadesc_by_name("int"));
33   gras_msgtype_declare("pong", gras_datadesc_by_name("int"));
34 }
35
36 /* **********************************************************************
37  * Server code
38  * **********************************************************************/
39
40 /* Global private data */
41 typedef struct {
42   gras_socket_t sock;
43   int endcondition;
44 } server_data_t;
45
46 /* Function prototypes */
47 int server_cb_ping_handler(gras_socket_t  expeditor,
48                            void          *payload_data);
49 int server (int argc,char *argv[]);
50
51
52 int server_cb_ping_handler(gras_socket_t  expeditor,
53                            void          *payload_data) {
54                              
55   xbt_error_t errcode;
56   int msg=*(int*)payload_data;
57   gras_msgtype_t *pong_t=NULL;
58
59   server_data_t *g=(server_data_t*)gras_userdata_get();
60
61   g->endcondition = 0;
62   INFO3("SERVER: >>>>>>>> Got message PING(%d) from %s:%d <<<<<<<<", 
63         msg, 
64         gras_socket_peer_name(expeditor),
65         gras_socket_peer_port(expeditor));
66   
67   msg = 4321;
68   errcode = gras_msg_send(expeditor, gras_msgtype_by_name("pong"), &msg);
69
70   if (errcode != no_error) {
71     ERROR1("SERVER: Unable answer with PONG: %s\n", xbt_error_name(errcode));
72     gras_socket_close(g->sock);
73     return 1;
74   }
75
76   INFO0("SERVER: >>>>>>>> Answed with PONG(4321) <<<<<<<<");
77   g->endcondition = 1;
78   gras_socket_close(expeditor);
79   return 1;
80 }
81
82 int server (int argc,char *argv[]) {
83   xbt_error_t errcode;
84   server_data_t *g;
85   gras_msgtype_t *ping_msg=NULL;
86
87   int port = 4000;
88   
89   gras_init(&argc,argv, NULL);
90   g=gras_userdata_new(server_data_t);
91    
92   if (argc == 2) {
93     port=atoi(argv[1]);
94   }
95
96   INFO1("Launch server (port=%d)", port);
97
98   if ((errcode=gras_socket_server(port,&(g->sock)))) { 
99     CRITICAL1("Error %s encountered while opening the server socket",
100               xbt_error_name(errcode));
101     return 1;
102   }
103
104   register_messages();
105   register_messages();
106   gras_cb_register(gras_msgtype_by_name("ping"),&server_cb_ping_handler);
107
108   INFO1("SERVER: >>>>>>>> Listening on port %d <<<<<<<<",
109         gras_socket_my_port(g->sock));
110   g->endcondition=0;
111
112   errcode = gras_msg_handle(600.0);
113   if (errcode != no_error)
114     return errcode;
115   if (g->endcondition)
116   
117   if (!gras_if_RL())
118     gras_os_sleep(1,0);
119
120   gras_socket_close(g->sock);
121   free(g);
122   gras_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   gras_init(&argc, argv, NULL);
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   gras_exit();
199   INFO0("Client: Done.");
200   return 0;
201 }