VC网络编程–FTP

WinInet全称是Win32 Internet Extension,它提供一个通用的网络协议访问接口,包括Gohper、FTP和HTTP。

使用WinInet开发网络应用程序的优点:

1)隐藏协议细节,简化编程:可不必深入了解协议。像使用WinSocket编程需要理解网络通信及协议基本原理;

2)熟悉编程接口:WinInet API函数和很多WinAPI函数相似;

3)稳定性好,不要求程序与底层直接联系:WinInet隐藏了协议的具体细节,使得程序不必直接使用各种协议;

4)支持数据缓存:WinInet函数为所有的协议提供缓存能力,程序员只需关心数据而不用去管理数据缓存;

5)支持多线程:由于WinInet函数在内部处理多线程的并发问题,因此WinInet函数支持多线程,在多线程中可以调用各种WinInet函数而不用担心发生问题或死锁。

WinInet类是一个总称,目前的版本中分为四组:

1)CInternetSession类:

直接继承自CObject类,用来建立与某个Internet服务器的会话。还可以向代理服务器描述连接,如果应用程序所使用的Internet连接必须保持一段时间,则可以在CWinApp类中创建相应的CInternetSession成员。CInternetSession类的成员函数如下:

QueryOption //提供一个可能的错误检测判断

SetOption //设置Internet会话的选项

OpenURL //设置URL,并对其进行分析

GetFtpConnection //打开一个FTP会话并进行连接

GetHttpConnection //打开HTTP服务器并进行连接

GetGopherConnection //打开Gopher服务器并进行连接

EnableStatusCallback //建立异步操作的状态回调

ServiceTypeFromHandle //通过Internet句柄返回服务器类型

GetContext //获取Internet和应用程序会话句柄

Close //关闭Internet连接

2)CInternetConnection类:

包括CInternetConnection类及其派生类:

CInternetConnection //管理与Internet服务器的连接

CHttpConnection //管理与HTTP服务器的连接

CFtpConnection //管理与FTP服务器的连接,可以对服务器上的文件和目录进行直接操作

CGopherConnection //管理与Gopher服务器的连接

3)CFileFind类:

包括CFileFind类及其派生类CFtpFileFind、CGopherFileFind类。CFileFind类直接继承于CObject类,这些类实现对本地和远程系统上的文件的搜索和定位工作:

CFileFind //对文件检索提供支持

CFtpFileFind //为在FTP服务器上进行的文件检索操作提供支持

CGopherFileFind //为在Gopher服务器上进行的文件检索操作提供支持

4)CInternetFile类和CGopherLocator类:

CInternetFile类包括CInternetFile类及其派生类CHttpFile、CGopherFile,这些类实现对远程系统上的文件的存取操作。

CInternetFile //允许对使用Internet协议的远程系统中的文件进行操作

CGopherFile //为在Gopher服务器上进行文件检索和读取操作提供支持

CHttpFile //提供对HTTP服务器上的文件进行操作的支持

在从Gopher服务器中获取信息之前,必须先获得该服务器的定位器,CGopherLocator类的主要功能就是从Gopher服务器中得到定位并确定定位器的类型。

WinInet有以下三个全局函数:

1)AfxParseURL:

AfxParseURL全局函数用于解析一个URL字符串,并返回服务类型:

BOOL AFXAPI AfxParseURL(

LPCTSTR pstrURL, //指向要解析的URL字符串的指针

DWORD& dwServiceType, //指定Internet的服务类型,如AFX_INET_SERVICE_FTP

//AFX_INET_SERVICE_HTTP、AFX_INET_SERVICE_HTTPS…

CString& strServer, //解析出来的主机字符串

CString& strObject, //解析出来的URL内容字符串

INTERNET_PORT& nPort //端口号(由Server或Object段指定的)

);

如果一个URL解析成功则返回非0值;如果为空URL或者不包含已知的服务类型则返回0值。

例如用AfxParseURL解析URL:service://server/dir/dir/object.ext:port,执行成功后得到的值:

strServer == “server”

strObject ==“/dir/dir/object.ext”

nPort == #port

dwServiceType == #service

2)AfxGetInternetHandleType:

AfxGetInternetHandleType函数用于获取指定的Internet句柄的网络服务类型,这些返回网络服务类型在AFXINET.H中定义:

DWORD AFXAPI AfxGetInternetHandleType(

HINTERNET hQuery //Internet查询的句柄

);

如果Handle为空或服务类型无法识别,则返回AFX_INET_SERVICE_UNK。

成功则返回相应的服务类型,如INTERNET_HANDLE_TYPE_INTERNET、INTERNET_HANDLE_TYPE_CONNECT_HTTP…

3)AfxThrowInternetException:

AfxThrowInternetException函数用于抛出一个Internet异常:

void AFXAPI AfxThrowInternetException(

DWORD dwContext, //引起异常的操作的上下文标识

DWORD dwError = 0 //引起异常的错误

);


编写支持Internet的应用程序的一般步骤:

1)创建一个CInternetSession对象

由于Internet会话是通过CInternetConnection类的对象实现的,因此首先要创建一个CInternetSession对象,建立一个Internet会话;

2)建立与服务器的连接

客户应用程序要与服务器协同工作,在创建了CInternetSession对象后, 使用CInternetSession的接如下接口(GetFtpConnetction、GetHttpConnection、GetGopherConnection),就可以得到与服务器连接的对象.

3)查询或设置Internet选项

在连接时,有时还要查询或设置Internet选项,这个工作可以通过QueryOption或SetOption函数来完成。

4)向用户反馈当前数据处理的进程信息

有时客户的应用程序在进行某些操作时,要耗费较长时间,因此需要向用户反馈当前的状态,这个工作由EnableStatusCallback函数来完成,此时还要重载OnStatusCallBack函数来实现回调函数的功能。

5)创建CInternetFile实例

调用CInternetSession类的成员函数OpenURL来建立与服务器的连接,函数返回一个CInternetFile指针。

6)文件读写操作

调用CInternetFile::Read或CInternetFile::Write函数对所得到的服务器文件进行读写操作。

7)异常处理

为提高应用程序的可靠性和容错性,必须对可能出现的问题进行处理,这种处理通常是调用CInternetException类的对象对目前可知的异常进行处理。

8)结束

调用CInternetSession::Close结束会话并销毁CInternetSession对象。

 


FTP连接:

119.    CInternetSession* pSession;   
120.    pSession = new CInternetSession;  //构造新的连接   
121.    CFtpConnection* pFtpCon;   
122.    pFtpCon = pSession->GetFtpConnection("192.168.1.23",NULL,NULL,22);//连接FTP服务器   
123.   
124.    CFtpFileFind ftpfind(pFtpCon);   
125.    if (ftpfind.FindFile(NULL)) //查找所有的文件   
126.    {   
127.        CString str ;   
128.        while ( ftpfind.FindNextFile())   
129.        {   
130.            if (!ftpfind.IsDirectory()) //判断是否是目录   
131.            {   
132.                str = ftpfind.GetFileName();   
133.                m_list.AddString(str);   
134.            }   
135.        }   
136.        if (!ftpfind.IsDirectory())   
137.        {   
138.            str = ftpfind.GetFileName();   
139.            m_list.AddString(str);   
140.        }   
141.    }   
142.       
143.    delete pSession;
198.    CInternetSession* pSession;   
199.    pSession = new CInternetSession;   
200.    CFtpConnection* pFtpCon;   
201.    pFtpCon = pSession->GetFtpConnection("192.168.1.23",NULL,NULL,22);   
202.   
203.    CString selfile;   
204.    m_list.GetText( m_list.GetCurSel(),selfile);   
205.    if (!selfile.IsEmpty())   
206.    {   
207.        pFtpCon->GetFile(selfile,"c:\\"+selfile);//下载文件到C盘   
208.    }

转载于:https://my.oschina.net/u/262502/blog/338020

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值