Как закачать файл на сервер по средаствам С++

Тема в разделе "Другие языки", создана пользователем qwerty, 10 июл 2008.

Статус темы:
Закрыта.
Модераторы: Цукер
  1. qwerty

    qwerty Постоялец

    Регистр.:
    10 апр 2006
    Сообщения:
    75
    Симпатии:
    0
    Доброго дня али вечера!
    Вопрос дня сегодня следующий.Возможно ли и если возможно то как:)Буду благодарен примеру с кодом.Решение интересует именно на языке С++.
    Есть три моих сервера.На сервере 1 стоит форма загрузки файлов на сервер,что то похожее на подобие рапидшаре и любых других обменников. И на сервере 2, располагается файл.
    С сервера 3 хочу загрузить файл с сервера 2 на сервер 1.
    Самый простой вариант это качаем файл на сервер 3 после того как файл скачался загружаем его на сервер 1.Теперь знатоки внимание вопрос.Можно ли не ждать пока файл загрузится полностью можно ли скачали часть данных скажем в память или еще как и передать серверу для загрузки.и так далее пока порциями не загрузим весь файл полностью.Тоесть отдавать его сразу частями и не сохранять на жеский диск сервера?
     
  2. gregzem

    gregzem

    Регистр.:
    21 окт 2007
    Сообщения:
    200
    Симпатии:
    63
    Вы не указали, что за сервера и на каких ОС. Веб сервера на всех трех или вы имеете ввиду просто некие хосты?

    Смею предположить, что на всех трех стоят вебсервера и они под ОС Unix. Я бы попробовал сделать следующее:

    1. на сервере 2, где лежит файл для закачки, кладем программульку (cgi скрипт, написанный на С++ c использованием, например, libcurl библиотеки под c++). Он умеет делать следующее: запускаться кем-то извне через HTTP GET запрос с сервера 3 и закачивать указанный файл POSTом на сервер 1.

    2. На сервере 3 пишется небольшой скрипт (тоже, кстати, cgi и тоже на c++), который дергает скрипт (см пункт 1), лежащий на сервере 2 через тот же libcurl.

    Произойдет следующее:

    С любого места можно будет набрать в браузере

    http://server3/startupload?f=myfile.pdf

    который пошлет http запрос вида

    GET /startuploadtoserver1?f=myfile.pdf HTTP/1.1

    на хост server2, порт 80

    В свою очередь на server2 в скрипте startuploadtoserver1
    выполнится запрос

    POST /uploader HTTP/1.1
    ...
    Content-Type: xxxxx
    Content-Length: xxxxx

    ...данные файла pdf....

    В ответ от server1 к server2 придет 200 OK, типа все OK + какая-нибудь полезная инфа или веб-страничка с результатом. Проанализировав страничку (или код ответа) скрипт сервера 2 дает ответ для server 3 примерно в таком же ключе. Это уже детали. Ну а архитектуру решения в принципе я расписал.

    Допустим файл огромный, канал между server 2 и server 1. В этом случае скрипт на server 2 отвалится через Timeout веб-сервера (или скрипт на server 3 отвалится по Timeout). Тогда решение другое.
    Два скрипта на server 2 (script1 загружает файл в фоновом режиме, script2 отдает статус загрузки по запросу с server3) и один на server 3 (инициатор начала загрузки и монитор статуса).

    На сервере 2 script1 загрузки должен запускаться по cron регулярно и проверять, не надо ли ему загрузить какой-нибудь файл на сервер 1. Если у него появляется такое задание, он его делает (обычный демон или cgi скрипт написанный на c++ с libcurl) и складывает результат закачки куда-нибудь (туда же откуда и получает задание на закачку и имя файла - например из БД). А скрипт на server 3 сам себя рефрешит до тех пор, пока не получит от скрипта script 2 c сервера 2 ответ о закачке или неудаче.

    В общем словами тяжело конечно архитектуру расписывать. Но варианты есть. Вообще до конца задача не ясна, поэтому если дадите более детальные комментарии может все проще намного окажется. Например, сделать перекачку файла через два ftp сервера (server2 и server1) и одного ftp клиента (на сервере 3).
     
    qwerty нравится это.
  3. qwerty

    qwerty Постоялец

    Регистр.:
    10 апр 2006
    Сообщения:
    75
    Симпатии:
    0
    Как считаете какой язык лучше выбрать?стоит ли это все реализовывать на php или все таки сделать это по средствам сги написанных на си?

    Добавлено через 2 минуты
    Как считаете стоит ли для этого дела использовать пхп?я тоже склоняюсь к си и сги но на пхп это будет реализовать проще и кода меньше, но будет ли это работать лучше вот в чем вопрос?
     
  4. skycode

    skycode Постоялец

    Регистр.:
    31 май 2008
    Сообщения:
    59
    Симпатии:
    22
    предположу что ето все попытка создания собственного обменника по типу депозита или рапиды... asp.net
     
  5. gregzem

    gregzem

    Регистр.:
    21 окт 2007
    Сообщения:
    200
    Симпатии:
    63
    Так уж получилось, что для веба лучше приспособлен Perl/PHP (особенно это касается Unix хостингов). А C/C++ как-то вообще для написания веб-приложений не годится. Я не говорю, что нельзя писать, пожалуйста, можно, как CGI можно хоть на Unix-шелле писать. Но удобнее все-таки заколачивать гвозди молотком, а не дрелью.

    ASP.NET - да, тоже хороший выбор, но больше для тех случаев, когда речь идет о формах, работе с базой данных и Windows хостинге.
     
  6. Accountboy

    Accountboy Создатель

    Регистр.:
    18 июл 2008
    Сообщения:
    29
    Симпатии:
    10
    Почему "Самый простой вариант это качаем файл на сервер 3 после того как файл скачался загружаем его на сервер 1" ? Не проще перелить с 2 на 1 напрямую? Почему не подходят более-менее готовые решения - например установить на 1 фтп сервак, на 2 - пхпшный скрипт который запускает командную строку с фтп клиентом, а на 3 - управляющий скрипт дергающий скрипт 2?
    ЗЫ. Если это никсовые сервера, то грамотный админ сможет примаунтить директорию с одного сервака на второй. Тогда не нужен даже фтп. Скрипт 2 будет тупо запускать команду копирования через exec(). Мне кажется это дешевле обойдется чем написание С++ программы с нуля дл я переброски файлов между никсами. Чето мне так кажется что в никсах уже давно такие вещи сделаны.
     
  7. gregzem

    gregzem

    Регистр.:
    21 окт 2007
    Сообщения:
    200
    Симпатии:
    63
    Ведь wget и ftp никто не отменял.
     
  8. EugeneVC

    EugeneVC

    Регистр.:
    28 окт 2007
    Сообщения:
    297
    Симпатии:
    83
    только не используете ftp
    лучше через ssh, sftp - а то ваши логины и пароли могу заснифить.
     
Статус темы:
Закрыта.