Конференция "Сети" » Скачивание файла [D7, WinXP]
 
  • Netter (14.11.08 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 сек.

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

    Буду благодарен за комментарии по теме, особенно за рабочий код.
  • Сергей М. © (14.11.08 20:07) [1]
    Вот тебе комментарии по самое нехочу:


    > iRet := Recv(sServerListen,


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

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


    > BlockWrite(outy, BigRecy, 4196);


    С какой луны свалилась эта цифирь, если фактически от клиента было принято iRet байт ?
  • Сергей М. © (14.11.08 20:47) [2]

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


    В Коране прямо так и написано ?
    Или блажь-отсебячина ?
  • Netter (14.11.08 21:06) [3]
    Т.к. я сатанист, то корректнее упомянуть библию Лавея, если уж про религию :)
    Нет, компоненты
    а) качают по протоколам фтп или хттп, у меня же - самописный
    б) весят неприемлемо много. А 10 кб - это много. И так удается ужать до 25 кб, когда в программе не реализована и половина функций.

    А цифирь, да, свалилась практически с луны. Лисен? Честно сказать, конкретно это имя давал не я. Но раз есть - пусть будет. Да и префиксы в виде типа переменной тоже мне непривычны.. В перле несколько проще - скаляр, массив, хеш :)
  • Netter (14.11.08 21:09) [4]
    Да, вопрос решен :)
    По поводу цифиря, спасибо :)
  • Сергей М. © (14.11.08 21:28) [5]

    > а)


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


    > б)


    Аргументы кулхацкера.
  • Netter (15.11.08 01:57) [6]
    а) а) ну никак не подходит под б), поэтому
    б) А вы предлагаете писать лоадеры на форточных компонентах, со всякими индейцами? Получая в итоге файл под полметра, который грузится будет дольше, чем программы им загружаемые?
  • Anatoly Podgoretsky © (15.11.08 09:31) [7]

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

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

        while (iRet<>0) do



    Когда значение ни где не устанавливается, как повезет.
  • Сергей М. © (17.11.08 08:36) [8]

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


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


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


    Ты куда-то спешишь ?)
 
Конференция "Сети" » Скачивание файла [D7, WinXP]
Есть новые Нет новых   [134434   +28][b:0][p:0.002]