are there other solutions?
For Hole Punching there are several techinques.
The one described is for when the router can be fooled with trying to connect from both ends at the same time.
But there are routers which have NAT implementations where the outgoing port isn't predictable. In that case you will need to use additional techniques to try to punch the whole (which not always works).
If that, and UPnP doesn't work... you can always communicatie via the common server (without a direct connection).
BTW. If I get to it, I will also implement username/password for the TUPNP class. Because allowing UPNP on your network is a security issue.
Putting Authentication on UPNP is at least a bit more secure (but that's not standard, not all implementations have authentication).
(Does your router have authenticated / secure UPnP ? Mine does, Asus with Asuswrt-Merlin.)