UltraUPNP - 10/21/2020

Written by: Hunter Wilcox

Update 11/12/2020: Added C++ version for fun

Have you ever wanted to host a quick, temperary, game server without logging into your router? With this tool, you map your computer / server to an external port. This tool allows you to add and remove port mappings on your router without logging into it. (If you router has it enabled / supports UPnP). Go here

Usage:

Add port mapping

java -jar UltraUPnP1.1.0.jar -add -externalPort <INT> -internalPort <INT> -host <STRING> -proto <String: UDP|TCP>

Remove port mapping

java -jar UltraUPnP1.1.0.jar -remove -externalPort <INT> -host <STRING> -proto <String: TCP|UDP>

Library Usage

public UltraUPnP(String[] args){
        RouterFinder findRouter = new RouterFinder();
        Router router = null;
        try {
            if(findRouter.search()){ // Serch for router
                router = new Router(findRouter.getUPNPUrlDescriptor()); // Connect to router
            }else{ return;}

      router.portForward(7979, 7979, "192.168..86.54", Router.TCP); // Add port mapping
            router.removeMapping(7979, "192.168.86.54", Router.TCP);      // Remove port mapping
            System.out.println("External IP: " + router.getExternalIPAddress()); // Get your external IP
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Qt/C++

/*
Source Code: https://github.com/JudgeGlass/UltraUPnP-CPP
*/
#include <QCoreApplication>
#include <QtNetwork/QNetworkDatagram>
#include <QDebug>
#include <QList>

#include <routerfinder.h>
#include <router.h>
#include <routerargument.h>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    RouterFinder routerFinder;

    if(routerFinder.search()){
        qDebug() << "CONNECTED";
    }else{
        qDebug() << "Could not connect";
        return -1;
    }

    Router *router = new Router(routerFinder.getDescriptorURL());
    qDebug() << "External IP: " << router->getExternalIPAddress();

    QList<RouterArgument> portMappings = router->getPortMappings();
    for(RouterArgument ra: portMappings){
        qInfo() << "<" << ra.getArgName() << ">" << ra.getArgValue() << "</" << ra.getArgName() <<pre ">\n";
    }

    router->portForward(888, 888, "192.168.86.22", router->TCP);
    router->removeMapping(888, "192.168.86.22", router->TCP);

    delete router;
    return a.exec();
}