Что есть:
1. Комп1, на котором создаётся сокет-сервер, допустим на 110 порту.
2. Комп2, который должен подключиться к компу1 напрямую!
3. Сервер, который должен передать IP и ПОРТ компа1 компу2, по которым комп2 должен будет подключиться к сокету компа1 на 110 порту.
И в 3-м пункте проблема...
Комп1 находится за NAT и имеет серый внутренний IP, следовательно, при попытке подключиться к компу1 по внешнему IP, все порты будут закрыты.
Я пока не могу придумать решения данной проблемы...
Кто может подсказать логику действий в данном случае?
Обойдитесь, чего тогда вопрос задавать. Skype работает по принципу P2P если это возможно, но он умеет очень ловко искать маршруты через другие хосты с локальной сети. Например через других клиентов в одном сегменте сети вашего провайдера у которых есть внешний адрес. В случае отсутствия любых других путей, соединение поднимается через сервера Skype у которых (внезапно) есть полноценные белые адреса.
Atllantis: "(тот же скайп например). "
У скайпа есть сервер, расположенный в Microsoft, и который может соединить два клиента за натом.
Напрямую, без внешней машины, два nat клиента не смогут друг к другу подключиться. Им нужно передать через кого-то внешнего, доступного для обоих, информацию о подключении.
Мало информации, лучше нарисовать псевдосхемой.
Как я понял комп1 где то далеко, прячется за натом провайдера? Или от провайдера ip статичный и белый а серый нат только на стороне локалки в виде обычного роутера?
Комп2 я так понимаю ваш комп.
Вопрос где находится сервер? у вас, вместе к комп1 или где то отдельно и имеет свой статичный внешний ip?
Если комп подходит под описание того что нат у него внутри своей локалки то надо просто пробросить dmz зону на комп1. Если доступа к роутеру нет но есть upnp то шаманить и програмно пробивать себе порт через upnp.
Другой вариант это любой vpn.
Еще 1 вариант это написать простейший аналог turn сервера. Т.е. грубо говоря где то на сервере у которого есть возможность открывать любые порты и присутсвует белый внешний ip стоит turn сервер. Turn в самой простой реализации будет работать так:
По дефолту ждет соединение на любом порту, пусть это будет даже сокетное соединение. При получение входящего соединения начинает ждать 2е соединение. После подключения обоих клиентов он у каждого получает input и output концы, затем кросирует их между собой. комп1(output)->комп2(input) и наоборот комп1(input)->комп2(output). В конечном счете сервер просто проксирует соединение, для комп1 и комп2 соединение будет именно друг с другом но в тоже время сами они будут являться клиентами для turn сервера, нат становится не проблемой, серый ип тоже.