OK, ich bin jetzt wieder ein bißchen weiter ...
das Problem wurde gelöst, indem ich im "Hauptsocket" den Status nach 226, also Transfer complete) abfrage. Der Listbefehl benötigt ja, neben dem (Up- und Downloaden) eigene Verbindungen, die mittels sog. "Untersockets" realisiert werden.
Hier mal der angepasste Quellcode ...
byte[] buffer = new byte[FtpClient.BUFFER_SIZE];
DateTime timeout = DateTime.Now.AddSeconds(FtpClient.MAX_TIMEOUT.TotalSeconds);
while(DateTime.Now < timeout) {
// Check whether data on
// transfer socket are available
if(transferSocket.Available > 0) {
// Read data
int readBytes = transferSocket.
Receive(buffer, buffer.Length, SocketFlags.None);
transferData.Append(Encoding.ASCII.GetString(buffer, 0, readBytes));
}
else {
// Check whether status message
// on main socket is available
if(this.socket.Available > 0) {
this.ReadResponse(FtpStatusCode.ClosingData);
if(debug) {
Console.WriteLine(this.response);
}
// Exit loop
if(this.statusCode == FtpStatusCode.ClosingData.GetHashCode()) {
break;
}
}
}
}
Jetzt wird solange die Schleife durchlaufen, bis entweder ein Timeout auftritt oder aber das Hauptsocket 226 meldet.
Jetzt habe ich trotzdem noch eine FTP-Verständnisfrage. Immer, wenn eine Aktion im passiven Modus erfolgreich abgeschlossen wurde (Download, Upload, Listing von Dateien und Verzeichnissen), gibt das Hauptsocket eine Meldung raus, z.B. 226 Transfer complete. Wie kann ich jetzt herausfinden, welche Meldung zu welchem Socket im passiven Modus gehört?
Kann mir da jemand helfen, bzw. einen Link posten? Problem ist, wenn ich z.B. 10 Downloads starte (synchron in Threads) und ich währenddessen ein Listing durchführe (siehe Quellcode oben), dann weiss ich ja nicht, wenn 226 auf der Console landet, auf was sich das bezieht, auf Download oder Listing. Das muss man doch irgendswie auseinanderhalten können?
Gruß und Danke schonmal für etwaige Antworten im Voraus.
P.S. Das mit den mehreren Verbindungen geht, denn Filezilla macht das auch so. Sogar laufen alle Downloads weiter, auch wenn beim Hauptsocket Verbindung geschlossen wurde.