FTP(File Transfer Protocol)协议主要用来在网络上进行文件传输。FTP通讯除了有一个默认的端口21外,还有其他端口,同城两个端口同时进行数据传输。一个是默认的端口(通常为21),主要进行控制连接,即进行命令协议及服务器端响应码的传输。另一个非标准端口主要进行数据,上传下载文件等。
实现FTP协议,有两种方式,实用WinInet API和使用基本Winsock。对于一般应用,用WinInet效率要高,而且简单。也可以用Winsock来编写,这样更加灵活,但是复杂度高且需要对协议非常熟悉。
FTP是MFC的WinInet支持的三个Internet功能(HTTP, gopher)之一,我们需要先创建一个CInternetSession实例和一个CFtpConnection对象就可以实现和一个 FTP服务器的通信。不需要直接创建CFtpConnection对象,而是通过调用CInternetsession::GetFtpConnection来完成这项工作。它创建CFtpConnection对象并返回一个指向该对象的指针。
要联接到FTP服务器,需要两个步骤,首先必须创建一个CInternetSession对象,用类CInternetSession创建并初始化一个或几个同时存在的Internet会话(session),并描述与代理服务器的连接(如果有必要的话),如果在程序运行期间需要保持与Internet的连接,可以创建一个CInternetsession对象作为类CWinApp的成员。
然后利用CInternetsession对象获取CFtpConnection对象。MFC中的类CFtpConnection管理我们与Internet服务器的连接,并直接操作服务器上的目录和文件。
下面通过一个例子: 实现Ftp上传文件,下载文件功能。
程序运行界面如下:
上传功能代码如下:
void CFtpDlg::OnBtnFtpUp() { // TODO: Add your control notification handler code here CInternetSession * pInternetSession = NULL; CFtpConnection * pFtpConnection = NULL; //建立连接 pInternetSession = new CInternetSession(AfxGetAppName()); //服务器的ip地址 CString strADddress = "192.168.1.61"; //用户名与密码 CString strUserName = "test"; CString strPwd = "123456"; //服务器的目录 CString strDir = "\Image"; //服务器中的Image目录下 //若要设置为服务器的根目录,则使用"\"就可以了 //创建了一个CFtpConnection对象,之后就可以通过这个对象进行上传文件,下载文件了 pFtpConnection = pInternetSession->GetFtpConnection(strADddress, strUserName, strPwd); //设置服务器的目录 bool bRetVal = pFtpConnection->SetCurrentDirectory(strDir); if(bRetVal == false) { AfxMessageBox("目录设置失败"); return ; } else { //把本地文件上传到服务器上 CString strLocalFile = "D:\002.jpg"; CString strRemoteFile = "001.jpg"; pFtpConnection->PutFile(strLocalFile, strRemoteFile); } //释放资源 if(NULL != pFtpConnection) { pFtpConnection->Close(); delete pFtpConnection; pFtpConnection = NULL; } if(NULL != pInternetSession) { delete pInternetSession; pInternetSession = NULL; } }
下载功能代码如下:
void CFtpDlg::OnBtnFtpdown() { // TODO: Add your control notification handler code here CInternetSession * pInternetSession = NULL; CFtpConnection * pFtpConnection = NULL; //建立连接 pInternetSession = new CInternetSession(AfxGetAppName()); //服务器的ip地址 CString strADddress = "192.168.1.61"; //用户名与密码 CString strUserName = "test"; CString strPwd = "123456"; //服务器的目录 CString strDir = "\Image"; //服务器中的Image目录下 //若要设置为服务器的根目录,则使用"\"就可以了 //创建了一个CFtpConnection对象,之后就可以通过这个对象进行上传文件,下载文件了 pFtpConnection = pInternetSession->GetFtpConnection(strADddress, strUserName, strPwd); //设置服务器的目录 bool bRetVal = pFtpConnection->SetCurrentDirectory(strDir); if(bRetVal == false) { AfxMessageBox("目录设置失败"); return ; } else { //把服务器002jpg下载到E盘 CString strLocalFile = "E:\002.jpg"; CString strRemoteFile = "002.jpg"; pFtpConnection->GetFile(strRemoteFile, strLocalFile); } //释放资源 if(NULL != pFtpConnection) { pFtpConnection->Close(); delete pFtpConnection; pFtpConnection = NULL; } if(NULL != pInternetSession) { delete pInternetSession; pInternetSession = NULL; } }
当然,前提是得配置好Ftp服务器,这样运行本程序的时候,可以把本地磁盘下的文件拷贝到ftp服务器上,也可以从Ftp服务器上获取文件。