2012-04-12 26 views
0

私はC#でTCPソケットを使いこなしていましたが、設定したFTPサーバと通信する際に問題があります。私は最初に接続して220メッセージを受け取ることができますが、 "USER nrcrast"コマンドを送信すると応答は得られず、DataAvailableプロパティはfalseを返します。誰か私が間違っていることを知っている?ここに私のコードは、これまでのところです:あなたはオーバー探しに興味があるならTCPを使用してC#でFTPクライアントを実装する

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

私はあなたが学習の練習としてこれをやっていると仮定しています。そのため、FtpWebRequest(http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx)を使用していないのは、クラス? –

+0

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

+0

はい。ちょうどプロトコル自体を理解しようとしているので、後でWindows phone用のFTPクライアントをコードすることができます。 (私はftpwebrequestがWindows phone codingのために利用できると信じていません) – nrcrast

答えて

5

暗所での撮影、あなたはコマンド

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

実際に、この仕様では、コマンドはCRLFで終了する必要があります。したがって、それは '' USER nrcrast \ r \ n "'になります。 http://tools.ietf.org/html/rfc959 –

+0

@JimMischel yep !,それを見て、ちょうどチェックしてください。 –

+0

ああ。驚くばかり!ありがとう。それはいつも本当に単純なものです。 – nrcrast

1

の末尾にキャリッジリターンと改行を入れる必要があります(これは完璧なことを言っていない)同様のプロジェクトの誰かの肩、私は長いこと前に同じことをしました(これは、ネット1.1に戻って、sslストリームのものが追加されたときに.net 2.0に移植)。

コマンドを送信したタイミング、サーバーがデータ接続を開くことを期待するタイミング、サーバーの応答を読み取るタイミングなどに関しては、FTPプロトコルには面倒なことがいくつかあります(アクティブ/パッシブモード)。

とにかく、My FTP Client Libraryソースコードを見て気軽に自分の実装を行うようにしてください。これはかなり完全な実装であり、auth ssl/tlsも同様です。

関連する問題