3 /* ping - ping/pong demo of GRAS features */
5 /* Authors: Martin Quinson */
6 /* Copyright (C) 2003 the OURAGAN project. */
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. */
17 GRAS_LOG_NEW_DEFAULT_CATEGORY(Ping);
19 /* **********************************************************************
21 * **********************************************************************/
27 /* Function prototypes */
28 gras_error_t register_messages(void);
31 gras_error_t register_messages(void) {
33 gras_datadesc_type_t *payload_t;
34 gras_msgtype_t *msg_t;
36 TRY(gras_datadesc_declare_struct("msg_ping_t",&payload_t));
37 TRY(gras_datadesc_declare_struct_append(payload_t,"dummy",
38 gras_datadesc_by_name("int")));
40 TRY(gras_msgtype_declare("ping", payload_t, &msg_t)); msg_t=NULL;
41 TRY(gras_msgtype_declare("pong", payload_t, &msg_t));
46 /* **********************************************************************
48 * **********************************************************************/
50 /* Global private data */
56 /* Function prototypes */
57 int server_cb_ping_handler(gras_socket_t *expeditor,
58 gras_datadesc_type_t *payload_type,
60 int server (int argc,char *argv[]);
63 int server_cb_ping_handler(gras_socket_t *expeditor,
64 gras_datadesc_type_t *payload_type,
68 msg_ping_t *msg=payload_data;
69 gras_msgtype_t *pong_t;
71 server_data_t *g=(server_data_t*)gras_userdata_get();
74 INFO3("SERVER: >>>>>>>> Got message PING(%d) from %s:%d <<<<<<<<\n",
76 gras_socket_peer_name(expeditor),
77 gras_socket_peer_port(expeditor));
80 TRY(gras_msgtype_by_name("pong",&pong_t));
81 errcode = gras_msg_send(expeditor, pong_t, payload_data);
84 if (errcode != no_error) {
85 ERROR1("SERVER: Unable answer with PONG: %s\n", gras_error_name(errcode));
86 gras_socket_close(&(g->sock));
91 INFO0("SERVER: >>>>>>>> Answed with PONG(4321) <<<<<<<<\n");
96 int server (int argc,char *argv[]) {
98 server_data_t *g=gras_userdata_new(server_data_t);
99 gras_msgtype_t *ping_msg;
107 if ((errcode=gras_socket_server(port,&(g->sock)))) {
108 CRITICAL1("Error %s encountered while opening the server socket",
109 gras_error_name(errcode));
113 TRYFAIL(register_messages());
114 TRYFAIL(gras_msgtype_by_name("ping",&ping_msg));
115 TRYFAIL(gras_cb_register(ping_msg,&server_cb_ping_handler));
117 INFO1("SERVER: >>>>>>>> Listening on port %d <<<<<<<<",
118 gras_socket_my_port(g->sock));
122 errcode = gras_msg_handle(60.0);
123 if (errcode != no_error && errcode != timeout_error)
130 INFO0("SERVER: Done.");
131 gras_socket_close(&(g->sock));
135 /* **********************************************************************
137 * **********************************************************************/
139 /* Global private data */
144 /* Function prototypes */
145 int client (int argc,char *argv[]);
147 int client(int argc,char *argv[]) {
148 gras_error_t errcode;
149 client_data_t *g=gras_userdata_new(client_data_t);
152 msg_ping_t *msg_ping_data, *msg_pong_data;
153 gras_msgtype_t *msg_ping_type, *msg_pong_type;
155 const char *host = "127.0.0.1";
163 if ((errcode=gras_socket_client(host,port,&(g->sock)))) {
164 fprintf(stderr,"Client: Unable to connect to the server. Got %s\n",
165 gras_error_name(errcode));
168 fprintf(stderr,"Client: Connected to %s:%d.\n",host,port);
171 TRY(register_messages());
172 TRY(gras_msgtype_by_name("ping",&msg_ping_type));
173 TRY(gras_msgtype_by_name("pong",&msg_pong_type));
176 "Client: >>>>>>>> Connected to server which is on %s:%d <<<<<<<<\n",
177 gras_socket_peer_name(g->sock),gras_socket_peer_port(g->sock));
179 msg_ping_data = malloc(sizeof(msg_ping_t));
180 msg_ping_data->dummy = 1234;
181 errcode = gras_msg_send(g->sock, msg_ping_type, msg_ping_data);
182 if (errcode != no_error) {
183 fprintf(stderr, "Client: Unable send PING to server (%s)\n",
184 gras_error_name(errcode));
185 gras_socket_close(&(g->sock));
188 fprintf(stderr,"Client: >>>>>>>> Message PING(%d) sent to %s:%d <<<<<<<<\n",
189 msg_ping_data->dummy,
190 gras_socket_peer_name(g->sock),gras_socket_peer_port(g->sock));
192 msg_pong_data = NULL;
193 if ((errcode=gras_msg_wait(6000,
194 msg_pong_type,&from,(void**)&msg_pong_data))) {
196 "Client: Why can't I get my PONG message like everyone else (%s)?\n",
197 gras_error_name(errcode));
198 gras_socket_close(&(g->sock));
202 fprintf(stderr,"Client: >>>>>>>> Got PONG(%d) got from %s:%d <<<<<<<<\n",
203 msg_pong_data->dummy,
204 gras_socket_peer_name(from),gras_socket_peer_port(from));
210 gras_socket_close(&(g->sock));
211 fprintf(stderr,"Client: Done.\n");