====== 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