/// <summary> /// Creates a TCP timeserver that listens for incoming connections and then responds with the current levels /// </summary> /// <returns> /// void /// </returns> public static void TcpUnitServer() { bool done = false; // Listen for connections on our defined port var listener = new TcpListener(IPAddress.Any, portNum); // Echo we're beginning the listener Console.WriteLine("Unit server now listening for TCP requests on port " + portNum); listener.Start(); while (!done) { TcpClient client = listener.AcceptTcpClient(); // accept the connection NetworkStream ns = client.GetStream(); // establish a network stream byte[] byte_levels = Encoding.ASCII.GetBytes(RetrieveData.ReadLevels()); // Retrieve and convert // try to send our data try { ns.Write(byte_levels, 0, byte_levels.Length); ns.Close(); client.Close(); // Show how many bytes we sent on each connection Console.WriteLine("Connection Established... Sent " + byte_levels.Length.ToString() + " Bytes"); } catch (Exception e) { Console.WriteLine(e.ToString()); } // Commented out for Testing //listener.Stop(); } }
static void Main(string[] args) { #region Command Arguments // Check for user input for (int i = 0; i < args.Length; i++) { if (args[i] == "--set-unit") { ContextSwitch.SetAsUnit(); } if (args[i] == "--set-town") { ContextSwitch.SetAsTown(); } if (args[i] == "--set-city") { ContextSwitch.SetAsCity(); } if (args[i] == "--get-mode") { Console.WriteLine(ContextSwitch.GetMode()); } if (args[i] == "--tcpscan") { NetworkRW.TCPScan(); } if (args[i] == "--gendb") { SQLHelper.CreateDB(); } if (args[i] == "--refresh-city") { NetworkRW.FindCity(); } if (args[i] == "--send-errors") { NetworkRW.SendError(); } } #endregion #region DeviceDefaults // If mode is not already set, then set it by default to unit mode if (!File.Exists("mode")) { ContextSwitch.SetAsDefault(); } // Create our dummy files if (!File.Exists("water") || !File.Exists("sewage") || !File.Exists("power")) { RetrieveData.CreateFiles(); } // Create a setupstat file if (!File.Exists("setupstat")) { ContextSwitch.CreateSetup(); } #endregion #region ModeDependants if (ContextSwitch.GetMode() == 0) // if unit { // We await a connection from the Town Control // by using the TCP Unit Server in Network Read/Write Console.WriteLine("Unit Mode Detected!"); ContextSwitch.FinishSetup(); // Setup can be set to finished NetworkRW.TcpUnitServer(); } if (ContextSwitch.GetMode() == 1) // if town { Console.WriteLine("Town Mode Detected!"); string stat = ContextSwitch.GetSetup(); // if the database doesn't exist, generate it and populate it if (stat == "pending") { Console.WriteLine("Generating Database..."); SQLHelper.CreateDB(); // create the database Console.WriteLine("Scanning Network..."); NetworkRW.TCPScan(); // populate the database Console.WriteLine("Detecting City..."); NetworkRW.FindCity(); // find the city ContextSwitch.FinishSetup(); // finish the setup } // Check setup again stat = ContextSwitch.GetSetup(); if (stat == "done") { // Initiate the TCP town client Console.WriteLine("Starting town client..."); NetworkRW.TcpTownClient(); // When finished, echo the errors to city Console.WriteLine("Sending any errors to city control..."); System.Threading.Thread.Sleep(5000); // pause briefly before continuing NetworkRW.SendError(); Console.WriteLine("Successfully sent errors"); } } if (ContextSwitch.GetMode() == 2) // if city { Console.WriteLine("City Mode Detected!"); string stat = ContextSwitch.GetSetup(); // if the database doesn't exist yet generate it, but do not populate it. if (stat == "pending") { Console.WriteLine("Initializating setup:"); Console.WriteLine("Generating Database..."); SQLHelper.CreateDB(); // create the database NetworkRW.CitySetup(); // run the city setup } //check setup again stat = ContextSwitch.GetSetup(); if (stat == "done") { // just run the city server NetworkRW.CityServer(); } } #endregion }