I've seen and read a lot of similar questions, and the corresponding Wikipedia articles (NAT traversal, STUN, TURN, TCP hole punching), but the overwhelming amount of information doesn't really help me with my very simple problem:
I'm writing a P2P application, and I want two users of my application behind NAT to be able to connect to each other. The connection must be reliable (comparable to TCP's reliability) so I can't just switch to UDP. The solution should work on today's common systems without reconfiguration. If it helps, the solution may involve a connectible 3rd-party, as long as it doesn't have to proxy the entire data (for example, to get the peers' external (WAN) IP addresses).
As far as I know, my only option is to use a "reliable UDP" library + UDP hole punching. Is there a (C/C++) library for this? I found enet in a related question, but it only takes care of the first half of the solution.
Anything else? Things I've looked at:
- Teredo tunnelling - requires support from the operating system and/or user configuration
- UPnP port forwarding - UPnP isn't present/enabled everywhere
- TCP hole punching seems to be experimental and only work in certain circumstances
- SCTP is even less supported than IPv6. SCTP over UDP is just fancy reliable UDP (see above)
- RUDP - nearly no mainstream support
- From what I could understand of STUN, STUNT, TURN and ICE, none of them would help me here.