Передача файлов/данных между двумя произвольными источниками

Я ищу простой способ реализовать этот сценарий:

Скажем, у меня есть две машины, между которыми я хотел бы обмениваться данными. Расположение/адреса этих машин могут измениться в любое время. Я хочу, чтобы обе машины зарегистрировались на центральном сервере, чтобы объявить о своей доступности. Одна из двух систем хочет получить файл из другой. Я знаю, что я могу заставить систему приемника сделать запрос к серверу, который затем запрашивает файл из источника, извлекает его, а затем передает запрашивающему. Однако это кажется неэффективным с точки зрения пропускной способности. Файл будет передан дважды. Существует ли система, в которой источник может транслировать его непосредственно в приемник?

Не имея возможности гарантировать такие вещи, как переадресация портов, если система находится за брандмауэром и т. Д. Я не знаю, как это сделать.

Спасибо.


person dwelch    schedule 14.09.2010    source источник
comment
Вы изучали системы P2P, такие как BitTorrent? Чем-то похож на меня.   -  person R. Martinho Fernandes    schedule 14.09.2010
comment
Похоже, BitTorrent использует обратные соединения.   -  person dwelch    schedule 16.09.2010


Ответы (1)


Когда машина A хочет отправить данные машине B, A отправляет запрос на центральный сервер C. C спрашивает у B разрешения. Если он принят, C передает IP-адрес и порт B для A. A пытается подключиться к B напрямую. В случае неудачи (т. е. если B находится за маршрутизатором/брандмауэром), тогда A уведомляет C об ошибке. Затем C сообщает IP-адрес и порт A B. B пытается подключиться напрямую к A (который должен иметь возможность проходить через брандмауэр/маршрутизатор B). Если какое-либо соединение установлено успешно, то A имеет прямое соединение для отправки данных на B. Если оба соединения неудачны (т. е. если A также находится за брандмауэром/маршрутизатором), то C должен действовать как прокси для всех передач между A и B.

person Remy Lebeau    schedule 14.09.2010