Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

idFTP


Страницы:   1 2

Zalm ©   (2010-02-16 17:45:00) 

Проблема такая, нужно раздавать файл одновременно на несколько конектов, всё вроде бы как надо делается, но одно но. Допустим приконектились три юзера, один тыкает кнопку хочет брать файл размером 1 гб например, началась закачка, потом тыкают кнопки другие юзеры что хотят ЭТОТ же файл. У них закачка стоит на 0 пока, как только первый клиент скачал файл, сразу рандомно у той пары юзеров начинает качаться этот файл, как заканчивает кторой качать, сразу же начинает третий... то есть блин так не приятно там какие-то махинации творятся они чета там рандомно в очередь какую-то становятся... а мне нужно что бы сразу один файл могло неск человек качать. Код вот такой у меня:

procedure TForm2.FTPRetrieveFile(ASender: TIdFTPServerContext; const AFileName: string; var VStream: TStream);
var
fil2 : TMemoryStream;
begin
Fil2:=TMemoryStream.Create;
if Fil<>nil then
 begin
  fil.Seek(0,0);
  Fil2.CopyFrom(fil,fil.Size);
 end;
VStream:=fil2;
end;


Fil это TFileStream, туда загружен файл шоб каждый контекст не мучал его каждый раз(это временно для тестов), поэтому просто копирую оттуда данные и всё. как я описал выше этот код раздает файл по какой-то там своей внутренней очереди xD:( как сделать что бы файлэ мог раздаваться сразу всем кто просит? что попровить надо?... второй день меня это мучает...

Не проходите мимо знающие люди пожалуйста)


sniknik   (2010-02-18 23:08:00) [21]

да что ты говоришь... а шедулер тогда у них зачем?
хотя, не буду спорить со Специалистом, у тебя же все и так правильно работает.


Zalm   (2010-02-18 20:49:00) [22]


> а ты уверен?

на 100%, TCP server и FTP server инди всегда создают новый поток при подключении клиента, и уничтожают при отключении


sniknik   (2010-02-18 20:45:00) [23]

> не все так просто...
во всяком случае с http нужен шедулер. а с ftp не связывался.


sniknik   (2010-02-18 20:43:00) [24]

> Так indy фтп и так каждому свой поток дает
а ты уверен? по моему там не все так просто...


Zalm   (2010-02-18 20:20:00) [25]


> Anatoly Podgoretsky

ой и тут вы... прикольно)


> Медвежонок Пятачок

ща пойду попробую. Раньше когда "наблюдал" за процессом, то помню что Сервер свою процедуру выполняет, то есть FileStream создается и всё поехало как надо дальше, тока клиент ничего не качает. А потом проходит секунд 7-8 и вылазит как раз это Connection Closed...


Anatoly Podgoretsky   (2010-02-18 19:51:00) [26]

> Zalm  (18.02.2010 15:39:09)  [9]

Это дворовый сленг.


Медвежонок Пятачок   (2010-02-18 16:51:00) [27]

ну или если логирование не нравится, то запустить  сервер из под IDE и  поставить точку останова на обработке файла. в пошаговой отладке увидишь где затык происходит


Медвежонок Пятачок   (2010-02-18 16:42:00) [28]

чего не хватает кажите пожалуйста?

не хватает логирования.
а потому не видно что реально происходит на сервере.
ты пока довольствуешься только текстом клиентского исключения.
а где и почему коннекшен клозед абнормали - ты не в курсе.

Vstream:=TFileStream.Create(AfileName,fmOpenRead or fmShareDenyNone);


Zalm   (2010-02-18 15:39:00) [29]


> указал рейндж.

Что за рейндж?


Zalm   (2010-02-18 14:14:00) [30]

Сервер

procedure TForm2.IdFTPServer1RetrieveFile(ASender: TIdFTPServerContext; const AFileName: string; var VStream: TStream);
begin
Vstream:=TFileStream.Create(AfileName,fmShareDenyNone);
end;


Клиент

begin
if idFtp1.Size(edit1.Text)<>0 then
 idftp1.Get(edit1.Text,'file');
end;


чего не хватает кажите пожалуйста? Когда первый клиент качает файл а второй просит этот же файл то показывает ошибку Data connection closed abnormally


Медвежонок Пятачок   (2010-02-18 10:39:00) [31]

Fil это TFileStream, туда загружен файл шоб каждый контекст не мучал его каждый раз

мудрое решение. особенно для гиговых файлов.

В чем проблема-то?
Пришел клиент, указал файл, указал рейндж.
Открывай файловый стрим на чтение с шареденайнон позиционируйся и отдавай.

А то сначала родят странное решение, напридумывают чудо-"оптимизацию", "для тестов" и мучаются с проблемой на ровном месте


Zalm   (2010-02-17 15:24:00) [32]

вопрос связан конкретно с Indy10 FTPServer


Zalm   (2010-02-17 15:20:00) [33]

Так indy фтп и так каждому свой поток дает, если ставить просто открытие на чтение, то при работающей чьей-то закачке сервер отключит клиента который хочет тоже начать с сообщением Connection closed abnormally, что-то такое.
В итоге вопрос как тогда настроить сервер?


sniknik   (2010-02-17 09:11:00) [34]

в разных потоках и с неблокирующим открытием только на чтение.
а еще для больших файлов неплохо бы сделать возможность докачивания, ту которую я вижу в флешгет когда качаю файлы, и реализация чего должна быть и на сервере (иногда флешгет отказывается качать в много потоков с докачкой т.к. сервер этого не позволяет).


Zalm   (2010-02-16 18:44:00) [35]

одновременно*


Zalm   (2010-02-16 18:44:00) [36]

как дновременно раздавать один и тот же большой файл?


Сергей М.   (2010-02-16 18:19:00) [37]

Прожуй.
Успокойся.
И медленно по-русскисформируй вопрос.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо