2009-12-29 6 views
0

Я использую Delphi 2010 и Indy 10, который поставляется с ним. MemStream является TMemoryStream и содержит файл, загруженный с веб-сайта.Как отправить TMemoryStream с помощью IdTrivialFTP Indy?

IdTrivialFTP1 := TIdTrivialFTP.Create(nil); 
try 
    IdTrivialFtp1.Name := 'IdTrivialFTP1'; 
    IdTrivialFTP1.Host := 'my-tftp-server-name.contoso.com'; 
    IdTrivialFTP1.Port := 69; 
    IdTrivialFTP1.ReceiveTimeout := 4000; 

    MemStream.Position := 0; 
    IdTrivialFTP1.Put(MemStream, sFileName); 
finally 
    FreeAndNil(IdTrivialFTP1); 
end; 

Всякий раз, когда я запускаю этот код, я получаю ошибку:

Project TestProject.exe raised exception class ERangeError with message 'Range check error'.

Я делал совсем немного Google-ков, чтобы понять эту ошибку, но я в настоящее время в убыток , Я также видел только 1 example of how to perform a TFTP PUT с использованием компонентов Indy.

Любые идеи?

UPDATE: Если трассировать в ошибку немного, я считаю, что ошибка быть выброшен из внутри «IdTrivialFTP.pas» в строке 272:

CurrentDataBlk := WordToStr(GStack.HostToNetwork(Word(TFTP_DATA))) 
+ WordToStr(GStack.HostToNetwork(BlockCtr)); 

Для ясности, вот контекст этого кода:

if BlockCtr > PrevBlockCtr then 
    begin 
    DataLen := IndyMin(BufferSize - hdrsize, SourceStream.Size - SourceStream.Position); 
    SetLength(CurrentDataBlk, DataLen + hdrsize); 
    CurrentDataBlk := WordToStr(GStack.HostToNetwork(Word(TFTP_DATA))) + WordToStr(GStack.HostToNetwork(BlockCtr)); 
    SetLength(CurrentDataBlk, DataLen + hdrsize); 
    //SourceStream.ReadBuffer(CurrentDataBlk[hdrsize+1], DataLen); 
    DoWork(wmWrite, DataLen); 
    TerminateTransfer := DataLen < BufferSize - hdrsize; 
    PrevBlockCtr := BlockCtr; 
    end; 
    Send(FPeerIP, FPeerPort, CurrentDataBlk); 
until False; { repeat } 

ответ

1

Версия Indy 10, который поставляется с D2010 не последняя Indy 10 редакция, которая доступна. Код Indy, который вы цитировали как сломанный, больше не существует в текущей версии. TIdTrivialFTP был переписан еще некоторое время назад, чтобы исправить множество проблем (я забыл проверить его в то время, хотя, я сделал это сейчас). Загрузите последний снимок Indy 10 с сервера SVN Indy или зеркала Fulgan (вам придется подождать один день, чтобы он догнал). Ссылки для скачивания доступны на веб-сайте Indy.

+0

У меня есть IdTrivialFTP.pas в редакции 3979 от svn.atozed.com, а строка 'SourceStream.ReadBuffer' по-прежнему закомментирована. –

+0

Проверьте IdTrivialFTP.pas, который находится в \ Indy10 \ branch \ Tiburon \ Lib \ Protocols. – Mick

+0

Кроме того, я только что понял, что проверил ревизию 3980, так что это может быть причина, по которой вы ее не видели. – Mick

1

Вы можете решить эту проблему довольно легко себе:

  • Установите точку останова на линии с идентификатором IdTrivialFTP1.Name.
  • Нажмите F9, чтобы запустить приложение. Сделайте все, что запускает код для FTP-файла.
  • Когда среда IDE останавливается в точке останова, нажмите F8, чтобы шаг за шагом через код.
  • Обратите внимание на строку, в которой вы попадаете F8, и инициируется исключение. Это проблема.

Поскольку у вас есть только две строки, которые должны вызывать ошибку проверки диапазона (те, которые назначают порт и ReceiveTimeout), выяснить, какой из них является виновником, должен быть + тривиальным + (предназначен для каламбур). Я подозреваю, что это настройка порта.

Кроме того, не забывайте, что Indy поставляется с полным исходным кодом. Вы также можете отслеживать это, если вы установите параметры компилятора вашего проекта для использования отладочных DCU. (Project | Options | Compiler)

+0

Проблема в исходном коде Indy, но, честно говоря, я не знаю, как это исправить. Я обновлю свой комментарий подробно. – Mick

3

Хорошая работа, определяющая источник исключения. Это всегда должно быть первым, что вы делаете, когда сталкиваетесь с исключением.

Код Indy, который вы используете, сломан. Даже если бы не была ошибка проверки диапазона, она по-прежнему не отправляла бы данные из исходного потока. Вы сами можете убедиться, что строка, которая считывает содержимое потока, была прокомментирована. Он по-прежнему комментируется в сегодняшнем снимке разработки, и похоже, что прошло уже два года с тех пор, как кто-то работал над этим файлом. Фактически эта строка была прокомментирована с тех пор, как файл был добавлен в репозиторий Subversion в редакции 7.

Ditch TIdTrivialFTP и попробуйте удачу с полноценным FTP-клиентом вместо этого, TIdFTP.

+0

Некоторые системы, такие как телефоны VOIP, используют TFTP, а не FTP. –

1

Мой ответ был бы; Indy сосет, вырывает его и использует компоненты ICS Франсуа Пьетте.

W

+0

Я проверю это. – Mick

Смежные вопросы