Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Скачивание файла


Автор: NetWorker 14.11.2008, 19:53
Всем доброго времени суток.
Задача следующая: скачать файл с сервера, который передается им просто-напросто открытым текстом. Упрощенно говоря, сервер дает его так:
Код

#perl here
#$client - дескриптор клиента, IO::Socket
open (IN, "<transfer.dat") or die;
foreach (<IN>) { print $client $_; }
close IN;
close $client;


Но это лирика, сервер гарантированно работает, проверялось клиентом на перле.

Клиент должен этот файл корректно принять и записать на диск. Но есть одно но: нельзя использовать никаких компонентов, ни инди, ни прочих качалок, исключительно WinSock.

Сам я, в течении уже третьего вечера пытаюсь реализовать сие дело таким образом:
Код

//delphi here
Procedure net;
var
  Outy      : File of char;
  BigRecy  : array[0..4196] of char;
  iRet       : integer;
begin
// здесь идет реализация сокетов и прочая романтика,
// к делу относящаяся лишь посредственно
      AssignFile (Outy, GetCurrentDir() + '\' + 'test.bin');
      ReWrite(Outy);

      while (iRet<>0) do
      begin
        iRet := Recv(sServerListen, BigRecy, length(BigRecy), 0);
        if (iRet = 0) then
          break;
          BlockWrite(outy, BigRecy, 4196);
        end;

      close (Outy);

end;


Таким образам передавались разные типы файлов, от `man iptables`, то есть простого текста, до картинок и музыки. Результаты следующие: Начало и середина текста выглядели, вроде бы, адекватно, но конец иногда дублировался, иногда образался, всегда по-разному. Вместо невинной картинки приходила какая-то невнятная цветная мазня. С мп3 дело обстоит немного лучше, трек либо укорачивался, либо удлиннялся, с пробелами(которые плеер просто пропускал) примерно по 0.2 сек.

Так как таким образом планируется передавать в основном исполняемые файлы, подобные баги-глюки-лаги абсолютно неприемлемы. 

Буду благодарен за комментарии по теме, особенно за рабочий код.

Автор: MetalFan 14.11.2008, 19:58
Цитата(NetWorker @  14.11.2008,  19:53 Найти цитируемый пост)
        iRet := Recv(sServerListen, BigRecy, length(BigRecy), 0);
        if (iRet = 0) then
          break;
          BlockWrite(outy, BigRecy, 4196);

ну так ты получаешь iRet байт, а пишешь в файл 4196

Автор: NetWorker 14.11.2008, 21:08
Вопрос решен, MetalFan, респект smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)