Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Accept one peer (described as hostname:port) per argument
[simgrid.git] / examples / gras / all2all / all2all.c
1 /* $Id$ */
2
3 /* ALL2ALL - all2all of GRAS features                                       */
4
5 /* Copyright (c) 2006 Ahmed Harbaoui. All rights reserved.                  */
6
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. */
9
10 #include "gras.h"
11 #include "xbt/ex.h"
12
13 XBT_LOG_NEW_DEFAULT_CATEGORY(all2all,"Messages specific to this example");
14
15 /* register data which may be sent (common to client and server) */
16 static void register_messages(void) {
17 }
18
19 /* Function prototypes */
20 int receiver (int argc,char *argv[]);
21 int sender (int argc,char *argv[]);
22
23
24 /* **********************************************************************
25  * Receiver code
26  * **********************************************************************/
27 int receiver (int argc,char *argv[]) {
28
29   int myport; /* port on which I receive stuff */
30   int todo; /* amount of messages I should get */
31   int data; /* message content */
32  
33   gras_socket_t mysock;  /* socket on which other people contact me */
34   gras_socket_t expeditor;  /* to notice who wrote me */
35  
36   /* Init the GRAS infrastructure and declare my globals */
37   gras_init(&argc,argv);
38  
39   /* Get my settings from the command line */
40   myport=atoi(argv[1]);
41   todo=atoi(argv[2]);
42
43   /* Create my master socket */
44   mysock = gras_socket_server(myport);
45
46   /* Register the known messages */
47   gras_msgtype_declare("data", gras_datadesc_by_name("int"));
48
49   /* Get the data */
50
51   INFO2("Listening on port %d (expecting %d messages)",
52         gras_socket_my_port(mysock),
53         todo);
54   while (todo>0) {
55      gras_msg_wait(60 /* wait up to one minute */,
56                    gras_msgtype_by_name("data"),
57                    &expeditor,
58                    &data);
59      todo--;
60      
61      INFO4("Got Data(%d) from %s:%d (still %d to go)",
62            data, 
63            gras_socket_peer_name(expeditor), gras_socket_peer_port(expeditor),
64            todo);
65
66   }
67    
68   /* Free the allocated resources, and shut GRAS down */
69   gras_socket_close(mysock);
70      
71   gras_exit();
72   return 0;
73 } /* end_of_receiver */
74
75 /* **********************************************************************
76  * Sender code
77  * **********************************************************************/
78
79 int sender (int argc,char *argv[]) {
80
81   int i; /* iterator */
82   int data; /* data exchanged */
83  
84   xbt_host_t h; /* iterator */
85   
86   gras_socket_t peer;  /* socket to node */
87  
88   /* xbt_dynar for hosts */
89   xbt_dynar_t hosts = xbt_dynar_new(sizeof(xbt_host_t),&xbt_host_free_voidp);
90  
91   /* Init the GRAS infrastructure and declare my globals */
92   gras_init(&argc,argv);
93  
94   /* Get the node location from argc/argv */
95   for (i=1; i<argc; i++){
96     xbt_host_t host = xbt_host_from_string(argv[i]);
97     xbt_dynar_push(hosts,&host);
98   }
99
100   INFO0("Launch current node");
101
102   /* Register the known messages */
103   gras_msgtype_declare("data", gras_datadesc_by_name("int"));
104
105   /* Wait for receivers to startup */
106   gras_os_sleep(1);
107
108   /* write 'em */
109   data =1000;
110   xbt_dynar_foreach(hosts,i,h) {
111      
112      peer = gras_socket_client(h->name,h->port);
113      gras_msg_send(peer,gras_msgtype_by_name("data"),&data);
114      INFO3("  Sent Data (%d) from %s to %s",
115            data,gras_os_myname(),h->name);
116      gras_socket_close(peer);
117   }
118
119   /* Free the allocated resources, and shut GRAS down */
120   xbt_dynar_free(&hosts);
121      
122   gras_exit();
123   return 0;
124 } /* end_of_sender */