Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    [C++] Capire quando la connessione ftp ad un server finisce

    Ciao ragazzi..io per comunicare via ftp con i server utilizzo questo metodo:

    Scrivere file
    codice:
    bool AddFileToServer(string buffer, string file)/*string directory = "tree" for default*/
    {
    HINTERNET hInternet;
    HINTERNET hFtpSession;
     
    hInternet = InternetOpen(NULL,INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
    
    if(hInternet == NULL)
    	return false;
    hFtpSession = InternetConnect(hInternet,"www.dominio.com",INTERNET_DEFAULT_FTP_PORT, "nome_utente","password", INTERNET_SERVICE_FTP, 0,0 );
    if(hFtpSession == NULL)
        {
    	int i = GetLastError();
    
    	DWORD dwError;
    	char error [500];
    	DWORD dwSize = sizeof(error);
    	InternetGetLastResponseInfo(&dwError,error,&dwSize);
    	return false;
        }
    char this_exe_path [600];
    GetModuleFileName(NULL,this_exe_path,600);
    
    string temp_file_path = this_exe_path;
    
    int found = temp_file_path.find_last_of('\\');
    temp_file_path = temp_file_path.substr(0,found);
    
    temp_file_path += "\\temp_file";
    
    ofstream out(temp_file_path);
    out << buffer;
    out.close();
    
    
    string server_file_path = "";
    server_file_path += file;
    
    BOOL bRet2 = FtpPutFile(hFtpSession, temp_file_path.c_str(), server_file_path.c_str(), FTP_TRANSFER_TYPE_BINARY, 0);
    DeleteFile(temp_file_path.c_str()); 
    
    InternetCloseHandle(hFtpSession);
    InternetCloseHandle(hInternet); 
    
    if(bRet2 == FALSE)
    	return false;
    return true;
    }
    Leggere file

    codice:
    string GetFileToServer(string file_name)
    {
    string file_content;
    HINTERNET hInternet;
    HINTERNET hFtpSession;
     
    hInternet = InternetOpen(NULL,INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
    
    if(hInternet == NULL)
        {
    	MessageBox(NULL,"Impossibile aprire un HANDLE internet","Fatal Error!!",MB_ICONERROR);
    	return false;
        }
    hFtpSession = InternetConnect(hInternet,"www.dominio.com",INTERNET_DEFAULT_FTP_PORT, "nome_utente","password", INTERNET_SERVICE_FTP, 0,0 );
    if(hFtpSession == NULL)
        {
    	int i = GetLastError();
    
    	DWORD dwError;
    	char error [500];
    	DWORD dwSize = sizeof(error);
    	InternetGetLastResponseInfo(&dwError,error,&dwSize);
    	MessageBox(NULL,error,"Fatal Error!!",MB_ICONERROR);
    	InternetCloseHandle(hInternet); 
    	return "";
        }
    
    string id = ::target_id;
    
    
    
    string file_to_read;
    file_to_read = file_name;
    
    
    HINTERNET hFile = FtpOpenFile(hFtpSession,file_to_read.c_str(),GENERIC_READ,FTP_TRANSFER_TYPE_BINARY|INTERNET_FLAG_HYPERLINK,NULL);
    if(hFile == NULL)
        {
    	int i = GetLastError();
    
    	DWORD dwError;
    	char error [500];
    	DWORD dwSize = sizeof(error);
    	InternetGetLastResponseInfo(&dwError,error,&dwSize);
    	MessageBox(NULL,error,"Erorr FTP file",MB_ICONERROR);
    	return "";
    	InternetCloseHandle(hFtpSession);
    	InternetCloseHandle(hInternet); 
    
        }
    int i = GetLastError();
    
    DWORD high_order;
    DWORD low_order = FtpGetFileSize(hFile,&high_order);
    
    unsigned long long file_size = (high_order * (MAXDWORD+1)) + low_order;
    
    
    char * buffer;
    buffer = new char [file_size];
    DWORD bytes_read;
    
    BOOL res = InternetReadFile(hFile,buffer,file_size,&bytes_read);
    
    if(bytes_read != file_size)
    	MessageBox(NULL,"bytes read different from file size!","Error",MB_ICONERROR);
    
    file_content = buffer;
    delete [] buffer;
    
    
    
    
    
    InternetCloseHandle(hFtpSession);
    InternetCloseHandle(hInternet); 
    InternetCloseHandle(hFile);
    
    
    return file_content;
    }

    Sono comnsapevole che non sono funzioni perfette, nel senso che per esempio la scrittura dei dati su file nel primo dovrebb essere binaria, poi come parametri delle funzioni dovrei mettere nome utente, donio, password e gestire meglio le eccezzioni.
    IN ogni caso il mio problema è un altro.

    Se io instauro una connessione ftp con questo programma da due computer differenti, ipotiziamo che il computer1 esegua l'upload via ftp di "ciao.txt", come fa il computer2 a capire quando il computer1 ha finito l'upload e quindi può scaicare il file?

    Avevo pensato a scriveree un codice PHP e fare due funzioni, che funzionano come i mutex per "bloccare" e "sbloccare" i file. Però sinceramente preferirei rimanero all'interno del linguaggio C++. Qualcuno ha idee?

    2 piccoli OT
    1) Vi darò notizie del problema nell'altro mio thread
    2) (posterò anche in cerco lavoro/collaborazione ma già che ci sono spero non disturbi i moderatori) Ho intenzione di sviluppare una classe per la gestione delle connnessioni ftp con il modello della fstream, exempio

    codice:
    ftp::istream in(dominio,nome_utente,passwor,file_da_scaricare);
    in >> mia_striga;
    in.close();
    Progetto non troppo complicato, c'è qualcuno che vorrebbe collaborare? me lo scriva :=)

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    ps

    Creata la libreria per le connessioni FTP, ancora un po' di testing e ci sarà il pre-release

    resta comunque il problema sopra citato

  3. #3
    Per scoprire quando una connessione al server cade puoi settare lo socket in modo che invii da solo un pacchetto vuoto in attesa di un ack di riscontro. Quello che in gergo si chiama ping e il client riceve il pong e che può essere realizzato anche inviando dati non significativi dopo un qualche minuti che il canale non è utilizzato.
    Se non invii ne ricevi dati non puoi sapere se la connessione è ancora attiva.
    ...

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    aspetta

    Aspetta, io non uso direttqmente i socket, come mostrato dal codice sopra e...a me non da fastidio che ci siano 2, 3, 4, 50 000 computer che si connettano FTP al server, mi da problemi solo quando cercano di avere l'accesso alla stesso file che magari uno sta ancora uploadando

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    pubblicata la pre-release

    Pubblicata la pre-release della mia libreria, consiglio a tutti gli utenti interessati a scaricarla perché è veramente comoda e facile da implementare.

    PRE-RELEASE solo per voi


    Tornando al problema, mi chiedevo se la funzione FtpOpenFile avvisasse nel callback se un altro pc sta aggiornando la pagina, che ne dite?

    PS aspetto commenti della mia libreria!!

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301

    Moderazione

    Originariamente inviato da kirakira93
    Pubblicata la pre-release della mia libreria, consiglio a tutti gli utenti interessati a scaricarla perché è veramente comoda e facile da implementare.
    [...]
    PS aspetto commenti della mia libreria!!
    Questo forum non è un luogo in cui pubblicizzare i tuoi lavori e raccogliere osservazioni.

    La discussione deve essere incentrata sul problema indicato nel titolo.
    Per migliorare i tuoi "prodotti", predisponi privatamente una pagina appositamente dedicata.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.