i need to perform port forwarding in a desktop application written in C#.
i used this code :
using System;
using System.Threading;
using NATUPNPLib;
namespace iSpyApplication
{
public static class NATControl
{
public static UPnPNAT NAT = new UPnPNAT();
private static IStaticPortMappingCollection _mappings;
public static IStaticPortMappingCollection Mappings
{
get
{
if (_mappings==null)
{
try
{
if (NAT.NATEventManager != null)
_mappings = NAT.StaticPortMappingCollection;
}
catch
{
}
}
return _mappings;
}
}
public static bool SetPorts(int wanPort, int lanPort)
{
bool b = false;
int i = 3;
while (Mappings == null && i > 0)
{
Thread.Sleep(2000);
i--;
}
if (Mappings != null)
{
try
{
Mappings.Remove(wanPort, "TCP");
}
catch (Exception ex)
{
}
try
{
Mappings.Add(wanPort, "TCP", lanPort, internalIP, true, "iSpy");
b = true;
}
catch (Exception ex)
{
}
}
return b;
}
}
}
UPnP is enabled in my linksys router
the code is running and not giving any errors or exceptions, however, mapping is simply not happening.
here is how i am testing it:
1. i have an application that listens to an internal port e.g. 8080.
2. i manually add a mapping entry to my router:
application : HTTP , external port 8080 , internal port 8080, protocol: TCP , internal IP , enabled
3. i request the following URL in my browser:
http : // publicIP : externalport /
4. the application receives a socket on the internal port and replies with a message.
i manually remove the mapping entry from the router and try to add it programmatically:
1. the same
2. i run a code that performs mapping
3. the same
4. browser displays the following message :
Unable to connect
Firefox can't establish a connection to the server a publicIP:externalPort
i have searched for C# code that performs mapping, and they all look the same. Why would mapping fail ?
Thanks in advance