【问题标题】:Set Port number when using FtpWebRequest in C#在 C# 中使用 FtpWebRequest 时设置端口号
【发布时间】:2010-10-26 23:27:19
【问题描述】:

当我尝试使用 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 等中运行良好。 这只会让它变得更加奇怪..

【问题讨论】:

    标签: c# ftpwebrequest


    【解决方案1】:

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

    reqFTP.UsePassive = false;
    

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

    【讨论】:

    • 我想我看到了区别,但我没有从被动变为主动,有没有人有一个很好的指导?
    【解决方案2】:

    你说得对,它与被动模式有关

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

    reqFTP.UsePassive = false;
    

    而且运行速度很快,没有错误!

    【讨论】:

      【解决方案3】:

      区分 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) 的连接。

      在您的示例中,您处于活动模式。您的客户端启动了从其 COMMAND 端口 (52183) 到服务器默认 COMMAND 端口 (21) 的连接,并指定了其 DATA 端口 (52184 = 52183 + 1)。然后服务器启动了从其默认 DATA 端口 (20) 到客户端的 DATA 端口 (52184) 的连接,这很可能被客户端的防火墙拒绝。

      我希望这可以帮助您解决问题!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-13
        • 1970-01-01
        • 1970-01-01
        • 2011-02-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多