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

当我尝试使用VS2008作为调试器从C#代码FTP到我的Win 2008服务器时,我一直遇到exception。

我的测试类看起来像这样:

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的连接失败。 在exception中我可以看到连接失败:192.168.10.35:52184

我不知道如何使用端口52184.我在ftpServerIP中指定它应该是端口21。

我在谷歌上发现了一些有相同问题的人,但我没有找到一个关于如何解决这个问题的好例子,我仍然不明白为什么会这样。

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

更新:

我曾尝试连接到不同的FTP帐户,并且一切正常。 因此,我测试了我的192.168.10.35:21 FTP,但它在CuteFTP Pro和其他类似的工作正常。 这让它变得更加奇怪..

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

 reqFTP.UsePassive = false; 

看看这篇关于FTP的好文章: 主动FTP与被动FTP,一个明确的解释

他们做对了,它与被动模式有关

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

 reqFTP.UsePassive = false; 

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

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

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

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