首页 > 解决方案 > '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;
}

标签: c++ftpmfcftp-clientfilezilla

解决方案


推荐阅读