static void Main(string[] args) { RandomNumberGenerator rng = new RNGCryptoServiceProvider(); //Initialize hosts Console.WriteLine("\n\n---------------------------------------\n\n"); int port = 20287; int net_size = 3; string net_type = "function"; if (args.Length > 0) { net_size = Int32.Parse(args[0]); } if (args.Length > 1) { net_type = args[1]; } int ms_sleep = 0; if (args.Length > 2) { ms_sleep = Int32.Parse(args[2]); } bool wait_after_connect = true; if (args.Length > 3) { ///@todo we really need better option parsing here wait_after_connect = false; } ArrayList node_list = new ArrayList(); Hashtable add_to_node = new Hashtable(); PathELManager pem = null; for (int loop = 0; loop < net_size; loop++) { //create and initialize new host //create one new node for each host AHAddress tmp_add = new AHAddress(rng); Node tmp_node = new StructuredNode(tmp_add, "bstland"); //Node tmp_node = new HybridNode(tmp_add, "bstland"); node_list.Add(tmp_node); add_to_node[tmp_add] = tmp_node; //long small_add = 2*(loop+1); //Node tmp_node = new StructuredNode(new AHAddress( new BigInteger(small_add)) ); PType path_p = PType.Protocol.Pathing; switch (net_type) { case "tcp": tmp_node.AddEdgeListener(new TcpEdgeListener(port + loop)); break; case "udp": tmp_node.AddEdgeListener(new UdpEdgeListener(port + loop)); break; case "function": tmp_node.AddEdgeListener(new FunctionEdgeListener(port + loop)); break; case "path": if (pem == null) { EdgeListener el = new UdpEdgeListener(port); pem = new PathELManager(el); pem.Start(); } //Pass path messages to the pem: tmp_node.DemuxHandler.GetTypeSource(path_p).Subscribe(pem, path_p); tmp_node.AddEdgeListener(pem.CreatePath((port + loop).ToString())); Console.WriteLine(port + loop); break; case "single_path": EdgeListener myel = new UdpEdgeListener(port + loop); //Test "default" path edge listener: pem = new PathELManager(myel); pem.Start(); tmp_node.DemuxHandler.GetTypeSource(path_p).Subscribe(pem, path_p); //Make the default path: tmp_node.AddEdgeListener(pem.CreateRootPath()); break; default: throw new Exception("Unknown net type: " + net_type); } //tmp_node.AddEdgeListener(new FunctionEdgeListener(port+loop)); for (int loop2 = 0; loop2 < net_size; loop2++) { if (loop == loop2) { continue; } int other_port = port + loop2; string ta_str = null; switch (net_type) { case "tcp": ta_str = "brunet.tcp://127.0.0.1:"; break; case "udp": ta_str = "brunet.udp://127.0.0.1:"; break; case "function": ta_str = "brunet.function://localhost:"; break; case "path": ta_str = String.Format("brunet.udp://127.0.0.1:{0}/", port); break; case "single_path": ta_str = "brunet.udp://127.0.0.1:"; break; default: throw new Exception("Unknown net type: " + net_type); } ta_str = ta_str + other_port.ToString(); TransportAddress this_ta = TransportAddressFactory.CreateInstance(ta_str); tmp_node.RemoteTAs.Add(this_ta); } } //This logs the changes in connection table BootStrapTester bst = new BootStrapTester(node_list); if (bst != null) { //This is just here to prevent a warning for //not using bst, which is just an observer } //Get Connected: int total_started = 0; ArrayList rnd_list = (ArrayList)node_list.Clone(); Random rnd = new Random(); for (int j = 0; j < rnd_list.Count; j++) { //Swap the j^th position with this position: int i = rnd.Next(j, rnd_list.Count); if (i != j) { object o = rnd_list[i]; rnd_list[i] = rnd_list[j]; rnd_list[j] = o; } } ArrayList c_threads = new ArrayList(); //var xrms = new Brunet.Rpc.XmlRpcManagerServer(20000); int cnt = 0; foreach (Node item in rnd_list) { Thread t = new Thread(item.Connect); c_threads.Add(t); t.Start(); //xrms.Add(item, "xm" + cnt++ + ".rem"); Console.WriteLine(item.Address.ToString() + " RemoteTAs count: " + item.RemoteTAs.Count); total_started++; Console.WriteLine("Started: " + total_started.ToString()); //Thread.Sleep(10000); Thread.Sleep(ms_sleep); //Console.ReadLine(); //foreach (TransportAddress item2 in item.RemoteTAs) // Console.WriteLine(item2); } System.Console.Out.WriteLine("Finished with BootStrapTester.Main"); string[] this_command = new string[] { "Q" }; if (wait_after_connect) { Console.WriteLine("Enter Q to stop"); this_command = Console.ReadLine().Split(' '); } while (this_command[0] != "Q") { if (this_command[0] == "D") { //Disconnect a node: int node = -1; try { node = Int32.Parse(this_command[1]); Node to_disconnect = (Node)node_list[node]; Console.WriteLine("About to Disconnect: {0}", to_disconnect.Address); to_disconnect.Disconnect(); bst.Remove(to_disconnect); } catch (Exception) { } } if (this_command[0] == "abort") { //Disconnect a node: int node = -1; try { node = Int32.Parse(this_command[1]); Node to_abort = (Node)node_list[node]; Console.WriteLine("About to Abort: {0}", to_abort.Address); to_abort.Abort(); bst.Remove(to_abort); } catch (Exception) { } } if (this_command[0] == "P") { //Pick a random pair of nodes to ping: Ping(node_list); } if (this_command[0] == "BP") { try { int reps = Int32.Parse(this_command[1]); bst.BenchmarkPing(reps); } catch (Exception x) { Console.WriteLine(x); } } if (this_command[0] == "BH") { try { int reps = Int32.Parse(this_command[1]); bst.BenchmarkHops(reps); } catch (Exception x) { Console.WriteLine(x); } } if (this_command[0] == "T") { //Pick a random pair of nodes to ping: TraceRoute(node_list); } if (wait_after_connect) { this_command = Console.ReadLine().Split(' '); } } foreach (Node n in node_list) { n.Disconnect(); } if (pem != null) { pem.Stop(); } //Block until all Connect threads finish. //foreach(Thread t in c_threads) { // t.Join(); //} }