簡體   English   中英

在C#中使用FtpWebRequest時設置端口號

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM