Исключение времени ожидания операции чтения сокета с SSH.NET при подключении к FTP-порту 21

Я получил исключение ниже, когда клиент пытается подключиться к FTP-серверу:

Время ожидания операции чтения сокета истекло через 30000 миллисекунд.

Источник = "Renci.SshNet"

в Renci.SshNet.Abstractions.SocketAbstraction.Read (сокет сокета, буфер Byte [], смещение Int32, размер Int32, тайм-аут TimeSpan) в Renci.SshNet.Session.SocketReadLine (тайм-аут TimeSpan) в Renci.SshNet.Session.Connect() в Renci.SshNet.BaseClient.Connect() в SftpClient.ReadAllBytesAsync() в C:\SftpClient\SftpClient.cs:строка 42

Код ниже:

using (Renci.SshNet.SftpClient sftp = new Renci.SshNet.SftpClient(server,
                                                    21,
                                                    Username,
                                                    Password))                      
    sftp.Connect();  //exception here
    content = sftp.ReadAllBytes(FilePath);    
    sftp.Disconnect();                      
}

Версия SSH.NET: 2016.1.0

Однако он подключается через telnet, как показано ниже, через командную строку:

telnet server_ip_address 21
220 (SFTPPlus_3.15.0) Welcome to the FTP/FTPS Service.

Персонал на стороне сервера отправляет мне общедоступные сертификаты, которые я установил в своей Windows 10.

Любая идея?


Решение:

Используйте этот: github.com/robinrodricks/FluentFTP


person Pingpong    schedule 09.09.2019    source источник


Ответы (2)


SSH.NET — это SSH/SFTP-клиент (порт 22).

Вы не можете использовать его для подключения к FTP-серверу (порт 21). FTP и SFTP — это два совершенно разных протокола.

Для FTP вы можете использовать:

person Martin Prikryl    schedule 09.09.2019

FTP и SFTP — это два совершенно разных протокола.

Для FTP-сервера (Порт 21) вы можете использовать следующий код:

Пример: загрузка файлов с помощью FtpWebRequest

string filename = "ftp://" + ip + "//" + "HA11062020CJEIC.pdf";
FtpWebRequest ftpReq = (FtpWebRequest)WebRequest.Create(filename);
ftpReq.UsePassive = false;
ftpReq.UseBinary = true;
ftpReq.Method = WebRequestMethods.Ftp.UploadFile;
ftpReq.Credentials = new NetworkCredential(username, password);

string sourceFile = @"C:\Users\*****\*****\FTP Schedular\HA11062020CJEIC.pdf";
byte[] b = File.ReadAllBytes(sourceFile);  //Get local pc file

//var webClient = new WebClient();  //Get file from URL
//byte[] b = webClient.DownloadData(sourceFile); 

ftpReq.ContentLength = b.Length;
using (Stream s = ftpReq.GetRequestStream())
{
    s.Write(b, 0, b.Length);
}

FtpWebResponse ftpResp = (FtpWebResponse)ftpReq.GetResponse();

if (ftpResp != null)
{
    string MessageBox = (ftpResp.StatusDescription);
}
person Gyan    schedule 30.07.2020
comment
ftpReq.UsePassive = false обычно плохой выбор. В большинстве случаев придерживайтесь значения по умолчанию true. + Также ReadAllBytes - довольно неэффективное решение (и вопрос в любом случае о загрузке, а не о загрузке). Для более эффективных подходов к загрузке и загрузке см. stackoverflow.com/q/44606028/850848 + Настройка ftpReq.ContentLength не действует. - person Martin Prikryl; 30.07.2020
comment
Я знаю, что ftpReq.UsePassive = false обычно является плохим выбором. В этом случае я использовал ftpReq.UsePassive = false, потому что мои режимы FTP-соединения находятся в активном режиме. - person Gyan; 04.08.2020