在 wininet ftp 程序中遇到段错误

Encountering seg fault in wininet ftp program

所以我找到了这个 c++ 程序,我想我会用它来自动将我的文件备份到我的桌面 ftp 服务器,但它总是遇到同样的段错误问题,在检查 ftp 服务器日志我可以看到它确实连接到 ftp 服务器并使用用户名和密码登录但是当它到达实际上传部分时它崩溃了。

我 运行 它通过 dev c++ 中的调试器,它说 "Access violation (Seg faut)"

这是 wininet 中的错误吗?如果是这样,是否有某种解决方法?

#include <windows.h>
#include <wininet.h>
#pragma comment(lib, "wininet")
#include <fstream>
#include <string.h>

int send(const char * ftp, const char * user, const char * pass, const char * pathondisk, char * nameonftp)
{

HINTERNET hInternet;
HINTERNET hFtpSession;
hInternet = InternetOpen(NULL,INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
if(hInternet==NULL)
{
    cout << GetLastError();
    //system("PAUSE");
    return 1;
}
hFtpSession = InternetConnect(hInternet,
(LPTSTR)ftp, INTERNET_DEFAULT_FTP_PORT,
(LPTSTR)user, (LPTSTR)pass, INTERNET_SERVICE_FTP,
INTERNET_FLAG_PASSIVE, 0);
if(hFtpSession==NULL)
{
    cout << GetLastError();
    //system("PAUSE");
    return 1;
}
Sleep(1000);
char * buf=nameonftp;
strcat(buf,".txt");
if (!FtpPutFile(hFtpSession, (LPTSTR)pathondisk, (LPTSTR)buf, FTP_TRANSFER_TYPE_ASCII, 0)) {
    cout << GetLastError();//this is never reached
    return 1;
}
Sleep(1000);
InternetCloseHandle(hFtpSession);
InternetCloseHandle(hInternet);
return 0;
}

int main() {
send("127.0.0.1","testuser","test","file.pdf","backup");
return 0;
}

您不得修改字符串文字。将字符串复制到新缓冲区以编辑内容。

此外,您应该使用 hogeA() API 让系统明确使用 ANSI 字符集。

试试这个:

#include <windows.h>
#include <wininet.h>
#pragma comment(lib, "wininet")
#include <iostream>
#include <fstream>
#include <string.h>

using std::cout;

int send(const char * ftp, const char * user, const char * pass, const char * pathondisk, const char * nameonftp)
{

    HINTERNET hInternet;
    HINTERNET hFtpSession;
    hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    if(hInternet==NULL)
    {
        cout << GetLastError();
        //system("PAUSE");
        return 1;
    }
    hFtpSession = InternetConnectA(hInternet,
        ftp, INTERNET_DEFAULT_FTP_PORT,
        user, pass, INTERNET_SERVICE_FTP,
        INTERNET_FLAG_PASSIVE, 0);
    if(hFtpSession==NULL)
    {
        cout << GetLastError();
        //system("PAUSE");
        return 1;
    }
    Sleep(1000);
    char * buf=new char[strlen(nameonftp) + 4 + 1];
    strcpy(buf, nameonftp);
    strcat(buf, ".txt");
    if (!FtpPutFileA(hFtpSession, pathondisk, buf, FTP_TRANSFER_TYPE_ASCII, 0)) {
        cout << GetLastError();
        delete[] buf;
        return 1;
    }
    delete[] buf;
    Sleep(1000);
    InternetCloseHandle(hFtpSession);
    InternetCloseHandle(hInternet);
    return 0;
}

int main() {
    send("127.0.0.1", "testuser", "test", "file.pdf", "backup");
    return 0;
}