none
請問有人用EVC寫FTP程式嗎? RRS feed

  • 問題

  •  

               請問一下有人有用EVC寫一個FTP的應用程式

                 可以透過這個FTP程式來UPDATE/DOWNLOAD IMAGE

                 不知道是不是有人可以提供相關資料來參考的呢~~~謝謝

    2007年1月25日 下午 02:32

所有回覆

  • 您先看看合不合用(一個Console Mode的FTP Up/Download)


    // SFTP.cpp : Opensource,Writend By Domissjack
    //

    #include "stdafx.h"
    #include "SFTP.h"
    #include <wininet.h>

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif

    #define MaxBlock 1024

    /////////////////////////////////////////////////////////////////////////////
    // The one and only application object

    CWinApp theApp;

    using namespace std;

    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {

        void ReportError(const char*);
        int nRetCode = 0;

        // initialize MFC and print and error on failure
        if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
        {
            // TODO: change error code to suit your needs
            cerr << _T("Fatal Error: MFC initialization failed") << endl;
            nRetCode = 1;
        }
        else
        {
            // TODO: code your application's behavior here.
            void ReportError(const char*,const int);
            void ShowInformation(void);

            char pz_Mode[10] = "GET";    //default mode...
            char pz_UserName[100] = {0};    //username for ftp...
            char pz_Password[100] = {0};    //password for ftp...
            char pz_Server[100]    = {0};    //server name
            char pz_LocalFile[100] = {0};    //local file name...
            char pz_RemoteFile[100] = {0};    //remote file name...

            int int_TranSpeed = 32;    //default speed(kBs)...

            if(argc < 14)
            {
                //arugment error...
                ShowInformation();
                return 1;
            }

            // augements check...
            for(int i = 0;i < argc; i++){
                if(!strcmp("-w",argv[ i])){
                    //mode change to PUT...
                    strcpy(pz_Mode,"PUT");
                }
                if(!strcmp("-r",argv[ i])){
                    //mode change to GET...
                    strcpy(pz_Mode,"GET");
                }
                if(!strcmp("-u",argv[ i])){
                    //set username...
                    strcpy(pz_UserName,argv[i+1]);
                }
                if(!strcmp("-p",argv[ i])){
                    //set password...
                    strcpy(pz_Password,argv[i+1]);
                }
                if(!strcmp("-x",argv[ i])){
                    //set transform speed...
                    int_TranSpeed = atoi(argv[i+1]);
                }
                if(!strcmp("-s",argv[ i])){
                    //set server name...
                    strcpy(pz_Server,argv[i+1]);
                }
                if(!strcmp("-t",argv[ i])){
                    //ftp server file name...
                    strcpy(pz_RemoteFile,argv[i+1]);
                }
                if(!strcmp("-l",argv[ i])){
                    //set server name...
                    strcpy(pz_LocalFile,argv[i+1]);
                }

            }


            // create ftp connection session...
            HINTERNET h_Inet;
            HINTERNET h_Iftp;
            HINTERNET h_RemoteFile;

            FILE* h_LocalFile = new FILE;

            LPSTR pz_TranBuff;
            DWORD dw_Size = 0;    //return read size of remote file...

            //initial memory...
            pz_TranBuff = (char*)malloc(MaxBlock*int_TranSpeed);
            if(!pz_TranBuff){
                //memory dispatch error...
                ReportError("----(ERROR)MEMORY DISPATCH ERROR",0);
                return 1;
            }
            memset(pz_TranBuff,0x0,MaxBlock*int_TranSpeed);

            //internet connection...
            h_Inet = InternetOpen(
                "Ftp Service",
                INTERNET_OPEN_TYPE_DIRECT ,
                NULL,
                NULL,
                0);

            h_Iftp = InternetConnect(
                h_Inet,
                pz_Server,
                INTERNET_DEFAULT_FTP_PORT,
                pz_UserName,
                pz_Password,
                INTERNET_SERVICE_FTP,0,0);

            if(!h_Iftp){
                //ftp connecting error...
                ReportError("----(ERROR)FTP CONNECTION ERROR",GetLastError());
                return GetLastError();
            }

            //action report...
            ReportError("(STARTING)FILE TRANSFORM IN BINARY MODE",0);

            //file transform mode...
            if(!strcmp("GET",pz_Mode)){
                //FTP GET
                h_RemoteFile = FtpOpenFile(
                    h_Iftp,
                    pz_RemoteFile,
                    GENERIC_READ,
                    FTP_TRANSFER_TYPE_BINARY|INTERNET_FLAG_TRANSFER_BINARY,0);
                if(!h_RemoteFile){
                    //ftp command error...
                    ReportError("----(ERROR)COULD NOT GET FILE",GetLastError());
                    return GetLastError();
                }
                //write by binary mode...
                h_LocalFile = fopen(pz_LocalFile,"wb");

                if(!h_LocalFile){
                    //file open error...
                    ReportError("----(ERROR)COULD NOT OPEN FILE",0);
                    return 1;
                }

                //save file to local...
                do{
                    InternetReadFile(
                        h_RemoteFile,
                        pz_TranBuff,
                        (MaxBlock*int_TranSpeed),
                        &dw_Size);

                    fwrite(
                        pz_TranBuff,
                        sizeof(char),
                        dw_Size,
                        h_LocalFile);

                }while(dw_Size == (MaxBlock*int_TranSpeed));

            }
            if(!strcmp("PUT",pz_Mode)){
                //FTP PUT

                h_RemoteFile = FtpOpenFile(
                    h_Iftp,
                    pz_RemoteFile,
                    GENERIC_WRITE,
                    FTP_TRANSFER_TYPE_BINARY|INTERNET_FLAG_TRANSFER_BINARY,0);

                if(!h_RemoteFile){
                    //ftp command error...
                    ReportError("----(ERROR)COULD NOT WRITE FILE",GetLastError());
                    return GetLastError();
                }

                //read by binary mode...
                h_LocalFile = fopen(pz_LocalFile,"rb");

                if(!h_LocalFile){
                    //file open error...
                    ReportError("----(ERROR)COULD NOT OPEN FILE",0);
                    return 1;
                }

                //save file to remote...
                do{
                    dw_Size = fread(
                        pz_TranBuff,
                        sizeof(char),
                        (MaxBlock*int_TranSpeed),
                        h_LocalFile);

                    InternetWriteFile(
                        h_RemoteFile,
                        pz_TranBuff,
                        dw_Size,
                        &dw_Size);

                }while(!feof(h_LocalFile));
            }   

            //close handle...
            fclose(h_LocalFile);
            InternetCloseHandle(h_RemoteFile);
            InternetCloseHandle(h_Iftp);
            InternetCloseHandle(h_Inet);
        }

        return nRetCode;
    }

    void ReportError(const char* pz_Msg,const int int_Error){
        //error messages save to localte file...
        FILE* hErrorReport = new FILE;
        char pzErrorContext[512] = {0};
        SYSTEMTIME ssNowDate;
       
        hErrorReport = fopen("./ErrorReport.log","a+");

        //write formating messages...
        GetLocalTime(&ssNowDate);
        sprintf(pzErrorContext,"RESTORED AT:%04d/%02d/%02d-%02d:%02d:%02d\t%s[%d]\n",
            ssNowDate.wYear,
            ssNowDate.wMonth,
            ssNowDate.wDay,
            ssNowDate.wHour,
            ssNowDate.wMinute,
            ssNowDate.wSecond,
            pz_Msg,int_Error);
        fwrite(pzErrorContext,1,strlen(pzErrorContext),hErrorReport);
        fclose(hErrorReport);
        return;
    }

    void ShowInformation(void){
        //copyright&information
        printf("[Small FTP version 1.0a] design by domissjack\n\n");
        printf("USAGE:sftp {-r|-w} -s server -u user -p password -x borespeet -t remote_file -l local_file\n");
        printf("Exam:sftp -r -s \"10.10.1.7\" -u test -p 1234 -x 8 -t \"/antai/index.asp\" -l \"./index.asp\"\n");
        return;
    }

    2007年2月27日 上午 04:36
  • 如果你的目的只是要更新image,

    建議你可以使用FTP Server的方式,那就可以遠端更新。

    如果你想自己寫的話,可以參考FTPUpdate,它就是一個透過FTP update image的例子。

     

    2007年3月8日 上午 09:57
  •  

                      請問一下,您所謂的FTP Server是指在catalog那邊加入這個元件

                     就可以讓CE透過網路去更新IMAGE嗎,是否還需要加什麼設定呢

                      不知道我可以在哪看到相關資料呢?因為之前有加入過不過好像沒多增加什麼東西

                        

                     

    2007年3月14日 下午 11:18
  • 1. 就是catalog上的FTP server

    2. 必須加入正確的路徑設定,另外FTP server是一個service,

        所以你要用網路連線去測試它。(看起來當然不會增加什麼東西)

        http://msdn2.microsoft.com/fr-fr/library/ms881875.aspx

    2007年3月16日 上午 02:08
  •  

       請問一下,在catalog上的FTP server加入之後是讓CE device變成server然後要由別台電腦連上這台

           CE device更新嗎,還是說我可以用一般的電腦(可能是Win XP,Win2000...),然後由

            CE device再連上去更新image,不知道catalog上的FTP server是屬於哪一種呢

           

    2007年3月16日 上午 02:58
  • 你的CE device就會變成server

    所以你可以在XP連上CE device後,

    將要更新的image upload到CE device,

    取代原本的image即可。

    2007年3月16日 上午 03:34
  •  

                         了解,看來跟我想要的似乎有出入

                        因為我是想要讓CE device來連到我的電腦更新image

                         所以看來是要用FTPUpdate這個程式囉

                          還是先來看這個範例的程式碼了,謝謝您的回覆悠

                 

    2007年3月16日 上午 03:39
  • 嗯~~如果是反向的話,

    那就是使用FTPUpdate了。

     

    2007年3月16日 上午 03:44