-
RGV © (27.03.13 04:36) [0]Доброе время суток! Помогите разобраться. Когда соединяюсь с фтп сервером на ftp.narod.ru
на команду MODE S сервер не отвечает.
вот лог:
230 Logged in, proceed
TYPE I
200 Type: I
STRU F
200 Structure is File
MODE S
.... зависон
на другой фтп сервер ок.
Хотя через тотже IE на ftp.narod.ru заходит без проблем.
Вот код:procedure TForm1.Button1Click(Sender: TObject);
var
ftp:TFTPSend;
n:integer;
begin
ftp:=TFTPSend.Create;
ftp.TargetHost:=cb_host.Text;
ftp.TargetPort:=inttostr(se_port.value);
ftp.UserName:=cb_log.Text;
ftp.Password:=e_Pass.Text;
ftp.OnStatus:=ftpstatus;
ftp.PassiveMode:=true;
if ftp.Login and ftp.ChangeToRootDir() and ftp.List('',false) then
begin
if (ftp.FtpList<>nil) and (ftp.FtpList.Count>0) then
begin
lv.Clear;
for n:=0 to ftp.FtpList.Count-1 do
with lv.Items.Add do
begin
caption:=ftp.FtpList.Items[n].FileName;
subitems.Add(inttostr(ftp.FtpList.Items[n].FileSize));
subitems.Add(ftp.FtpList.Items[n].Permission);
subitems.Add(DateTimeToStr(ftp.FtpList.Items[n].FileTime));
end;
end else
if (ftp.FullResult<>nil) and (ftp.FullResult.Count>0) then memo1.Lines.Assign(ftp.FullResult) else memo1.Lines.Add('list zero');
end else memo1.Lines.Add('error');
ftp.Logout;
ftp.Free;
end;
procedure TForm1.ftpstatus(Sender: TObject; Response: Boolean; const Value: string);
begin
memo1.Lines.Add(value);
application.ProcessMessages;
end; -
Сергей М. © (28.03.13 18:00) [1]Вот описание протокола:
http://ru.wikipedia.org/wiki/FTP
никакой команы "MODE" в нем и в помине нет .. -
Павиа (29.03.13 15:39) [2]
> Вот описание протокола:http://ru.wikipedia.org/wiki/FTPникакой
> команы "MODE" в нем и в помине нет ..
Это не описание, а пересказ.
вот это вот описание первой версии
http://tools.ietf.org/html/rfc959
и команда mode там есть.
Правда протокол ftp старый и менялся несколько раз. и некоторые серверы не поддерживают часть команд из-за соображений безопасности.
А так надо логи смотреть что куда. -
RGV © (02.04.13 01:48) [3]
> Правда протокол ftp старый и менялся несколько раз. и некоторые
> серверы не поддерживают часть команд из-за соображений безопасности.
Мне кажется, что хотябы из вежливости сервер должен ответить, что данная комманда не поддерживается, ну в крайнем случае разорвать соединение, а получается, что клиент отправил команду и ждет ответа, а ответа нет, разрыв происходит спустя пару минут :)
Может подскажете готовый адекватный компонент FTP. Или самому с головой окунаться в http://tools.ietf.org/html/rfc959 ? С Инди мы в контрах.
А может в TFTPSend где-нибудь есть magic-property из-за которого мне житья нет.
Я волшебное слово знаю... пожалуйста. -
clickmaker © (02.04.13 12:33) [4]> С Инди мы в контрах
Вы просто не умеете их готовить.
На самом деле, никакой чудо-компонент не поможет, если сам сервер эту команду не поддерживает -
Сергей М. © (04.04.13 22:12) [5]Не возражаю если я старый слепой обезьян, но не вижу я ничего и близко напоминающего отправку поманды "MODE" в исходниках IdFTP.pas, к примеру, в 9-й версии (та что под рукой оказалась)
-
clickmaker © (04.04.13 22:36) [6]> [5] Сергей М. © (04.04.13 22:12)
Indy 10
procedure TIdFTP.TransferMode(ATransferMode: TIdFTPTransferMode);
var
s: String;
i : Integer;
LBuf : String;
begin
if (ATransferMode = dmStream) or (ATransferMode = dmDeflate) then begin
case ATransferMode of
// dmBlock: begin
// s := 'B'; {do not localize}
// end;
// dmCompressed: begin
// s := 'C'; {do not localize}
// end;
dmStream: begin
s := 'S'; {do not localize}
end;
dmDeflate: begin
if Assigned(FCompressor) then begin
//we parse this way because IxExtensionSupported can only work
//with one word.
for i := 0 to FCapabilities.Count-1 do begin
LBuf := Sys.Trim(FCapabilities[i]);
if LBuf = 'MODE Z' then begin {do not localize}
s := 'Z'; {do not localize}
Break;
end;
end;
if s <> 'Z' then begin
Exit;
end;
end else begin
Exit;
end;
end;
end;
if SendCmd('MODE ' + s) = 200 then begin {do not localize}
FCurrentTransferMode := ATransferMode;
end;
end;
end;