[英]Set Port number when using FtpWebRequest in C#
當我嘗試使用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。
我在谷歌上發現了一些有相同問題的人,但我還沒有找到一個關於如何解決這個問題的好例子,我仍然不明白為什么會這樣。
誰知道如何處理這個問題?
更新:
我試圖連接到一個不同的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)的連接。 服務器打開一個隨機數據端口(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)的連接,該端口很可能被客戶端的防火牆拒絕。
我希望這可以幫助您解決問題!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.