在VC中实现FTP功能

简介:
要联接到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服务器的根目录,亲自体验一下我们的程序工作的怎末样。









本文转自 life0 51CTO博客,原文链接:http://blog.51cto.com/life0/12410,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
Web App开发 容灾 安全
非功能关键知识总结
【2月更文挑战第4天】非功能关键知识总结
70 2
|
4月前
|
前端开发
SSM整合-前后台协议联调(列表功能、添加功能、添加功能状态处理、修改功能、删除功能)
SSM整合-前后台协议联调(列表功能、添加功能、添加功能状态处理、修改功能、删除功能)
35 0
|
3月前
|
C++
BugProfiler功能使用介绍
BugProfiler功能使用介绍
23 0
|
4月前
楼中楼回复评论功能的实现
@(真棒)装就完事了. 今天给写的评论系统增加了楼中楼功能,众所周知,楼中楼评论实现是有困难的,我的确也踩进了很多坑。 这里跟大家讲述我是如何实现的.
51 0
|
8月前
|
数据安全/隐私保护
主要功能
5.1.1 PowerPoint 2010的主要功能 PowerPoint 2010的主要功能是将各种文字、图形图表、音频、视频等多媒体信息以图片的形式展示出来。 在PowerPoint 2010中,将这种制作出的图片叫做幻灯片,而一张张幻灯片组成的文件叫做演示文稿文件。 其默认扩展名为.pptx 模板文件扩展名: potx 放映文件扩展名:ppsx 5.1.2 新建和打开演示文稿 启动PowerPoint 2010后,显示的窗口被称为演示文稿的工作窗口,该窗口主要由快速访问工具栏、选项卡、“幻灯片/大纲”窗格、幻灯片编辑窗格、备注窗功能区、格、任务窗格、状态栏、视图切换按钮和显示比
|
10月前
|
Java 开发者 Spring
AskBlog v0.1版基本功能
AskBlog v0.1版基本功能
50 0
BXA
|
11月前
|
Web App开发 算法 安全
C++11:必须关注的一个功能
C++11是C++语言的一次重大更新,旨在解决一些C++03语言存在的问题,从而提高其可靠性和可用性
BXA
70 0
|
Python Serverless 容器
Funfile 功能介绍
前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。
4972 0
|
网络协议 开发者 存储
1-关于"小五物联"的功能介绍(使用介绍)
随着自己做的APP"小五物联"的功能的不断增加,为了方便使用者,对该APP的使用,用这篇文章做介绍,以后没更新一项功能就会重新编辑这篇文章.一,绑定设备(WIFI开关(MQTT))WIFI开关,主要是绑定WIFI模块实现远程控制具体绑定请看http://www.
1320 0
|
Web App开发 Linux 程序员