From 255628e641e873fb6699cd40ea50aa9be2fc1a18 Mon Sep 17 00:00:00 2001 From: lidgren Date: Tue, 7 Jun 2011 06:13:34 +0000 Subject: [PATCH] UPnP port forwarding improved to tolerate up to 1000 ms of router response time; UPnP added to DurableSample --- Lidgren.Network/NetUPnP.cs | 15 +++++++++------ .../DurableSample/DurableServer/Program.cs | 4 ++++ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/Lidgren.Network/NetUPnP.cs b/Lidgren.Network/NetUPnP.cs index b62e022..90e25d9 100644 --- a/Lidgren.Network/NetUPnP.cs +++ b/Lidgren.Network/NetUPnP.cs @@ -3,6 +3,7 @@ using System.IO; using System.Xml; using System.Net; using System.Net.Sockets; +using System.Threading; namespace Lidgren.Network { @@ -11,8 +12,11 @@ namespace Lidgren.Network /// public class NetUPnP { + private const int c_discoveryTimeOutMillis = 1000; + private string m_serviceUrl; private NetPeer m_peer; + private ManualResetEvent m_discoveryComplete = new ManualResetEvent(false); /// /// NetUPnP constructor @@ -38,7 +42,7 @@ namespace Lidgren.Network peer.Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, false); // allow some extra time for router to respond - System.Threading.Thread.Sleep(50); + // System.Threading.Thread.Sleep(50); } internal void ExtractServiceUrl(string resp) @@ -59,7 +63,7 @@ namespace Lidgren.Network return; m_serviceUrl = CombineUrls(resp, node.Value); m_peer.LogDebug("UPnP service ready"); - System.Threading.Thread.Sleep(50); + m_discoveryComplete.Set(); #if !DEBUG } catch { return; } @@ -84,7 +88,7 @@ namespace Lidgren.Network /// public bool ForwardPort(int port, string description) { - if (m_serviceUrl == null) + if (m_serviceUrl == null && !m_discoveryComplete.WaitOne(c_discoveryTimeOutMillis)) return false; IPAddress mask; @@ -120,7 +124,7 @@ namespace Lidgren.Network /// public bool DeleteForwardingRule(int port) { - if (m_serviceUrl == null) + if (m_serviceUrl == null && !m_discoveryComplete.WaitOne(c_discoveryTimeOutMillis)) return false; try { @@ -145,9 +149,8 @@ namespace Lidgren.Network /// public IPAddress GetExternalIP() { - if (m_serviceUrl == null) + if (m_serviceUrl == null && !m_discoveryComplete.WaitOne(c_discoveryTimeOutMillis)) return null; - try { XmlDocument xdoc = SOAPRequest(m_serviceUrl, "" + diff --git a/Samples/LibraryTestSamples/DurableSample/DurableServer/Program.cs b/Samples/LibraryTestSamples/DurableSample/DurableServer/Program.cs index 16b80cf..a20e15a 100644 --- a/Samples/LibraryTestSamples/DurableSample/DurableServer/Program.cs +++ b/Samples/LibraryTestSamples/DurableSample/DurableServer/Program.cs @@ -25,9 +25,13 @@ namespace DurableServer config.Port = 14242; config.EnableMessageType(NetIncomingMessageType.ConnectionApproval); config.EnableMessageType(NetIncomingMessageType.DiscoveryRequest); + config.EnableUPnP = true; Server = new NetServer(config); Server.Start(); + // attempt upnp port forwarding + Server.UPnP.ForwardPort(14242, "Durable sample test"); + m_expectedReliableOrdered = new uint[3]; m_reliableOrderedCorrect = new int[3]; m_reliableOrderedErrors = new int[3];