c++ - '227进入被动模式'后未收到响应
问题描述
我正在尝试通过我正在开发的客户端程序访问 FTP 服务器(我可以访问)。我将这个库用于所有较低级别的 FTP 通信,到目前为止它运行良好,并且可以毫无问题地访问本地网络上的服务器。当通过服务器的公共 IP 尝试相同的连接时会出现问题,这仍然允许我的程序登录,甚至PWD
- 但是,无论出于何种原因,代码在发送命令时未能收到响应PASV
并立即断开连接,最后一个记录的响应是200 Type set to A
确认上一个命令。我最初的假设是这是服务器端的端口转发问题,但像 FileZilla 这样的程序似乎能够毫无困难地导航服务器。我可以看到该PASV
命令已被服务器接收,并且它以227 Entering Passive Mode (...)
. 是否可能需要建立一些传出端口规则,或者客户端机器的传入规则?
任何投入将不胜感激!
编辑:根据要求,这是一个最低限度的复制程序
#include "ftplib.h"
bool CFTPFileFinder::Connect(CString URL)
{
try
{
CString serverName;
CString strObject;
INTERNET_PORT nPort;
DWORD dwServiceType = AFX_INET_SERVICE_FTP;
if (AfxParseURL(URL, dwServiceType, serverName, strObject, nPort))
{
CString connectAddress;
connectAddress.Format("%s:%d", serverName, nPort);
if (m_FTPLibSession->Connect((LPCTSTR)connectAddress))
{
if(m_FTPLibSession->Login(m_Username, m_Password))
{
const int max = 1024;
char* pwd = static_cast<char*>(malloc(max));
bool test1 = m_FTPLibSession->Pwd(pwd, max); // succeeds
CString OutputPath("output.txt");
CString SearchPath("*.*");
bool test2 = m_FTPLibSession->Nlst(OutputPath, SearchPath); // fails, only when public IP
return true;
}
}
}
}
catch (CException* pEx)
{
CString str;
LPTSTR error = str.GetBuffer(255);
pEx->GetErrorMessage(error, 255);
pEx->Delete();
str.ReleaseBuffer();
}
return false;
}
解决方案
推荐阅读
- delphi - 停止缩放 TGraphicControl 组件
- r - R:如何在多个csv中提取列,然后在一个文件夹中写入多个csv
- javascript - 是否可以通过使用 object.variable 名称来获取值?不是object.property?
- c - 如何使用 for 循环将不同大小的新数组添加到旧数组?
- python - 寻找生成连续数字的简单函数
- java - 获取 com.xero.api.XeroApiException:尝试创建/更新发票时出现未经授权的错误
- lua - 如何使用函数更改全局变量?
- jquery - 在 puppeteer 中获取元素的子元素
- c++ - 我正在尝试解决英特尔架构并行基础课程中 Coursera 上的一项作业
- python - 我们可以多次使用 re.sub 而不是使用 str.replace