FTP NLST приводит к «425: не удается открыть соединение для передачи данных» только на некоторых клиентских компьютерах - PullRequest
1 голос
/ 26 марта 2020

В настоящее время я использую FTP-сервер FileZilla в сети. Моя проблема заключается в том, что на казалось бы случайных машинах, когда пользователь переходит в каталог (что он может сделать) и пытается выполнить ls (т.е. передачу данных), его конец зависает в ожидании ответа, в то время как сервер сообщает об этом 425: Can't open data connection for transfer упомянутом над. Этот результат варьируется в зависимости от используемого клиентского компьютера, где некоторые (локальные или удаленные) могут продолжить работу, а другие застряли здесь. Я понимаю, что это потому, что простые команды FTP, такие как CWD ing, работают на портах 20/21, тогда как передача данных FTP работает на каком-то другом номере порта, который, в свою очередь, может быть заблокирован брандмауэром где-то в цепочке. Мой вопрос заключается в том, как мне учесть эти разные порты (если это действительно проблема), поскольку, насколько я знаю, они могут быть выше 1024?

Моя конечная цель в этом проекте - реализовать очень простое решение FTP, в идеале использующее Win INet, однако, до сих пор я столкнулся с той же проблемой:

BOOL CWebFileFinder::FindFile(const CString& URL)
{
    CString ServerName;
    CString strObject;
    INTERNET_PORT nPort;
    DWORD dwServiceType = AFX_INET_SERVICE_FTP;
    if (AfxParseURL(URL, dwServiceType, ServerName, strObject, nPort))
    {
        m_Connection = m_Session.GetFtpConnection(ServerName, m_Username, m_Password, nPort/*, true*/);  // results in findfile still failing
        if (m_Connection)
        {
            m_Connection->SetCurrentDirectory("sms");  // CDs into this dir
            m_Finder = new CFtpFileFind(m_Connection);
            if (m_Finder)
            {
                More = m_Finder->FindFile(_T("*.*"));  // hangs here
            }
        }
    }
    catch (CException* pEx)
    {
        CString str;
        LPTSTR error = str.GetBuffer(255);
        pEx->GetErrorMessage(error, 255);
        pEx->Delete();
        str.ReleaseBuffer();
    }
    return More;
}

Насколько я вижу, либо мне нужно позвонить, чтобы открыть этот порт данных до LIST или найдите брандмауэры, блокирующие эти порты, и создайте правило для предотвращения этого ( Какие порты Win inet прослушивает для активного подключения к данным FTP? ). Конечно, я мог бы также быть совершенно не в себе - любая идея была бы очень оценена!

1 Ответ

1 голос
/ 02 апреля 2020

Ваш FTP-сервер требует зашифрованного соединения (TLS / SSL).

Win Inet не поддерживает зашифрованный FTP.
См. C ++ / Win32 Основы безопасности FTP и используя SSL .

...