Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.17;
Скачать: CL | DM;

Вниз

Работа с FTP-сервером через HTTP-proxy   Найти похожие ветки 

 
pathfinder   (2007-10-11 11:02) [0]

Здравствуйте!
Пишу компонент для работы (получение и отправка файлов) c FTP-сервером через HTTP-proxy.
Взял за основу класс TTCPBlockSocket из компонентов Synapse и по примеру класса THTTPSend (Synapse) набросал свой.
Возникла такая проблема: при получении(метод GET) и отправке(метод PUT) часто происходит обрезка файла или файл вообще получается нулевой длины, особенно это актуально для файлов с размером в несколько килобайт и больше. Подскажите пожалуйста как с этим бороться.


 
umbra ©   (2007-10-11 11:44) [1]


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

неплохо бы увидеть код. Кроме того, неплохо бы анализировать ответы прокси на запросы. Надо также помнить, что соединение может оборваться в любой момент и предусмотреть докачку (если она возможна). Ну и самое главное - вы работаете с прокси, который сам знает об фтп (сквид, например) или просто создаете туннель к фтп серверу?


 
pathfinder   (2007-10-11 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   (2007-10-12 09:36) [3]

Перепробовал массу вариантов, но никакой закономерности не нашел..
В чем может быть дело?


 
umbra ©   (2007-10-12 12:54) [4]


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

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



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

Текущий архив: 2008.08.17;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.018 c
15-1214669750
Tommy
2008-06-28 20:15
2008.08.17
async professional


15-1214810458
йцукен
2008-06-30 11:20
2008.08.17
Загрузка данных из MySQL в StringGrid


6-1191929280
fd979
2007-10-09 15:28
2008.08.17
Как послать сообщение в виде HMTL?


15-1214923657
Kostafey
2008-07-01 18:47
2008.08.17
"Ничего не понимаю" - java не умеет считать или я?


2-1216055751
QMike
2008-07-14 21:15
2008.08.17
нарисовать на канве TImage