设为首页 加入收藏

TOP

4.4.2 定义CFtp类
2013-10-07 13:01:47 来源: 作者: 【 】 浏览:70
Tags:4.4.2 定义 CFtp

4.4.2  定义CFtp类

CFtp类是用户自定义实现FTP功能和原理非常重要的类。在本节中,用户将学习到怎样在VC环境中定义和封装CFtp类。首先定义头文件Ftp.h,代码如下:

  1. class CFtp      //定义CFtp类  
  2. {  
  3.    public:  
  4. CString ipaddr,name,password;   //IP地址、用户名、密码  
  5.               int port;         //端口号码  
  6.         BOOL FTPConnect(CString severhost,int port);        //连接FTP服务器  
  7.         CSocket *m_clientsocke; //套接字对象  
  8.               CArchive *archive;    //串行化对象  
  9.               CSocketFile *socketfile;          //套接字文件对象  
  10.    private:  
  11.         CString Recv();         //接收命令消息  
  12.              Void Send(CString st);//发送命令消息  
  13.              Void UpdataFile(CString str);      //上传文件  
  14.              Void DownLoadFile(CString str1);   //下载文件  
  15.         Void GetFileStatu(char ch);//获取文件属性   
  16. }  

从上面的CFtp类声明中,用户可以看到FTP编程(www.cppentry.com)相关的数据和实现方法。下面将根据FTP基本功能介绍每个函数。首先,客户端应该连接服务器,登录方式为匿名。其函数实现如下:

  1. BOOL CFtp::FTPConnect(CString severhost,int port)  
  2. {   
  3. CSocket  *m_clientsocket=new CSocket();         //构造连接套接字对象  
  4. m_clientsocket->Create(21,SOCK_STREAM,FD_READ|FD_WRITE,NULL);  
  5. //创建流式套接字  
  6. if(!m_clientsocket)                 //判断套接字对象创建是否成功  
  7. { MessageBox("套接字创建失败!");   
  8. return false; }                 //创建m_clientsocket失败    
  9.   if(!(m_clientsocket->Connect((atoi)severhost,port)))   
  10. return false;   //连接FTP服务器  
  11.     else  
  12. { return true;} //连接成功将返回true  

客户端连接FTP服务器,成功则返回true,否则返回false。如果连接成功,则需要向服务器发送命令以初始化服务器和获取服务器文件列表。函数Send()定义如下:

  1. Void CFtp::Send(CString charstring)     // Send()函数发送信息到服务器  
  2. { CSocketFile * socketfile; //定义对象指针  
  3. socketfile =new CSocketFile(m_clientsocket);   
  4.     //关联对象m_clientsocket是创建的套接字  
  5. archive=new CArchive(&m_sockfile,CArchive::load| CArchive::store);   
  6.     //创建对象m_archive的实例并指定属性  
  7.       charstring=""USER"+lymlrl+"PASS"+123456";     //构造字符串charstring  
  8.       archive.WriteString(" "+"\r\n");      //向服务器发送空字符串进行初始化    
  9.  try{     
  10. archive ->WriteString(charstring +"\r\n");  
  11.                     //调用CArchive类的WriteString发送命令  
  12. archive ->Flush();                  //强制写入命令到服务器  
  13. }  
  14.   Catch(CException e)//处理被抛出的异常   
  15.  {  
  16.  MessageBox("发送关闭命令失败!");    
  17. }  

当命令发送后,服务器会返回客户端请求的数据。函数Recv()的实现如下:

  1.         // Recv()函数接收服务器返回的数据  
  2. CString CFtp::Recv()  
  3. {  
  4. CString recvstr=" ";    //初始化字符串recvstr为空  
  5. if(archive->ReadString(recvstr))        //接收返回信息并放到recvstr变量  
  6. {  
  7. if(recvstr==" ") MessageBox("接收数据为空");  //如果接收的数据为空则提示  
  8. { MessageBox("接收数据成功");  
  9. return recvstr; //返回数据  
  10. }}//返回接收到的数据  
  11. else   
  12.      {  
  13. MessageBox("接收数据失败");  
  14. }//提示接收数据失败  

函数Recv()利用"archive->ReadString(recvstr)"读取服务器返回的数据或者其他信息。其中,包括文件的属性等信息。用户可以从服务器返回的数据中读取文件的属性。函数实现如下:

  1. Void CFtp::GetFileStatu(char car)       //参数car表示接收到的数据  
  2. {  
  3.    char buf[100]={0};   //用于保存临时数据  
  4.    char ch="a";         //初始化字符变量  
  5. CString str="";         //定义字符串  
  6. int i=0,j=0;            //定义循环变量  
  7. for(int i=0;i<1024;i++) //循环解析消息数据以获得一条完整的信息  
  8. {     
  9.       if(car[i]!="\")buf[i]==car[i];    //取得的
    信息不是"\",则保存到临时变量  
  10.     else   
  11. {   
  12. if(car[i+1]=="r")MessageBox("成功解析一条消息!");  
  13.         //如果取得的是结束符号,则提示成功提取  
  14. }  
  15. }  
  16. while(ch!=""&&i<1024)  
  17. {  
  18.    if(buf[i]!=""&&buf[i+1]==EOF)str+=(CString)buf[i];  
  19.         //如果不是空格,则保存在字符串变量中  
  20. else  
  21. {   
  22. ch=buf[i+1];            //如果是空格,则移动到下一个字符  
  23.   i+=1;  
  24.   j+=1;  
  25. str=""; //将字符串变量重新设置  
  26. }   
  27. switch(j)//根据变量j进行选择信息字符段  
  28. {  
  29.   case 1:  
  30.          MessageBox("文件最后一次保存的日期是:%c",str);  
  31.         //打印文件各属性  
  32.   case 2:  
  33.          MessageBox("文件最后一次保存的时间是:%c",str);   
  34.   case 3:  
  35.            MessageBox("文件的大小是:%c",atoi(str));    
  36.   case 4:  
  37.          MessageBox("文件的名称是:%c",str);         
  38. }  
  39.  }   
  40.     } 

函数GetFileStatu()根据参数car所指向的接收内容数组,通过循环方式获取一条完整的信息,然后再从这条信息中取得各属性。

CFtp类中很重要的作用是上传和下载文件,这两个功能的实现方法如下:

  1. Void CFtp::UpdataFile(CString str)          //参数
    str表示上传文件的路径  
  2. {  
  3. archive->WriteString("STOR "+"\r\n");   
  4.         //调用CArchive类的WriteString()函数发送STOR命令  
  5. char buff[1024]={0};            //设置缓冲区  
  6. SOCKET sock;    //与服务器建立连接成功后返回的套接字句柄  
  7. CFile file(str,CFile::modeReadWrite);   //关联文
    件对象并指定文件属性为可读可写  
  8. file.Read(buff,1024);   //读取文件内容到缓冲区中  
  9. file.close();           //读取完毕,关闭文件  
  10. ::Send(sock,buff,1024,NULL);            //调
    用Send()函数发送文件内容到FTP文件  

函数UpdataFile()根据参数str所指定的本地文件路径上传文件。首先读取本地文件内容到缓冲区中,利用函数Send()将缓冲区的内容发送到服务器。下载文件函数DownLoadFile()的实现方法与函数UpdataFile()一样,其具体实现如下:

  1. Void CFtp::DownLoadFile(CString filename)  
  2. //参数filename表示从列表中获取的文件名  
  3. {  
  4. int lenth;      //已经获取的文件大小  
  5. int i=0;  
  6. archive->WriteString("RETR "+"\r\n");   
  7.            //调用CArchive类的WriteString()函数发送RETR命令  
  8. archive->WriteString(filename +"\r\n"); //向
    服务器发送将要下载的文件名称  
  9. char buff[1024]={0};            //设置缓冲区  
  10. SOCKET sock;    //与服务器建立连接成功后返回的套接字句柄  
  11. CFile file(filename,CFile::modeReadWrite);  //
    建立文件并指定文件属性为可读可写  
  12. while(lenth!=0)   
  13. {  
  14. ::Recv(sock,buff,1024,NULL);    //在套接字上接收数据到缓冲区中      
  15. file.Write(buff,1024);          //将缓冲区内容写到文件中  
  16. lenthlenth=lenth-1024;//从文件总大小中减去已经接收并写入文件中的大小  

本节封装了CFtp类发送命令、接收数据、获取文件属性和上传下载文件等FTP主要操作。用户在程序中使用该类时,应将其头文件"Ftp.h"和"Ftp.cpp"加入到工程中,然后创建CFtp类对象对各函数进行调用即可。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇4.4.3 使用CFtp类编程 下一篇4.4.1 建立工程

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: