FTP NLST 仅在某些客户端计算机上导致“425:无法打开数据连接进行传输”
FTP NLST results in '425: Can't open data connection for transfer' only on some client machines
我目前运行正在网络上安装 FileZilla FTP 服务器。我的问题是,在看似随机的机器上,当用户导航到一个目录(他们能够这样做)并尝试 ls(即数据传输)时,他们的终端挂起等待响应,而服务器报告此 425: Can't open data connection for transfer
上文提到的。此结果因所使用的客户端计算机而异,其中一些(本地或远程)能够继续进行,而另一些则卡在此处。我知道这是因为像 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;
}
据我所知,要么我需要在 LIST
之前调用打开此数据端口,要么找到阻止这些端口的防火墙并创建一个规则来防止这种情况(What ports does Wininet listen on for Active FTP data connection?).当然,我也可以完全偏离基础——任何见解都将非常感激不尽!
您的 FTP 服务器似乎需要加密连接 (TLS/SSL)。
WinInet 不支持加密 FTP。
参见 C++/Win32 The basics of FTP security and using SSL。
我目前运行正在网络上安装 FileZilla FTP 服务器。我的问题是,在看似随机的机器上,当用户导航到一个目录(他们能够这样做)并尝试 ls(即数据传输)时,他们的终端挂起等待响应,而服务器报告此 425: Can't open data connection for transfer
上文提到的。此结果因所使用的客户端计算机而异,其中一些(本地或远程)能够继续进行,而另一些则卡在此处。我知道这是因为像 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;
}
据我所知,要么我需要在 LIST
之前调用打开此数据端口,要么找到阻止这些端口的防火墙并创建一个规则来防止这种情况(What ports does Wininet listen on for Active FTP data connection?).当然,我也可以完全偏离基础——任何见解都将非常感激不尽!
您的 FTP 服务器似乎需要加密连接 (TLS/SSL)。
WinInet 不支持加密 FTP。
参见 C++/Win32 The basics of FTP security and using SSL。