View previous topic :: View next topic |
Author |
Message |
PortmappingGuru
Joined: 06 Feb 2011 Posts: 8
|
Posted: Fri Feb 18, 2011 12:03 pm Post subject: Opening Ports |
|
|
Hi,
I wrote a small function that should open a port for a certain IP address. It works good for one of my test router. But the other test router always returns a UPNP error. My programm is running in debug mode as console, so this is what miniupnpc prints into the console:
Quote: |
This is a UPNP-Test!
Opening port 2300 for 192.168.2.2...
ifIndex=11 nextHop=102a8c0
Num Entries: 2
Interface Index[0]: 11
IP Address[0]: 192.168.2.2
Subnet Mask[0]: 255.255.255.0
BroadCast[0]: 1.0.0.0 (1)
Reassembly size[0]: 65535
Type and State[0]:
Interface Index[1]: 1
IP Address[1]: 127.0.0.1
Subnet Mask[1]: 255.0.0.0
BroadCast[1]: 1.0.0.0 (1)
Reassembly size[1]: 65535
Type and State[1]:
M-SEARCH Reply:
ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1
Location: http://192.168.2.1:1900/igd.xml
header='CONTENT-LENGTH', value='2746'
Content-Length: 2746
header='CONTENT-TYPE', value='text/xml'
header='DATE', value='Sun, 01 Jan 2006 07:15:01 GMT'
header='LAST-MODIFIED', value='Tue, 28 Oct 2003 08:46:08 GMT'
header='SERVER', value='TP-LINK Router R460, UPnP/1.0'
header='CONNECTION', value='close'
End of HTTP content
urlbase = ''
WAN Device (Common interface config) :
serviceType = 'urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1'
controlURL = '/ifc'
eventSubURL = '/ifc'
SCPDURL = '/ifc.xml'
primary WAN Connection Device (IP or PPP Connection):
servicetype = 'urn:schemas-upnp-org:service:WANIPConnection:1'
controlURL = '/ipc'
eventSubURL = '/ipc'
SCPDURL = '/ipc.xml'
secondary WAN Connection Device (IP or PPP Connection):
servicetype = ''
controlURL = ''
eventSubURL = ''
SCPDURL = ''
urls->ipcondescURL='http://192.168.2.1:1900/ipc.xml' 31 n1=41
urls->controlURL='http://192.168.2.1:1900/ipc' 27 n2=37
urls->controlURL_CIF='http://192.168.2.1:1900/ifc' 27 n3=37
SOAP request : POST /ipc HTTP/1.1 - Host: 192.168.2.1:1900
SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#GetStatusInfo" - Con
tent-Length: 271
header='CONNECTION', value='close'
header='SERVER', value='TP-LINK Router R460, UPnP/1.0'
header='CONTENT-LENGTH', value='480'
Content-Length: 480
header='CONTENT-TYPE', value='text/xml; charset="utf-8"'
End of HTTP content
SOAP Response :
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SO
AP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<u:GetStatusInfoResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1
"><NewConnectionStatus>Connected</NewConnectionStatus><NewLastConnectionError>ER
ROR_NONE</NewLastConnectionError><NewUptime>0 Days, 00:15:02</NewUptime></u:GetS
tatusInfoResponse></SOAP-ENV:Body>
</SOAP-ENV:Envelope>
UPNPIGD_IsConnected(http://192.168.2.1:1900/ipc) = 1
SOAP request : POST /ipc HTTP/1.1 - Host: 192.168.2.1:1900
SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#GetStatusInfo" - Con
tent-Length: 271
header='CONNECTION', value='close'
header='SERVER', value='TP-LINK Router R460, UPnP/1.0'
header='CONTENT-LENGTH', value='480'
Content-Length: 480
header='CONTENT-TYPE', value='text/xml; charset="utf-8"'
End of HTTP content
SOAP Response :
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SO
AP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<u:GetStatusInfoResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1
"><NewConnectionStatus>Connected</NewConnectionStatus><NewLastConnectionError>ER
ROR_NONE</NewLastConnectionError><NewUptime>0 Days, 00:15:02</NewUptime></u:GetS
tatusInfoResponse></SOAP-ENV:Body>
</SOAP-ENV:Envelope>
SOAP request : POST /ipc HTTP/1.1 - Host: 192.168.2.1:1900
SOAPAction: "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1#AddPortMapp
ing" - Content-Length: 602
header='CONTENT-LENGTH', value='476'
Content-Length: 476
header='CONTENT-TYPE', value='text/xml; charset="utf-8"'
header='DATE', value='Sun, 01 Jan 2006 07:15:01 GMT'
header='EXT', value=''
header='SERVER', value='TP-LINK Router R460, UPnP/1.0'
End of HTTP content
SOAP Response :
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SO
AP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Client</faultcode>
<faultstring>UPnPError</faultstring>
<detail>
<UPnPError xmlns="urn:schemas-upnp-org:control-1-0">
<errorCode>-111</errorCode>
<errorDescription>Invalid Action</errorDescription>
</UPnPError>
</detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
|
What does the Error -111 mean?
This is my current function (sorry german comments):
Code: |
float upnp_command(char* locIp, unsigned short Port, char Protocol, bool Delete)
{
//Führt einen UPnP Discover durch
//--> Findet alle UPnP-Fähigen Geräte
struct UPNPDev *devices = upnpDiscover(30, NULL, NULL, 0);
if(devices)
{ //wenn Geräte gefunden wurden
struct IGDdatas *data = (struct IGDdatas *)malloc(sizeof(struct IGDdatas));
struct UPNPUrls *urls = (struct UPNPUrls *)malloc(sizeof(struct UPNPUrls));
if(data == NULL || urls == NULL)
{
free((void*)data);
free((void*)urls);
freeUPNPDevlist(devices);
WSACleanup();
return -1;
}
//Ermittelt ob es Geräte die IGD (= Internet Gateway Device Protocol)
//fähige Geräte gibt:
int validDevices = UPNP_GetValidIGD(devices, urls, data, NULL, 0);
bool Found = false; //wird true gesetzt wenn IGD fähige Geräte gefunden wurden
int Returns = 0; //Rückgabewert der UPNP_Add/Delete Funktionen
if(validDevices > 0)
{ //wenn es IGD fähige Geräte gibt
//Konvertiert den Port in einen String:
char PortStr[32];
sprintf(PortStr, "%i", Port);
if(Protocol & PROTOCOL_UDP)
{ //Wenn der Port für UDP geöffnet/geschlossen werden soll
Found = true;
if(!Delete)
Returns = UPNP_AddPortMapping(urls->controlURL, data->CIF.servicetype, PortStr, PortStr, locIp, NULL, "UDP", NULL);
else
Returns = UPNP_DeletePortMapping(urls->controlURL, data->CIF.servicetype, PortStr, "UDP", NULL);
}
if(Protocol & PROTOCOL_TCP)
{ //Wenn der Port für TCP geöffnet/geschlossen werden soll
Found = true;
if(!Delete)
Returns = UPNP_AddPortMapping(urls->controlURL, data->CIF.servicetype, PortStr, PortStr, locIp, NULL, "TCP", NULL);
else
Returns = UPNP_DeletePortMapping(urls->controlURL, data->CIF.servicetype, PortStr, "TCP", NULL);
}
}
//Befreit den benützten Speicher
free((void*)data);
free((void*)urls);
freeUPNPDevlist(devices);
//Gibt den entsprechenden Fehler zurück
if(Returns != 0) return -1; //ein UPNP Fehler ist aufgetreten
else
{
if(Found) return 1;
else return 0;
}
}
return 0;
} |
Maybe I wrote the code in a way it works not for all devices correct?
Thanks for your help! |
|
Back to top |
|
|
shaidar
Joined: 05 Feb 2011 Posts: 5
|
Posted: Fri Feb 18, 2011 8:43 pm Post subject: |
|
|
Hi,
Your code does not work because the service type is not correct, you should replace:
Code: | data->CIF.servicetype | by Code: | data->first.servicetype | when invoking UPNP_AddPortMapping and UPNP_DeletePortMapping actions.
By this mean, you will use WANPPPConnection or WANIPConnection instead of WANCommonInterfaceConfig. |
|
Back to top |
|
|
PortmappingGuru
Joined: 06 Feb 2011 Posts: 8
|
Posted: Sat Feb 19, 2011 10:17 am Post subject: |
|
|
Thank you so much! It works now like a charm
I currently noticed, that my second router has a field in it's UPnP table called "App Description". If I forward a port with the function above, miniupnpc is entered into the "App Description" field. Is it possible to add a different text to this field? Which parameter do I have to change?
Thanks a lot! |
|
Back to top |
|
|
shaidar
Joined: 05 Feb 2011 Posts: 5
|
Posted: Sat Feb 19, 2011 1:56 pm Post subject: |
|
|
You're welcome .
You have to specify the text you want in the sixth parameter of UPNP_AddPortMapping. So, for example you should call:
Code: | UPNP_AddPortMapping(urls->controlURL, data->first.servicetype, PortStr, PortStr, locIp, "MyPortMappingDescription", "UDP", NULL); |
instead of:
Code: | UPNP_AddPortMapping(urls->controlURL, data->first.servicetype, PortStr, PortStr, locIp, NULL, "UDP", NULL); |
|
|
Back to top |
|
|
PortmappingGuru
Joined: 06 Feb 2011 Posts: 8
|
Posted: Sat Feb 19, 2011 6:40 pm Post subject: |
|
|
Works great!
Thanks again! |
|
Back to top |
|
|
miniupnp Site Admin
Joined: 14 Apr 2007 Posts: 1589
|
Posted: Sun Feb 20, 2011 9:54 am Post subject: |
|
|
About the errorCode -111 :
Code: | <UPnPError xmlns="urn:schemas-upnp-org:control-1-0">
<errorCode>-111</errorCode>
<errorDescription>Invalid Action</errorDescription>
</UPnPError> |
I think there is a bug in the router because the right error code for "Invalid Action" is 401.
And if you cast the integer 401 to a signed char, you got -111...
401 = 0x191
and (signed char)0x91= -111 _________________ Main miniUPnP author.
https://miniupnp.tuxfamily.org/ |
|
Back to top |
|
|
daniel854 Guest
|
Posted: Wed May 11, 2011 6:27 pm Post subject: same problem |
|
|
i had the same problem. your solution helped me very much. |
|
Back to top |
|
|
PortmappingGuru
Joined: 06 Feb 2011 Posts: 8
|
Posted: Fri Sep 09, 2011 12:38 pm Post subject: |
|
|
Ok, I have nearly the same problem again, but now on another router. The router returns error code 401 (invalid action):
Code: |
Returns = UPNP_AddPortMapping(urls->controlURL, data->first.servicetype, PortOutStr, PortInStr, locIp, "UPnP Port", "UDP", NULL, NULL);
|
This is how I'm opening the port now. I don't see any reason why this is an invalid action, because it works with most routers...
Do you have any suggestions, what I could do wrong?
Thanks! |
|
Back to top |
|
|
miniupnp Site Admin
Joined: 14 Apr 2007 Posts: 1589
|
Posted: Fri Sep 09, 2011 2:28 pm Post subject: |
|
|
PortmappingGuru wrote: | Ok, I have nearly the same problem again, but now on another router. The router returns error code 401 (invalid action):
Code: |
Returns = UPNP_AddPortMapping(urls->controlURL, data->first.servicetype, PortOutStr, PortInStr, locIp, "UPnP Port", "UDP", NULL, NULL);
|
This is how I'm opening the port now. I don't see any reason why this is an invalid action, because it works with most routers...
Do you have any suggestions, what I could do wrong?
Thanks! |
The router is most probably bugged... have you successfully tried to open a port with another UPnP client on the same router ? _________________ Main miniUPnP author.
https://miniupnp.tuxfamily.org/ |
|
Back to top |
|
|
PortmappingGuru
Joined: 06 Feb 2011 Posts: 8
|
Posted: Fri Sep 09, 2011 3:37 pm Post subject: |
|
|
Yes, it works with another application based on miniupnp (maybe different version though) so it has to be something in my code...
PS: I'm using miniupnpc 1.6 and Microsoft Visual Studio 2008. |
|
Back to top |
|
|
PortmappingGuru
Joined: 06 Feb 2011 Posts: 8
|
Posted: Thu Sep 15, 2011 11:51 am Post subject: |
|
|
It was indeed a bug in the router firmware. After a firmware update it works again!
Thanks for your help! |
|
Back to top |
|
|
miniupnp Site Admin
Joined: 14 Apr 2007 Posts: 1589
|
Posted: Tue Nov 29, 2011 2:26 pm Post subject: |
|
|
PortmappingGuru wrote: | It was indeed a bug in the router firmware. After a firmware update it works again! |
Could you please give us the buggy version number and the fixed one of your router, so we can help other people running into the same problem ?
Thanks _________________ Main miniUPnP author.
https://miniupnp.tuxfamily.org/ |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
© 2007 Thomas Bernard, author of MiniUPNP.
|