代码之家  ›  专栏  ›  技术社区  ›  The real napster

在C中使用FtpWebRequest时设置端口号#

  •  9
  • The real napster  · 技术社区  · 17 年前

    当我尝试使用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

    我在ftpServerIP中指定它应该是端口21。

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

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

    我尝试连接到另一个FTP帐户,在那里一切正常。因此,我测试了我的192.168.10.35:21 FTP,但它在CuteFTP Pro等软件中运行良好。 这只会让事情变得更奇怪。。

    3 回复  |  直到 17 年前
        1
  •  7
  •   Vikhram    10 年前

    我猜可能是Windows防火墙问题,FTP使用的端口不仅仅是端口21,有时将FTP模式从主动更改为被动有助于工作。

    reqFTP.UsePassive = false;
    

    Active FTP vs. Passive FTP, a Definitive Explanation

        2
  •  4
  •   The real napster    17 年前

    这是正确的,它与被动模式有关

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

    reqFTP.UsePassive = false;
    

    它工作得很快,没有错误!

        3
  •  1
  •   Guillaume.Nepveu    9 年前

    活动模式:

    1) 客户端启动从随机未指定的命令端口(N>1023)到默认服务器命令端口(21)的连接。客户端将指定其数据端口(N+1)并开始侦听此端口。

    2) 服务器启动从其默认数据端口(20)到指定客户端数据端口(N+1)的连接。

    被动模式:

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

    2) 客户端启动从其数据端口(N+1)到指定服务器数据端口(P>1023)的连接。

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

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

    我希望这能帮助你解决你的问题!

    推荐文章