Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

метод Nlist от NMFTP

2.1K
30 августа 2009 года
mainigor
151 / / 21.10.2005
Всем добрый день!
Не удается получить список файлов с FTP сервера.
Вот так коннекчусь :
Код:
// init & connect
        NMFTP1->Host = "comp";
        NMFTP1->Port = 21;
        NMFTP1->UserID = "user";
        NMFTP1->Password = "user";
        */

       // NMFTP1->Disconnect();

        try
        {
           NMFTP1->Connect();
        }
        catch(...)
        {
           NoConnect = 0;
           return 0;                     // нет коннекта
        }
цепляюсь через прокси чтоб видно было ошибки, вот log :
Код:
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)
и чего это у него ошибка ?
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.
Если есть соображения - поделитесь.
Буду рад любым предложениям.
14
31 августа 2009 года
Phodopus
3.3K / / 19.06.2008
Может картинку сети нарисуте? А то локальные сервера, наружные, прокси.. Где, что.. Лично я запутался.
2.1K
31 августа 2009 года
mainigor
151 / / 21.10.2005
уточняю
вот прицепил картинку :
[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 ? Я думаю, что это и было бы разгадкой задачи.
14
31 августа 2009 года
Phodopus
3.3K / / 19.06.2008
Мда.. Ну вы и нарисовали - яснее не стало.. Где сервер(а), где клиент(ы), где прокси, где GENE6, кто такой 194.11.28.1... Даже не оч. понятно сколько ftp-клиентов и сколько ftp-серверов которые задействованы в тесте.
Короче команда PORT используется для соединения канала данных в активном режиме. Без нее как бэ обойтись можно используя пассивный режим, тогда будет команда PASV. Пассивный режим может оказаться необходим при использовании файрволла, когда непонятно положим, какому клиенту отправлять пришедший запрос на подключение канала данных или что-то в этом роде.
92
31 августа 2009 года
Тень Пса
2.2K / / 19.10.2006
был у меня код на работе... приду туда завтра, если нас нафик не снесёт ураганом и не зальёт офигенным ливнем и не прибьёт градом, который сегодня на редкость крупный... и кину сюда кусок кода =)) для получения списка файлов и скачивания оных по FTP :)
14
31 августа 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: Тень Пса
и кину сюда кусок кода =)) для получения списка файлов и скачивания оных по FTP :)


дык работает код-то у него в нескольких ситуациях, не работает лишь выборочно и явно из-за конфигурации сети

92
31 августа 2009 года
Тень Пса
2.2K / / 19.10.2006
mainigor, а настройки прокси? он точто пускает дальше себя?
Phodopus, это я так на погоду жаловался ;)
2.1K
01 сентября 2009 года
mainigor
151 / / 21.10.2005
работает через тот же прокси, например Total commander.
(Еще раз пишу: прокси не обязателен. Я его использую как перехват чтоб логи смотреть, это программа 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);
но в момент передачи перечня файлов программа уже ни кидает ошибку, но и не передает ничего , а просто стоит в ожидании вот в таком положении:
Код:
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
Я думаю, что клиент NMFTP в данный момент не принимает.
У меня настроено для стандартной ситуации : должно работать
NMFTP1->Nlist();
и по событию OnListItem
 
Код:
void __fastcall TfSinhronization::NMFTP1ListItem(AnsiString Listing)
{
        ListBox1->Items->Add(Listing);
}
может как-то еще можно из него выцарапать, то что он принимает ?
14
01 сентября 2009 года
Phodopus
3.3K / / 19.06.2008
После того как он
Цитата:

227 Entering Passive Mode (193,169,188,90,209,59)


нужно к нему самостоятельно подключить канал данных на 193.169.188.90:53563 (если с порядком байт ничего не напутал). Сам этот NMFTP пасивный режим-то поддерживает?

92
01 сентября 2009 года
Тень Пса
2.2K / / 19.10.2006
mainigor, эм... попробуй Indy (TIdFTP по-моему) компоненты, у меня с ними проблем не возникло, и всё работало окейна, а вот почему от NMFTP отказался.. не помню.
2.1K
01 сентября 2009 года
mainigor
151 / / 21.10.2005
только что пробовал по той же схеме подключил Indy - то же самое (не работает).

добавил обработку ошибок :

Код:
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");
  }
       
}
прорвало !!! Nlist() все также не работает, но работает List() - там мусора много (даты и атрибуты файлов). Но все же. Хотя иногда вешает программу, пока не понял почему. Иногда 1 раз, а иногда 5 раз нажмешь на кнопочку возврата перечня файлов - и висюк :( .
А все же интересно, добавил обработку и как включилось :D .
2.1K
01 сентября 2009 года
mainigor
151 / / 21.10.2005
Ну вот и все!!
все же IdFTP работает и достаточно хорошо.
я исправил свойство Passive = true;
(спасибо за совет Тень Пса)
вот рабочий код :
 
Код:
sList = new TStringList;
                IdFTP1->List(sList, "*.*", false);
                 // занес файлы в листбокс
                for (int i=0; i<sList->Count; i++)
                {
                        ListBox1->Items->Add(sList->Strings);

                }


А компонент NMFTP в принципе работает, копирует например. :)
92
01 сентября 2009 года
Тень Пса
2.2K / / 19.10.2006
я тебе завтра в личку код кину, я когда-то писал там все парсеры-фигарсеры и тд и тп... для всего мусора =) если нужно конечно :)

на здоровье ) а точнее, для успешного выполнения проекта ;)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог