Autore: Fabio Di Matteo
Ultima revisione: 21/12/2023 - 12:56
Utilizzando il comando 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
main.cc
#include <iostream> #include <cstdint> #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
La funzione preleva il primo gateway valido igd.
#include <iostream> #include <cstdint> #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
Il nostro wiki installa solamente cookie tecnici necessari al funzionamento della piattaforma "Dokuwiki". Niente analitics, statistiche, tracciamenti o altro.