После успешной авторизации я отправляю заголовок запроса, жду заголовок ответа и в случае если нет ответа(таймаут) или код ответа не является кодом ошибки, то отправляю тело запроса. В результате на 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;