C++ InternetConnect无法通过FTP代理连接到FTP服务器

C++ InternetConnect无法通过FTP代理连接到FTP服务器,c++,proxy,ftp,C++,Proxy,Ftp,我正在尝试使用WinGate FTP代理连接到FTP服务器。InternetOpen()在所有情况下都会成功执行并返回适当的句柄 如果代理身份验证关闭,InternetConnect()将返回正确的句柄,我可以继续执行进一步的ftp操作,但如果代理身份验证打开,InternetConnect()将返回NULL 在MSDN上,他们提到代理使用InternetSetOption()和INTERNET\u OPTION\u PROXY\u用户名和INTERNET\u OPTION\u PROXY\u密

我正在尝试使用WinGate FTP代理连接到FTP服务器。InternetOpen()在所有情况下都会成功执行并返回适当的句柄

如果代理身份验证关闭,InternetConnect()将返回正确的句柄,我可以继续执行进一步的ftp操作,但如果代理身份验证打开,InternetConnect()将返回NULL

在MSDN上,他们提到代理使用InternetSetOption()和INTERNET\u OPTION\u PROXY\u用户名和INTERNET\u OPTION\u PROXY\u密码标志在InternetConnect返回的句柄上设置代理用户名和密码,但返回NULL,在打印GetLastError()时,我收到以下消息:
InternetConnect失败:12014

220 WinGate引擎FTP网关就绪

331发送密码

530身份验证失败

if((hHandle=InternetOpen(“上载”,INTERNET\u打开\u类型\u代理,“ftp=ftp://:”,NULL,0))==NULL)
{
printf(“InternetOpen失败:%d”,GetLastError());
printInternetErrorMsg(函数);
返回false;
}   
字符缓冲区[1024];
字符串proxy\u用户名、proxy\u密码;
//获取ftp代理用户名和密码
// ..
如果((m_itConnect=InternetConnect(hHandle、ftpserver、INTERNET\u DEFAULT\u FTP\u端口、ftpusrname、ftppasswd、INTERNET\u服务\u FTP、NULL、NULL))==NULL){
printf(“InternetConnect失败:%d”,GetLastError());
printInternetErrorMsg(函数);
//启用代理身份验证时,Internet连接失败,出现以下错误
//InternetConnect失败:12014
//220 WinGate引擎FTP网关就绪
//331发送密码
//530身份验证失败
返回false;
}
strcpy(buffer,proxy_username.c_str());
如果(!InternetSetOption(m_itConnect、INTERNET_OPTION、代理_用户名、(LPVOID)缓冲区、lstrlen(缓冲区)))
{
printf(“无法设置代理身份验证设置(用户名)。返回错误:%d”,GetLastError());
返回false;
}
strcpy(buffer,proxy_password.c_str());
如果(!InternetSetOption(m_itConnect、INTERNET_OPTION、代理_密码、(LPVOID)缓冲区、lstrlen(缓冲区)))
{
printf(“无法设置代理身份验证设置(密码)。返回错误:%d”,GetLastError());
返回false;
}
}
printf(“Internet连接成功…”);
返回true;
感谢您的帮助。
提前感谢。

问题是您连接的是FTP代理,而不是HTTP代理。所以你得到了一个FTP欢迎字符串

使用WinInet处理代理时,FTP通过HTTP完成。客户端向HTTP代理发出FTP URL的HTTP请求。HTTP代理充当FTP服务器的FTP客户端,并为客户端将响应转换回HTTP。奇怪但真实

因此,您需要将代理端口更改为WinGate中的HTTP代理

if ((hHandle=InternetOpen("Upload", INTERNET_OPEN_TYPE_PROXY, "ftp=ftp://<servername>:<port>", NULL, 0)) == NULL)
    {
        printf("InternetOpen failed: %d", GetLastError());
        printInternetErrorMsg(function);
        return false;   
    }   
    char buffer[1024];
    string proxy_username,proxy_password;
    // get ftp proxy username and password
            // ..


    if ((m_itConnect=InternetConnect(hHandle, ftpserver, INTERNET_DEFAULT_FTP_PORT, ftpusrname, ftppasswd, INTERNET_SERVICE_FTP, NULL, NULL)) == NULL){
        printf("InternetConnect failed: %d", GetLastError());
        printInternetErrorMsg(function);
                    //Internet Connect Fails with following error when Proxy Authentication is ON
                    //InternetConnect failed: 12014
                    //220 WinGate Engine FTP Gateway ready
                    //331 send password
                    //530 Auth Failed 

        return false;           
    }
    strcpy(buffer,proxy_username.c_str());

    if ( !InternetSetOption (m_itConnect, INTERNET_OPTION_PROXY_USERNAME, (LPVOID) buffer, lstrlen (buffer) ))
    {
        printf("Unable to set proxy authetication settings (username). Error returned: %d",  GetLastError() );
        return false;
    }

    strcpy(buffer, proxy_password.c_str());

    if ( !InternetSetOption (m_itConnect, INTERNET_OPTION_PROXY_PASSWORD, (LPVOID) buffer, lstrlen (buffer) ))
    {
        printf("Unable to set proxy authetication settings (password). Error returned: %d",  GetLastError() );
        return false;
    }
}


printf("InternetConnect successful ...");
return true;