2012-04-12 7 views
0

Ich habe in C# mit TCP-Sockets herumgespielt, und ich habe Probleme mit einem FTP-Server zu kommunizieren, die ich eingerichtet habe. Ich kann mich anfänglich verbinden und die 220-Nachricht erhalten, aber wenn ich den "USER nrcrast" -Befehl sende, bekomme ich nie eine Antwort, und die DataAvailable-Eigenschaft gibt false zurück. Weiß jemand was ich falsch mache? Hier ist mein Code so weit:Implementieren eines FTP-Clients in C# mit TCP

namespace TCPClient 
{ 
public partial class TCPClientForm : Form 
{ 


    private TcpClient myClient; 
    NetworkStream stream; 

    public TCPClientForm() 
    { 
     InitializeComponent(); 
     send(); 

    } 

    void send() 
    { 

     while (true) 
     { 
      try 
      { 
       myClient = new TcpClient("nrcrast.dyndns.info", 21); 
       break; 
      } 
      catch (SocketException ex) 
      { 
       Console.WriteLine(ex.ToString()); 
      } 

     } 
     stream = myClient.GetStream(); 
     int sendOffset = 0; 
     int recOffset=0; 

     int dataLength; 
     Byte[] receiveData = new Byte[256]; 


     // wait for a response 
     dataLength = stream.Read(receiveData, recOffset, receiveData.Length); 
     String recvdMessage = System.Text.Encoding.ASCII.GetString(receiveData, 0, dataLength); 
     Console.WriteLine(recvdMessage.ToString()); 
     recOffset+=dataLength; 


     String message = "USER nrcrast"; 
     Byte[] data = System.Text.Encoding.ASCII.GetBytes(message); 
     stream.Write(data, 0, data.Length); 
     sendOffset += data.Length; 

     // wait for a response 
     while (!stream.DataAvailable) 
     { 
     } 
     dataLength = stream.Read(receiveData, 0, receiveData.Length); 
     recvdMessage = System.Text.Encoding.ASCII.GetString(receiveData, 0, dataLength); 
     Console.WriteLine(recvdMessage.ToString()); 


    } 


} 
+2

Ich gehe davon aus, dass Sie dies als eine Lernübung tun, und deshalb verwenden Sie nicht die FtpWebRequest (http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx) Klasse, oder? –

+0

... oder [WebClient] (http://msdn.microsoft.com/en-us/library/system.net.webclient.aspx) –

+0

Ja. Ich versuche nur, das Protokoll selbst zu verstehen, damit ich später einen FTP-Client für Windows Phone programmieren kann. (Ich glaube nicht, dass die ftpwebrequest für Windows-Telefon-Codierung verfügbar ist) – nrcrast

Antwort

5

Ein Shooting in der Dunkelheit, benötigen Sie einen Wagenrücklauf zu setzen und neue Zeile am Ende des Befehls

String message = "USER nrcrast\r\n"; 
+1

Tatsächlich besagt die Spezifikation, dass Befehle mit einer CRLF enden sollten. Also wäre es "USER nrcrast \ r \ n" '. Siehe http://tools.ietf.org/html/rfc959 –

+0

@JimMischel yep !, das ist es, ich habe es gerade überprüft. –

+0

Oh Mann. Genial! Vielen Dank. Es ist immer etwas wirklich Einfaches. – nrcrast

1

Wenn Sie in der Suche über interessiert sind Jemandem die Schulter auf einem ähnlichen Projekt (nicht sagen, es ist perfekt), ich habe das gleiche vor langer Zeit (das war wieder in. NET 1.1, und portierte es auf. NET 2.0, wenn die SSL-Stream-Zeug hinzugefügt wurde).

Es gibt einige knifflige Teile zu den FTP-Protokollen in Bezug auf Zeiten beim Senden von Befehlen, wenn der Server erwartet, dass Sie die Datenverbindung öffnen, beim Lesen der Serverantwort usw. (abhängig von aktiv/passiv) Modi).

sowieso, fühlen Sie sich frei, über My FTP Client Library Quellcode als Referenz zu sehen, wie Sie Ihre eigene Implementierung tun. Es ist eine ziemlich vollständige Implementierung und macht auch aut ssl/tls.