 <p>The kind of peer-to-peer networking problems become simple to the point of being trivial if you designate one machine as the master server. It should have a well-known name that all sub-servers can connect to so they can publish (and withdraw) their availability. A client can then send a query request to the same server and get a list of known servers in return.</p> <p>This can also solve your firewall problem, the master server could be listening on port 80.</p> <p>Look into the System.Net.PeerToPeer namespace for a p2p solution supported by the framework.</p>