Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

idFTP   Найти похожие ветки 

 
Zalm ©   (2010-02-16 17:45) [0]

Проблема такая, нужно раздавать файл одновременно на несколько конектов, всё вроде бы как надо делается, но одно но. Допустим приконектились три юзера, один тыкает кнопку хочет брать файл размером 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:( как сделать что бы файлэ мог раздаваться сразу всем кто просит? что попровить надо?... второй день меня это мучает...

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


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

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


 
Zalm ©   (2010-02-16 18:44) [2]

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


 
Zalm ©   (2010-02-16 18:44) [3]

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


 
sniknik ©   (2010-02-17 09:11) [4]

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


 
Zalm ©   (2010-02-17 15:20) [5]

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


 
Zalm ©   (2010-02-17 15:24) [6]

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


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

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

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

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

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


 
Zalm ©   (2010-02-18 14:14) [8]

Сервер

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


 
Zalm ©   (2010-02-18 15:39) [9]


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

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


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

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

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

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


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

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


 
Anatoly Podgoretsky ©   (2010-02-18 19:51) [12]

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

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


 
Zalm ©   (2010-02-18 20:20) [13]


> Anatoly Podgoretsky

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


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

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


 
sniknik ©   (2010-02-18 20:43) [14]

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


 
sniknik ©   (2010-02-18 20:45) [15]

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


 
Zalm ©   (2010-02-18 20:49) [16]


> а ты уверен?

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


 
sniknik ©   (2010-02-18 23:08) [17]

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


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

насчет обязательности потоков, 2-й пост (понимаю что не совсем то, но как прецедент)
http://xayam.kilkennycat.ru/view/6-1189799328


 
Zalm ©   (2010-02-19 02:17) [19]

В режиме дебага смотрите что происходит.
При подключении клиента ВСЕГДА запускается новый поток, при отключении ВСЕГДА уничтожается поток, если собрались спорить, то спорьте с дебагером D2009, я говорю то что он показывает


 
sniknik ©   (2010-02-19 07:50) [20]

только одно слово - Synchronize, которое ты проигнорировал, если вообще читал ссылку и 2-й пост.

> если собрались спорить
да ну тебя нафиг. спорить еще с тобой.


 
Медвежонок Пятачок ©   (2010-02-19 08:42) [21]

оба сервера (фтп и шттп) - наследники tidtcpserver

так что все там нормально с нитками. каждое подключение - одна новая настоящая нитка.


 
sniknik ©   (2010-02-19 09:26) [22]

> оба сервера (фтп и шттп) - наследники tidtcpserver
> так что все там нормально с нитками.

sniknik ©   (18.02.10 20:45) [15]
>> не все так просто...
> во всяком случае с http нужен шедулер. а с ftp не связывался.

> одна новая настоящая нитка.
а выполнение пользовательского кода может идти в синхронизации

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


 
Медвежонок Пятачок ©   (2010-02-19 09:29) [23]

во всяком случае с http нужен шедулер.

у меня без шедулера замечательно работет.
кроме того я верю тому что мне говорит GetCurrentThreadID


 
sniknik ©   (2010-02-19 09:35) [24]

могу только предположить, что инди у тебя девятый.


 
Медвежонок Пятачок ©   (2010-02-19 09:51) [25]

Я поочередно использую 9.0.18 и 10.0.52

В десятке:
TIdCustomHTTPServer = class(TIdTCPServer)

Правда в десятке появилась поддержка forks но ее еще включить надо


 
Zalm ©   (2010-02-19 10:03) [26]


> p.s. если и там все так хорошо и в проге правильно откуда
> проблемы? голову собеседникам поморочить? раз все работает,
>  не парьте моск.

Дык причем тут правильно\не правильно, работать-то оно может и работает правильно, только сразу с двумя клиентами не работает, вот в чем единственный косяк. Что отключается клиент с месагой уже выше писал какой...(
И я шедулером вобще только один раз пользовался, без него всё отлично работает.


 
Zalm ©   (2010-02-19 10:21) [27]

Вот приложения, запустите два клиента сразу, попробуйте и там и там поставить качать файл сразу, то есть нужен большой файл будет, и увидите глюк

http://letitbit.net/download/3756.36b637fd3ddc72404af728b1d/App.rar.html

Если кто скачает и посмотрит буду благодарен.


 
sniknik ©   (2010-02-19 10:24) [28]

> работать-то оно может и работает правильно, только сразу с двумя клиентами не работает
не вяжется одно с другим.

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

> без него всё отлично работает.
я бы не называл описанное "отлично"...


 
sniknik ©   (2010-02-19 10:26) [29]

ОШИБКА
Запрошенный URL не может быть доставлен

Во время доставки URL: http://letitbit.net/download/3756.36b637fd3ddc72404af728b1d/App.rar.html

Произошла следующая ошибка:

   * Доступ запрещён.

     Настройка контроля доступа не даёт возможности выполнить Ваш запрос в настоящее время. Пожалуйста, свяжитесь с Вашим системным администратором, если Вы считаете это неправильным.


 
Zalm ©   (2010-02-19 10:44) [30]


> ОШИБКА

Извиняюсь, вот тогда на народе

http://narod.ru/disk/18060229000/App.rar.html


 
sniknik ©   (2010-02-19 11:07) [31]

:)

Внутренняя ошибка сервиса.

Мы уже в курсе и стараемся исправить как можно быстрее. Возвращайтесь немного позже, все уже будет работать.

блокировки это от локалки. только вечером могу посмотреть.


 
Zalm ©   (2010-02-19 11:30) [32]

Может на почту?

Хорошо, посмотрите пожалуйста тогда вечером, если вам будет не сложно


 
Zalm ©   (2010-02-19 18:58) [33]

Посмотрел, когда первый клиент качает файл, а второй подключается и тоже хочет качать файл, сервер пишет 10048 адрес алреди ин юс...
Только не понял какой адрес, и что с этим сделать...


 
sniknik ©   (2010-02-19 19:29) [34]

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

http://www.filefactory.com/file/b02edff/n/App.rar

запускал на скачку один и тот же файл 1,37гиг размером. одновременно (клиента с именем server.exe (???) положил в разные папки, т.к. скачивая он ложит файл рядом, и запустил).


 
Zalm ©   (2010-02-19 20:52) [35]

Да я просто сохранил не так) поэтому там и сервер.ехе)
Проблема была еще меньше чем думал, у сервера стоит параметр defaultdataport 20, ставлю 0, и всё работает. А клитическая секция это я для того ставил что бы из OnWork обновлять сколько скачалось, потому что я когда писал http клиент, без критической секции на onWork программа просто висла
Вобщем спасибо большое за участие, и помощь в решении проблемы


 
sniknik ©   (2010-02-20 08:47) [36]

> ставлю 0
я дефаултные 20 ни на что не менял, и работало.


 
Zalm ©   (2010-02-20 19:49) [37]

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



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.054 c
15-1268233355
zinetz_victor@yahoo.com
2010-03-10 18:02
2010.08.27
Кого надо убить, чтобы заработала удаленная отладка в D2010??


6-1222332748
santey
2008-09-25 12:52
2010.08.27
winsock2


2-1273563415
Uzer2010l
2010-05-11 11:36
2010.08.27
Коллизия обработчиков


2-1268686344
yurpos
2010-03-15 23:52
2010.08.27
Помогите бестолковому


2-1267712808
Scot Storch
2010-03-04 17:26
2010.08.27
чтение из стрима