====== Chiedere al Modem/Router di casa di aprire una porta su un ip interno ======
Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **// 21/12/2023 - 12:56 //** // //
Utilizzando il comando **[[http://miniupnp.tuxfamily.org/|upnpc]]** chiederemo al router di casa di aprire una porta su uno specifico indirizzo, in modo tale che possa accettare connessioni in ingresso.
upnpc -a 192.168.1.10 30301 30301 TCP
Stiamo chiedendo di aprire la porta 30301 sull'indirizzo 192.168.1.10 utilizzando TCP.
Usiamo il comando **upnpc -l ** per vedere quali porte il modem tiene aperte .
upnpc -l
====== Fare la stessa cosa in C++ con miniupnpc ======
**main.cc**
#include
#include
#include "miniupnpc/miniupnpc.h"
#include "miniupnpc//upnpcommands.h"
int main(int argc, char* argv[])
{
/* in upnpdev.h
* struct UPNPDev {
struct UPNPDev * pNext;
char * descURL;
char * st;
char * usn;
unsigned int scope_id;
...
}; * */
// Chiediamo il descrUrl al modem/router
// a questo url troviamo la descrizione dei servizi in xml
struct UPNPDev *devlist ;
int err;
devlist = upnpDiscover(2000, NULL, NULL,
UPNP_LOCAL_PORT_SAME, 0, 2, &err);
printf("DescrUrl: %s\n",devlist->descURL);
struct UPNPUrls urls;
struct IGDdatas data;
char lanaddr[]="192.168.1.1";
int i = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr));
//Ora proviamo a chiedere di aprire le porte
char eport[]="30044";
char iport[]="30044";
char iaddr[]="192.168.1.4";
char description[]="Prove Fabio DM";
char proto[]="TCP";
char leaseDuration[]="60"; //secondi
int res;
res=UPNP_AddPortMapping(devlist->descURL, data.first.servicetype,
eport, iport, iaddr, description,
proto, 0, leaseDuration);
if (res==0)
{
printf("Operazione eseguita con successo\n");
} else{
printf("Non รจ stato possibile eseguire l'operazione\n");
}
return 0;
}
**makefile**
all:
g++ `pkg-config --cflags --libs miniupnpc` main.c -o portmapping
static:
g++ main.c ./libminiupnpc.a -o portmapping_static
====== Prelevare il default gateway ======
La funzione preleva il primo gateway valido igd.
#include
#include
#include "miniupnpc/miniupnpc.h"
#include "miniupnpc/upnpcommands.h"
std::string getGateway()
{
struct UPNPDev *devlist ;
int err;
devlist = upnpDiscover(2000, NULL, NULL, UPNP_LOCAL_PORT_SAME, 0, 2, &err);
struct UPNPUrls urls;
struct IGDdatas data;
char lanaddr[]={0};
int i = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr));
std::string sub ;
std::string fullUrl(urls.ipcondescURL);
int pos = fullUrl.find(":");
sub = fullUrl.substr(pos + 3);
pos = sub.find(":");
sub = sub.substr(0, pos);
std::string gw(sub);
return gw;
}
int main(int argc, char* argv[])
{
std::string mgw;
mgw=getGateway();
printf("Default gw: %s\n",mgw.c_str());
return 0;
}
**makefile**
all:
g++ `pkg-config --cflags --libs miniupnpc` main.c -o getGW
static:
g++ main.c ./libminiupnpc.a -o getGW_static