Autor Beitrag
hexxler
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 31.07.14 15:27 
Hallo liebe Forenmitglieder,

ich bin neu in der C# Entwicklung und will einen Ftpclienten programmieren, der auch für Drftpd funktioniert. Drftpd hat spezielle Eigenheiten nämlich den PRET Befehl. Da die normal Ftp Library von Microsoft diesen Befehl nicht unterstützt, habe ich mich für die System.Net.Ftpclient.dll von netftp.codeplex.com entschieden, da diese laut Doku den PRET Befehl unterstützt. Ich habe jedoch ein Problem mit dem File Listing.

Folgenden Code benutze ich:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
void connectbuttonclick (object sender, EventArgs e)
{     
    FtpClient client = new FtpClient();
                                           
    client.Host = ****;
    client.Port = *****;
    client.Credentials = new NetworkCredential(user, pass);
    client.Connect();
    client.BeginGetListing(new AsyncCallback(GetListingCallback), client);
}

static void GetListingCallback(IAsyncResult ar) {
            FtpClient client = ar.AsyncState as FtpClient;

            try {
                if (client == null)
                    throw new InvalidOperationException("The FtpControlConnection object is null!");

                foreach (FtpListItem item in client.EndGetListing(ar))
                  Console.WriteLine(item);
            }
            catch (Exception ex) {
                Console.WriteLine(ex.ToString());
            }
            finally {
              System.Threading.Thread.Sleep(10);
            }

und erhalte folgende Fehlermeldung vom DrFTPD-Server:

500 You need to use a client supporting PRET (PRE Transfer) to use PASV


Ich habe schon in den Source der Library geschaut und dort wird nach dem FEAT Befehl nach PRET gesucht und sofern gefunden, wird ein Parameter gesetzt. Ich habe bereits mit einem anderen Ftpclienten zum DrFTPD verbunden und geschaut was denn FEAT liefert und siehe da es kommt in der zweiten Zeile PRET. Ich habe keine Ahnung woran das noch liegen könnte, vielleicht könnt ihr mir weiterhelfen.

Grüße

Moderiert von user profile iconTh69: B- durch C#-Tags ersetzt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4078
Erhaltene Danke: 845

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Do 31.07.14 16:32 
Hallo und :welcome:,

bitte Crossposts immer angeben: myCSharp.de - System.Net.Ftpclient PRET ERROR (DrFTPD)
Auch wenn der schon geschlossen wurde, ist das doch hilfreich.

Und ich denke, daß sich wohl kaum einer direkt mit dieser Lib auskennt und du daher selber debuggen mußt...
hexxler Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 31.07.14 18:35 
Hallo :) ,

ja die haben meinen Post geschlossen weil mir niemand weiterhelfen konnte, daher versuche ich es nun hier in der Hoffnung dass hier vielleicht jemand Erfahrung mit der Library hat. Ich werde dann mal den Debugger anwerfen vielleicht finde ich ja was und melde es dann hier.


Grüße
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4078
Erhaltene Danke: 845

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Fr 01.08.14 08:26 
Hallo,

schau mal auf diesen Post: Re: During PASV I get: 500 You need to use a client supporting PRET (PRE Transfer) to use PASV Pin:
Zitat:
Ok, solution is to first send a PRET LIST to the server, which will then respond with 200 OK, will use master for upcoming transfer. After that I can easily send my PASV and the world is fine.

Sollte es das nicht beheben, dann suche mal weiter nach der Fehlermeldung im Internet: "500 You need to use a client supporting PRET"
hexxler Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 01.08.14 12:40 
Hallo,

Danke für die Antwort erstmal. Es hat mir aufjedenfall teilweise weitergeholfen. Ich habe meine Code nun umgebaut und das ganze vorgefertigte BeginConnect weggelassen:

ausblenden C#-Quelltext
1:
2:
3:
client.Execute("PRET LIST"));
client.Execute("PASV");             
client.Execute("LIST -al");


Jetz das Debugging Ergebnis:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
230 Administrator logged in successfully.
FEAT
211-Extensions supported:
 PRET
 AUTH SSL
 PBSZ
 CPSV
 SSCN
 MLST type*,x.crc32*,size*,modify*,unix.owner*,unix.group*,x.slaves*,x.xfertime*
 CLNT
 NOOP
211 End
Text encoding: System.Text.ASCIIEncoding
PRET LIST
200 OK, will use master for upcoming transfer
PASV
227 Entering Passive Mode (192,168,80,128,7,212).
LIST -al
150 File status okay; about to open data connection.


Genau wie beschrieben in dem Link. Also aufjedenfall mal einen Schritt weiter nun ist die Frage, wenn ich das von Hand mache und nicht die Listing Routine der Library verwende wie ich weitermache.. Wenn ich mit meinem Flashfxp auf meinen Server gehe, dann kommt:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
[R] PRET LIST
[R] 200 OK, will use master for upcoming transfer
[R] PASV
[R] 227 Entering Passive Mode (192,168,80,128,7,217).
[R] Opening data connection IP: **.***.**.** PORT: 2009
[R] LIST -al
[R] 150 File status okay; about to open data connection.


Ich muss mich mal erkundigen wie genau das mit der Passive Methode genau funktioniert, ich weiss bisher nur dass der Server dann einen Port aufmacht und den dann dem Clienten übergibt, wie man hier auch schön sehen kann. Der Client wird dann auf den Port verbinden und sich irgendwie dort das Listing holen, so denke ich (:. Ich melde mich, sobald ich mehr weiss. Andere die vielleicht noch Ideen haben sind natürlich herzlich willkommen...


Viele Grüße

Moderiert von user profile iconTh69: B- durch C#- bzw. Code-Tags ersetzt