【问题标题】:Encountering seg fault in wininet ftp programwininet ftp程序遇到seg错误
【发布时间】:2015-12-16 15:45:58
【问题描述】:

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

我通过 dev c++ 中的调试器运行它,它显示“访问冲突(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;
}

【问题讨论】:

  • 不要尝试修改字符串文字。即使它们是可修改的,strcat(buf,".txt"); 也会导致越界访问。
  • cout &lt;&lt; GetLastError();//this is never reached为什么...因为错误?
  • @MikeCAT 是的,程序在打印 GetLastError() 之前就崩溃了;到控制台。

标签: c++ windows ftp wininet


【解决方案1】:

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

此外,您应该使用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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多