Escrevi poucos aplicativos peer-to-peer e posso dizer que a acessibilidade de peers é o principal problema com esse tipo de aplicativo. Aqui estão alguns ponteiros:
-
se você usar o TCP, sua única esperança é o UPnP. No entanto, você não pode presumir que está sempre disponível. Na verdade, o UPnP é (a) geralmente suportado por roteadores de redes domésticas (b) é freqüentemente desativado, pois as pessoas veem pouco ou nenhum valor nele, então o suporte para ele é bastante esporádico. Suas chances são ainda menores se seus clientes estiverem atrás de duas camadas de roteadores, cada qual fazendo seu próprio NAT. Mas, se você puder dizer aos seus clientes para habilitar o UPnP ou especificar o UPnP como pré-requisito para o seu aplicativo, então é um caminho a ser seguido.
-
Outra opção é usar o UDP e inserir um orifício no roteador, mas você precisaria de um agente externo que rastreie o endereço de mesmo nível e corresponda à identidade do host a um endereço IP acessível globalmente (no seu caso, ele provavelmente será implantado "Desconhecido"). Note que o TTL de buracos de pinos UDP é geralmente muito curto (pela minha estimativa é entre 20 segundos e 5 minutos), então você precisaria pingar seu agente com bastante frequência. Outro problema com o UDP é que você pode precisar implementar seu próprio protocolo de controle de fluxo se seu aplicativo trocar bits de dados maiores que 1 pacote.
Espero que isso ajude.