9

当我尝试使用 VS2008 作为调试器从 C# 代码 FTP 到我的 Win 2008 服务器时,我不断收到异常。

我的测试类如下所示:

public class FTP
{
    private string ftpServerIP = "192.168.10.35:21";
    private string ftpUserID = "Administrator";
    private string ftpPassword = "XXXXXXXX";
    private string uploadToFolder = "uploadtest";

    public void Upload(string filename)
    {
        FileInfo fileInf = new FileInfo(filename);
        string uri = "ftp://" + ftpServerIP + "/" + uploadToFolder + "/" + fileInf.Name;
        FtpWebRequest reqFTP;

        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
        reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
        reqFTP.KeepAlive = false;
        reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
        reqFTP.UseBinary = true;
        reqFTP.ContentLength = fileInf.Length;

        int buffLength = 2048;
        byte[] buff = new byte[buffLength];
        int contentLen;

        FileStream fs = fileInf.OpenRead();
        try
        {
            Stream strm = reqFTP.GetRequestStream();
            contentLen = fs.Read(buff, 0, buffLength);

            while (contentLen != 0)
            {
                strm.Write(buff, 0, contentLen);
                contentLen = fs.Read(buff, 0, buffLength);
            }

            strm.Close();
            fs.Close();
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
    }
}

当我执行代码时,我在 GetRequestStream() 调用中收到一个连接失败并出现 FTP 错误 227。在异常中,我可以看到连接失败:192.168.10.35:52184

我不知道它是如何产生端口 52184 的。我在 ftpServerIP 中指定它应该是端口 21。

我在 google 上发现了一些有同样问题的人,但我没有找到一个很好的例子来说明如何解决这个问题,我仍然不明白为什么会发生这种情况。

有谁知道如何处理这个问题??

更新:

我尝试连接到不同的 FTP 帐户,一切正常。因此我测试了我的 192.168.10.35:21 FTP,但它在 CuteFTP Pro 等中运行良好。这只会让它更加奇怪..

4

3 回答 3

7

我的猜测是 Windows 防火墙问题,FTP 使用的端口不仅仅是端口 21 - 有时将 FTP 模式从主动更改为被动有助于使事情正常进行。

reqFTP.UsePassive = false;

看看这篇关于 FTP 的好文章:Active FTP vs. Passive FTP, a Definitive Explanation

于 2009-05-18T08:25:27.277 回答
4

Thies 是对的,它与被动模式有关

代码中的修复非常简单:)

reqFTP.UsePassive = false;

它工作得很快而且没有错误!

于 2009-05-18T09:08:25.460 回答
1

区分 COMMAND 端口和 DATA 端口很重要。连接协议也将根据您处于 ACTIVE 或 PASSIVE 模式而改变。

活动模式:

1) 客户端从一个随机的未指定 COMMAND 端口 (N > 1023) 到默认服务器 COMMAND 端口 (21) 发起连接。客户端将指定他的 DATA 端口 (N+1) 并开始侦听此端口。

2)服务器发起一个从他的默认DATA端口(20)到指定客户端DATA端口(N+1)的连接。

被动模式:

1) 客户端使用 PASSIVE 命令从随机未指定的 COMMAND 端口 (N > 1023) 到默认服务器 COMMAND 端口 (21) 发起连接。服务器打开一个随机的 DATA 端口(P > 1023)并将其发送给客户端。

2)客户端发起一个从他的DATA端口(N+1)到指定的服务器DATA端口(P>1023)的连接。

如果您使用 ACTIVE 模式,您很可能需要让客户端的防火墙接受从服务器到您的端口(N+1 > 1024)的连接。

In your example, you were in ACTIVE mode. Your client initiated a connection from his COMMAND port (52183) to the server's default COMMAND port (21) and specified its DATA port (52184 = 52183 + 1). Then the server initiated a connection from its default DATA port (20) to the client's DATA port (52184) which was most likely rejected by the client's firewall.

I hope this helps you solve your problem!

于 2017-01-24T22:29:56.493 回答