Конференция "Сети" » Работа с FTP-сервером через HTTP-proxy [WinXP]
 
  • pathfinder (11.10.07 11:02) [0]
    Здравствуйте!
    Пишу компонент для работы (получение и отправка файлов) c FTP-сервером через HTTP-proxy.
    Взял за основу класс TTCPBlockSocket из компонентов Synapse и по примеру класса THTTPSend (Synapse) набросал свой.
    Возникла такая проблема: при получении(метод GET) и отправке(метод PUT) часто происходит обрезка файла или файл вообще получается нулевой длины, особенно это актуально для файлов с размером в несколько килобайт и больше. Подскажите пожалуйста как с этим бороться.
  • umbra © (11.10.07 11:44) [1]

    > при получении(метод GET) и отправке(метод PUT) часто происходит
    > обрезка файла или файл вообще получается нулевой длины,
    > особенно это актуально для файлов с размером в несколько
    > килобайт и больше. Подскажите пожалуйста как с этим бороться

    неплохо бы увидеть код. Кроме того, неплохо бы анализировать ответы прокси на запросы. Надо также помнить, что соединение может оборваться в любой момент и предусмотреть докачку (если она возможна). Ну и самое главное - вы работаете с прокси, который сам знает об фтп (сквид, например) или просто создаете туннель к фтп серверу?
  • pathfinder (11.10.07 16:08) [2]
    После успешной авторизации я отправляю заголовок запроса, жду заголовок ответа и в случае если нет ответа(таймаут) или код ответа не является кодом ошибки, то отправляю тело запроса. В результате на FTP-сервере оказывается только часть файла или файл с нулевой длиной:(

    2007.10.11 15:54:57:214 --> PUT ftp://user:pass@10.1.1.1/test3.zip HTTP/1.0
    2007.10.11 15:54:57:214 --> User-Agent: Mozilla/4.0 (compatible)
    2007.10.11 15:54:57:214 --> Authorization: Basic ...C5CaG...
    2007.10.11 15:54:57:214 --> Proxy-Authorization: NTLM ...XBndX...
    2007.10.11 15:54:57:214 --> Host: 10.1.1.1
    2007.10.11 15:54:57:214 --> Pragma: no-cache
    2007.10.11 15:54:57:214 --> Accept: */*
    2007.10.11 15:54:57:214 --> Proxy-Connection: Keep-Alive
    2007.10.11 15:54:57:214 --> Content-Length: 130462
    2007.10.11 15:54:57:214 -->
    2007.10.11 15:55:27:215 HR_Error: 10060,Connection timed out
    2007.10.11 15:55:27:215 HR_WriteCount: 65536
    2007.10.11 15:55:27:230 HR_WriteCount: 64926
    2007.10.11 15:55:27:246 HR_SocketClose:

    Код метода класса, реализующего сокет, для отправки данных:

    function TBlockSocket.SendBuffer(Buffer: TMemory; Length: Integer): Integer;
    {$IFNDEF CIL}
    var
     x, y: integer;
     l, r: integer;
     p: Pointer;
    {$ENDIF}
    begin
     Result := 0;
     if TestStopFlag then
       Exit;
     DoMonitor(True, Buffer, Length);
    {$IFDEF CIL}
     Result := synsock.Send(FSocket, Buffer, Length, 0);
    {$ELSE}
     l := Length;
     x := 0;
     while x < l do
     begin
       y := l - x;
       if y > FSendMaxChunk then
         y := FSendMaxChunk;
       if y > 0 then
       begin
         LimitBandwidth(y, FMaxSendBandwidth, FNextsend);
         p := IncPoint(Buffer, x);
    //      r := synsock.Send(FSocket, p^, y, MSG_NOSIGNAL);
         r := synsock.Send(FSocket, p, y, MSG_NOSIGNAL);
         SockCheck(r);
         if Flasterror <> 0 then
           Break;
         Inc(x, r);
         Inc(Result, r);
         Inc(FSendCounter, r);
         DoStatus(HR_WriteCount, IntToStr(r));
       end
       else
         break;
     end;
    {$ENDIF}
     ExceptCheck;
    end;
  • pathfinder (12.10.07 09:36) [3]
    Перепробовал массу вариантов, но никакой закономерности не нашел..
    В чем может быть дело?
  • umbra © (12.10.07 12:54) [4]

    > жду заголовок ответа и в случае если нет ответа(таймаут)

    странный ход мысли. Если нет ответа, то прокси, скорее всего, еще пытается соединиться с фтп-сервером. Если в этот момент пытаться передавать данные, то он просто закроет соединение. Тогда на фтп-сервере останется пустой файл. Если файл закачивается не полностью, то это означает обрыв соединения с фтп. Его надо восстанавливать и докачивать файл.
 
Конференция "Сети" » Работа с FTP-сервером через HTTP-proxy [WinXP]
Есть новые Нет новых   [134431   +10][b:0][p:0]