【问题标题】:STOR command destroys connection with FTP serverSTOR 命令破坏与 FTP 服务器的连接
【发布时间】:2017-04-17 17:56:29
【问题描述】:

我正在用 C# 编写 FTP 客户端。我输入了将文件上传到 FTP 服务器的方法,文件上传确实有效。但是,数据传输成功后,客户端与服务器断开连接。以下是我执行的步骤: 1.使用PASV从服务器获取IP和端口。 2. 使用 IP 和端口创建与服务器的 DATA 连接。 3.将文件转换为字节并通过DATA连接发送。 4.通过COMMAND连接发送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);
        }

【问题讨论】:

  • 请勿将代码作为图片发布。将其发布为文本+此外,您的代码未显示,方法如何调用+解释,您如何检测断开连接-到底发生了什么? - 网络捕获或至少一个服务器日志也会很有用。
  • 上传成功后,我尝试使用我实现的其他功能:目录更改,NLIST功能,RETR功能。文件上传成功后,我没有收到服务器端的响应。如果文件上传失败或者甚至没有使用其他功能也可以正常工作。
  • “无响应”和“断开连接”是两个不同的东西。如果您需要我们的帮助,您需要准确无误。并提供我要求的信息。
  • 为什么不使用 C# 中包含的工具连接到 FTP 服务器?检查 FtpWebRequest。
  • 我们的作业不允许使用这些库。

标签: c# ftp


【解决方案1】:

你描述的顺序是错误的。特别是在发出指定传输数据(即 STOR)应该发生什么的命令之前,您不应该开始数据传输。正确的顺序是:

  1. 使用 PASV 或 PORT 命令来确定数据端口并获得对该命令的响应。如果 PORT 监听给定的 IP:port。
  2. 发送 STOR 命令并阅读响应。应该是初步回复 (150)。
  3. 创建数据连接:使用 PASV 连接到远程主机,使用 PORT 等待传入连接。
  4. 传输数据并关闭数据连接。
  5. 等待最终响应 (226)。

【讨论】:

  • 我确实按照您的示例更改了顺序。文件已成功上传到服务器。但是,与帖子中解释的问题相同。在第二步中我没有得到任何回应。 (!networkStream.DataAvailable)。但是第 5 步我得到“150 ok to send data”
  • @user7038346:我在您的代码中看不到任何在发送 STOR 后从服务器读取响应的内容。快速检查一个正常工作的 FTP 客户端和这个服务器,显示我给出的命令正是那个工作的,即首先读取对 STOR 的响应,然后通过数据连接连接到服务器。虽然我不熟悉 .NET,但我认为如果响应已经存在,您不应该检查 DataAvailable:因为它只有在收到命令后才由服务器发送,您应该等待响应。
猜你喜欢
  • 2014-11-10
  • 2012-04-21
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
相关资源
最近更新 更多