diff --git a/OpenRA.Server/Class1.cs b/OpenRA.Server/Class1.cs index 050ca7cd64..1e057f005c 100644 --- a/OpenRA.Server/Class1.cs +++ b/OpenRA.Server/Class1.cs @@ -4,45 +4,72 @@ using System.Linq; using System.Text; using System.Net.Sockets; using System.Threading; +using System.IO; +using System.Net; namespace OpenRA.Server { - class Program + static class Program { static void Main(string[] args) { - var left = new TcpListener(1234); - left.Start(); - var right = new TcpListener(1235); - right.Start(); + var listener = new TcpListener(IPAddress.Any, 1234); + var clients = new List(); - var lc = left.AcceptTcpClient(); - lc.NoDelay = true; - var l = lc.GetStream(); + listener.Start(); - var rc = right.AcceptTcpClient(); - rc.NoDelay = true; - var r = rc.GetStream(); - - var ll = new Thread(RW(l, r)); - var rr = new Thread(RW(r, l)); - ll.Start(); - rr.Start(); - - ll.Join(); - } - - static ThreadStart RW(NetworkStream a, NetworkStream b) - { - return () => + for (; ; ) { - var buf = new byte[4096]; - while (true) + try { - var len = a.Read(buf, 0, 4096); - b.Write(buf, 0, len); + var conn = listener.AcceptTcpClient(); + conn.NoDelay = true; + Console.WriteLine("Accepted connection from {0}", + conn.Client.RemoteEndPoint.ToString()); + + new Thread(() => + { + lock (clients) + clients.Add(conn); + + var ns = conn.GetStream(); + + try + { + for (; ; ) + { + var frame = BitConverter.ToInt32(ns.Read(4), 0); + var length = BitConverter.ToInt32(ns.Read(4), 0); + var data = ns.Read(length); + + lock (clients) + foreach (var c in clients) + if (c != conn) + { + var otherStream = c.GetStream(); + otherStream.Write(BitConverter.GetBytes(frame)); + otherStream.Write(BitConverter.GetBytes(length)); + otherStream.Write(data); + } + } + } + catch (Exception e) + { + Console.WriteLine("Client dropped: {0}", conn.Client.RemoteEndPoint.ToString()); + + lock (clients) + clients.Remove(conn); + } + }) { IsBackground = true }.Start(); } - }; + catch (Exception e) + { + Console.WriteLine(e.ToString()); + } + } } + + public static void Write(this Stream s, byte[] data) { s.Write(data, 0, data.Length); } + public static byte[] Read(this Stream s, int len) { var data = new byte[len]; s.Read(data, 0, len); return data; } } }