Форум: "Сети";
Текущий архив: 2008.08.17;
Скачать: [xml.tar.bz2];
ВнизРабота с 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.1 c