充满梦想的FTP探索之旅(二)WinInet和FTP

WinInet库之FTP通信 // 文件传输协议(File Transfer Protocol,简称FTP)用在互联网上文件的双向传输,是主用于文件的上传和下载处理的协议。 // 上传是指将文件从本地计算机中复制到远程主机上。下载是指将远程主机上的文件复制到本地计算机上。 // FTP是专门为文件传输而生的,传输效率高,稳定性好。公司内部通常会有多个FTP服务器,用于共享公司内部的资料。 // 在Windows上,微软提供了WinInet(即Windows Internet)库用于方便网络程序的开发。WinInet支持FTP、HTTP 阅读详情

需要

objectcontent
HeaderWininet.h
LibraryWininet.lib
DLLWininet.dll

变量声明

BOOL            bSuccess ;
HINTERNET       hIntSession, hFtpSession, hFind ;
HANDLE hLocalFind ;
WIN32_FIND_DATA finddata ;

Open an internet session

hIntSession = InternetOpen (CTelProxyApp::szTitle,           INTERNET_OPEN_TYPE_DIRECT,
            NULL, NULL, 0) ;

if(hIntSession == NULL)
{
    DWORD dwError = GetLastError();
    ErrLog(<<"InternetOpen error "<<dwError);
    return;
}

Open an FTP session

 hFtpSession = InternetConnect(hIntSession, m_szFTPServer,
                INTERNET_DEFAULT_FTP_PORT,
                m_szUser, m_szPassword, INTERNET_SERVICE_FTP, 0, 0);

 if(hFtpSession == NULL)
 {
     DWORD dwError = GetLastError();
     ErrLog(<<"InternetConnect error "<<dwError);
     InternetCloseHandle (hIntSession) ;     
     return;
 }

ftp远程路径设置

//根目录为"/"
bSuccess = FtpSetCurrentDirectory (hFtpSession, m_szDirectory) ;
if(!bSuccess)
{
    DWORD dwLastError = GetLastError();     
    if (dwLastError == ERROR_INTERNET_EXTENDED_ERROR) {
        char szLastResponse[1024] = { 0 }; 
        DWORD lastErrorResponse = 0; 
        DWORD bufSize = sizeof(szLastResponse); 
        if (InternetGetLastResponseInfo(&lastErrorResponse, szLastResponse, &bufSize)) 
        {               
            //如果错误类似于550 /0: No such file or directory.
            if(memcmp(szLastResponse,"550",3) == 0)
            {
                bSuccess = FtpCreateDirectory (hFtpSession, m_szDirectory) ;
                bSuccess = FtpSetCurrentDirectory (hFtpSession, m_szDirectory) ;
                if(!bSuccess)
                {
                    ErrLog(<<szLastResponse<<"Cannot set directory to "<<m_szDirectory);
                    InternetCloseHandle (hFtpSession) ;
                    InternetCloseHandle (hIntSession) ;
                    return;
                }

        }else{
            ErrLog(<<"Cannot set directory to "<<m_szDirectory);
            InternetCloseHandle (hFtpSession) ;
            InternetCloseHandle (hIntSession) ;
            return;
        }
    }
    else //if InternetGetLastResponseInfo() failed
    {
        ErrLog(<<"Cannot set directory to "<<m_szDirectory);
        InternetCloseHandle (hFtpSession) ;
        InternetCloseHandle (hIntSession) ; 
        return;
    }
}   

}

获得ftp远程路径

char szCurrentDirectory[MAX_PATH] = {0};
DWORD dwLen = MAX_PATH;
bSuccess = FtpGetCurrentDirectory(hFtpSession, szCurrentDirectory, &dwLen);
if(!bSuccess)
{
    DWORD dwLastError = GetLastError(); //set dwLastError to GetLastError()
    ErrLog(<<"Cannot set directory to "<<m_szDirectory);


InternetCloseHandle (hFtpSession) ;
InternetCloseHandle (hIntSession) ;
return;

}

本地路径遍历上传

hLocalFind = ::FindFirstFile(CApp::getRecordFileTemplate().c_str(),&finddata);
if(hLocalFind == INVALID_HANDLE_VALUE)
{
    InternetCloseHandle (hFtpSession) ;
    InternetCloseHandle (hIntSession) ;     
    return;
}

do
{
    bSuccess = FtpPutFile(hFtpSession,(CApp::getRecordFileDirectory()+=finddata.cFileName).c_str(),
                    finddata.cFileName,FTP_TRANSFER_TYPE_BINARY, 0); 

if(!bSuccess)
{
    DWORD dwErr = GetLastError();
    ErrLog(<<"upload file to ftp server fail.error "<<dwErr);
    InternetCloseHandle (hFtpSession) ;
    InternetCloseHandle (hIntSession) ;

    return;
}
DebugLog(<<"upload "<<finddata.cFileName);
}while(FindNextFile(hLocalFind,&finddata));

远程路径遍历下载

 hFind = FtpFindFirstFile (hFtpSession, TEMPLATE, 
                           &finddata, 0, 0) ;

 if (hFind == NULL)
 {
      InternetCloseHandle (hFtpSession) ;
      InternetCloseHandle (hIntSession) ;
      return;
 }

 do 
 {              
      FtpGetFile (hFtpSession, 
                  finddata.cFileName, finddata.cFileName, TRUE, 
                  FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY, 0) ;
 }
 while (InternetFindNextFile (hFind, &finddata)) ;

完成销毁对象

InternetCloseHandle (hFind) ;
InternetCloseHandle (hFtpSession) ;
InternetCloseHandle (hIntSession) ;

注意

You should call theGetLastError function immediately when a function’s return value indicates that such a call will return useful data.

源文档 https://msdn.microsoft.com/en-us/library/windows/desktop/ms679360(v=vs.85).aspx

否则遇到错误,调用GetLastError查看错误码返回0.我之前没注意这个问题,日志输出放在了GetlastError前面,结果ftp函数返回FALSE,查看GetLastError的错误码为0,颇是束手无策。

参考

• <<Windows程序设计>> WinInet和FTP
• <<Visual C++ 网络高级编程>> FTP协议的实现
• WinINet Functions
C++/MFC FTP客户端开发:多线程、断点续传与WinInet实战 文件传输协议(FTP)是网络编程中用于文件交换的经典协议,其核心原理基于客户端-服务器模型,通过控制连接和数据连接实现可靠的文件上传与下载。在桌面应用开发领域,多线程技术是保障用户界面响应性的关键,它能将耗时的I/O操作置于后台,避免主线程阻塞。结合WinInet这一高层网络API,开发者可以高效处理FTP协议细节,快速构建稳定客户端。这类技术的工程价值在于实现可控、可定制的文件管理解决方案,尤其适用于企业内部系统集成、工业设备维护等对稳定性和定制化要求高的场景。本文以C++和MFC框架为基础,深入探讨了如 阅读详情

相关推荐

内存驻留木马分析实战:从进程注入到反射加载的攻防对抗

在网络安全领域,进程注入和反射式DLL加载是两项关键的底层技术。进程注入允许代码在目标进程的地址空间中执行,而反射加载则实现了不依赖系统加载器的内存模块执行。这些技术不仅用于软件调试和插件化开发,也被广泛应用于恶意软件的隐蔽驻留,形成了所谓的“无文件攻击”。其技术价值在于突破了传统文件扫描的防御边界,直接在内核态或用户态内存中实现持久化控制。在应用场景上,从渗透测试中的权限维持到高级持续性威胁(APT)攻击,内存驻留技术都扮演着重要角色。本文聚焦于RAM运行远程访问木马的分析,深入探讨其利用进程注入和反射加

414

CFtpConnection之CreateDirectory、GetCurrentDirectory、SetCurrentDirectory的使用

FTP站点目录是C:\\Data,我们如何将本地文件上传到FTP服务器的C:\\Data\\data目录下?使用CreateDirectory、GetCurrentDirectory、SetCurrentDirectory函数就可以很好的实现。一下省略掉FTP其它的一些连接操作: 方法一: CString strFtpPath,strUP; pFtpConnection->GetC

小米的修行之路 4619

WinInet和FTP

WinInet和FTP(1)WinInet接口(含HTTP、FTP)及FTP函数层次关系 (2)Ftp函数介绍  ①InternetOpen——初始化,它告诉 Internet DLL 初始化内部数据结构并准备接收应用程序之后的其他调用。参数含义LPCTSTR lpszAgent调用WinInet函数的应用程序名字,在HTTP协议中作为用户代理项DWORD   dwAccessType访问要求类型...

KnightOnHorse的博客 918

自写控制台清除内容函数clrscr()

编程小白,最近学了双缓冲,倒腾了好几天,终于是学会了。 这里想要给大家分享的是控制台清除内容的函数clrscr() 在网上找了好久,有的说这个函数是TC特有的(虽然不知道TC是啥),还有些说是在conio.h头文件里 但VS2019绝对是没有的,所以只能只能写 这里可能有人会说用system(“cls”)就好,clrscr()很复杂,但我最近几天被折磨的BUG就是因为这个system(“cls”)导致的,一直显示0xc0000142的error 具体原因我并不知道,但可能是因为要读取和写入缓冲会有冲突,所以

z1095582370的博客 1791

实验五 利用MFC WinInet类实现FTP客户端

7. 正确记录实验关键过程,对实验结果进行分析,并写出实验报告。打包提交的内容包括源程序的项目代码、电子版实验报告。首先填写正确的主机IP地址、端口号、用户名和密码,才能连接FTP服务器,连接成功应该显示服务器文件列表,显示文件的详细路径。选中服务器文件列表中的文件,单击“文件下载”按钮即可下载文件,能通过“另存为”对话框保存文件。5. 编写详细的说明文档,包括设计思想、工作流程以及关键的环节及问题;4.编写程序的功能实现部分代码,并调试运行。2.绘制MFC程序界面,熟悉所使用的控件。

m0_65002489的博客 624

使用WinINet 函数实现 FTP上传/下载/删除/重命名等操作的函数汇总说明

项目中需要网络数据的下载,就打算搭个FTP站点实现功能,最近也在学习使用windows api中的函数,所以就打算使用WinINet函数实现FTP上传/下载/删除/重命名相关功能,通过对MSDN的中的示例的学习。总结了部分在Qt环境下相关函数的使用;

... 488

Linux搭建FTP服务器,FtpGetCurrentDirectory和FtpSetCurrentDirectory问题

一、在VMware的RHEL6.9中搭建 ftp 服务器的基本步骤 1. 安装FTP服务器 rpm -qa | grep vsftpd #查看是否已安装vsftpd yum -y install vsftpd #如果没有安装执行该命令安装 使用yum安装前需预先建立安装源,参见https://blog.youkuaiyun.com/ikaoni/art...

ikaoni的专栏 1418

Wininet 异步FTP客户端组件及示例程序全套源码

完整项目,编译平台VS2008。使用异步wininet实现的FTP客户端,并加入加入自动超时检测机制。在局域网环境可以占满网络带宽,可以在此基础进行二次开发。

C代码实现从FTP上下载文件

从FTP上下载文件这个功能我早就想实现了,但是苦于百度的文章大多是下载链接,一直没舍得积分下载,这次通过查阅MSDN,将一套下载流程函数摸了一下,写出代码实现从FTP下载文件 环境 VS2015 代码: #include &lt;iostream&gt; #include &lt;windows.h&gt; #include &lt;process.h&gt; #include &lt;w...

她的吻让他 7779

基于WININET技术访问FTP

基于WININET技术,用c++访问FTP地址,实现上传下载,这个文件写的有点乱。最近比较忙,没有修改就上传了。

简单WinInet FTP客户端编程

利用WinInet技术 ,编写的基于MFC的FTP客户端。 实现了根目录下文件的上传、下载及删除操作,目录的操作有点问题就没完全实现,拿出来给大家共享一下,同时希望给与改进意见。 (Visual Studio 2010下测试。)

VC++实战FTP下载工具:WinINet API实现文件与目录递归下载

文件传输协议(FTP)是网络编程中处理文件上传下载的经典方案,其基于客户端-服务器模型,通过控制连接与数据连接实现可靠传输。在Windows平台进行原生开发时,微软提供的WinINet API封装了FTP等高层协议,开发者无需从Socket层手动实现命令交互,即可便捷地完成连接管理、文件传输与目录遍历等核心操作。该技术方案的价值在于其深度集成于Windows系统,无需额外依赖第三方库,编译出的程序具备良好的部署兼容性与运行效率,尤其适合需要集成到现有MFC应用或作为独立工具部署在异构环境中的场景。通过合理使

weixin_30421809的博客 477

WinINetFTP文件传输

使用WinINet实现FTP文件传输 使用WinINet实现FTP文件传输

VC6 HTTP客户端开发:WinINet实战与经典Windows网络编程

HTTP客户端是网络编程中的基础组件,用于在应用层实现客户端与服务器之间的数据交换。其核心原理基于HTTP协议,通过建立TCP连接、发送请求报文和接收响应报文来完成通信。在Windows平台,WinINet API提供了原生、高效的实现方案,尤其适合需要深度集成Windows系统特性或维护遗留项目的场景。WinINet自动处理连接管理、代理设置和HTTPS加密等复杂细节,技术价值在于为C++ Win32桌面应用提供了稳定可靠的网络通信能力。在VC6开发环境中,基于WinINet构建HTTP客户端,不仅能满足

weixin_34296641的博客 405

winInetFtpDownloadDemo

实现了Ftp服务器的上传和下载,实现多级目录的创建和索引,实现了远程的操作,拥有Demo界面

IEEE论文接收后,收到Proof邮件别慌!手把手教你48小时内搞定校样(附详细截图)

本文详细解析了IEEE论文接收后Proof校样的全流程,从邮件关键信息解码到精准修改标注,提供48小时内高效完成校样的实战指南。涵盖登录技巧、文件验证、修改标注黄金法则及九宫格检查清单,帮助作者避免常见错误,确保论文顺利发表。

weixin_30652491的博客 563

MFC中基于WinInet封装CHttpClient类:零依赖HTTP客户端实现指南

HTTP客户端是网络编程中的基础组件,用于在客户端与服务器之间进行数据交换。其核心原理是通过建立TCP连接,遵循HTTP协议发送请求和接收响应。在Windows平台的C++桌面开发中,直接使用系统原生API构建HTTP客户端,能实现零第三方依赖、深度集成开发框架并保障部署的简洁性。对于MFC(Microsoft Foundation Classes)应用程序而言,利用系统内置的WinInet API封装自定义的CHttpClient类,是一种高度工程实践导向的技术方案。该方案特别适用于需要严格控制依赖、或已

weixin_33766805的博客 315

CentOS7 编译升级GCC至9.3.0

1)下载GCC9.2.0源码并解压 从GCC官方FTP下载地址可以看到GCC最新版本为9.3.0。由于官网下载速度慢,实际上用清华大学的镜像站进行下载,代码如下: wget -c /opt/tmp/ https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.gz #考虑到安装失败的可能性,创建一个临时文件夹来安装GCC...

haha123486的博客 1万+

WinInet中的FTP操作

研究了一下Wininet在ftp中的应用,感觉比http应用要简单些。项目设置方面,Wininet.h和Wininet.lib都必须加入。假设ftp地址为10.1.1.1,账号和密码都为hello。为简单起见,使用同步模式:HINTERNET hInstance;HINTERNET hConnect;hInstance = InternetOpen(L"ftptest",     

小李匪盗的专栏 6721

NumPy 与 Pandas 的详细应用(含实例)

本文系统介绍了Python数据分析中NumPy和Pandas两大核心库的应用。NumPy专注于高效数值计算,提供多维数组和向量化运算功能;Pandas则擅长结构化数据处理,支持数据清洗、分组统计等操作。文章详细讲解了库的安装、基础操作(数组/DataFrame创建、索引切片)、进阶功能(缺失值处理、分组聚合),并通过电商销售分析案例演示了实际应用场景。最后总结了二者的协同优势:NumPy负责底层数值计算,Pandas处理高级数据操作,配合使用可显著提升数据处理效率。建议读者从基础操作入手,结合实际案例练习,

weixin_42030577的博客 2299

VerilogEval实战指南:从基准测试到模型微调的全流程解析

本文提供了VerilogEval实战指南,详细解析了从基准测试到模型微调的全流程。VerilogEval是一个自动化、标准化的测试框架,用于客观评估大语言模型生成Verilog硬件代码的能力。文章涵盖了环境搭建、核心机制解析、利用其生成合成数据进行模型微调的策略,以及如何将其工程化集成到自动化评估流程中,为硬件设计领域的AI应用提供了完整的方法论。

yy01234的博客 1005

23.2 WinInet 和 FTP

摘录于《Windows程序(第5版,珍藏版).CHarles.Petzold 著》P1093         WinInet API 是一些高层函数的集合,主要用于协助程序使用三个最常见的互联网协议:用于 WWW 的超文本传输协议(HTTP)、文件传输协议(FTP)和另一个称为 Gopher 的文件传输协议。WinInet 函数的语法与通常的 Windows 文件操作函数的语法很相似,因而应

wilim 1465

Android系统去掉长按webview界面弹框中的分享功能

Android 系统去解决长按显示内容,去掉分享功能,不论那个界面,是所有界面都需要满足。如果仅仅去掉系统自带的,那么系统来处理如果客户自定义,部分App自定义的菜单项,不是调用系统的,那么还是需要应用去解决的。之前做过Editext,其实还需要去TextView,最难点的就是WebView中的HTML了 去分享功能了。WebView中涉及到分享功能菜单的界面,/***//***//***//***//***//***//***//***//**

十年饮冰,难凉热血 1019
上一篇: 充满梦想的FTP探索之旅(一)FTP服务器Serv-u配置
下一篇: 如何使用短信猫发送中文短信
soliddream66
博客等级 码龄19年 93粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值