Normally a NAT will keep the public end point of a local end point the same for all packets that are coming from it, thus making UDP hole punching easily possible. However, some NATs will map the local end point to a different public one for each different host a packet is sent to, thus making UDP hole punching not possible.
The only way to do traditional UDP punching would be to guess the remote end point. However, since there are more than 65,000 ports, this method is not very reliable. So I've read that applications like Skype - which well-knowingly are able to communicate through pretty much any type of NAT - use a relay for that. Here are my questions:
A relay is simply a socket that transfers incoming data from one socket to another socket, right? Are there any other ways of doing UDP hole punching through naughty NATs without either taking wild guesses or using a relay (which then isn't really "hole punching" anymore)?