2017-04-17 59 views
0

我正在用C#編寫FTP客戶端。我輸入了將文件上傳到FTP服務器和文件上傳的方法。但是,數據傳輸成功後,客戶端將從服務器斷開連接。以下是我的步驟: 1.使用PASV從服務器獲取IP和端口。 2.使用IP和端口創建與服務器的DATA連接。 3.將文件轉換爲字節並通過DATA連接發送。通過COMMAND連接STOR命令破壞與FTP服務器的連接

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

「無響應」和「斷開」是兩個不同的事情。如果您需要我們的幫助,您需要準確。並提供信息,我已經問你了。 –

回答

1

您描述的順序是錯誤的。特別是在發出指定傳輸數據應該發生的命令(即STOR)之前,你不應該開始數據傳輸。正確的順序是:

  1. 使用PASV或PORT命令來確定數據端口並獲得對此命令的響應。在給定的IP:端口上偵聽PORT的情況。
  2. 發送STOR命令和讀取響應。這應該是一個初步的迴應(150)。
  3. 創建數據連接:用PASV連接到遠程主機,用PORT等待傳入連接。
  4. 傳輸數據並關閉數據連接。
  5. 等待最終回覆(226)。
+0

我確實改變了您的示例中的順序。該文件已成功上載到服務器上。然而,與在帖子中解釋的相同的問題。第二步我沒有迴應。 (!networkStream.DataAvailable)。但第5步我得到「150確定發送數據」 – user7038346

+0

@ user7038346:我看不到任何代碼在發送STOR後讀取服務器的響應。使用正在工作的FTP客戶端以及該服務器的快速檢查表明,我給出的命令恰好是正在工作的命令,即首先讀取對STOR的響應,然後使用數據連接連接到服務器。雖然我對.NET不熟悉,但我不認爲如果響應已經存在,您應該檢查DataAvailable:因爲它只在獲取命令後由服務器發送,所以您應該等待響應。 –