2017-04-17 22 views
0

私はC#でFTPクライアントを作成しています。 FTPサーバーにファイルをアップロードする方法を打ちました。ファイルのアップロードは機能します。しかし、データ送信が成功した後、クライアントはサーバーから切断されます。ここにある手順は次のとおりです。 1. PASVを使用してサーバーからIPとポートを取得します。 2. IPとポートを使用してサーバーとのDATA接続を作成します。 3.ファイルをバイトに変換し、DATA接続経由で送信します。私が切断取得なぜ私の質問があるSTORコマンドがFTPサーバーとの接続を破棄します

COMMAND接続を介して 4.送信STOR。

public void PrepareUpload() // Get IP and Port from server by using PASV. 
     { 
      String answer; 
      String message = "PASV\r\n"; 
      Byte[] data = System.Text.Encoding.ASCII.GetBytes(message); 
      this.ns.Write(data, 0, data.Length);  
      answer = Response(this.ns); 
      this.dataPort = getPort(answer, 4) * 256 + getPort(answer, 5); 
     } 

public void DataConnect(string server) // Create DATA connection with server using IP and port. 
     { 
      int port = this.dataPort; 
      this.dataConnection = new TcpClient(); 
      IPAddress ipAddress = Dns.GetHostEntry(server).AddressList[0]; 

      this.dataConnection.Connect(ipAddress, port); 
      this.nds = dataConnection.GetStream(); 
     } 

public void DataTransfer(string filename) // Convert file to bytes and send through DATA connection. 
     { 
      byte[] data = System.IO.File.ReadAllBytes(filename); 
      this.filename = Path.GetFileName(filename); 
      nds.Write(data, 0, data.Length); 
     } 

public void Upload() // Send STOR through COMMAND connection 
     { 
      String message = "STOR " + this.filename + "\r\n"; 
      Byte[] data = System.Text.Encoding.ASCII.GetBytes(message); 
      this.ns.Write(data, 0, data.Length); 
     } 
+0

はイメージとしてのコードを投稿しないでください。 +あなたのコードは表示されません、メソッドはどのように呼び出されていますか+解説、どのように切断を検出しますか - 正確にはどうなりますか? - ネットワークキャプチャまたは少なくともサーバーログも便利です。 –

+0

アップロードが成功した後、私は実装した他の機能、ディレクトリ変更、NLIST機能、RETR機能を使用しようとします。私は成功したファイルのアップロード後にサーバー側から応答がありません。ファイルのアップロードが失敗したり、使用されていない場合は、他の機能がうまく動作します。 – user7038346

+0

「応答なし」と「切断」は2つの異なることです。私たちの助けが必要な場合は、正確にする必要があります。そして、私があなたに求めた情報を提供してください。 –

答えて

1

説明した順序が間違っています。特に、転送されたデータ(つまりSTOR)で何が起こるべきかを指定するコマンドを発行する前に、データ転送を開始すべきではありません。正しい順序は:

  1. PASVまたはPORTコマンドを使用してデータポートを特定し、このコマンドに応答します。 PORTの場合、指定されたIP:ポートをリッスンします。
  2. STORコマンドを送信し、応答を読んで。それは予備的な応答(150)でなければなりません。
  3. データ接続を作成します。PASVを使用してリモートホストに接続し、PORTは着信接続を待機します。
  4. 転送データとは、データ接続を閉じます。
  5. 最終的な応答(226)を待ちます。
+0

あなたの例では、私は注文を変更しました。ファイルは正常にサーバーにアップロードされます。しかし、ポストで説明したのと同じ問題。私は2番目のステップで応答を得ません。 (!networkStream.DataAvailable)。しかし、ステップ5では、 "150 OKデータを送信"を取得します。 – user7038346

+0

@ user7038346:あなたのコードでは、STORを送信した後にサーバーからの応答を読み取ることができません。作業中のFTPクライアントのクイックチェックと正確には、このサーバーは、指定した注文が動作していることを示しています。つまり、最初にSTORへの応答を読み取り、データ接続を使用してサーバーに接続します。私は.NETに精通していませんが、応答が既にある場合はDataAvailableをチェックする必要はないと考えています。コマンドを受信した後にサーバーから送信されるため、代わりに応答を待つ必要があります。 –

関連する問題