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 /* **********************************************************************
19 * **********************************************************************/
20 /* message definition */
28 static const DataDescriptor msgPingDesc[] =
29 {SIMPLE_MEMBER(INT_TYPE,1,offsetof(msgPing_t,dummy))};
30 #define msgPingLength 1
32 typedef msgPing_t msgPong_t;
33 static const DataDescriptor msgPongDesc[] =
34 {SIMPLE_MEMBER(INT_TYPE,1,offsetof(msgPong_t,dummy))};
35 #define msgPongLength 1
37 /* Function prototypes */
38 gras_error_t register_messages(const char *prefix);
41 gras_error_t register_messages(const char *prefix) {
44 if ((errcode=gras_msgtype_register(MSG_PING,"ping",1,msgPingDesc,msgPingLength)) ||
45 (errcode=gras_msgtype_register(MSG_PONG,"pong",1,msgPongDesc,msgPongLength))) {
46 fprintf(stderr,"%s: Unable register the messages (got error %s)\n",
47 prefix,gras_error_name(errcode));
53 /* **********************************************************************
55 * **********************************************************************/
57 /* Global private data */
63 /* Function prototypes */
64 int server_cbPingHandler(gras_msg_t *msg);
65 int server (int argc,char *argv[]);
68 int server_cbPingHandler(gras_msg_t *msg) {
69 int *dummy=malloc(sizeof(int*));
70 server_data_t *g=(server_data_t*)gras_userdata_get();
74 fprintf (stderr,"SERVER: >>>>>>>> Got message PING(%d) from %s:%d <<<<<<<<\n",
75 gras_msg_ctn(msg,0,0,int), gras_sock_get_peer_name(msg->sock),gras_sock_get_peer_port(msg->sock));
77 if (gras_msg_new_and_send(msg->sock,MSG_PONG,1, dummy,1)) {
78 fprintf(stderr,"SERVER: Unable answer with PONG\n");
79 gras_sock_close(g->sock);
84 fprintf(stderr,"SERVER: >>>>>>>> Answed with PONG(4321) <<<<<<<<\n");
89 int server (int argc,char *argv[]) {
91 server_data_t *g=gras_userdata_new(server_data_t);
93 if ((errcode=gras_sock_server_open(4000,4000,&(g->sock)))) {
94 fprintf(stderr,"SERVER: Error %s encountered while opening the server socket\n",gras_error_name(errcode));
98 if (register_messages("SERVER") ||
99 gras_cb_register(MSG_PING,-1,&server_cbPingHandler)) {
100 gras_sock_close(g->sock);
104 fprintf(stderr,"SERVER: >>>>>>>> Listening on port %d <<<<<<<<\n",gras_sock_get_my_port(g->sock));
107 while (!g->endcondition) {
108 if ((errcode=gras_msg_handle(60.0))) {
109 fprintf(stderr,"SERVER: Error '%s' while handling message\n",gras_error_name(errcode));
110 gras_sock_close(g->sock);
116 fprintf(stderr,"SERVER: Done.\n");
117 return gras_sock_close(g->sock);
120 /* **********************************************************************
122 * **********************************************************************/
124 /* Global private data */
129 /* Function prototypes */
130 int client (int argc,char *argv[]);
132 int client(int argc,char *argv[]) {
135 gras_error_t errcode;
136 client_data_t *g=gras_userdata_new(client_data_t);
138 if ((errcode=gras_sock_client_open("102",4000,&(g->sock)))) {
139 fprintf(stderr,"Client: Unable to connect to the server. Got %s\n",
140 gras_error_name(errcode));
144 if (register_messages("Client")) {
145 // grasCloseSocket(g->sock);
149 fprintf(stderr,"Client: >>>>>>>> Connected to server which is on %s:%d <<<<<<<<\n",
150 gras_sock_get_peer_name(g->sock),gras_sock_get_peer_port(g->sock));
152 if (gras_msg_new_and_send(g->sock,MSG_PING, 1, &dummy,1)) {
153 fprintf(stderr,"Client: Unable send PING to server\n");
154 gras_sock_close(g->sock);
157 fprintf(stderr,"Client: >>>>>>>> Message PING(%d) sent to %s:%d <<<<<<<<\n",
158 dummy, gras_sock_get_peer_name(g->sock),gras_sock_get_peer_port(g->sock));
160 if ((errcode=gras_msg_wait(6000,MSG_PONG,&msg))) {
161 fprintf(stderr,"Client: Why can't I get my PONG message like everyone else (%s error)?!\n",
162 gras_error_name(errcode));
163 gras_sock_close(g->sock);
167 fprintf(stderr,"Client: >>>>>>>> Message PONG(%d) got from %s:%d <<<<<<<<\n",
168 gras_msg_ctn(msg,0,0,int),gras_sock_get_peer_name(msg->sock),gras_sock_get_peer_port(msg->sock));
172 gras_sock_close(g->sock);
173 fprintf(stderr,"Client: Done.\n");