FtpS Ssl Tls



  • Hallo und guten Abend

    Ich hab mir diese Plattform für mein erstes Programm in C++ zuhilfe genommen. Wie ihr sicher schnell bemerkt bin ich C++ Anfänger und komme von der VB-Welt.

    Für eine kleine FTP-Applikation, wurde der Vorschlag gemacht dies mit C/C++ zu machen. Leider steht mir "nur" MS Visual C++ Express zur Verfügung. Aber wie ich feststellen konnte ist es auch mit diesem Compiler möglich, C++ Programme zu erstellen. Die Grenzen der Möglichkeiten kann ich aber noch nicht abschätzen. Verbesserungsvorschläge nehm ich immer entgegen.

    Ich hab mir zu Übungszwecken nachfolgendes Programm erstellt, dass auch funktioniert. Wie ich aber ziemlich schnell bemerkte ist es mit 'WinInit' nicht möglich SSL Sicherheiten einzubinden. Kann mir das jemand bestätigen?

    Ich hab jetzt schon einige Stunden im Internet gesucht, aber etwas wirklich schlaues habe ich noch nicht gefunden. Welche Möglichkeiten gibt es ein FtpS (ssl/tls) Programm zu schreiben?

    Besitzt vielleicht jemand ein gutes Beispiel. Für jeden guten Tip wäre ich sehr dankbar.

    Ich danke für die Feedbacks.

    wachs

    #include "stdafx.h"
    #include <iostream>
    #include <windows.h>
    #include <wininet.h>
    
    #pragma comment(lib, "wininet.lib")
    #pragma comment(lib, "ws2_32")
    
    using namespace std;
    
    bool FileUpload(wchar_t *host,int port,wchar_t *user,wchar_t *pass,wchar_t *locFile,wchar_t *remFile,wchar_t *fEntry);
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	wchar_t* ftpHost = _T("ftpServer");
    	int ftpPort = INTERNET_DEFAULT_FTP_PORT;
    	wchar_t* ftpUser = _T("user");
    	wchar_t* ftpPass = _T("pw");
    	wchar_t* lFile = _T("daten.txt");
    	wchar_t rFile[50] = _T("daten.txt");
    	wchar_t fEntry[150] = _T("/dir/");
    
    	FileUpload(ftpHost,ftpPort,ftpUser,ftpPass,lFile,rFile,fEntry);
    
    	getchar();
    	return 0;
    }
    
    bool FileUpload(wchar_t *host,int port,wchar_t *user,wchar_t *pass,wchar_t *locFile,wchar_t *remFile,wchar_t *fEntry)
    {
    	HINTERNET hINetOpen,hINetConnect;
    	wchar_t pstrDirName[MAX_PATH];
    	size_t lpdwSize;
    	BOOL bRet=false;
    
    	cout<<"Ftp FileUpload begin ..."<<endl;
    
    	__try{
    		 hINetOpen = InternetOpen(L"Ftp Upload", 
    								  INTERNET_OPEN_TYPE_DIRECT, 
    								  NULL, 
    								  NULL, 
    								  0);
    		 if(!hINetOpen == NULL){cout<<"Internet Connectioned Detected..."<<endl<<endl;}
    		 else{cout<<"Internet Connection Not Detected. Error: "<<GetLastError()<<endl;return false;}
    
    		 hINetConnect = InternetConnect(hINetOpen, 
    										host, 
    										port, 
    										user, 
    										pass, 
    										INTERNET_SERVICE_FTP, 
    										INTERNET_FLAG_PASSIVE, 
    										0);
    		 if(!hINetConnect == NULL){cout<<"Successfully connected to the ftp server.."<<endl;}
    		 else{cout<<"Cannot Connect to the ftp server. Error: "<<GetLastError()<<endl;return false;}
    
    		 lpdwSize=GetCurrentDirectory(MAX_PATH,pstrDirName);
    		 if(lpdwSize==0){cout<<"Error calling GetCurrentDirectory"<<endl;}
    		 else{lpdwSize*=sizeof(wchar_t);
    			  wcout<<"Current relative Client Directory set to: \n\t"
    				   <<pstrDirName<<endl
    				   <<"\tLenght of Directory is: "<<lpdwSize<<endl<<endl;}
    
    		wcscat_s(pstrDirName,L"\\");
    		wcscat_s(pstrDirName,locFile);
    		wcscat(fEntry,remFile);
    
    		bRet = FtpPutFile(hINetConnect,
    						  pstrDirName,
    						  fEntry,
    						  FTP_TRANSFER_TYPE_BINARY,
    						  0);
    		 if(bRet){cout<<"Upload Files is ready ..."<<endl<<endl;}
    		 else{cout<<"Cannot Upload Files. Error: "<<GetLastError()<<endl;return false;}
    
    		 cout<<endl;
    		return true;
    	}	
    	__finally{
    		InternetCloseHandle(hINetOpen);
    		InternetCloseHandle(hINetConnect);
    		cout<<"File Upload is finish!"<<endl;
    	}
    }
    


  • Du könntest u.a. libcurl verwenden.



  • Guten Morgen

    Zuerst einmal meinen Dank für den Tip. Von libcurl habe ich schon einmal was gehört. Ich hab die Seite jetzt nochmals angeschaut. Scheint ein mächtiges Werkzeug zu sein, mit guten Möglichkeiten.

    Vielleicht muss ich ein wenig ausholen für was ich meinen Zugriff brauche.

    Den Zugriff auf eine Webspace im Internet brauche ich um Dateien abzulegen. Die entsprechende Webspace bringt auch die Möglichkeiten mit für einen FtpS-Zugriff.

    Das Programm erstellt ausgewählte Berechnungen technischer Natur. Von Zeit zu Zeit holt sich das Programm einige Dateien, sei es für bestimmte Berechnugsparameter oder sei es für die Veränderung der Grundeinstellungen die dann wieder auf die Webspace zurückgespeichert werden. Hierbei kann es sich um Html-Code handeln, aber es sind sicher auch andere Dateien vorhanden mit Xml-Formate (z:B. für die Grundeinstellungen des Programmes). Die entsprechenden Werte erstellt das Programm selber, packt sie in den XML- bzw. Html-Code und legt sie ab.

    Damit das Programm "flexibel" bleibt, muss es auch auf anderen Computer laufen. D.h. Jeder Berechtigte kann sich das Programm vom Internet zur Nutzung runterladen. Vorläufig soll es jedoch nur auf Windows 32/64 laufen.

    Und genau hier fangen meine Überlegungen an. Es ist unzumutbar einem Kunden vorauszusetzen, dass er OpenSsl und lincurl schon auf dem System installiert hat. Ich suche nach einer Lösung, in dem ich ein FtpS-Tool anbieten kann, in dem die grundlegenden Werkzeuge für den Zugriff per FtpS schon enthalten sind. Alles Free natürlich. Diese werden dann dem Berechnungsprogramm hinzugefügt. Ziel wäre hier schon, dass keine Installation notwendig ist, um das Programm zu starten und zu nutzen.

    Auf der libcurl Homepage findet man nicht einmal eine richtige Installations-Anweisung. Darum ist es mir noch unklar, ob es für mich in frage kommt.

    Gibt es andere Möglichkeiten, die mein Vorgehen unterstützen würden?. Wäre für jede gute Idee dankbar.

    Danke für die Hilfe.

    Wachs



  • wachs schrieb:

    Und genau hier fangen meine Überlegungen an. Es ist unzumutbar einem Kunden vorauszusetzen, dass er OpenSsl und lincurl schon auf dem System installiert hat. Ich suche nach einer Lösung, in dem ich ein FtpS-Tool anbieten kann, in dem die grundlegenden Werkzeuge für den Zugriff per FtpS schon enthalten sind.

    Denkfehler, libcurl ist eine Bibliothek, die bindest du in dein Programm ein und nutzt sie dort. Dabei gibt es 2 Möglichkeiten:
    - statisch: dabei wird der Bibliothekscode in deine Executable einkompiliert, d.h. du hast eine Datei mit allem drum und dran (die eventuell etwas größer ist)
    - dynamisch: deine Exe-Datei wird kleiner, erfordert aber noch abhängige Bibliotheksdateien, sprich dlls, die z.B. im gleichen verzeichnis liegen.

    Bei beiden Wegen lieferst du z.B. ein Archiv aus, in dem alle benötigten Dateien vorhanden sind. Sprich es muss entpackt werden und kann dann gestartet werden.



  • Skym0sh0 danke für die Antwort.

    Das habe ich jetzt nicht daraus erkennen können. Hört sich gut an. 😋

    Gibt es bei OpenSsl diese Möglichkeit auch? Leider habe ich mich bis zum jetzigen Zeitpunkt noch nicht gross mit dem Thema befassen können. Aber ich bin ernsthaft daran.

    Ich werde mir die libcurl mal runterladen. Mal schauen wie weit ich kommen.

    Wäre irgendwie noch cool, wenn es einen Wrapper oder dergleichen gäbe, der alles schon beinhaltet, und den ich nur noch einbinden müsste.

    nochmals danke.

    wachs



  • edit: Frage falsch gelesen, sorry.



  • Ich erlaube mir einfach mal die Frage: Wieso in C++?

    (Wie ich finde) könnte man selbst über das Kompilieren in C++ mehrere Bücher schreiben, was halt auch das Einbinden von Bibliotheken beinhaltet. Das geht meistens nicht per Oneclick wie in Java/Eclipse.



  • Mahlzeit

    C++ ist so vorgegeben. U.a. wäre das eine Möglichkeit für mich, mich mit C++ zu befassen.

    "Per Oneclick" würde ich bei so einer Frage nie erwarten. Aber sofern es so etwas gäbe, will ich nicht nochmals das Rad erfinden ....

    Es ist aber schon so. Es wäre für mich eine gute Möglichkeit das C/C++ besser kennenzulernen.

    wachs



  • Naja, übermenschlich schwer ists auch nicht eine Bibliothek einzubinden, so ists nicht.

    Aber ich finds halts nicht so easy wie in z.B. Java.
    Und du wirst zu Beginn mit 2-3 Stunden Arbeit rechnen müssen, dein Projekt aufzusetzen.


Log in to reply