// init & connect
NMFTP1->Host = "comp";
NMFTP1->Port = 21;
NMFTP1->UserID = "user";
NMFTP1->Password = "user";
*/
// NMFTP1->Disconnect();
try
{
NMFTP1->Connect();
}
catch(...)
{
NoConnect = 0;
return 0; // нет коннекта
}
метод Nlist от NMFTP
Не удается получить список файлов с FTP сервера.
Вот так коннекчусь :
Код:
Код:
20---------- Welcome to Pure-FTPd [TLS] ----------
220-You are user number 4 of 50 allowed.
220-Local time is now 16:01. Server port: 21.
220-This is a private system - No anonymous login
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
[7|TRANSFER|192.168.2.52->14]
USER nrcrimesha
[7|TRANSFER|192.168.2.52<-40]
331 User nrcrime OK. Password required
[7|TRANSFER|192.168.2.52->19]
PASS &xdQ@
[7|TRANSFER|192.168.2.52<-92]
230-User nrcrime has group access to: nrcrimesha
230 OK. Current restricted directory is /
[7|TRANSFER|192.168.2.52->22]
CWD /www/XML/synxro/
[7|TRANSFER|192.168.2.52<-46]
250 OK. Current directory is /www/XML/synxro
[7|TRANSFER|192.168.2.52->10]
TYPE L 8
[7|TRANSFER|192.168.2.52<-52]
200-Missing argument
200 TYPE is now 8-bit binary
[7|TRANSFER|192.168.2.52->25]
PORT 192,168,2,52,6,204
[7|TRANSFER|192.168.2.52<-69]
500 I won't open a connection to 192.168.2.52 (only to 194.11.28.1)
220-You are user number 4 of 50 allowed.
220-Local time is now 16:01. Server port: 21.
220-This is a private system - No anonymous login
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
[7|TRANSFER|192.168.2.52->14]
USER nrcrimesha
[7|TRANSFER|192.168.2.52<-40]
331 User nrcrime OK. Password required
[7|TRANSFER|192.168.2.52->19]
PASS &xdQ@
[7|TRANSFER|192.168.2.52<-92]
230-User nrcrime has group access to: nrcrimesha
230 OK. Current restricted directory is /
[7|TRANSFER|192.168.2.52->22]
CWD /www/XML/synxro/
[7|TRANSFER|192.168.2.52<-46]
250 OK. Current directory is /www/XML/synxro
[7|TRANSFER|192.168.2.52->10]
TYPE L 8
[7|TRANSFER|192.168.2.52<-52]
200-Missing argument
200 TYPE is now 8-bit binary
[7|TRANSFER|192.168.2.52->25]
PORT 192,168,2,52,6,204
[7|TRANSFER|192.168.2.52<-69]
500 I won't open a connection to 192.168.2.52 (only to 194.11.28.1)
Passive пробовал.
Перепробовал варианты, на все мои серверы наружные - не хочет, а вот на локальной машине все OK .
У меня :
Ftp сервер GENE6. OS: windows xp
Работает :
Код:
NMFTP1->Nlist();
Код:
NMFTP1->List();
вот с локального компа лог (это работает на ура):
Код:
220 Gene6 FTP Server v3.10.0 (Build 2) ready...
[6|TRANSFER|192.168.2.52->11]
USER igor
[6|TRANSFER|192.168.2.52<-33]
331 Password required for igor.
[6|TRANSFER|192.168.2.52->15]
PASS 24081966
[6|TRANSFER|192.168.2.52<-26]
230 User igor logged in.
[6|TRANSFER|192.168.2.52->21]
CWD /nr/XML/synxro/
[6|TRANSFER|192.168.2.52<-64]
550 CWD failed. "/nr/XML/synxro/" : no such file or directory.
[6|TRANSFER|192.168.2.52->21]
CWD /nr/XML/synxro/
[6|TRANSFER|192.168.2.52<-68]
250 CWD command successful. "/nr/XML/synxro" is current directory.
[6|TRANSFER|192.168.2.52->10]
TYPE L 8
[6|TRANSFER|192.168.2.52<-22]
200 Type set to L 8.
[6|TRANSFER|192.168.2.52<-30]
200 Port command successful.
[6|TRANSFER|192.168.2.52->25]
PORT 192,168,2,52,11,30
<<<< вот эта команда проходит т.к. это мой IP
вот если бы ее исключить тогда бы везде работало ...
[6|TRANSFER|192.168.2.52->6]
NLST
[6|TRANSFER|192.168.2.52<-49]
150 Opening data connection for directory list.
[6|TRANSFER|192.168.2.52<-18]
226 Transfer ok.
[6|TRANSFER|192.168.2.52->11]
USER igor
[6|TRANSFER|192.168.2.52<-33]
331 Password required for igor.
[6|TRANSFER|192.168.2.52->15]
PASS 24081966
[6|TRANSFER|192.168.2.52<-26]
230 User igor logged in.
[6|TRANSFER|192.168.2.52->21]
CWD /nr/XML/synxro/
[6|TRANSFER|192.168.2.52<-64]
550 CWD failed. "/nr/XML/synxro/" : no such file or directory.
[6|TRANSFER|192.168.2.52->21]
CWD /nr/XML/synxro/
[6|TRANSFER|192.168.2.52<-68]
250 CWD command successful. "/nr/XML/synxro" is current directory.
[6|TRANSFER|192.168.2.52->10]
TYPE L 8
[6|TRANSFER|192.168.2.52<-22]
200 Type set to L 8.
[6|TRANSFER|192.168.2.52<-30]
200 Port command successful.
[6|TRANSFER|192.168.2.52->25]
PORT 192,168,2,52,11,30
<<<< вот эта команда проходит т.к. это мой IP
вот если бы ее исключить тогда бы везде работало ...
[6|TRANSFER|192.168.2.52->6]
NLST
[6|TRANSFER|192.168.2.52<-49]
150 Opening data connection for directory list.
[6|TRANSFER|192.168.2.52<-18]
226 Transfer ok.
Буду рад любым предложениям.
Может картинку сети нарисуте? А то локальные сервера, наружные, прокси.. Где, что.. Лично я запутался.
вот прицепил картинку :
[ATTACH]3687[/ATTACH]
соединяюсь с ftp-сервером (GENE6) на локальном компьютере - все работает
не работает на удаленных серверах. А именно : проходит коннект и перемещение в нужную директорию. Но вот получить список - команда Nlist() не проходит. Если посмотреть log от прокси возникает какая-то команда :
[FONT=monospace][7|TRANSFER|192.168.2.52->25]
PORT 192,168,2,52,6,204
[/FONT]видно, что IP локальной машины
ну и за ней ошибка
[7|TRANSFER|192.168.2.52<-69]
500 I won't open a connection to 192.168.2.52 (only to 194.11.28.1)
сервер говорит, что хочет видеть только свой IP .
как запретить посылать эту команду PORT ? Я думаю, что это и было бы разгадкой задачи.
Короче команда PORT используется для соединения канала данных в активном режиме. Без нее как бэ обойтись можно используя пассивный режим, тогда будет команда PASV. Пассивный режим может оказаться необходим при использовании файрволла, когда непонятно положим, какому клиенту отправлять пришедший запрос на подключение канала данных или что-то в этом роде.
был у меня код на работе... приду туда завтра, если нас нафик не снесёт ураганом и не зальёт офигенным ливнем и не прибьёт градом, который сегодня на редкость крупный... и кину сюда кусок кода =)) для получения списка файлов и скачивания оных по FTP :)
Цитата: Тень Пса
и кину сюда кусок кода =)) для получения списка файлов и скачивания оных по FTP :)
дык работает код-то у него в нескольких ситуациях, не работает лишь выборочно и явно из-за конфигурации сети
Phodopus, это я так на погоду жаловался ;)
(Еще раз пишу: прокси не обязателен. Я его использую как перехват чтоб логи смотреть, это программа NetView ).
Я вот после очередных экспериментов обнаружил, что Total Commander тоже посылает эту комманду PORT, и она у него тоже неправильная. Но у меня после этого прога останавливается, а тотал бежит дальше, кидает LIST -la, получает перечень файлов и спокойно выводит их на свою панель.
Я вот теперь попытался сымитировать как работает Total Commander,
Код:
cmd = "SYST"; NMFTP1->DoCommand(cmd);
cmd = "PWD"; NMFTP1->DoCommand(cmd);
cmd = "TYPE A"; NMFTP1->DoCommand(cmd);
cmd = "PASV"; NMFTP1->DoCommand(cmd);
cmd = "NLST"; NMFTP1->DoCommand(cmd);
cmd = "PWD"; NMFTP1->DoCommand(cmd);
cmd = "TYPE A"; NMFTP1->DoCommand(cmd);
cmd = "PASV"; NMFTP1->DoCommand(cmd);
cmd = "NLST"; NMFTP1->DoCommand(cmd);
Код:
220---------- Welcome to Pure-FTPd [TLS] ----------
220-You are user number 5 of 50 allowed.
220-Local time is now 09:41. Server port: 21.
220-This is a private system - No anonymous login
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
[43|TRANSFER|192.168.2.52->14]
USER user
[43|TRANSFER|192.168.2.52<-40]
331 User user OK. Password required
[43|TRANSFER|192.168.2.52->19]
PASS password
[43|TRANSFER|192.168.2.52<-92]
230-User nrcrime has group access to: nrcrime
230 OK. Current restricted directory is /
[43|TRANSFER|192.168.2.52->22]
CWD /www/XML/synxro/
[43|TRANSFER|192.168.2.52<-46]
250 OK. Current directory is /www/XML/synxro
[43|TRANSFER|192.168.2.52->6]
SYST
[43|TRANSFER|192.168.2.52<-19]
215 UNIX Type: L8
[43|TRANSFER|192.168.2.52->5]
PWD
[43|TRANSFER|192.168.2.52<-48]
257 "/www/XML/synxro" is your current location
[43|TRANSFER|192.168.2.52->8]
TYPE A
[43|TRANSFER|192.168.2.52<-23]
200 TYPE is now ASCII
[43|TRANSFER|192.168.2.52->6]
PASV
[43|TRANSFER|192.168.2.52<-51]
227 Entering Passive Mode (193,169,188,90,209,59)
[43|TRANSFER|192.168.2.52->6]
NLST
220-You are user number 5 of 50 allowed.
220-Local time is now 09:41. Server port: 21.
220-This is a private system - No anonymous login
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
[43|TRANSFER|192.168.2.52->14]
USER user
[43|TRANSFER|192.168.2.52<-40]
331 User user OK. Password required
[43|TRANSFER|192.168.2.52->19]
PASS password
[43|TRANSFER|192.168.2.52<-92]
230-User nrcrime has group access to: nrcrime
230 OK. Current restricted directory is /
[43|TRANSFER|192.168.2.52->22]
CWD /www/XML/synxro/
[43|TRANSFER|192.168.2.52<-46]
250 OK. Current directory is /www/XML/synxro
[43|TRANSFER|192.168.2.52->6]
SYST
[43|TRANSFER|192.168.2.52<-19]
215 UNIX Type: L8
[43|TRANSFER|192.168.2.52->5]
PWD
[43|TRANSFER|192.168.2.52<-48]
257 "/www/XML/synxro" is your current location
[43|TRANSFER|192.168.2.52->8]
TYPE A
[43|TRANSFER|192.168.2.52<-23]
200 TYPE is now ASCII
[43|TRANSFER|192.168.2.52->6]
PASV
[43|TRANSFER|192.168.2.52<-51]
227 Entering Passive Mode (193,169,188,90,209,59)
[43|TRANSFER|192.168.2.52->6]
NLST
У меня настроено для стандартной ситуации : должно работать
NMFTP1->Nlist();
и по событию OnListItem
Код:
void __fastcall TfSinhronization::NMFTP1ListItem(AnsiString Listing)
{
ListBox1->Items->Add(Listing);
}
{
ListBox1->Items->Add(Listing);
}
Цитата:
227 Entering Passive Mode (193,169,188,90,209,59)
нужно к нему самостоятельно подключить канал данных на 193.169.188.90:53563 (если с порядком байт ничего не напутал). Сам этот NMFTP пасивный режим-то поддерживает?
mainigor, эм... попробуй Indy (TIdFTP по-моему) компоненты, у меня с ними проблем не возникло, и всё работало окейна, а вот почему от NMFTP отказался.. не помню.
добавил обработку ошибок :
Код:
void __fastcall TfSinhronization::NMFTP1Failure(bool &Handled,
TCmdType Trans_Type)
{
switch(Trans_Type)
{
case cmdChangeDir: Memo1->Lines->Add("ChangeDir failed");
case cmdMakeDir: Memo1->Lines->Add("MakeDir failed");
case cmdDelete: Memo1->Lines->Add("Delete failed");
case cmdRemoveDir: Memo1->Lines->Add("RemoveDir failed");
case cmdList: Memo1->Lines->Add("List failed");
case cmdRename: Memo1->Lines->Add("Rename failed");
case cmdUpRestore: Memo1->Lines->Add("UploadRestore failed");
case cmdDownRestore: Memo1->Lines->Add("DownloadRestore failed");
case cmdDownload: Memo1->Lines->Add("Download failed");
case cmdUpload: Memo1->Lines->Add("Upload failed");
case cmdAppend: Memo1->Lines->Add("UploadAppend failed");
case cmdReInit: Memo1->Lines->Add("Reinitialize failed");
case cmdAllocate: Memo1->Lines->Add("Allocate failed");
case cmdNList: Memo1->Lines->Add("NList failed");
case cmdDoCommand: Memo1->Lines->Add("DoCommand failed");
case cmdCurrentDir: Memo1->Lines->Add("CurrentDir failed");
}
}
TCmdType Trans_Type)
{
switch(Trans_Type)
{
case cmdChangeDir: Memo1->Lines->Add("ChangeDir failed");
case cmdMakeDir: Memo1->Lines->Add("MakeDir failed");
case cmdDelete: Memo1->Lines->Add("Delete failed");
case cmdRemoveDir: Memo1->Lines->Add("RemoveDir failed");
case cmdList: Memo1->Lines->Add("List failed");
case cmdRename: Memo1->Lines->Add("Rename failed");
case cmdUpRestore: Memo1->Lines->Add("UploadRestore failed");
case cmdDownRestore: Memo1->Lines->Add("DownloadRestore failed");
case cmdDownload: Memo1->Lines->Add("Download failed");
case cmdUpload: Memo1->Lines->Add("Upload failed");
case cmdAppend: Memo1->Lines->Add("UploadAppend failed");
case cmdReInit: Memo1->Lines->Add("Reinitialize failed");
case cmdAllocate: Memo1->Lines->Add("Allocate failed");
case cmdNList: Memo1->Lines->Add("NList failed");
case cmdDoCommand: Memo1->Lines->Add("DoCommand failed");
case cmdCurrentDir: Memo1->Lines->Add("CurrentDir failed");
}
}
А все же интересно, добавил обработку и как включилось :D .
все же IdFTP работает и достаточно хорошо.
я исправил свойство Passive = true;
(спасибо за совет Тень Пса)
вот рабочий код :
Код:
sList = new TStringList;
IdFTP1->List(sList, "*.*", false);
// занес файлы в листбокс
for (int i=0; i<sList->Count; i++)
{
ListBox1->Items->Add(sList->Strings);
}
IdFTP1->List(sList, "*.*", false);
// занес файлы в листбокс
for (int i=0; i<sList->Count; i++)
{
ListBox1->Items->Add(sList->Strings);
}
А компонент NMFTP в принципе работает, копирует например. :)
на здоровье ) а точнее, для успешного выполнения проекта ;)