3 /* ALL2ALL - all2all of GRAS features */
5 /* Copyright (c) 2006 Ahmed Harbaoui. All rights reserved. */
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. */
13 XBT_LOG_NEW_DEFAULT_CATEGORY(all2all,"Messages specific to this example");
15 /* register data which may be sent (common to client and server) */
16 static void register_messages(void) {
19 /* Function prototypes */
20 int receiver (int argc,char *argv[]);
21 int sender (int argc,char *argv[]);
24 /* **********************************************************************
26 * **********************************************************************/
27 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 */
43 /* Create my master socket */
44 mysock = gras_socket_server(myport);
46 /* Register the known messages */
47 gras_msgtype_declare("data", gras_datadesc_by_name("string"));
51 INFO2("Listening on port %d (expecting %d messages)",
52 gras_socket_my_port(mysock),
55 gras_msg_wait(60 /* wait up to one minute */,
56 gras_msgtype_by_name("data"),
61 INFO3("Got Data from %s:%d (still %d to go)",
63 gras_socket_peer_name(expeditor), gras_socket_peer_port(expeditor),
68 /* Free the allocated resources, and shut GRAS down */
69 gras_socket_close(mysock);
73 } /* end_of_receiver */
75 /* **********************************************************************
77 * **********************************************************************/
79 int sender (int argc,char *argv[]) {
82 char *data; /* data exchanged */
83 int datasize; /* size of message */
84 xbt_host_t h; /* iterator */
86 gras_socket_t peer; /* socket to node */
89 /* xbt_dynar for hosts */
90 xbt_dynar_t hosts = xbt_dynar_new(sizeof(xbt_host_t),&xbt_host_free_voidp);
92 /* Init the GRAS infrastructure and declare my globals */
93 gras_init(&argc,argv);
95 /* Get the node location from argc/argv */
96 for (i=1; i<argc-1; i++){
97 xbt_host_t host = xbt_host_from_string(argv[i]);
98 xbt_dynar_push(hosts,&host);
101 datasize=atoi(argv[argc-1]);
103 data=(char *) malloc(datasize+1); // allocation of datasize octets
104 memset(data, 32, datasize);
105 data[datasize] = '\0';
107 INFO0("Launch current node");
109 /* Register the known messages */
110 gras_msgtype_declare("data", gras_datadesc_by_name("string"));
113 /* Wait for receivers to startup */
117 xbt_dynar_foreach(hosts,i,h) {
119 peer = gras_socket_client(h->name,h->port);
120 gras_msg_send(peer,gras_msgtype_by_name("data"),&data);
121 INFO2(" Sent Data from %s to %s",
122 /*data,*/gras_os_myname(),h->name);
123 gras_socket_close(peer);
126 /* Free the allocated resources, and shut GRAS down */
127 xbt_dynar_free(&hosts);
131 } /* end_of_sender */