Barra laterale

rete:upnp:introduzione_a_upnpc

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

Prelevare il default gateway

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

rete/upnp/introduzione_a_upnpc.txt · Ultima modifica: 17/01/2024 - 10:53 da Fabio Di Matteo