Вот некоторые настоятельно рекомендуемые технические материалы для пробивки отверстий UDP (или TCP):
http://www.usenix.org/events/usenix05/tech/general/full_papers/ford/ford_html/
Или, конечно же, википедия:
http://en.wikipedia.org/wiki/UDP_hole_punching
По сути, поскольку большинство компьютеров находятся за так называемыми трансляторами сетевых адресов (NAT), вам нужно будет использовать общедоступный IP-адрес компьютера и общедоступный порт так, как их видит кто-то в Интернете. Кроме того, вам понадобится частный IP-адрес и частный порт (или, поскольку само приложение видит свои сокеты ... это на тот случай, если вы находитесь за тем же NAT, что и другое приложение / компьютер / узел, к которому вы пытаетесь подключиться). Затем ОБА оба узла пытаются установить соединение, пробуя открытый и закрытый адреса. Когда эти два приложения устанавливают контакт, они успешно прошли NAT - они успешно пробили дырокол.
Популярный способ сделать это - подключить обоих клиентов к серверу, который помогает координировать работу двух клиентов. Он координирует отправку общедоступных и частных IP-адресов и портов другому клиенту, который они затем используют для выполнения «дырокола».
Также, очевидно, используется протокол UDP, потому что он более (эмпирически) успешен, чем TCP. Примечание: я пытался найти статистику по этому вопросу, но безуспешно.