Я делаю программу голосового чата клиент-сервер (неуправляемый С++, win32), в которой клиенты подключаются к серверу с использованием TCP, а функции текстового чата/чата выполняются в TCP, в то время как вся аудиопередача отправляется через отдельный сокет UDP/RTP (используя API из JRTPLIB).
Таким образом, IP-адрес известен из TCP-соединения, и номер порта RTP-сокета может быть отправлен после установления соединения.
Проблема в том, что в TCP только сервер должен выполнять переадресацию портов для обмена данными в обоих направлениях, поскольку вы устанавливаете соединение, в то время как в UDP вам нужно использовать recvfrom() - для чего, на самом деле, нужно, чтобы порты были открыты в первое место на стороне клиента, чего я не хочу (да и не нужно если смотреть на любую многопользовательскую игру или VoIP клиент)
Чтение источников, в которых говорится об UDP Hole Punching (например, http://en.wikipedia.org/wiki/UDP_hole_punching), например, они продолжают упоминать о начале диалога UDP с сервером. Вот в чем дело - как вы на самом деле начинаете udp-разговор (в обе стороны) с сервером без необходимости открытия клиентом каких-либо портов? в TCP, как я уже упоминал, вам просто нужно подключиться() к серверу, и связь возможна в обоих направлениях.
Кроме того, я знаю, что RTP основан на UDP, но есть ли что-то еще, что я должен знать о пробивке отверстий RTP (опять же, с использованием JRTPLIB), что отличает его от UDP?
Заранее спасибо!