Skip to content

Commit

Permalink
Further tidyup upnp
Browse files Browse the repository at this point in the history
  • Loading branch information
UnknownShadow200 committed Dec 16, 2021
1 parent 0f6221b commit 6dcd6ee
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 24 deletions.
15 changes: 6 additions & 9 deletions GUI/Popups/PortTools.cs
Expand Up @@ -68,12 +68,9 @@ public partial class PortTools : Form
}

void mWorkerForwarder_DoWork(object sender, DoWorkEventArgs e) {
int tries = 0;
bool adding = (bool)e.Argument;

retry:
try {
tries++;
if (!UPnP.Discover()) {
e.Result = 0;
} else if (adding) {
Expand All @@ -83,8 +80,8 @@ public partial class PortTools : Form
UPnP.DeleteForwardingRule(port, ProtocolType.Tcp);
e.Result = 3;
}
} catch {
if (tries < 2) goto retry;
} catch (Exception ex) {
Logger.LogError("Unexpected UPnP error", ex);
e.Result = 2;
}
}
Expand All @@ -104,18 +101,18 @@ public partial class PortTools : Form
lblResult.ForeColor = Color.Green;
return;
case 2:
lblResult.Text = "Something weird just happened, try again.";
lblResult.ForeColor = Color.Black;
lblResult.Text = "Unexpected error, see Error Logs";
lblResult.ForeColor = Color.Red;
return;
case 3:
lblResult.Text = "Deleted port forward rule.";
lblResult.Text = "Deleted port forward rule";
lblResult.ForeColor = Color.Green;
return;
}
}

void SetUPnPEnabled(bool enabled) {
btnDelete.Enabled = enabled;
btnDelete.Enabled = enabled;
btnForward.Enabled = enabled;
}
}
Expand Down
33 changes: 18 additions & 15 deletions GUI/UPnP.cs
Expand Up @@ -21,6 +21,9 @@
using System.Xml;
using MCGalaxy.Network;
//This upnp class comes from http://www.codeproject.com/Articles/27992/NAT-Traversal-with-UPnP-in-C, Modified for use with MCForge
// Some relatively straightforward documentation on how UPnP works:
// http://www.upnp-hacks.org/upnp.html
// http://www.upnp-hacks.org/igd.html

namespace MCGalaxy
{
Expand Down Expand Up @@ -48,17 +51,18 @@ public static class UPnP
IPEndPoint ep = new IPEndPoint(IPAddress.Broadcast, 1900);
byte[] buffer = new byte[0x1000];

DateTime start = DateTime.UtcNow;
s.ReceiveTimeout = 3000;
visitedLocations.Clear();
Logger.Log(LogType.BackgroundActivity, "Searching for UPnP devices..");
DateTime end = DateTime.UtcNow.Add(Timeout);

try {
do {
while (DateTime.UtcNow < end)
{
s.SendTo(data, ep);
s.SendTo(data, ep);
s.SendTo(data, ep);

int length = -1;
do {
length = s.Receive(buffer);
Expand All @@ -77,19 +81,18 @@ public static class UPnP
}
}
} while (length > 0);
} while (start.Subtract(DateTime.UtcNow) < Timeout);
return false;
}
} catch (Exception ex) {
Logger.LogError("Error discovering UPnP devices", ex);
return false;
}
return false;
}

public static void ForwardPort(int port, ProtocolType protocol, string description) {
if (String.IsNullOrEmpty(_serviceUrl) )
throw new InvalidOperationException("No UPnP service available or Discover() has not been called");

string xdoc = SOAPRequest(_serviceUrl,
string xdoc = SOAPRequest(_serviceUrl, "AddPortMapping",
"<u:AddPortMapping xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">" +
"<NewRemoteHost></NewRemoteHost>" +
"<NewExternalPort>" + port + "</NewExternalPort>" +
Expand All @@ -99,19 +102,19 @@ public static class UPnP
"<NewEnabled>1</NewEnabled>" +
"<NewPortMappingDescription>" + description + "</NewPortMappingDescription>" +
"<NewLeaseDuration>0</NewLeaseDuration>" +
"</u:AddPortMapping>", "AddPortMapping");
"</u:AddPortMapping>");
}

public static void DeleteForwardingRule(int port, ProtocolType protocol) {
if (String.IsNullOrEmpty(_serviceUrl) )
throw new InvalidOperationException("No UPnP service available or Discover() has not been called");

string xdoc = SOAPRequest(_serviceUrl,
"<u:DeletePortMapping xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">" +
"<NewRemoteHost></NewRemoteHost>" +
"<NewExternalPort>" + port + "</NewExternalPort>" +
"<NewProtocol>" + protocol.ToString().ToUpper() + "</NewProtocol>" +
"</u:DeletePortMapping>", "DeletePortMapping");
string xdoc = SOAPRequest(_serviceUrl, "DeletePortMapping",
"<u:DeletePortMapping xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">" +
"<NewRemoteHost></NewRemoteHost>" +
"<NewExternalPort>" + port + "</NewExternalPort>" +
"<NewProtocol>" + protocol.ToString().ToUpper() + "</NewProtocol>" +
"</u:DeletePortMapping>");
}


Expand Down Expand Up @@ -161,7 +164,7 @@ public static class UPnP

/// <summary> Performs a XML SOAP request </summary>
/// <returns> XML response from the service </returns>
static string SOAPRequest(string url, string soap, string function) {
static string SOAPRequest(string url, string function, string soap) {
string req =
"<?xml version=\"1.0\"?>" +
"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">" +
Expand Down

0 comments on commit 6dcd6ee

Please sign in to comment.