FTP-Zugriff via C++ schlägt fehl
-
Hallo zusammen,
ich habe ein C++-Programm geschrieben, das auf meinen FTP-Server zugreifen und dann eine Datei hochladen soll. Hier ist der Code:
#include <cstdlib> #include <wininet.h> #include <iostream> using namespace std; int main(int argc, char *argv[]) { char host[50]; char user[50]; char pass[50]; system("netstat > C:\\Intel\\ip.txt"); cout <<"Host: \n"; cin >>host; cout <<"User: \n"; cin >>user; cout <<"Password: \n"; cin >>pass; HINTERNET hOpen,hConnection; hOpen = InternetOpen("FTP", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); if(!hOpen) { cout <<"Error.\n"; } hConnection = InternetConnect(hOpen, host, INTERNET_DEFAULT_FTP_PORT,user, pass, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0); if (!hConnection) { DWORD ErrorNum = GetLastError(); cout <<"Error Nr.2.\nError-Nummer: " <<ErrorNum<<"\n"; } else { cout <<"Access granted!\n"; } FtpPutFile(hConnection, "C:\\Intel\\ip.txt", "IP.txt", FTP_TRANSFER_TYPE_ASCII, 0); InternetCloseHandle(hConnection); InternetCloseHandle(hOpen); system("PAUSE"); return EXIT_SUCCESS; }
Angezeigt wird mir daraufhin immer Error Nr.2 mit dem Fehlercode 12014, der besagt:
ERROR_INTERNET_INCORRECT_PASSWORDIch gebe aber zu 100% das richtige Passwort an. Könnt ihr mir vielleicht weiterhelfen?
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Wirklich 100%?
Beliebte Fehlerquellen bei Paßworteingabe sind Groß-/Kleinschreibung.
Hast im Debugger geprüft, welchen Wert dein Paßwort nachcin>> pass;
wirkich hat?
Ist der FTP-Port 21 auf deinem Host wirklich offen?
-
Ja, 100%. Habe extra aus Testzwecken sechsmal den gleichen Buchstaben in klein genommen.
Habe auch den Wert des Passwortes schon überprüft.
Eigentlich müsste der Port offen sein. Ich werde es aber nochmal nachschauen, sobald ich später zuhause bin.
-
Mal eine ganz dämliche Frage:
Capslock ist zu dem Zeitpunkt nicht zufälligerweise aktiv, oder?
-
Da du C++ verwendest solltest du in deinem eigenem Interesse auch std::string nutzen:
char host[50]; char user[50]; char pass[50];
=>
std::string host; std::string user; std::string pass;
und
hConnection = InternetConnect(hOpen, host, INTERNET_DEFAULT_FTP_PORT,user, pass, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
=>
hConnection = InternetConnect(hOpen, host.c_str(), INTERNET_DEFAULT_FTP_PORT, user.c_str(), pass.c_str(), INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
Hat vermutlich aber nichts mit deinem Problem zu tun, aber macht es dir auch in Zukunft einfacher.
Ansonsten probier mal statt INTERNET_FLAG_PASSIVE eine 0 zu übergeben.
-
Erstmal danke für eure Antworten.
Nein, Caps Lock ist nicht aktiv, ich überprüfe den Wert von pass (hier im Code nicht enthalten).Ansonsten probier mal statt INTERNET_FLAG_PASSIVE eine 0 zu übergeben.
Hatte ich vorher, hat leider auch nicht funktioniert..
Also muss es an den Port-Einstellungen liegen? Weil Fehler im Code gibt es nicht, oder?
-
mal davon abgesehen, dass man den Code schöner strukturieren könnte ...
Es macht ja keinen Sinn, InternetConnect zu versuchen, wenn InternetOpen schon fehltschlägt. dto für die folgenden Aktionen.
Auf
http://msdn.microsoft.com/en-us/library/windows/desktop/aa384363(v=vs.85).aspx
sind die Parameter für host, user und password vom Typ LPCTSTR. Bin mir nicht sicher, aber ich glaube, in Unicode-Umgebungen kann man nicht so einfach char* anstelle von LPCTSTR nehmen. Vielleicht wäre das noch ein Ansatz.
-
Was hast Du bei den Projekteinstellungen eingestellt? Unicode oder Multi-byte?
Je nach Projekteinstellungen ist LPCTSTR bei Unicode wchar_t * und bei Muli-byte char *.
Quisslich schrieb:
Bin mir nicht sicher, aber ich glaube, in Unicode-Umgebungen kann man nicht so einfach char* anstelle von LPCTSTR nehmen...
Doch wenn man explizit die Ascii Varianten verwendet InternetConnectA().
-
Wären die Projekteinstellungen nicht passend, gäbe es einen Compilerfehler wegen falschen Datentyps.
-
Es macht ja keinen Sinn, InternetConnect zu versuchen, wenn InternetOpen schon fehltschlägt. dto für die folgenden Aktionen.
Würde InternetOpen fehlschlagen, dann würde er mir den ersten Error anzeigen. Das scheint allerdings zu funktionieren, da er mir nur Error Nr.2 anzeigt, den ich dann auch mit der Error-Code-Abfrage versehen habe.
Habs mal mit string anstelle von char probiert, ändert leider nichts.
Ports sind ebenfalls freigegeben.
Hab es mit Dev C++ kompiliert, also Multi Byte.
-
Matoso schrieb:
. Das scheint allerdings zu funktionieren, da er mir nur Error Nr.2 anzeigt, den ich dann auch mit der Error-Code-Abfrage versehen habe.
MSDN:
ERROR_FILE_NOT_FOUND 2 (0x2) The system cannot find the file specified.
-
Belli schrieb:
Wären die Projekteinstellungen nicht passend, gäbe es einen Compilerfehler wegen falschen Datentyps.
Hast du recht.