Хобрук: Ваш путь к мастерству в программировании

Как отправить TMemoryStream с помощью Indy IdTrivialFTP?

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

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;

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

Проект TestProject.exe вызвал класс исключения ERangeError с сообщением «Ошибка проверки диапазона».

Я немного погуглил, чтобы понять эту ошибку, но сейчас я в недоумении. Я также видел только 1 пример выполнения TFTP PUT с использованием компонентов Indy. .

Любые идеи?

ОБНОВЛЕНИЕ: если немного проследить ошибку, я обнаружу, что ошибка возникает из "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 }
29.12.2009

Ответы:


1

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

04.01.2010
  • У меня есть IdTrivialFTP.pas версии 3979 с сайта svn.atozed.com, а строка SourceStream.ReadBuffer все еще закомментирована. 05.01.2010
  • Проверьте файл IdTrivialFTP.pas, который находится в папке \Indy10\branches\Tiburon\Lib\Protocols. 05.01.2010
  • Кроме того, я только что понял, что проверил ревизию 3980, так что может быть причина, по которой вы ее не видели. 05.01.2010
  • О да. Теперь я вижу, что разработка ведется в ветви Tiburon, а не в магистрали. Как долго это будет исправлено, Реми? Tiburon было кодовым названием Delphi 2009, не так ли? Я бы никогда не подумал получить последнюю версию из ветки, названной в честь устаревшего кодового имени. 05.01.2010
  • Да, Tiburon было кодовым названием Delphi 2009. Именно тогда мы начали интеграцию Indy с Unicode. Он еще не закончен. Нет ETA, когда ветка Tiburon будет объединена с Trunk. Использование Branch вместо Trunk для получения последнего кода указано в инструкциях по загрузке на веб-сайте Indy. 06.01.2010

  • 2

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

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

    Откажитесь от TIdTrivialFTP и попытайте счастья с полноценным FTP-клиентом, TIdFTP.

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

  • 3

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

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

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

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

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

  • 4

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

    W

    30.12.2009
    Новые материалы

    Дрейф концепций в ИИ
    Что такое концептуальный дрейф? Дрейф понятий — это явление в искусственном интеллекте и машинном обучении, при котором основное распределение данных меняется со временем. Это изменение в..

    Изучите Vue перед React. Вот почему
    Сегодняшняя сеть представляет собой запутанный беспорядок из разных языков, библиотек и фреймворков, и начинающие веб-разработчики часто не могут понять, что изучать в первую очередь. Что вы..

    Гл.31 — Помощь слабослышащим с помощью возможностей машинного обучения Apple Watch.
    1 500 000 000  – количество людей с потерей слуха в мире. Это почти 20% населения Земли! (источник: who.int ) Недавно я экспериментировал с Apple Sound Classification API, и результаты на..

    Машинное обучение без кода / Глубокое обучение Каждый специалист по обработке и анализу данных должен знать
    Akkio, Очевидно.ай, DataRobot, Левити, Clarifai, Teachable Machines, Lobe, Pimer, DynaBench, APAflow Teachable Machine- https://teachablemachine.withgoogle.com/ Vertex AI..

    Код, который работает вместе, остается вместе
    Первоначально это было опубликовано в tiagojdf . Когда я только начинал как младший программист, я всегда терялся, глядя на внутренний код. Я предположил, что отчасти это было из-за того,..

    Эта модель Google сочетает в себе рассуждение и действие в рамках одной языковой модели.
    ReAct предоставляет архитектуру, которая инициирует действия на основе путей рассуждений языка. Недавно я запустил образовательный информационный бюллетень, посвященный ИИ, у которого уже..

    Сортировка структур JSON по нескольким полям в JavaScript
    Array.sort() не для слабонервных. Особенно, когда речь идет о сортировке сложных структур данных. Большинство руководств по JavaScript дают только краткое введение в Array.sort() . Обычно..