1 /* ALL2ALL - all2all of GRAS features */
3 /* Copyright (c) 2006 Ahmed Harbaoui. All rights reserved. */
5 /* This program is free software; you can redistribute it and/or modify it
6 * under the terms of the license (GNU LGPL) which comes with this package. */
11 XBT_LOG_NEW_DEFAULT_CATEGORY(all2all, "Messages specific to this example");
13 /* register data which may be sent (common to client and server) */
14 static void register_messages(void)
18 /* Function prototypes */
19 int receiver(int argc, char *argv[]);
20 int sender(int argc, char *argv[]);
23 /* **********************************************************************
25 * **********************************************************************/
26 int receiver(int argc, char *argv[])
29 int myport; /* port on which I receive stuff */
30 int todo; /* amount of messages I should get */
31 char *data; /* message content */
33 gras_socket_t mysock; /* socket on which other people contact me */
34 gras_socket_t expeditor; /* to notice who wrote me */
36 /* Init the GRAS infrastructure and declare my globals */
37 gras_init(&argc, argv);
39 /* Get my settings from the command line */
40 myport = atoi(argv[1]);
43 /* Register the known messages */
44 gras_msgtype_declare("data", gras_datadesc_by_name("string"));
46 /* Create my master socket */
47 mysock = gras_socket_server(myport);
50 INFO2("Listening on port %d (expecting %d messages)",
51 gras_socket_my_port(mysock), todo);
53 gras_msg_wait(60 /* wait up to one minute */ ,
54 "data", &expeditor, &data);
58 INFO3("Got Data from %s:%d (still %d to go)",
59 gras_socket_peer_name(expeditor), gras_socket_peer_port(expeditor),
64 /* Free the allocated resources, and shut GRAS down */
65 gras_socket_close(mysock);
69 } /* end_of_receiver */
71 /* **********************************************************************
73 * **********************************************************************/
75 int sender(int argc, char *argv[])
78 unsigned int iter; /* iterator */
79 char *data; /* data exchanged */
80 int datasize; /* size of message */
81 xbt_peer_t h; /* iterator */
84 gras_socket_t peer = NULL; /* socket to node */
87 /* xbt_dynar for peers */
88 xbt_dynar_t peers = xbt_dynar_new(sizeof(xbt_peer_t), &xbt_peer_free_voidp);
90 /* Init the GRAS infrastructure and declare my globals */
91 gras_init(&argc, argv);
93 /* Get the node location from argc/argv */
94 for (iter = 1; iter < argc - 1; iter++) {
95 xbt_peer_t peer = xbt_peer_from_string(argv[iter]);
96 xbt_dynar_push(peers, &peer);
99 datasize = atoi(argv[argc - 1]);
101 data = (char *) malloc(datasize + 1); // allocation of datasize octets
102 memset(data, 32, datasize);
103 data[datasize] = '\0';
105 INFO0("Launch current node");
107 /* Register the known messages */
108 gras_msgtype_declare("data", gras_datadesc_by_name("string"));
111 /* write to the receivers */
112 xbt_dynar_foreach(peers, iter, h) {
117 peer = gras_socket_client(h->name, h->port);
121 if (e.category != system_error /*in RL */
122 && e.category != mismatch_error /*in SG */ )
128 gras_msg_send(peer, "data", &data);
130 INFO2(" Sent Data from %s to %s", gras_os_myname(), h->name);
135 gras_socket_close(peer);
138 /* Free the allocated resources, and shut GRAS down */
140 xbt_dynar_free(&peers);
144 } /* end_of_sender */