2017-04-17 1 views
0

Ich schreibe FTP-Client mit C#. Ich tippte Methoden zum Hochladen von Datei auf FTP-Server und Datei-Upload funktioniert. Nach erfolgreicher Datenübertragung wird der Client jedoch vom Server getrennt. Hier sind die Schritte, die ich tue: 1. Erhalten Sie IP und Port vom Server mit PASV. 2. Erstellen Sie eine Datenverbindung mit dem Server über IP und Port. 3. Konvertieren Sie die Datei in Bytes und senden Sie sie über die DATA-Verbindung. 4. Senden STOR über COMMAND-VerbindungSTOR Befehl zerstört Verbindung mit FTP-Server

Meine Frage ist, warum ich die Verbindung getrennt bekomme.

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

Veröffentlichen Sie Code nicht als Bild. Schreib es als Text + Außerdem zeigt dein Code nicht an, wie heißen die Methoden + Erklären, wie erkennst du die Trennung - Was genau passiert? - Netzwerk-Capture oder zumindest ein Server-Log wäre auch nützlich. –

+0

Nach erfolgreichem Upload versuche ich andere Funktionen zu verwenden, die ich implementiert habe: Verzeichniswechsel, NLIST-Funktion, RETR-Funktion. Ich bekomme keine Antwort von der Serverseite nach dem erfolgreichen Datei-Upload. Wenn der Datei-Upload fehlschlägt oder nicht einmal verwendet wird, funktionieren andere Funktionen gut. – user7038346

+0

"Keine Antwort" und "Trennen" sind zwei verschiedene Dinge. Wenn Sie unsere Hilfe brauchen, müssen Sie genau sein. Und stelle die Informationen bereit, nach denen ich dich gefragt habe. –

Antwort

1

Die von Ihnen beschriebene Reihenfolge ist falsch. Insbesondere sollten Sie die Datenübertragung nicht starten, bevor Sie den Befehl ausgeben, der angibt, was mit den übertragenen Daten (d. H. STOR) geschehen soll. Die richtige Reihenfolge wäre:

  1. Verwenden Sie den PASV- oder PORT-Befehl, um den Datenport zu ermitteln und eine Antwort auf diesen Befehl zu erhalten. Im Falle von PORT hören Sie den gegebenen IP: Port.
  2. Senden Sie das STOR-Kommando und lesen Sie die Antwort. Es sollte eine vorläufige Antwort sein (150).
  3. Erstellen Sie die Datenverbindung: mit PASV verbinden mit dem Remote-Host, mit PORT warten auf eingehende Verbindungen.
  4. Übertragen Sie die Daten und schließen Sie die Datenverbindung.
  5. Warten Sie auf die endgültige Antwort (226).
+0

Ich habe die Reihenfolge wie in Ihrem Beispiel geändert. Die Datei wurde erfolgreich auf dem Server hochgeladen. Das gleiche Problem wie im Post erklärt. Ich bekomme im zweiten Schritt keine Antwort. (! networkStream.DataAvailable). Jedoch Schritt 5 Ich bekomme "150 OK, um Daten zu senden" – user7038346

+0

@ user7038346: Ich kann nichts in Ihrem Code sehen, der die Antwort vom Server nach dem Senden des STORs liest. Eine schnelle Überprüfung mit einem funktionierenden FTP-Client und genau diesem Server zeigt, dass die Reihenfolge, die ich gab, genau die ist, die funktioniert, d. H. Zuerst die Antwort an den STOR liest und dann eine Verbindung mit dem Server mit der Datenverbindung herstellt. Und obwohl ich mit .NET nicht vertraut bin, denke ich nicht, dass Sie DataAvailable überprüfen sollten, wenn die Antwort bereits da ist: da es erst vom Server gesendet wird, nachdem Sie den Befehl erhalten haben, sollten Sie stattdessen auf die Antwort warten. –

Verwandte Themen