From 1801432a28a2b6ee78863043305e5efd39820a2e Mon Sep 17 00:00:00 2001 From: lidgren Date: Fri, 19 Oct 2012 07:25:34 +0000 Subject: [PATCH] MasterServer sample improved --- Lidgren.Network/NetNatIntroduction.cs | 13 +++-- Samples/MasterServerSample/MSClient/Form1.cs | 6 ++- .../MasterServerSample/MSClient/Program.cs | 29 ++++++----- .../MasterServerSample/MSServer/Program.cs | 25 ++++++---- .../MasterServer/Program.cs | 50 ++++++++++--------- 5 files changed, 74 insertions(+), 49 deletions(-) diff --git a/Lidgren.Network/NetNatIntroduction.cs b/Lidgren.Network/NetNatIntroduction.cs index 438a088..bfe1e59 100644 --- a/Lidgren.Network/NetNatIntroduction.cs +++ b/Lidgren.Network/NetNatIntroduction.cs @@ -19,8 +19,7 @@ namespace Lidgren.Network // send message to client NetOutgoingMessage msg = CreateMessage(10 + token.Length + 1); msg.m_messageType = NetMessageType.NatIntroduction; - msg.Write(false); - msg.WritePadBits(); + msg.Write((byte)0); msg.Write(hostInternal); msg.Write(hostExternal); msg.Write(token); @@ -29,8 +28,7 @@ namespace Lidgren.Network // send message to host msg = CreateMessage(10 + token.Length + 1); msg.m_messageType = NetMessageType.NatIntroduction; - msg.Write(true); - msg.WritePadBits(); + msg.Write((byte)1); msg.Write(clientInternal); msg.Write(clientExternal); msg.Write(token); @@ -100,6 +98,13 @@ namespace Lidgren.Network punchSuccess.m_senderEndPoint = senderEndPoint; punchSuccess.Write(token); ReleaseMessage(punchSuccess); + + // send a return punch just for good measure + var punch = CreateMessage(1); + punch.m_messageType = NetMessageType.NatPunchMessage; + punch.Write((byte)0); + punch.Write(token); + m_unsentUnconnectedMessages.Enqueue(new NetTuple(senderEndPoint, punch)); } } } diff --git a/Samples/MasterServerSample/MSClient/Form1.cs b/Samples/MasterServerSample/MSClient/Form1.cs index d4b52f9..dc5ff0d 100644 --- a/Samples/MasterServerSample/MSClient/Form1.cs +++ b/Samples/MasterServerSample/MSClient/Form1.cs @@ -23,7 +23,11 @@ namespace MSClient private void button2_Click(object sender, EventArgs e) { - string host = comboBox1.SelectedItem.ToString(); + if (comboBox1.SelectedItem == null) + return; + + var splits = comboBox1.SelectedItem.ToString().Split(' '); + var host = Int64.Parse(splits[0]); Program.RequestNATIntroduction(host); } } diff --git a/Samples/MasterServerSample/MSClient/Program.cs b/Samples/MasterServerSample/MSClient/Program.cs index 3f24087..8ccee8f 100644 --- a/Samples/MasterServerSample/MSClient/Program.cs +++ b/Samples/MasterServerSample/MSClient/Program.cs @@ -14,7 +14,7 @@ namespace MSClient private static Form1 m_mainForm; private static NetClient m_client; private static IPEndPoint m_masterServer; - private static List m_hostList; + private static Dictionary m_hostList; [STAThread] static void Main() @@ -23,7 +23,7 @@ namespace MSClient Application.SetCompatibleTextRenderingDefault(false); m_mainForm = new Form1(); - m_hostList = new List(); + m_hostList = new Dictionary(); NetPeerConfiguration config = new NetPeerConfiguration("game"); config.EnableMessageType(NetIncomingMessageType.UnconnectedData); @@ -54,12 +54,16 @@ namespace MSClient if (inc.SenderEndPoint.Equals(m_masterServer)) { // it's from the master server - must be a host - IPEndPoint hostInternal = inc.ReadIPEndPoint(); - IPEndPoint hostExternal = inc.ReadIPEndPoint(); + var id = inc.ReadInt64(); + var hostInternal = inc.ReadIPEndPoint(); + var hostExternal = inc.ReadIPEndPoint(); - m_hostList.Add(new IPEndPoint[] { hostInternal, hostExternal }); + m_hostList[id] = new IPEndPoint[] { hostInternal, hostExternal }; - m_mainForm.comboBox1.Items.Add(hostExternal.Address.ToString()); + // update combo box + m_mainForm.comboBox1.Items.Clear(); + foreach (var kvp in m_hostList) + m_mainForm.comboBox1.Items.Add(kvp.Key.ToString() + " (" + kvp.Value[1] + ")"); } break; case NetIncomingMessageType.NatIntroductionSuccess: @@ -83,9 +87,9 @@ namespace MSClient m_client.SendUnconnectedMessage(listRequest, m_masterServer); } - public static void RequestNATIntroduction(string host) + public static void RequestNATIntroduction(long hostid) { - if (string.IsNullOrEmpty(host)) + if (hostid == 0) { MessageBox.Show("Select a host in the list first"); return; @@ -97,13 +101,14 @@ namespace MSClient NetOutgoingMessage om = m_client.CreateMessage(); om.Write((byte)MasterServerMessageType.RequestIntroduction); - // write internal ipendpoint + // write my internal ipendpoint IPAddress mask; om.Write(new IPEndPoint(NetUtility.GetMyAddress(out mask), m_client.Port)); - // write external address of host to request introduction to - IPEndPoint hostEp = new IPEndPoint(NetUtility.Resolve(host), CommonConstants.GameServerPort); - om.Write(hostEp); + // write requested host id + om.Write(hostid); + + // write token om.Write("mytoken"); m_client.SendUnconnectedMessage(om, m_masterServer); diff --git a/Samples/MasterServerSample/MSServer/Program.cs b/Samples/MasterServerSample/MSServer/Program.cs index ac7f7fa..978c228 100644 --- a/Samples/MasterServerSample/MSServer/Program.cs +++ b/Samples/MasterServerSample/MSServer/Program.cs @@ -22,18 +22,25 @@ namespace MSServer Console.WriteLine("Server started; waiting 5 seconds..."); System.Threading.Thread.Sleep(5000); - // register with master server - NetOutgoingMessage regMsg = server.CreateMessage(); - regMsg.Write((byte)MasterServerMessageType.RegisterHost); - IPAddress mask; - IPAddress adr = NetUtility.GetMyAddress(out mask); - regMsg.Write(new IPEndPoint(adr, 14242)); - - Console.WriteLine("Sending registration to master server"); - server.SendUnconnectedMessage(regMsg, masterServerEndpoint); + var lastRegistered = -60.0f; while(Console.KeyAvailable == false || Console.ReadKey().Key != ConsoleKey.Escape) { + // (re-)register periodically with master server + if (NetTime.Now > lastRegistered + 60) + { + // register with master server + NetOutgoingMessage regMsg = server.CreateMessage(); + regMsg.Write((byte)MasterServerMessageType.RegisterHost); + IPAddress mask; + IPAddress adr = NetUtility.GetMyAddress(out mask); + regMsg.Write(server.UniqueIdentifier); + regMsg.Write(new IPEndPoint(adr, 14242)); + Console.WriteLine("Sending registration to master server"); + server.SendUnconnectedMessage(regMsg, masterServerEndpoint); + lastRegistered = (float)NetTime.Now; + } + NetIncomingMessage inc; while ((inc = server.ReadMessage()) != null) { diff --git a/Samples/MasterServerSample/MasterServer/Program.cs b/Samples/MasterServerSample/MasterServer/Program.cs index ff421ee..c1829c4 100644 --- a/Samples/MasterServerSample/MasterServer/Program.cs +++ b/Samples/MasterServerSample/MasterServer/Program.cs @@ -12,7 +12,7 @@ namespace MasterServer { static void Main(string[] args) { - List registeredHosts = new List(); + Dictionary registeredHosts = new Dictionary(); NetPeerConfiguration config = new NetPeerConfiguration("masterserver"); config.SetMessageTypeEnabled(NetIncomingMessageType.UnconnectedData, true); @@ -39,25 +39,28 @@ namespace MasterServer switch ((MasterServerMessageType)msg.ReadByte()) { case MasterServerMessageType.RegisterHost: + // It's a host wanting to register its presence - IPEndPoint[] eps = new IPEndPoint[] + var id = msg.ReadInt64(); // server unique identifier + + Console.WriteLine("Got registration for host " + id); + registeredHosts[id] = new IPEndPoint[] { msg.ReadIPEndPoint(), // internal msg.SenderEndPoint // external }; - Console.WriteLine("Got registration for host " + eps[1]); - registeredHosts.Add(eps); break; case MasterServerMessageType.RequestHostList: // It's a client wanting a list of registered hosts Console.WriteLine("Sending list of " + registeredHosts.Count + " hosts to client " + msg.SenderEndPoint); - foreach (IPEndPoint[] ep in registeredHosts) + foreach (var kvp in registeredHosts) { // send registered host to client NetOutgoingMessage om = peer.CreateMessage(); - om.Write(ep[0]); - om.Write(ep[1]); + om.Write(kvp.Key); + om.Write(kvp.Value[0]); + om.Write(kvp.Value[1]); peer.SendUnconnectedMessage(om, msg.SenderEndPoint); } @@ -65,27 +68,28 @@ namespace MasterServer case MasterServerMessageType.RequestIntroduction: // It's a client wanting to connect to a specific (external) host IPEndPoint clientInternal = msg.ReadIPEndPoint(); - IPEndPoint hostExternal = msg.ReadIPEndPoint(); + long hostId = msg.ReadInt64(); string token = msg.ReadString(); - Console.WriteLine(msg.SenderEndPoint + " requesting introduction to " + hostExternal + " (token " + token + ")"); + Console.WriteLine(msg.SenderEndPoint + " requesting introduction to " + hostId + " (token " + token + ")"); // find in list - foreach (IPEndPoint[] elist in registeredHosts) + IPEndPoint[] elist; + if (registeredHosts.TryGetValue(hostId, out elist)) { - if (elist[1].Equals(hostExternal)) - { - // found in list - introduce client and host to eachother - Console.WriteLine("Sending introduction..."); - peer.Introduce( - elist[0], // host internal - elist[1], // host external - clientInternal, // client internal - msg.SenderEndPoint, // client external - token // request token - ); - break; - } + // found in list - introduce client and host to eachother + Console.WriteLine("Sending introduction..."); + peer.Introduce( + elist[0], // host internal + elist[1], // host external + clientInternal, // client internal + msg.SenderEndPoint, // client external + token // request token + ); + } + else + { + Console.WriteLine("Client requested introduction to nonlisted host!"); } break; }