FTP-Verbindung per Programm

Ok, das mit der Verbindung funktioniert ganz gut, allerdings disconnected der nicht richtig!
Weil wenn ich nach beenden des Programms auf den FTP will, sagt der mir das da noch jemand drauf ist...

Passiert auch nur, wenn das Programm die Datei nicht findet!

So nach 2 minuten geht es dann erst wieder (ist so ein kostenloser arcor-ftp zum testen)


Noch 2 Fragen:
1: Kannst du mir das:
Code:
AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0);
mal genauer erklären?

2: Wie hast du die Bibliotheken im nachhinein eingebunden?
Denn mir den voreingestellten, funktioniert das nicht!
Ich musste deine Bibliotheken zu den anderen hinzufügen und dann gings...

Danke aber erstmal

Tip für alle mit dem selben Problem:
MFC's einbinden geht auch bei der erstellung einer Win32 Anwendung
 
Zuletzt bearbeitet:
moin


Wenn man jetzt von meinem Beispiel ausgeht, sollte man vielleicht noch ein connection->Close();
machen.


mfg
umbrasaxum
 
Also ich habe den Code mal ein wenig geändert und Dokumentiert

Code:
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0);

	CInternetSession session;
	CFtpConnection *connection;
	CInternetFile *file;

	char buffer[100], server[100] = {"home.arcor.de"},login[50] = {"usr"}, passwd[30] = {"pwd"};
	int port = 21;
	
	cout << "Verbinde mit " << server << " ...\n";
	
	if(connection = session.GetFtpConnection(server, login, passwd, port, 0)) // Verbindung herstellen
	{
		cout<< "...mit Erfolg\n";

		cout << "Versuche Verzeichniss zu wechseln...\n";

		if(connection->SetCurrentDirectory("test"))								//Verzeichniss wechseln
		{
			cout<<"...mit Erfolg!\n";
		}	else	{
			cout << "...ohne Erfolg\nVerbindung wird geschlossen!\n";
			connection->Close();
		}
		cout << "Oeffne Datei...\n";

		if(!(file = connection->OpenFile("info.txt", GENERIC_READ, FTP_TRANSFER_TYPE_BINARY, 1))) // Datei oeffnen
		{
			cout<<"...ohne Erfolg\nVerbindung wird geschlossen!\n";
			connection->Close();
		}	else	{
			cout<<"mit Erfolg!\n";
		}

		file->Read(buffer, 100);		//Datei lesen

		cout<< buffer;					//Datei ausgeben
		session.Close();
		connection->Close();
	}	else	{
		cout << "Es konnte keine Verbindung hergestellt werden!";
	}
	return 0;
}
 
Zuletzt bearbeitet:
Wahrscheinlich setzt die Methode Read von CInternetFile kein Nullbyte an das Ende der Zeichenkette. Bei der Ausgabe wird deshalb über die eigentliche Zeichenkette hinaus gelesen.

Entweder du löst das dadurch, dass du vorher buffer mit lauter Nullen füllst oder du setzt an das Ende des Strings selber ein 0. Die Länge des Strings wird von Read zurückgegeben.
 
Das mit der '\0' hab ich mir auch fast gedacht, allerdings hab ich nicht gewusst wie ich die länge hole, aber wenn Read die länge zurückgibt, wie kann ich das dann in die Funktion selbst einbauen?
Code:
flie->Read(buffer, ?)
Danke
 
Zuletzt bearbeitet:
Hab keine Ahnung von den Funktionen!

Aber ich denke bei Getfile, lädt er die Datei runter... das soll er eigentlich nicht machen.

Gibt es nicht auch hier eine feof funktion?

Dann würde ich das nämlich zeichen für Zeichen auslesen bis feof erreicht ist
 
Zuletzt bearbeitet:
moin


Code:
int i = file->GetLength();
file->Read(buffer, 100);
buffer[i] = '\0';

Frag mich ncihtr warum aber GetLength muss vor Read aufgerufen werden, dann funktioniert es wie es soll.


mfg
umbrasaxum
 
Zurück