C++ FTP NLST结果为';425:Can';t为传输打开数据连接';仅在某些客户端计算机上

C++ FTP NLST结果为';425:Can';t为传输打开数据连接';仅在某些客户端计算机上,c++,windows,ssl,ftp,wininet,C++,Windows,Ssl,Ftp,Wininet,我目前正在网络上运行FileZilla FTP服务器。我的问题是,在看似随机的机器上,当用户导航到一个目录(他们可以这样做)并尝试ls(即数据传输)时,他们的终端挂起等待响应,而服务器报告上述425:无法打开数据连接进行传输。此结果因所使用的客户端计算机而异,其中一些(本地或远程)可以继续,而另一些卡在此处。我知道这是因为像CWDing这样的简单FTP命令在20/21端口上运行,而FTP数据传输在其他端口号上运行,而这些端口号又可能被链条上的某个防火墙阻止。我的问题是,我如何解释这些不同的端口(

我目前正在网络上运行FileZilla FTP服务器。我的问题是,在看似随机的机器上,当用户导航到一个目录(他们可以这样做)并尝试ls(即数据传输)时,他们的终端挂起等待响应,而服务器报告上述
425:无法打开数据连接进行传输
。此结果因所使用的客户端计算机而异,其中一些(本地或远程)可以继续,而另一些卡在此处。我知道这是因为像
CWD
ing这样的简单FTP命令在20/21端口上运行,而FTP数据传输在其他端口号上运行,而这些端口号又可能被链条上的某个防火墙阻止。我的问题是,我如何解释这些不同的端口(如果这确实是一个问题),因为据我所知,它们可能是1024以上的任何端口

我在这个项目中的最终目标是实现一个非常简单的FTP解决方案,理想情况下使用WinINet,但是,到目前为止,我遇到了相同的问题:

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;
}

就我所见,要么我需要在
列表之前调用以打开此数据端口,要么找到阻止这些端口的防火墙并创建一个规则来防止()。当然,我也可能完全偏离了底线——任何洞察都将受到极大的赞赏

您的FTP服务器似乎需要加密连接(TLS/SSL)

WinInet不支持加密的FTP。

请参阅。

相反,请使用被动模式(
PASV
,而不是
PORT
)。主动模式很难工作。请参阅我的报告以了解原因一般来说,这不是编程问题。如果要使用FTP,机器设置必须允许FTP网络连接。没有代码可以解决这个问题。@MartinPrikryl谢谢你的链接,我会看看的。当我将ftp连接设置为被动(取消对最后一个参数的注释)时,用户会在:
>257“/”是当前目录后立即断开连接CWD sms>250 CWD成功。“/sms”是当前目录。>输入A>200类型设置为A>PASV>227进入被动模式(,198,9)>断开连接。
我知道windows命令行使用的ftp实现不支持被动,假设WinINet使用相同的实现是否公平?或者您有其他建议吗?没有WinINet支持被动模式您可以使用在同一台机器上运行的任何(GUI)FTP客户端检索目录列表吗?是的,FileZilla客户端可以毫无问题地列出目录的内容。我认为这意味着我的代码有错误?请发布一个详细的FileZilla日志文件。