Я пытаюсь написать приложение, которое выполняет следующие действия:
Как соединить двух клиентов друг с другом напрямую, используя сервер, который знает их адреса, порты и имеет открытое соединение с обоими?
Во многих постах о p2p есть утверждения, что это возможно и распространенный сценарий, но я изо всех сил пытаюсь найти объяснение, как это делается.
То, что вы описываете, является прямым одноранговым (p2p) соединением. Чтобы это работало в нормальных условиях, без необходимости переадресации портов или более продвинутых методов обхода NAT (дырокол, STUN и т. д.), сервер должен будет облегчить согласование между клиентами, когда один клиент соглашается откройте прослушивающий сокет, к которому затем попытается подключиться другой клиент. Если это соединение не удается, клиенты могут поменяться ролями и повторить попытку в другом направлении. Пока хотя бы 1 клиент не находится за NAT, это обычно работает. Но если это соединение также не работает, дальнейшая связь между клиентами должна будет проходить через сервер в качестве прокси-сервера, если только не используются более продвинутые методы.
Я не уверен, какая именно проблема у вас здесь. Это в основном клиент № 1, подключающийся к серверу, клиент № 2, подключающийся к серверу, а затем сервер, получающий данные от клиента № 1 и пересылающий их по существующему соединению клиенту № 2 - и наоборот.