![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Скачивание файла [D7, WinXP]
Netter © (2008-11-14 19:48:00)Всем доброго времени суток.
Задача следующая: скачать файл с сервера, который передается им просто-напросто открытым текстом. Упрощенно говоря, сервер дает его так:
#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 сек.
Так как таким образом планируется передавать в основном исполняемые файлы, подобные баги-глюки-лаги абсолютно неприемлемы.
Буду благодарен за комментарии по теме, особенно за рабочий код.
Сергей М. (2008-11-17 08:36:00) [1]
> файл под полметра
Смешной размер по нынешним временам.
> который грузится будет дольше
Ты куда-то спешишь ?)
Anatoly Podgoretsky (2008-11-15 09:31:00) [2]
> Да, вопрос решен :)
Решен говоришь, тогда как понимать это
while (iRet<>0) do
Когда значение ни где не устанавливается, как повезет.
Netter (2008-11-15 01:57:00) [3]а) а) ну никак не подходит под б), поэтому
б) А вы предлагаете писать лоадеры на форточных компонентах, со всякими индейцами? Получая в итоге файл под полметра, который грузится будет дольше, чем программы им загружаемые?
Сергей М. (2008-11-14 21:28:00) [4]
> а)
В TIdTCPClient, TClientSocket, TTCPClient прикладным протоколом даже не пахнет.
> б)
Аргументы кулхацкера.
Netter (2008-11-14 21:09:00) [5]Да, вопрос решен :)
По поводу цифиря, спасибо :)
Netter (2008-11-14 21:06:00) [6]Т.к. я сатанист, то корректнее упомянуть библию Лавея, если уж про религию :)
Нет, компоненты
а) качают по протоколам фтп или хттп, у меня же - самописный
б) весят неприемлемо много. А 10 кб - это много. И так удается ужать до 25 кб, когда в программе не реализована и половина функций.
А цифирь, да, свалилась практически с луны. Лисен? Честно сказать, конкретно это имя давал не я. Но раз есть - пусть будет. Да и префиксы в виде типа переменной тоже мне непривычны.. В перле несколько проще - скаляр, массив, хеш :)
Сергей М. (2008-11-14 20:47:00) [7]
> нельзя использовать никаких компонентов, ни инди, ни прочих
> качалок, исключительно WinSock
В Коране прямо так и написано ?
Или блажь-отсебячина ?
Сергей М. (2008-11-14 20:07:00) [8]Вот тебе комментарии по самое нехочу:
> iRet := Recv(sServer Listen,
Что еще за " Listen" ?
Инф.обмен с успешно подключившимся клиентом должен осуществляться через гнездо, ассоциированное с этим конкретным соединением, а не через слушающее гнездо.
> BlockWrite(outy, BigRecy, 4196);
С какой луны свалилась эта цифирь, если фактическиот клиента было принято iRetбайт ?