From 66802928b6788ce1368b4a9099f45b6a8de87cea Mon Sep 17 00:00:00 2001 From: lidgren Date: Mon, 10 May 2010 09:43:45 +0000 Subject: [PATCH] Nat introduction added; sample added (not finished yet) --- Lidgren.Network/Lidgren.Network.csproj | 3 +- Lidgren.Network/NetIncomingMessage.Write.cs | 1 - Lidgren.Network/NetIncomingMessageType.cs | 1 + Lidgren.Network/NetMessageType.cs | 3 +- Lidgren.Network/NetNatIntroduction.cs | 49 +++++++++++ Lidgren.Network/NetOutgoingMessage.Write.cs | 3 +- Lidgren.Network/NetPeer.Internal.cs | 6 ++ .../MasterServer/MasterServer.csproj | 65 ++++++++++++++ .../MasterServer/Program.cs | 81 ++++++++++++++++++ .../MasterServer/Properties/AssemblyInfo.cs | 36 ++++++++ .../MasterServerSample/MasterServerSample.sln | 26 ++++++ .../MasterServerSample/MasterServerSample.suo | Bin 0 -> 29184 bytes 12 files changed, 269 insertions(+), 5 deletions(-) create mode 100644 Lidgren.Network/NetNatIntroduction.cs create mode 100644 Samples/MasterServerSample/MasterServer/MasterServer.csproj create mode 100644 Samples/MasterServerSample/MasterServer/Program.cs create mode 100644 Samples/MasterServerSample/MasterServer/Properties/AssemblyInfo.cs create mode 100644 Samples/MasterServerSample/MasterServerSample.sln create mode 100644 Samples/MasterServerSample/MasterServerSample.suo diff --git a/Lidgren.Network/Lidgren.Network.csproj b/Lidgren.Network/Lidgren.Network.csproj index e85c410..4b0713a 100644 --- a/Lidgren.Network/Lidgren.Network.csproj +++ b/Lidgren.Network/Lidgren.Network.csproj @@ -3,7 +3,7 @@ Debug AnyCPU - 9.0.21022 + 9.0.30729 2.0 {FA245447-5F23-4AA1-BD5F-8D2DDF33CFBD} Library @@ -65,6 +65,7 @@ + diff --git a/Lidgren.Network/NetIncomingMessage.Write.cs b/Lidgren.Network/NetIncomingMessage.Write.cs index dfae042..6e9aa48 100644 --- a/Lidgren.Network/NetIncomingMessage.Write.cs +++ b/Lidgren.Network/NetIncomingMessage.Write.cs @@ -446,7 +446,6 @@ namespace Lidgren.Network /// /// Writes an endpoint description /// - /// internal void Write(IPEndPoint endPoint) { byte[] bytes = endPoint.Address.GetAddressBytes(); diff --git a/Lidgren.Network/NetIncomingMessageType.cs b/Lidgren.Network/NetIncomingMessageType.cs index c4b3414..c2f39e5 100644 --- a/Lidgren.Network/NetIncomingMessageType.cs +++ b/Lidgren.Network/NetIncomingMessageType.cs @@ -41,5 +41,6 @@ namespace Lidgren.Network DebugMessage = 1 << 8, // Data (string) WarningMessage = 1 << 9, // Data (string) ErrorMessage = 1 << 10, // Data (string) + NatIntroduction = 1 << 11, // IPEndPoint } } diff --git a/Lidgren.Network/NetMessageType.cs b/Lidgren.Network/NetMessageType.cs index 7a726af..55ff633 100644 --- a/Lidgren.Network/NetMessageType.cs +++ b/Lidgren.Network/NetMessageType.cs @@ -48,7 +48,8 @@ namespace Lidgren.Network Disconnect = 8, Discovery = 9, DiscoveryResponse = 10, - NatIntroduction = 11, + NatPunchMessage = 11, + NatIntroduction = 12, } internal enum NetMessageType : byte diff --git a/Lidgren.Network/NetNatIntroduction.cs b/Lidgren.Network/NetNatIntroduction.cs new file mode 100644 index 0000000..31d3938 --- /dev/null +++ b/Lidgren.Network/NetNatIntroduction.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Net; + +namespace Lidgren.Network +{ + public partial class NetPeer + { + public void Introduce(IPEndPoint host, IPEndPoint client) + { + // send message to client + NetOutgoingMessage msg = CreateMessage(10); + msg.Write(false); + msg.WritePadBits(); + msg.Write(host); + SendUnconnectedLibraryMessage(msg, NetMessageLibraryType.NatIntroduction, client); + + // send message to host + msg = CreateMessage(10); + msg.Write(true); + msg.WritePadBits(); + msg.Write(client); + SendUnconnectedLibraryMessage(msg, NetMessageLibraryType.NatIntroduction, host); + } + + private void HandleNatIntroduction(int ptr, IPEndPoint senderEndpoint) + { + VerifyNetworkThread(); + + // read intro + NetIncomingMessage tmp = new NetIncomingMessage(m_receiveBuffer, 1000); // never mind length + tmp.Position = (ptr * 8); + bool isHost = (tmp.ReadByte() == 0 ? false : true); + IPEndPoint ep = tmp.ReadIPEndpoint(); + + // quickly; send nat punch + NetOutgoingMessage punch = CreateMessage(0); + SendUnconnectedLibraryMessage(punch, NetMessageLibraryType.NatPunchMessage, ep); + + if (!isHost) + { + NetIncomingMessage intro = CreateIncomingMessage(NetIncomingMessageType.NatIntroduction, 10); + intro.Write(ep); + intro.m_senderEndpoint = senderEndpoint; + ReleaseMessage(intro); + } + } + } +} diff --git a/Lidgren.Network/NetOutgoingMessage.Write.cs b/Lidgren.Network/NetOutgoingMessage.Write.cs index 474a8cb..b626e53 100644 --- a/Lidgren.Network/NetOutgoingMessage.Write.cs +++ b/Lidgren.Network/NetOutgoingMessage.Write.cs @@ -509,8 +509,7 @@ namespace Lidgren.Network /// /// Writes an endpoint description /// - /// - internal void Write(IPEndPoint endPoint) + public void Write(IPEndPoint endPoint) { byte[] bytes = endPoint.Address.GetAddressBytes(); Write((byte)bytes.Length); diff --git a/Lidgren.Network/NetPeer.Internal.cs b/Lidgren.Network/NetPeer.Internal.cs index f960f6a..a5da5d6 100644 --- a/Lidgren.Network/NetPeer.Internal.cs +++ b/Lidgren.Network/NetPeer.Internal.cs @@ -418,6 +418,12 @@ namespace Lidgren.Network int payloadLengthBytes = NetUtility.BytesToHoldBits(payloadLengthBits); + // + // Handle nat introduction + // + if (libType == NetMessageLibraryType.NatIntroduction) + HandleNatIntroduction(ptr, senderEndpoint); + // // Handle Discovery // diff --git a/Samples/MasterServerSample/MasterServer/MasterServer.csproj b/Samples/MasterServerSample/MasterServer/MasterServer.csproj new file mode 100644 index 0000000..0130f57 --- /dev/null +++ b/Samples/MasterServerSample/MasterServer/MasterServer.csproj @@ -0,0 +1,65 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {47E2AC9A-F375-47A7-A4E6-9814D3A2954B} + Exe + Properties + MasterServer + MasterServer + v3.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + + + + + + + {FA245447-5F23-4AA1-BD5F-8D2DDF33CFBD} + Lidgren.Network + + + + + \ No newline at end of file diff --git a/Samples/MasterServerSample/MasterServer/Program.cs b/Samples/MasterServerSample/MasterServer/Program.cs new file mode 100644 index 0000000..02b3706 --- /dev/null +++ b/Samples/MasterServerSample/MasterServer/Program.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using Lidgren.Network; +using System.Net; + +namespace MasterServer +{ + public enum MasterServerMessageType + { + RegisterHost, + RequestHostList, + RequestIntroduction, + } + + public class Program + { + static void Main(string[] args) + { + List registeredHosts = new List(); + + NetPeerConfiguration config = new NetPeerConfiguration("masterserver"); + + NetPeer peer = new NetPeer(config); + peer.Start(); + + // keep going until ESCAPE is pressed + Console.WriteLine("Press ESC to quit"); + while (!Console.KeyAvailable || Console.ReadKey().Key != ConsoleKey.Escape) + { + NetIncomingMessage msg; + while((msg = peer.ReadMessage()) != null) + { + switch (msg.MessageType) + { + case NetIncomingMessageType.UnconnectedData: + // + // We've received a message from a client or a host + // + + // by design, the first byte always indicates action + switch ((MasterServerMessageType)msg.ReadByte()) + { + case MasterServerMessageType.RegisterHost: + // It's a host wanting to register its presence + registeredHosts.Add(msg.SenderEndpoint); + break; + + case MasterServerMessageType.RequestHostList: + // It's a client wanting a list of registered hosts + foreach (IPEndPoint ep in registeredHosts) + { + // send registered host to client + NetOutgoingMessage om = peer.CreateMessage(); + om.Write(ep); + peer.SendUnconnectedMessage(om, msg.SenderEndpoint); + } + + break; + case MasterServerMessageType.RequestIntroduction: + // It's a client wanting to connect to a specific host + IPEndPoint rh = msg.ReadIPEndpoint(); + peer.Introduce(rh, msg.SenderEndpoint); + break; + } + break; + + case NetIncomingMessageType.DebugMessage: + case NetIncomingMessageType.VerboseDebugMessage: + case NetIncomingMessageType.WarningMessage: + case NetIncomingMessageType.ErrorMessage: + // print diagnostics message + Console.WriteLine(msg.ReadString()); + break; + } + } + } + + peer.Shutdown("shutting down"); + } + } +} diff --git a/Samples/MasterServerSample/MasterServer/Properties/AssemblyInfo.cs b/Samples/MasterServerSample/MasterServer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..cc65acb --- /dev/null +++ b/Samples/MasterServerSample/MasterServer/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("MasterServer")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("MasterServer")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("649338d3-b80b-4710-b801-21e593935c21")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Samples/MasterServerSample/MasterServerSample.sln b/Samples/MasterServerSample/MasterServerSample.sln new file mode 100644 index 0000000..1d6b9d4 --- /dev/null +++ b/Samples/MasterServerSample/MasterServerSample.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MasterServer", "MasterServer\MasterServer.csproj", "{47E2AC9A-F375-47A7-A4E6-9814D3A2954B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lidgren.Network", "..\..\Lidgren.Network\Lidgren.Network.csproj", "{FA245447-5F23-4AA1-BD5F-8D2DDF33CFBD}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {47E2AC9A-F375-47A7-A4E6-9814D3A2954B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {47E2AC9A-F375-47A7-A4E6-9814D3A2954B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {47E2AC9A-F375-47A7-A4E6-9814D3A2954B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {47E2AC9A-F375-47A7-A4E6-9814D3A2954B}.Release|Any CPU.Build.0 = Release|Any CPU + {FA245447-5F23-4AA1-BD5F-8D2DDF33CFBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FA245447-5F23-4AA1-BD5F-8D2DDF33CFBD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FA245447-5F23-4AA1-BD5F-8D2DDF33CFBD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FA245447-5F23-4AA1-BD5F-8D2DDF33CFBD}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Samples/MasterServerSample/MasterServerSample.suo b/Samples/MasterServerSample/MasterServerSample.suo new file mode 100644 index 0000000000000000000000000000000000000000..7778c0f52571ff11a2d61623c12aef75bc5c22c4 GIT binary patch literal 29184 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 K9D6(H|Nj8LY4E22 literal 0 HcmV?d00001