Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.059 c
15-1269453084
SergD
2010-03-24 20:51
2010.08.27
Экземпляр класса


10-1167426358
nali
2006-12-30 00:05
2010.08.27
Ошибка при работе с Excel2000


2-1272371119
abhtr
2010-04-27 16:25
2010.08.27
Нарушение кодировки при копировании из таблицы в таблицу


2-1270035677
Валигози2
2010-03-31 15:41
2010.08.27
Способ задания порядка записей


2-1269838242
tippa
2010-03-29 08:50
2010.08.27
а чего он пищит?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский