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];