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 << 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错误的主要内容,如果未能解决你的问题,请参考以下文章