Statistik  Mitglieder gesamt: 68142  Mitglieder online: 8  Gäste online: 3 mehr...
Anzeige
| Thread: [Vermutlich gelöst] FTP mit C?
 10.03.2008 17:13 Uhr
|
|
|
|
|
Hallo,
ich bin gerade dabei, ein Programm zu schreiben, mit dem man seine Dateien auf einen FTP-Server hochladen kann, um sie von woanders automatisch runterladen zu können. Der Zweck ist aber eigentlich auch egal, es geht darum, dass sich Windows weigert, meine FTP-Befehle auszuführen. Ich kopier hier mal die relevanten Teile des Sourcecodes rein. Sämtliche Variablen sind definiert als char soundso[100] und alle sachen (Adresse, User, PW) sind bereits abgefragt. PHP:1
2
3
4
5
6
7
8
9
| FILE * ftp = fopen("ftp.txt", "w");
fprintf(ftp, "%s\n", user);
fprintf(ftp, "%s\n", pw);
fprintf(ftp, "send config.txt\n");
strcpy(ftp_o, "ftp -s:ftp.txt ");
strcpy(ftp_o, &ftp);
system(ftp_o);
system("PAUSE"); |
Das Problem ist: Er erstellt die ftp.txt und dann geht er zum System("PAUSE"); über. Die Datei wird aber nicht hochgeladen und ich bekomme keine Ausgabe vom FTP.
Aso: Bitte keine Kommentare über meinen Programmierstil, ich weis, das System("PAUSE"); böse ist und ich lieber getch oder sonstwas benutzen soll. Es geht nur um den Fehler
Thx, Malexmave
 1 mal bearbeitet
|
|
 10.03.2008 18:07 Uhr
|
|
|
|
|
Also nach dem Quellcode zu urteilen ist doch alles so wie es ist.
Mit fopen öffnest du "lokal" eine Datei.
In die du mit fprintf etwas reinschreibst.
Da ist nirgends etwas von FTP Zugriff!
Einzig der Sinn dieser 3 Zeilen ist mir schleierhaft: PHP:1
2
3
| strcpy(ftp_o, "ftp -s:ftp.txt ");
strcpy(ftp_o, &ftp);
system(ftp_o); |
In der ersten Zeile kopierst du in die Zeichenkette ftp_o den Text: "ftp -s:ftp.txt" (nicht den Inhalt dieser Datei).
Und dann rufst du in der 2. Zeile nochmal strcpy auf und überschreibst den Inhalt von gerade eben, so dass die Zeile darüber eigentlich vollkommen wirkungslos wird. Und das nicht genug du nimmst sogar noch den Zeiger vom Zeiger der auf eine Dateizeiger zeigt ich bezweifel, dass du da überhaupt etwas sinnvolles erhältst. 1. ist ftp keine Zeichenkette sondern vom typ FILE und 2. ist ftp schon ein Zeiger daher frag ich mich was das 2. & bringen soll.
So und dann rufst du noch lokal den Inhalt von ftp_o, welcher irgend einen Datenmüll durch die 2. Zeile enthält auf, ich bezweifel dass diese Zeile überhaupt den geringsten Sinn ergibt, genauso wie die 2 Zeilen drüber.
Ausserdem vergisst du 2 Dinge, zu prüfen ob die Datei geöffnet wurde, das geht so: PHP:1
2
3
4
5
6
| FILE *ftp;
ftp = fopen("datei.endung", "modus");
if(ftp != NULL)
//mache weiter
else
//Datei konnte nicht geöffnet werden, weshalb auch immer. |
Und das 2. ist, dass du vergessen hast die Datei zu schliessen: Also auf diese Weise kannst du nur lokale Dateien öffnen und bearbeiten, für entfernte Dateien (z.B. über FTP) muss du dich schon in Netzwerkprogrammierung einarbeiten.
Leider kenn ich mich da selbst nicht aus um dir da weiterzuhelfen.
Wenn du dich aber in Netzwerkprogrammierung nicht so sehr einarbeiten willst musst du eine API finden die für dich die Netzwerkkomunikation übernimmt.
 1 mal bearbeitet
|
|
 10.03.2008 18:14 Uhr
|
|
|
|
|
Ich versuche, mit den Zeilen einen FTP-Befehl zu machen, der als Ziel eine Variable Adresse hat. Da man in System keine Variablen einbauen kann, geht es nur so. Die Textdatei macht dann die eigentliche Arbeit.
Das ist zumindest der Plan...
|
|
 10.03.2008 21:46 Uhr
|
|
|
|
|
Mit dem system() Befehl eine ftp-Verbindung aufzumachen, ist wohl einer der grausigsten Hacks die ich in letzter Zeit gesehen hab.
Wenn du simplen Code für ftp haben willst, nimm eine Skriptsprache wie PHP auf der Konsole. Auch verpönt, aber wenigstens selbst geskriptet und sehr, sehr simpel.
Falls du eine fertige Bibliothek verwenden willst bietet sich cURL an: cURL
Aber in welchem Kontext kommt das ganze überhaupt vor?
___________________________ "Etre fort pour être utile" - Georges Hébert
|
|
 10.03.2008 21:57 Uhr
|
|
|
|
|
Habe mir jetzt curl angesehen und werde das mal versuchen.
Das Programm soll mal dazu dienen, Dateien zwischen zwei (Oder 3 oder 4...) Computern zu Synchronisieren. Ich bastele gerade eine Tool-Sammlung zusammen, in der viele kleine, meiner meinung nach sinnvolle dinge zusammengefasst sind, die ich alle selbst code und später als Open Source veröffentlichen will (SourceForge).
|
|
 10.03.2008 22:03 Uhr
|
|
|
|
|
Das hab ich mir als ich den Post fertig hatte auch gedacht, hatte jedoch keine Zeit mehr ihn zu editieren, da ich weg musste.
In dem Fall ist doch dieser Befehl aber ausreichend: PHP:1
| strcpy(ftp_o, "ftp -s:ftp.txt "); |
Er enthält den Befehl, die Parameter und den Pfad zur Datei.
Wenn fprintf jedoch gecached wird (bin mir nicht sicher), kann es jedoch vorkommen, dass die Datei zu dem Zeitpunkt des Aufrufes leer ist und somit das ganze nicht funktioniert. Hier kannst du entgegen wirken, wenn du vorher die Datei mit Hilfe von fclose schliesst oder zumindest den Puffer für die Ausgabe in der Datei mit Hilfe von fflush leerst.
So nun zu diesem Befehl: Er ist in mehrerlei Hinsicht falsch:
1. Wenn du vorhattest dem String von vorher etwas anzuhängen, nämlich z.B. den Dateinamen, dann geht das so nicht, denn mit strcpy kopierst du einen String in einen anderen und hängst keinen an, d.h. der String wird ersetzt. Wenn du etwas einem anderen String anhängen willst, musst du schon zu dem Befehl strcat greifen!
2. Würdest du SO sowieso niemals einen Dateinamen anhängen, denn die Variable ftp enthält nicht den Dateinamen auch nicht deren Inhalt sondern lediglich den Zeiger auf die Datei, d.h. wo die Datei auf dem Datenträger zu finden ist. Willst du den Dateinamen der Datei haben so musst du sie in einer getrennten Variable speichern!
3. Frage ich mich was das & da sein soll, laut der Deklaration ist die Variable ftp ja schon ein Zeiger (wegen dem *) wieso dann nochmal sagen, dass er den Zeiger übergeben soll? Ich frage mich wieso der Compiler hier nicht gemeckert hat...
Eine mögliche Lösung für dein Problem könnte so aussehen (nicht getestet): PHP:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| FILE *file;
char filename[] = "ftp.txt";
char command[100];
file = fopen(filename, "wb");
if(file != NULL) {
fprintf(file, "%s\n", user);
fprintf(file, "%s\n", pw);
fprintf(file, "send config.txt\n");
fclose(file); //Alternativ: fflush(file); Jedoch dann später das schliessen der Datei nicht vergessen!
strcpy(command, "FTP -s:");
strcat(command, filename);
system(command);
}
else fprintf("Fehler: Datei konnte nicht geöffnet werden!");
system("PAUSE"); |
|
|
 10.03.2008 22:10 Uhr
|
|
|
|
|
Da ist noch ein Missverständnis:
ftp ist eine Char[100]-Variable und enthält die Adresse des Servers. Die Datei, die geschickt werden soll, steht in der ftp.txt. Diese enthält die Befehle, die ausgeführt werden sollen.
|
|
 10.03.2008 22:19 Uhr
|
|
|
|
|
Hä, dann check ich deinen ursprünglichen Code überhaupt nicht mehr!
Denn du deklarierst ftp so:
FILE *ftp;
und nutzt diese um die ftp.txt zu öffnen, nicht um dort eine Serveradresse zu speichern...
Du hättest somit 2 Variablen mit dem selben Namen, wahrscheinlich sogar in unterschiedlichem Geltungsbereich, da der Compiler ja anscheinend über Doppeldeklaration nicht geklagt hat.
Wie wäre es, wenn du einfach den gesamten Code posten würdest, damit man es nachvollziehen kann.
Aber aufjedenfall hängst du strings mit strcat an und ein fclose oder fflush solltest du vielleicht auch verwenden.
Edit:
Und selbst wenn ftp noch zusätzlich als char[100] deklariert wäre, wäre es falsch, denn 1. dürfen keine zwei Variablen gleichen Names existieren, es sei den sie befinden sich in unterschiedlichen Geltungsbereichen, aber wenn du in dem Fall nur ftp schreibst meinst du die als FILE deklarierte Variable egal welche Variable gleichen Namens sonst wo rumschwirrt.
Auch wenn die richtige Variable gewählt wäre, wäre das & falsch, denn char[100] ist genauso ein Zeiger, genau wie jedes Array nur ein Zeiger ist. Du könntest eine Arrayvariable auch so ansprechen: *(array+50) oder einen Zeiger, welcher auf 100 Einheiten zeigt auch so ansprechen: zeiger[50].
 4 mal bearbeitet
|
|
 11.03.2008 08:40 Uhr
|
|
|
|
|
Ich bin sooooo dooooof...
Ich habe ftp tatsächlich 2x deklariert: 1x als char und 1x als File. Danke für den Hinweis! So, jetzt klappt es auch ohne andere sachen wie curl. Ich werde mir curl aber trotzdem mal ansehen, weil das damit vermutlich um einiges einfacher gehen wird...
DANKE!
P.S.: Falls es trotzdem noch jemanden gibt, der den Quellcode sehen will, kann er es hier einfach Posten, dann stelle ich den code noch rein.
|
|
|