diff --git a/OpenRa.Game/Network/Network.cs b/OpenRa.Game/Network/Network.cs index b4743cb3e4..5170cfc3cc 100644 --- a/OpenRa.Game/Network/Network.cs +++ b/OpenRa.Game/Network/Network.cs @@ -1,10 +1,79 @@ using System; using System.Collections.Generic; using System.Text; +using System.Net.Sockets; +using System.Threading; +using System.Net; +using System.IO; namespace OpenRa.Game { class Network { + public const int Port = 6543; + const int netSyncInterval = 40 * 5; + + UdpClient client = new UdpClient(Port); + int nextSyncTime = 0; + int currentFrame = 0; + + Queue incomingPackets = new Queue(); + + public Network() + { + client.EnableBroadcast = true; + + Thread receiveThread = new Thread(delegate() + { + for (; ; ) + { + IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); + byte[] data = client.Receive(ref sender); + + Packet packet = Packet.FromReceivedData(sender, data); + + lock (this) + { + if (currentFrame <= packet.Frame) + incomingPackets.Enqueue(packet); + } + } + }); + } + + public void Send(byte[] data) + { + IPEndPoint destination = new IPEndPoint(IPAddress.Broadcast, Port); + using(MemoryStream ms = new MemoryStream()) + using (BinaryWriter writer = new BinaryWriter(ms)) + { + writer.Write(currentFrame); + writer.Write(data); + writer.Flush(); + + byte[] toSend = ms.ToArray(); + + client.Send(toSend, toSend.Length); + } + } + + public Queue Tick() + { + Queue toProcess = new Queue(); + + if (Environment.TickCount > nextSyncTime) + lock (this) + { + while (incomingPackets.Count > 0 && incomingPackets.Peek().Frame <= currentFrame) + { + Packet p = incomingPackets.Dequeue(); + if (p.Frame == currentFrame) + toProcess.Enqueue(p); + } + ++currentFrame; + } + + return toProcess; + } } } diff --git a/OpenRa.Game/Network/Packet.cs b/OpenRa.Game/Network/Packet.cs new file mode 100644 index 0000000000..01d36b5f9a --- /dev/null +++ b/OpenRa.Game/Network/Packet.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Net; +using System.IO; + +namespace OpenRa.Game +{ + class Packet : IComparable + { + IPEndPoint address; + int frame; + byte[] data; + + public int Frame { get { return frame; } } + + Packet(IPEndPoint address, byte[] data) + { + this.address = address; + + using (MemoryStream ms = new MemoryStream(data)) + using (BinaryReader reader = new BinaryReader(ms)) + { + frame = reader.ReadInt32(); + this.data = reader.ReadBytes(data.Length - 4); + } + } + + public static Packet FromReceivedData(IPEndPoint sender, byte[] data) { return new Packet(sender, data); } + + public int CompareTo(Packet other) { return frame.CompareTo(other.frame); } + } +} diff --git a/OpenRa.Game/OpenRa.Game.csproj b/OpenRa.Game/OpenRa.Game.csproj index 14fae2e4a9..c94fdabe9d 100644 --- a/OpenRa.Game/OpenRa.Game.csproj +++ b/OpenRa.Game/OpenRa.Game.csproj @@ -44,6 +44,7 @@ +