Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
069c7c53b86d89fc078fe9527c4c71ff353a495b
[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   gras_socket_close(g->sock);
120   free(g);
121   xbt_exit();
122   INFO0("SERVER: Done.");
123   return no_error;
124 }
125
126 /* **********************************************************************
127  * Client code
128  * **********************************************************************/
129
130 /* Global private data */
131 typedef struct {
132   gras_socket_t sock;
133 } client_data_t;
134
135 /* Function prototypes */
136 int client (int argc,char *argv[]);
137
138 int client(int argc,char *argv[]) {
139   xbt_error_t errcode;
140   client_data_t *g;
141
142   gras_socket_t from;
143   int ping, pong;
144
145   const char *host = "127.0.0.1";
146         int   port = 4000;
147
148   gras_init(&argc, argv, NULL);
149   g=gras_userdata_new(client_data_t);
150    
151   if (argc == 3) {
152     host=argv[1];
153     port=atoi(argv[2]);
154   } 
155
156   INFO2("Launch client (server on %s:%d)",host,port);
157   gras_os_sleep(1,0); /* Wait for the server startup */
158   if ((errcode=gras_socket_client(host,port,&(g->sock)))) {
159     ERROR1("Client: Unable to connect to the server. Got %s",
160            xbt_error_name(errcode));
161     return 1;
162   }
163   INFO2("Client: Connected to %s:%d.",host,port);    
164
165
166   register_messages();
167
168   INFO2("Client: >>>>>>>> Connected to server which is on %s:%d <<<<<<<<", 
169         gras_socket_peer_name(g->sock),gras_socket_peer_port(g->sock));
170
171   ping = 1234;
172   errcode = gras_msg_send(g->sock, gras_msgtype_by_name("ping"), &ping);
173   if (errcode != no_error) {
174     fprintf(stderr, "Client: Unable send PING to server (%s)\n",
175             xbt_error_name(errcode));
176     gras_socket_close(g->sock);
177     return 1;
178   }
179   INFO3("Client: >>>>>>>> Message PING(%d) sent to %s:%d <<<<<<<<",
180         ping,
181         gras_socket_peer_name(g->sock),gras_socket_peer_port(g->sock));
182
183   if ((errcode=gras_msg_wait(6000,gras_msgtype_by_name("pong"),
184                              &from,&pong))) {
185     ERROR1("Client: Why can't I get my PONG message like everyone else (%s)?",
186            xbt_error_name(errcode));
187     gras_socket_close(g->sock);
188     return 1;
189   }
190
191   INFO3("Client: >>>>>>>> Got PONG(%d) got from %s:%d <<<<<<<<", 
192         pong,
193         gras_socket_peer_name(from),gras_socket_peer_port(from));
194
195   gras_socket_close(g->sock);
196   free(g);
197   xbt_exit();
198   INFO0("Client: Done.");
199   return 0;
200 }