![]() |
|
#1
|
|||
|
|||
![]() Всем доброго времени суток.
Задача следующая: скачать файл с сервера, который передается им просто-напросто открытым текстом. Упрощенно говоря, сервер дает его так: Код:
#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 сек. Так как таким образом планируется передавать в основном исполняемые файлы, подобные баги-глюки-лаги абсолютно неприемлемы. Буду благодарен за комментарии по теме, особенно за рабочий код. |