VC中实现FTP功能

C++项目实战:一小时搭建属于你的小型FTP服务器 FTP服务器是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务。 FTP是File Transfer Protocol( 文件传输协议 )。顾名思义,就是专门用来传输文件的协议。简单地说,支持FTP协议的服务器就是FTP服务器。 这是一个用C++编写的小型FTP服务器源代码,VC6.0下顺利编译,界面是英文的。 项目结构展示: 源码展示: 这个小型的FT... 阅读详情

 

要联接到FTP服务器,需要两个步骤,首先必须创建一个CInternetSession对象,用类CInterSession创建并初始化一个或几个同时存在的Internet会话(session),并描述与代理服务器的连接(如果有必要的话),如果在程序运行期间需要保持与Internet的连接,可以创建一个CInternetSession对象作为类CWinApp的成员。

---- MFC中的类CFtpConnection管理我们与Internet服务器的连接,并直接操作服务器上的目录和文件,FTP是MFC的WinInet支持的三个Internet功能之一,我们需要先创建一个CInternetSession实例和一个CFtpConnection对象就可以实现和一个FTP服务器的通信,我们不需要直接创建CFtpConnection对象,而是通过调用CInternetSession::GetFtpConnection来完成这项工作。它创建CFtpConnection对象并返回一个指向该对象的指针。

Ftp连接类的信息

---- 下面我们简要介绍连接类的信息

1.     CInternetSession对象

---- CInternetSession(LPCTSTR pstrAgent,DWORD dwConText ,DWORD dwAccessType,LPCTSTR pstrProxyName,LPCTSTR pstrProxyBypass,DWORD dwFlags);

---- 在创建CInternetSession对象时调用这个成员函数,CInternetSession是应用程序第一个要调用的Internet函数,它将创始化内部数据结构,以备将来在应用程序中调用。如果dwFlags包含INTERNET_FLAG_ASYNC,那末从这个句柄派生的所有的句柄,在状态回调例程注冊之前,都会出现异步状态。如果沒有打开Internet连接,CInternetSession就会抛出一个例外,AfxThorowInternetException。

2.     GetFtpConnection()函数

---- CFtpConnection* CIternetSession::GetFtpConnection(LPCTSTR pstrServer,LPCTSTR pstrUserName,LPCTSTR pstrPassword,INTERNET_PORT nPort,BOOL bPassive);

---- 调用这个函数建立一个FTP连接,并获得一个指向CFtpConnection对象的指针,GetFtpConnection连接到一个FTP服务器,创建并返回指向CFtpConnection对象的指针,它不在服务器上进行任何操作。如果打算读写文件,必须进行分步操作。关于查找,打开和读/写文件的信息需参考CFtpConnection和CFtpFileFind类。

---- 对这个函数的调用返回一个指向CFtpConnection对象的指针。如果调用失败,检查抛出的CInternetException对象,就可以确定失败的原因。

3.     GetFile()函数

---- BOOL GetFile(LPCTSTR pstrRemoteFile,LPCTSTR pstrLocalFile,BOOL bFailExists ,DWORD dwAttributes,DWORD dwFlags,DWORD dwContext);

---- 调用这个成员函数,可以从FTP服务器取得文件,并且把文件保存在本地机器上。GetFile()函数是一个比较高级的例程,它可以处理所有有关从FTP服务器读文件,以及把文件存放在本地机器上的工作。如果dwFlags为FILE_TRANSFER_TYPE_ASCII,文件数据的传输也会把控制和格式符转化为Windows中的等阶符号。默认的传输模式是二进制模式,文件会以和服务器上相同的格式被下载。

---- pstrRemoteFile和 pstrLocalFile可以是相对于当前目录的部分文件名,也可以是全文件名,在这两个名字中间,都既可以用反斜杠(/)或者正斜杠(/)来作为文件名的目录分隔符,GetFile()在使用前会把目录分隔符转化为适当的字符。

---- 可以用自己选择的值来取代dwContext默认的值,设置为上下文标识符与CFtpConnection对象的定位操作有关,这个操作由CFtpConnection中的CInternetSession对象创建。返回给CInternetSession::OnStatusCallBack的值指出了所标识操作的状态。

---- 如果调用成功,函数的返回为非0,否则返回0,如果调用失败,可以调用Win32函数GetLastError(),确认出错的原因。

4.     PutFile()函数

---- BOOL PutFile(LPCTSTR pstrLocalFile, LPCTSTR pstrRemoveFile ,DWORD dwFlags, DWORD dwContext);

---- 调用这个成员函数可以把文件保存到FTP服务器。PutFile()函数是一个比较高级的例程,它可以处理有关把文件存放到服务器上的工作。只发送数据,或要严格控制文件传输的应用程序,应该调用OpenFile和 CInternet::Write。利用自己选择的值来取代dwContext默认的值,设置为上下文标识符,上下文标识符是CInternetSession对象创建的CFtpConnection对象的特定操作有关,这个值返回给CInternetSession::OnStateCallBack,从而把操作的状态通报给它所标识的上下文。

---- 如果调用成功,函数的返回为非0,否则返回0,如果调用失败,可以调用Win32函数GetLastError(),确认出错的原因。

连接到FTP站点

---- 建立连接到ftp.microsoft.com的程序,它是一个单文档程序。并且连接由视图类的构造函数完成。

1.     建立单文档程序ftp

2.     在ftpview.h中加入包含#include < afxinet.h >

3.     在ftpview.h中添加如下的成员变量

4.     public:

5.     CInternetSession *m_pInetSession;

6.     CFtpConnection *m_pFtpConnection;

7.     在ftpview.cpp中的ftpview构造函数中加入下面的代码

8.     CFtpView::CFtpView()

9.     {

10.     m_pInetSession=new CInternetSession

11.     (AfxGetAppName(),1,

12.     PRE_CONFIG_INTERNET_ACCESS);

13.     try

14.     {

15.     m_pFtpConnection=m_pInetSession->

16.     GetFtpConnection("FTP.MICROSOFT.COM");

17.     }

18.     catch(CInternetException *pEx)

19.     {

20.     TCHAR szError[1024];

21.     if(pEx->GetErrorMessage(szError,1024))

22.     AfxMessageBox(szError);

23.     else

24.     AfxMessageBox("There was an exception");

25.           pEx->Delete();

26.           m_pFtpConnection=NULL;

27.       }

28.     }

29.     在ftpview.cpp中的ftpview析构函数中加入下面的代码

30.       CFtpView::~CFtpView()

31.       {

32.         if(m_pFtpConnection!=NULL)

33.         {

34.       m_pFtpConnection->Close();

35.       delete m_pFtpConnection;

36.         }

37.         delete m_pInetSession;

38.       }

39.     编译并且执行程序,如果连接出现问题,将会在一个消息框中报告出错消息。

发送文件到FTP文件服务器

---- 创建一个发送文件到FTP文件服务器的程序

40.     建立单文档程序ftpfw, 在ftpfwview.h中加入包含 #include < afxinet.h >

41.     在ftpfwview.h中添加如下的成员变量

42.     public:    

43.       bool m_bConnectionAttempted;

44.         int m_nFileStatus;

45.     在ftpview.cpp中的ftpview构造函数中加入下面的代码

46.     CFtpfwView::CFtpfwView()

47.     {  

48.         m_bConnectionAttempted=false;

49.     }

50.     使用ClassWizard加入新的类CFtpThread,该类派生于CWinThread 在ftpthread.h中加入如下变量

51.     public:

52.         static UINT PutFile(LPVOID Status);

53.     添加新类成员函数代码

54.     UINT CFtpThread::PutFile(LPVOID Status)

55.       {

56.     int *pnFileStatus;

57.     CInternetSession *pInetSession;

58.     CFtpConnection *pFtpConnection=NULL;

59.     pnFileStatus=(int *)Status;

60.     *pnFileStatus=0;

61.     pInetSession=new

62.     CInternetSession(AfxGetAppName(),1,

63.     PRE_CONFIG_INTERNET_ACCESS);

64.     try

65.     {

66.     pFtpConnection=pInetSession->

67.     GetFtpConnection("192.34.45.0");

68.         }

69.     catch(CInternetException *pEx)

70.         {

71.     pEx->Delete();

72.     pFtpConnection=NULL;

73.     *pnFileStatus=-1;

74.     goto BallOut;

75.         }

76.         *pnFileStatus =1;

77.     pFtpConnection->Remove("test.txt");

78.     if(!pFtpConnection->PutFile

79.     ("test.txt","test.txt"))

80.     *pnFileStatus=-2;

81.         else

82.     *pnFileStatus=2;

83.       BallOut:

84.     if(pFtpConnection!=NULL)

85.         {

86.     pFtpConnection->Close();

87.     delete pFtpConnection;

88.         }

89.         delete pInetSession;

90.         AfxEndThread(0);

91.         return false;

92.       }

93.     编辑ftpfwview.cpp中的OnDraw()函数

94.       void CFtpfwView::OnDraw(CDC* pDC)

95.       {

96.         CFtpfwDoc* pDoc = GetDocument();

97.         ASSERT_VALID(pDoc);

98.         if(!m_bConnectAttempted)

99.         {

100.     m_bConnectAttempted=TRUE;

101.     AfxBeginThread((AFX_THREADPROC)

102.     CFtpThread::PutFile,&m_nFileStatus);

103.         }

104.       }

105.     编译并且执行程序,在连接和传输的过程中,应用程序仍然可以作自己的工作,这是因为传输的过程发生在线程中。

总结语

---- 通过以上的程序我们可以明白FTP的工作原理,我们可以编制自己的获得FTP服务器的文件以及获得FTP服务器的根目录,亲自体验一下我们的程序工作的怎末样。

 

源文档 <http://life0.blog.51cto.com/87691/12410/>

 

深入理解VC6.0环境下构建FTP服务器的源码详解 搭建一个基本的FTP服务器需要掌握网络编程和多线程编程的知识。具体而言,开发者需要了解TCP/IP协议栈、Winsock接口编程以及多线程同步机制。在VC6.0环境下,通过MFC(Microsoft Foundation Classes)框架或Win32 API均可实现上述功能。在进入下一章深入了解MFC框架在FTP服务器开发中的应用之前,请确保你已经具备了以上基础。随着章节的深入,你将逐步接触到更多关于MFC框架的高级应用和优化实践,为后续的源码文件解析和核心功能实现打下坚实基础。 阅读详情

相关推荐

vc 6.0开发ftp断点续传源代码

在自己的工程中引入所有文件,在stdafx.h中对照本下载工具项目的stdafx.h,应该是要加入afxsock.h。 参考main.cpp。主要是调用DownloadHelper。先添加任务,然后设置onFinish(下载完成后的动作),最后start。 如果目录中已有该文件,程序会自动覆盖,不会出错。 默认下载端口是80,不支持其他端口。如果要这个功能,请修改Mydownload中的fnMyDownload,HttpDownLoadNonProxy加入nHostPort。 ###fnMyDownload说明: bool fnMyDownload( CString strUrl, CString strWriteFileName, unsigned long *& downloaded, unsigned long & totalSize, CString strProxy, int nProxyPort, int nThread ) strUrl: 需要下载的文件地址, 如:“http://10.20.1.6/musiconline/091029/daisy.mp3” strWriteFileName: 下载后文件的存放地址,如:“d:\\” downloaded: 指针引用,调用函数后会不断变化,实时反映已下载多少字节的数据 totalSize: 传递引用,表示所要下载文件的总长度,与downloaded配合可以分析各种下载信息 strProxy,nProxyPort 这两个为代理选项,有的话填上,如"192.168.1.89",8080 没有的话麻烦点填上"",0 。(呵呵,暂时没有去研究具体怎么使用) nThread: 用于下载开启的线程数,一般3,4个最佳。。太多反而降低速度,而且有些服务器不支持多连接。 例:fnMyDownload("http://10.20.1.6/musiconline/091029/daisy.mp3","d:\\",downloaded,totalSize,"",0,3) ###代码说明 Mydownload.cpp底端的fnMyDownload函数是下载器的关键函数。 其中在原作者的基础上,加了几句编码转换的代码。把网络的文件名和路径转化为UTF8,但这里可能会有问题,例如中文域名。有需要,请再作修改。 DownloadHelper是外围封装的类,用于列表管理,自动断点重连。 ChineseCode用于编码转换。 Thread是一个封装好的线程类,被DownloadHelper继承。类似于Java的Thread类。 ###Mydownload代码笔记: 从fnMyDownload开始,程序首先解析输入的url,拆分为地址,路径,文件名等。然后获取文件头,得到文件大小,然后再下载。重点函数是ThreadDownLoad。下载完之后用FileCombine合并文件。 ###开发测试环境: windows xp + Visual C++ 6.0 !!!!!!需要使用MFC环境!!!!!!!!!!!!

在VC中实现FTP功能

文章标题:在VC中实现FTP功能原 作 者:孟学桢原 出 处:不详发 布 者:loose_went发布类型:转载发布日期:2004-04-12今日浏览:6总 浏 览:1523---- 要联接到FTP服务器,需要两个步骤,首先必须创建一个CInternetSession对象,用类CInterSession创建并初始化一个或几个同时存在的Internet会话(sessi

无序代码 2138

VC中使用ftp进行文件的读写

该程序在Visual C++中通过FTP的方式实现对文件的读和写.

2020-12-09

//补充头文件 #include <afxinet.h>#include <afxsock.h>//定义CInternetSession* m_pInetSession;CFtpConnection* m_pFtpConnection;CFtpFileFind* m_pRemoteFile;CString m_pRemoteFileName, m_LocateFileName;void CFTPClient2020Dlg::OnClickedConnect(){ // TODO: 在

weixin_45488111的博客 302

ftp server vc6.0 mfc c++代码

ftp server vc6.0 mfc c++代码 可以在window上使用,默认密码 123321 可以实际使用

银河麒麟V10 SP3系统下如何安全安装gcc-toolset-10(附yum仓库避坑指南)

本文详细介绍了在银河麒麟V10 SP3系统中安全部署gcc-toolset-10的完整方案。核心在于通过配置默认禁用的yum仓库(如EPKL仓库)并配合--enablerepo参数进行精准安装,有效规避依赖冲突风险,实现与系统默认GCC 7.3的稳定共存。文章还提供了多版本环境切换、系统维护及故障排查的实用指南,确保操作的可控与可逆。

h0i1j2k3l的博客 590

在VC中实现FTP功能_网络/通信_VC技术文章

---- 要联接到FTP服务器,需要两个步骤,首先必须创建一个CInternetSession对象,用类CInterSession创建并初始化一个或几个同时存在的Internet会话(session),并描述与代理服务器的连接(如果有必要的话),如果在程序运行期间需要保持与Internet的连接,可以创建一个CInternetSession对象作为类CWinApp的成员。 ---- MFC中的类C

xwchen的专栏 1426

五.卡尔曼滤波器(EKF)开发实践之五: 编写自己的EKF替换robot_pose_ekf中EKF滤波器

本系列文章主要介绍如何在工程实践中使用卡尔曼滤波器,分五个小节介绍: 一.卡尔曼滤波器开发实践之一: 五大公式 二.卡尔曼滤波器开发实践之二: 一个简单的位置估计卡尔曼滤波器 三.卡尔曼滤波器(EKF)开发实践之三: 基于三个传感器的海拔高度数据融合 四.卡尔曼滤波器(EKF)开发实践之四: ROS系统位姿估计包robot_pose_ekf详解 五.卡尔曼滤波器(EKF)开发实践之五: 编写自己的EKF替换robot_pose_ekf中EKF滤波器 也就是本文 ...

okgwf的博客 4138

vc实现简单的ftp上传和下载功能

<br />#include <afxinet.h><br />void CFtpHandleDlg::OnOK() <br />{<br /> // TODO: Add extra validation here<br /> CInternetSession *m_pInternetSession=new CInternetSession(AfxGetAppName(),1,PRE_CONFIG_INTERNET_ACCESS);<br /> CFtpConnection *m_pFtpConnectio

医疗影像检索 5033

minist手写数字的识别代码复现(pytorch 版本)

电脑系统:Windows 10语言环境:Python 3.8.18编译器:jupyter notebook深度学习环境:torch == 1.13.1+cu116显卡及显存: Tesla V100-PCIE-32GB卷积神经网络(Convolutional Neural Network,CNN或ConvNet)是一种 具有局部连接、权重共享等特性的深层前馈神经网络. 目前的卷积神经网络一般是由卷积层、汇聚层和全连接层交叉堆叠而成的 前馈神经网络。

2202_75521293的博客 2620

Holtek BS45F3833芯片深度剖析:如何用高集成MCU重塑超声波雾化市场格局?

本文深度剖析Holtek BS45F3833芯片如何通过高集成MCU技术重塑超声波雾化市场。该芯片集成了PWM直驱、电容检水、触摸控制等核心功能,显著提升雾化精度和效率,同时降低BOM成本和开发难度。文章通过实测数据和实战案例,展示了其在香薰机、车载设备及工业加湿器等场景的创新应用,为开发者提供了一站式解决方案。

weixin_29192211的博客 413

最简单的在VC中用MFC中FTP下载功能的实现

(1)、确定一个FTP服务器,这里假设本地主机。(2)、新建一个基于对话框的应用程序,在对话框的源文件中引用“afxinet.h”源文件。(3)、在对话框的OnInitDialog方法中链接指定的FTP服务器,将FTP根目录下的文件显示出来(没有显示文件夹)。 CInternetSession* pSession; pSession = new CInternetSession;  /

Seas_小庙的专栏 1万+

用STC8单片机解码EV1527遥控信号:从波形分析到C代码实现(附完整库)

本文详细介绍了如何使用STC8单片机解码EV1527遥控信号,从波形分析到C代码实现的完整过程。内容包括EV1527协议解析、硬件搭建、信号捕获技巧、解码算法实现及优化策略,并附有完整库代码,帮助开发者快速实现智能家居设备的无线控制。

weixin_34093995的博客 296

FTP文件操作。

VC中实现FTP功能 ----要联接到FTP服务器,需要两个步骤,首先必须创建一个CInternetSession对象,用类CInterSession创建并初始化一个或几个同时存在的Internet会话(session),并描述与代理服务器的连接(如果有必要的话),如果在程序运行期间需要保持与Int

ljz888666555的专栏 744

高通thermal-engine.conf配置详解:从虚拟传感器到CPU频率控制的完整指南

本文深入解析了高通thermal-engine.conf配置文件的架构与调优方法。从虚拟传感器的加权融合原理,到监控算法与CPU频率控制的多级策略,提供了完整的配置详解与实战调试指南。文章旨在帮助开发者与高级用户掌握底层温控逻辑,在性能与散热间实现精准平衡,并详细介绍了日志调试与场景化配置等高级技巧。

weixin_28327051的博客 495

2025东三省D题深圳杯数学建模实战解析:基于多模型融合的法医STR混合样本智能识别系统

本文深入解析了2025年东三省数学建模竞赛D题,即深圳杯赛题,聚焦于法医STR混合样本的智能识别挑战。文章系统阐述了构建一个基于多模型融合的智能识别系统的完整流程,涵盖贡献者人数判定、DNA贡献比例估计、个体基因型推断以及STR谱图去噪四大核心步骤。通过融合高斯混合模型、随机森林、非负矩阵分解、小波变换与深度学习等多种技术,并强调特征工程的重要性,为破解法医DNA混合样本分析这一行业难题提供了清晰的数学建模与AI实战思路。

weixin_29050271的博客 392

VC操作FTP服务器上传与下载资料

刚做完的项目中,有个远程升级的功能是通过FTP服务器实现的,总结一下遇到知识点。        首先要搭建一个FTP服务器,网上可以找到很多软件,我用的是server-u,方便简单。设置完毕后,要修改FTP用户权限(默认只是读取),可增加写入、删除等权限。 这时可以用dos命令进行简单的测试,dos窗口输入:1.ftp;2.open  127.0.0.1  2121(端口号),ftp默认端口为

nearwu的专栏 1648

模拟一个基站和一个移动台之间的信号传播

同样使用时间序列和上述参数计算出反射径信号的信号强度。根据时间序列和上述参数,计算出直射径信号的信号强度。该信号被视为一个简单的正弦波信号,其频率是2Hz。:时间序列,从0.1秒开始,每隔0.0001秒采样一次,直到12秒。:设置坐标轴范围,横轴范围为0到12秒,纵轴范围为-0.5到0.5。:移动台移动的速度。:移动台距离基站的初始距离。:基站到反射墙的距离。假设基站到反射墙的距离为15米。:绘制直射径信号、反射径信号和合成信号的波形图。:添加标签,标注每条曲线对应的含义。表示反射径信号的颜色为绿色,

Fanjufei的博客 292

VC++利用WinInet技术开发FTP客户端程序

摘要:WinInet是微软MFC类库提供的Win32Internet扩展接口,利用WinInet开发人员可以方便地编写出Internet客户端程序。本文主要阐述利用WinInet在VC 2005中实现FTP客户端程序的方法。相对于通常采用的IE浏览器,本FTP客户端程序更加安全可靠。 关键词:MFC;WinInet;FTP客户端程序;VC 2005 一、WinInet概述 为了开发Inter

记事本 4691

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

FTP客户端程序

<br />FTP客户端程序,VC6.0下调试通过<br /> <br />client.c<br />#include "client.h"<br />#define SOL_SOCKET      0xffff    <br /><br />int fill_host_addr(char *host_ip_addr,struct sockaddr_in *host,int port)<br />{<br /> if(port<=0||port>=(1<<16))<br />  return 254;<b

hello_sally的专栏 868

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: VC基本操作四十条
下一篇: VS2008下编译Boost::asio
liufei_learning
博客等级 码龄17年 821粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值