-/* $Id$ */
+#include "ping.h"
-/* ping - ping/pong demo of GRAS features */
-
-/* Copyright (c) 2003, 2004, 2005 Martin Quinson. All rights reserved. */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "gras.h"
XBT_LOG_NEW_DEFAULT_CATEGORY(Ping,"Messages specific to this example");
-/* register messages which may be sent (common to client and server) */
-static void register_messages(void) {
- gras_msgtype_declare("ping", gras_datadesc_by_name("int"));
- gras_msgtype_declare("pong", gras_datadesc_by_name("int"));
-}
-
-/* Function prototypes */
-int server (int argc,char *argv[]);
-int client (int argc,char *argv[]);
-
-/* **********************************************************************
- * Server code
- * **********************************************************************/
-
/* Global private data */
typedef struct {
gras_socket_t sock;
} server_data_t;
-static int server_cb_ping_handler(gras_socket_t expeditor,
- void *payload_data) {
+/* register messages which may be sent (common to client and server) */
+void ping_register_messages(void) {
+ gras_msgtype_declare("ping", gras_datadesc_by_name("int"));
+ gras_msgtype_declare("pong", gras_datadesc_by_name("int"));
+ INFO0("Messages registered");
+}
+
+static int server_cb_ping_handler(gras_msg_cb_ctx_t ctx, void* payload) {
- xbt_error_t errcode;
- /* 1. Get the payload into the msg variable */
- int msg=*(int*)payload_data;
+ xbt_ex_t e;
+ /* 1. Get the payload into the msg variable, and retrieve my caller */
+ int msg=*(int*)payload;
+ gras_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
/* 2. Retrieve the server's state (globals) */
/* 4. Change the value of the msg variable */
msg = 4321;
/* 5. Send it back as payload of a pong message to the expeditor */
- errcode = gras_msg_send(expeditor, gras_msgtype_by_name("pong"), &msg);
+ TRY {
+ gras_msg_send(expeditor, "pong", &msg);
- /* 6. Deal with errors */
- if (errcode != no_error) {
- ERROR1("Unable answer with PONG: %s\n", xbt_error_name(errcode));
+ /* 6. Deal with errors: add some details to the exception */
+ } CATCH(e) {
gras_socket_close(globals->sock);
- return 1;
+ RETHROW0("Unable answer with PONG: %s");
}
INFO0(">>>>>>>> Answered with PONG(4321) <<<<<<<<");
gras_socket_close(expeditor);
/* 9. Tell GRAS that we consummed this message */
- return 1;
+ return 0;
} /* end_of_server_cb_ping_handler */
int server (int argc,char *argv[]) {
- xbt_error_t errcode;
server_data_t *globals;
int port = 4000;
INFO1("Launch server (port=%d)", port);
/* 3. Create my master socket */
- if ((errcode=gras_socket_server(port,&(globals->sock)))) {
- CRITICAL1("Error %s encountered while opening the server socket",
- xbt_error_name(errcode));
- return 1;
- }
+ globals->sock = gras_socket_server(port);
/* 4. Register the known messages. This function is called twice here, but it's because
this file also acts as regression test, no need to do so yourself of course. */
- register_messages();
- register_messages(); /* just to make sure it works ;) */
+ ping_register_messages();
+ ping_register_messages(); /* just to make sure it works ;) */
/* 5. Register my callback */
- gras_cb_register(gras_msgtype_by_name("ping"),&server_cb_ping_handler);
+ gras_cb_register("ping",&server_cb_ping_handler);
INFO1(">>>>>>>> Listening on port %d <<<<<<<<", gras_socket_my_port(globals->sock));
globals->endcondition=0;
/* 6. Wait up to 10 minutes for an incomming message to handle */
- errcode = gras_msg_handle(600.0);
+ gras_msg_handle(60.0);
/* 7. Housekeeping */
- if (errcode != no_error)
- return errcode;
if (!globals->endcondition)
WARN0("An error occured, the endcondition was not set by the callback");
gras_exit();
INFO0("Done.");
- return no_error;
+ return 0;
} /* end_of_server */
-/* **********************************************************************
- * Client code
- * **********************************************************************/
-
-/* Function prototypes */
int client(int argc,char *argv[]) {
- xbt_error_t errcode;
- gras_socket_t toserver; /* peer */
+ xbt_ex_t e;
+ gras_socket_t toserver=NULL; /* peer */
gras_socket_t from;
int ping, pong;
gras_os_sleep(1);
/* 4. Create a socket to speak to the server */
- if ((errcode=gras_socket_client(host,port,&toserver))) {
- ERROR1("Unable to connect to the server. Got %s",
- xbt_error_name(errcode));
- return 1;
+ TRY {
+ toserver=gras_socket_client(host,port);
+ } CATCH(e) {
+ RETHROW0("Unable to connect to the server: %s");
}
INFO2("Connected to %s:%d.",host,port);
/* 5. Register the messages.
See, it doesn't have to be done completely at the beginning, only before use */
- register_messages();
+ ping_register_messages();
/* 6. Keep the user informed of what's going on */
INFO2(">>>>>>>> Connected to server which is on %s:%d <<<<<<<<",
/* 7. Prepare and send the ping message to the server */
ping = 1234;
- errcode = gras_msg_send(toserver, gras_msgtype_by_name("ping"), &ping);
- if (errcode != no_error) {
- fprintf(stderr, "Unable send PING to server (%s)\n",
- xbt_error_name(errcode));
+ TRY {
+ gras_msg_send(toserver, "ping", &ping);
+ } CATCH(e) {
gras_socket_close(toserver);
- return 1;
+ RETHROW0("Failed to send PING to server: %s");
}
INFO3(">>>>>>>> Message PING(%d) sent to %s:%d <<<<<<<<",
ping,
gras_socket_peer_name(toserver),gras_socket_peer_port(toserver));
/* 8. Wait for the answer from the server, and deal with issues */
- if ((errcode=gras_msg_wait(6000,gras_msgtype_by_name("pong"),
- &from,&pong))) {
- ERROR1("Why can't I get my PONG message like everyone else (%s)?",
- xbt_error_name(errcode));
+ TRY {
+ gras_msg_wait(6000,"pong", &from,&pong);
+ } CATCH(e) {
gras_socket_close(toserver);
- return 1;
+ RETHROW0("Why can't I get my PONG message like everyone else: %s");
}
/* 9. Keep the user informed of what's going on, again */