wininet ftp程序遇到seg错误

Posted

技术标签:

【中文标题】wininet ftp程序遇到seg错误【英文标题】:Encountering seg fault in wininet ftp program 【发布时间】: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() 之前就崩溃了;到控制台。 【参考方案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;

【讨论】:

以上是关于wininet ftp程序遇到seg错误的主要内容,如果未能解决你的问题,请参考以下文章

WinInet ftp 连接错误 123

对于大多数 FTP 函数,IE 11 中的 wininet 随机返回错误 12003

c ++ wininet ftp列出许多文件错误

WinInet 未定义标识符

FtpGetFile WinINet 永远不会返回

WinInet C++ ftp 模板?