Ah. I hope I didn't sow confusion there, hplus. My post was based on reading rather than personal experience. So you can reply using accept/recvfrom, but not send a new packet to the client on the same IP/port? What's the difference? I thought packet-wise it would be the same thing.
Are you confusing a few concepts here? Accept is for TCP, recvfrom is for UDP. TCP ports are NOT the same as UDP ports.
Edit: The server should be the only peer that reads packets from a fixed port. The server will reply to the address returned from recvfrom(). That's because the client's router will probably assign some random port number the first time it sends a package to the server.
For NAT-Punchthrough you will need a master server that can read UDP packets. When the server registers itself with the master server it will send a datagram to it. The master will store the port it sees and tell that port to the clients querying the server list so they can connect. However, the server will have to send a keep-alive packet to the master server because its router might change the assigned port if it is not used for a while. This is not a problem however, since the master server should delete dead servers from its list anyway.
The real problem is that you probably don't have the possibility to run a UDP service on your of-the-shelf webhost.