Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2010.10.10;
Скачать: [xml.tar.bz2];

Вниз

Скачивание файла   Найти похожие ветки 

 
Netter   (2008-11-14 19:48) [0]

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

#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-14 20:07) [1]

Вот тебе комментарии по самое нехочу:


> iRet := Recv(sServerListen,


Что еще за "Listen" ?

Инф.обмен с успешно подключившимся клиентом должен осуществляться через гнездо, ассоциированное с этим конкретным соединением, а не через слушающее гнездо.


> BlockWrite(outy, BigRecy, 4196);


С какой луны свалилась эта цифирь, если фактически от клиента было принято iRet байт ?


 
Сергей М. ©   (2008-11-14 20:47) [2]


> нельзя использовать никаких компонентов, ни инди, ни прочих
> качалок, исключительно WinSock


В Коране прямо так и написано ?
Или блажь-отсебячина ?


 
Netter   (2008-11-14 21:06) [3]

Т.к. я сатанист, то корректнее упомянуть библию Лавея, если уж про религию :)
Нет, компоненты
а) качают по протоколам фтп или хттп, у меня же - самописный
б) весят неприемлемо много. А 10 кб - это много. И так удается ужать до 25 кб, когда в программе не реализована и половина функций.

А цифирь, да, свалилась практически с луны. Лисен? Честно сказать, конкретно это имя давал не я. Но раз есть - пусть будет. Да и префиксы в виде типа переменной тоже мне непривычны.. В перле несколько проще - скаляр, массив, хеш :)


 
Netter   (2008-11-14 21:09) [4]

Да, вопрос решен :)
По поводу цифиря, спасибо :)


 
Сергей М. ©   (2008-11-14 21:28) [5]


> а)


В TIdTCPClient, TClientSocket, TTCPClient прикладным протоколом даже не пахнет.


> б)


Аргументы кулхацкера.


 
Netter   (2008-11-15 01:57) [6]

а) а) ну никак не подходит под б), поэтому
б) А вы предлагаете писать лоадеры на форточных компонентах, со всякими индейцами? Получая в итоге файл под полметра, который грузится будет дольше, чем программы им загружаемые?


 
Anatoly Podgoretsky ©   (2008-11-15 09:31) [7]


> Да, вопрос решен :)

Решен говоришь, тогда как понимать это

    while (iRet<>0) do

Когда значение ни где не устанавливается, как повезет.


 
Сергей М. ©   (2008-11-17 08:36) [8]


> файл под полметра


Смешной размер по нынешним временам.


> который грузится будет дольше


Ты куда-то спешишь ?)



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2010.10.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.003 c
2-1278925532
linuxoid
2010-07-12 13:05
2010.10.10
помогите с пингом


2-1279601277
Андрей_1
2010-07-20 08:47
2010.10.10
Цвет шрифта DBGrid


11-1225097570
Demiurg
2008-10-27 11:52
2010.10.10
Lazarus и ошибка "не найден файл"


2-1279112941
DFT
2010-07-14 17:09
2010.10.10
вопрос по inherited


15-1278992831
картман
2010-07-13 07:47
2010.10.10
Интерфейс





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский