Установить номер порта при использовании FtpWebRequest в C # - PullRequest
9 голосов
/ 18 мая 2009

Я получаю исключение, когда пытаюсь подключиться к FTP на свой Win 2008 Server из кода C #, используя VS2008 в качестве отладчика.

Мой тестовый класс выглядит так:

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);
        }
    }
}

Когда я выполняю код, я получаю сообщение Ошибка соединения с ошибкой FTP 227 в вызове GetRequestStream (). В исключении я вижу, что соединение не может: 192.168.10.35:52184

Понятия не имею, как получается порт 52184. Я указываю в ftpServerIP, что это должен быть порт 21.

Я нашел несколько человек с такими же проблемами в Google, но я не нашел хорошего примера того, как это можно решить, и я до сих пор не понимаю, почему это происходит.

Кто-нибудь знает, как решить эту проблему ??

UPDATE:

Я попытался подключиться к другой учетной записи FTP, и там все работает нормально. Поэтому я проверил свой FTP 192.168.10.35:21, но он отлично работает в CuteFTP Pro и тому подобное. Это только делает это еще более странным ..

Ответы [ 3 ]

7 голосов
/ 18 мая 2009

Я полагаю, что это проблемы с брандмауэром Windows, FTP использует другие порты, а не только порт 21 - иногда переключение режима FTP с активного на пассивный помогает заставить все работать.

reqFTP.UsePassive = false;

Посмотрите на эту хорошую статью на FTP: Активный FTP против пассивного FTP, полное объяснение

4 голосов
/ 18 мая 2009

Все правильно, это связано с пассивным режимом

Исправление в коде так безумно просто:)

reqFTP.UsePassive = false;

И все работало быстро и без ошибок!

1 голос
/ 25 января 2017

Важно различать порт COMMAND и порт DATA. Протокол соединения также изменится, если вы находитесь в режиме ACTIVE или PASSIVE.

АКТИВНЫЙ РЕЖИМ:

1) Клиент инициирует соединение от случайного неуказанного порта COMMAND (N> 1023) к порту COMMAND сервера по умолчанию (21). Клиент определит свой порт DATA (N + 1) и начнет прослушивать этот порт.

2) Сервер инициирует соединение со своего стандартного порта DATA (20) на указанный клиентский порт DATA (N + 1).

ПАССИВНЫЙ РЕЖИМ:

1) Клиент инициирует соединение со случайного неуказанного порта COMMAND (N> 1023) с портом COMMAND сервера по умолчанию (21) с помощью команды PASSIVE. Сервер открывает случайный порт 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), который, скорее всего, был отклонен брандмауэром клиента.

Надеюсь, это поможет вам решить вашу проблему!

...