Прямой обмен данными между компьютерами через интернет
Подобные обсуждения уже есть на форуме - но там отсылки типа "юзай файлообменники" и "нафига это нужно".
Есть программа (уже давно работающая), которая реализует функции "облачного" плеера. На данный момент, "облачность" реализуется посредством размещения файлов на моих серверах, а также добавлением в каталог, лежащий на сервере, прямых ссылок на файлы лежащие на разных сайтах по всей сети. Если кто-то имеет желание поделится своими ссылками - заходит на спец. форум, и размещает их там. После проверки, я добавляю их в каталог.
Пользователи подбросили идею - сделать возможным добавление файлов прямо из программы, причем файлы хранятся на компьютере пользователя. То-есть получается одноранговая сеть.
Есть мысля сделать это так: при расшаривании файла, экзепляр программы посылает на сервер список файлов, с привязкой их по ip (напр. в текстовом файле. Название файла - адрес отправителя). Ip может быть динамическим, поэтому нужно организовать на том же сервере аналог dyndns. В принципе, каждый экземпляр программы будет представлять ftp сервер/клиент с динамическим ip.
И вот тут вопрос: Как правильно организовать аналог dynDns?
Проще так - как получить доступ к ftp серверу по его динамическому ip (пусть даже серому). Например тот что выдается всякими сервисами типа "какой мой ip" - не годиться. По нему доступ не идет, да он и актуален только для маршрутизатора (т.е. по нему можно попасть в веб-интерфейс роутера\маршрутизатора, а дальше - нет). Думал использовать tracert. Но маршрут то я получаю, но чего с ним делать потом? Как указать ftp клиенту - "зайди на 192.166.235.235 через 246.123.231.222 через..."? Просто с такой проблемой столкнулся впервые.
Может есть какой другой вариант организации обмена? Как он сделан например в скайпе или других подобных прогах? Ведь все упираеться, я так думаю, в тот же сервер где хранятся и раздаются DNS. Была мысль еще VPN - но тут я просто не нашел программных способов доступа к vpn (бибилотека может есть какая? неважно на чем, хоть на фортране)
ЗЫ. У меня для эксперимента стоит filezilla сервер и такой же клиент. Если кто-то знает как мне через динамику и NAT получить доступ к серверу (на одну сессию, используя тот ip что есть) - это и будет ответ на мой вопрос. Дальше разберусь.
коммандной строки минус - пользователи других операцонных систем не смогут так работать) или p2p (jxta например)
Вариант Б: прямое подключение со стороны расшаривающего пользователя с маршрутизацией трафика через свои сервера(Т.е. пользователь А подключен к вашему серваку и расшарил чтото. Пользователь Б подключается к вашему серваку и запрашивает шару пользователя А. ваш сервак берет у подключенного А данные и дает их пользователю Б)
Или при "расшаривании" файлов тупо аплоадить их к вам на сервер.
Вариант А: vpn (настраивается из
Вариант Б: прямое подключение со стороны расшаривающего пользователя с маршрутизацией трафика через свои сервера(Т.е. пользователь А подключен к вашему серваку и расшарил чтото. Пользователь Б подключается к вашему серваку и запрашивает шару пользователя А. ваш сервак берет у подключенного А данные и дает их пользователю Б)
Или при "расшаривании" файлов тупо аплоадить их к вам на сервер.
p2p - а что-то кроме jxta есть? Для дельфы там реализации по-моему нет. А программа у меня на делфи.Может, опять же, есть клиент с командной строкой?
Вариант Б: Если бы знал как расшарить файлы, то для меня не было бы проблемой реализовать и задумку с FTP. Но вот как? Я об этом по - сути и спрашиваю. Мне нада узнать как на моем сервере правильно записать ссылку на файл в удаленном компьютере. Если IP статика -ту проблем нет. А вот как все это забацать при маршрутизации? Я просто не знаю как правильно записать путь маршрутизации. Так например "111.111.111.111\222.222.222.222\100.100.100.100" - не работает. Я так понял это неправильно. Правильнее сделать как в DynDNS - на компе стоит программа которая при каждом подключении высылает ip на спец. сервак, и там присваивается этому ip новый dns. Вроде просто но как это сделать? Как это делают например qiup или аська? Skype - там p2p.
http://it.sander.su/udp-hole-punching.php
И то правда. Я как то и забыл про UDP. Хотя каждый день торрентами пользуюсь. Спасибо, буду рыть в указанном направлении.
Возник новый вопрос - как реализовать UDP hole punching на сервере. Клиент - там вроде ничего сложного нет. А вот серверная часть, которая будет получать и рассылать адреса с портами - это уже вопрос. В принципе на пхп написать могу, хотя и опыт работы с ним у меня очень не большой. Может есть готовые решения? Или возоможно лучше будет на VDS - сервере разместить десктопую прогу написанную на плюсах или делфи? Хотя если VDS - то можно и VPN сразу на нем же и поднять и вообще не париться. Но какая нужна мощность сервака? Насколько я понимаю VPN (а именно ее протокол pptp) там сервер будет использоватся только при соединении, а дальше обмен пойдет по "тунелю" между двумя машинами?
http://habrahabr.ru/post/142858/
Хотя бы некоторым? Это сильно упрощает решение проблеммы.
Те, кто порт не открыл, будут получать файлы через остальных, то есть каждый клиент должен иметь возможность маршрутизировать запросы.
Ещё, если ты собрался использовать FTP, то там есть режимы активный и пассивный, в обеих случаях указываются адрес и порт.