您的位置:首页 > 编程语言 > PHP开发

MFC实现FTP客户端程序

2014-08-31 09:42 260 查看
前天老板要求用iStation提取一些用户的本地信息,信息量比较大,用http协议肯定实现不了了。只能在服务器端开一个ftp,然后由iStation实现上传。

 

       我以为这次真的要接触那些冗繁的socket套接字编程了。先Google一下吧,没想到结果很令人惊喜,MFC居然自带了封装Ftp操作的CFtpConnection类,这可省了大事了。这个类封装的的确比较彻底了,如果进行简单的客户端设计这些已经足够用了。

 

       简单介绍一下实现吧:

 

        public:
             CInternetSession* m_pInetSession;

             CFtpConnection*   m_pFtpConnection;

 

       //CInternetSession 和 CFtpConnection 类包含在afxinet.h头文件中

 

       第一步:建立ftp连接

 

       m_pInetSession = new CInternetSession(
AfxGetAppName(), 1,

          PRE_CONFIG_INTERNET_ACCESS);

       try{

           m_pFtpConnection = m_pInetSession->

               GetFtpConnection(addr, username, password, port);

           // addr       ftp服务器的地址  LPCTSTR

           // username   登陆用户名       LPCTSTR 

           // password   密码            LPCTSTR

           // port       端口            UINT

       }

 

       //若登陆不成功则抛出异常,以下是针对异常的处理

       catch(CInternetException *pEx){

            TCHAR szError[1024] = {0};

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

                 AfxMessageBox(szError);

            else

                 AfxMessageBox(_T("There
was an exception"));

            pEx->Delete();

            m_pFtpConnection = NULL;

            return;

       }

 

       第二步:发送文件

      为了确保在发送的时候,还能够进行其他的操作,所以程序中需要一个文件发送线程,以保证良好的交互性。

      

       首先声明一个线程执行函数:

       static UINT PutFile(LPVOID pFtp);

 

       此函数的实现如下,很简单。

       UINT PutFile(LPVOID pFtp)

       {

          CFtpConnection* FtpConnection = (CFtpConnection*)pFtp;

          if(FtpConnection->

              PutFile(_T("c:/test.txt"), _T("test.txt"))){

                MessageBox(NULL, _T("发送成功!"), _T("提示"), MB_OK);

           //第一个参数为本地文件的地址,第二个为服务器端文件的地址

                return 1;

           }

           else{

                MessageBox(NULL, _T("发送失败!"), _T("提示"), MB_OK);

                return 0;

           }

       }

     

       在主线程里开启上传线程:

       CWinThread* th;

       th = AfxBeginThread( PutFile, this,

                 THREAD_PRIORITY_NORMAL, CREATE_SUSPENDED);

       th->m_bAutoDelete = FALSE;

       th->ResumeThread();

 

       需要说明的是,这里上传功能设计得非常简单。只使用了一个PutFile函数。这个函数封装了服务器端文件上传、写入和关闭等操作,所以本程序并不支持断线续传。如果想使程序支持断线续传,则需要是用CFtpConnection类中的OpenFile函数打开文件,然后使用CInternetFile类的函数来对文件进行读写控制。

 

       第三步:断开连接

 

      没有什么可说明的。

       if(m_pFtpConnection != NULL)

       {

           m_pFtpConnection->Close();

           delete m_pFtpConnection;

       }

       delete m_pInetSession;

 

      总体上看,MFC类对一些常用的网络功能提供了强大的支持,Microsoft有进一步将Windows的程序设计傻瓜化了。可能真的有一天 Visual Studio就像 Word 和 PowerPoint 一样,成为一个纯应用层面上的工具,而不再是令人望而生畏的程序开发软件了。这也正是Microsoft和Gates的野心了。

 

      正如老板说的那样:“当你毕业的时候,如果你对操作系统的认识仅仅是Windows,对硬件的认识仅仅是X86,那是一件很可怕的事情。”     

 

      睡觉喽,明天把它copy到公司,联调一下就OK了。然后继续研究Wolf……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mfc