Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/29: Рейтинг темы: голосов - 29, средняя оценка - 4.93
1 / 1 / 1
Регистрация: 26.03.2018
Сообщений: 38

FTP на сокетах

23.04.2018, 15:46. Показов 5376. Ответов 7

Студворк — интернет-сервис помощи студентам
Есть код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
 
namespace ConsoleApplication1
{
    class Program
    {
        public class FtpClient
        {
            public string ConnectionServer(string host) //method connectioin with server
            {
                try
                {//Соединяем
                        int port = 21;
                    IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(host), port);
                    Socket temp = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                    temp.Connect(ipe);
                  //Цикл отправки команды и получения ответа
                        for (;;)
                        {
 
                            Console.Write("Введите сообщение:");
                        string message = Console.ReadLine();
                        byte[] data = Encoding.ASCII.GetBytes(message);
 
                        temp.Send(data);
 
                    // буфер для ответа
                    byte[] gena = new byte[256];
                    StringBuilder builder = new StringBuilder();
                    int bytes = 0;
                    //Получаем ответ
                    do
                    {
                        bytes = temp.Receive(gena, gena.Length, 0);
 
                        builder.Append(Encoding.UTF8.GetString(gena, 0, bytes));
                    }
                    while (temp.Available > 0);
                    Console.WriteLine(builder.ToString());
 
 
                     }
                }
                catch (ArgumentNullException)
                {
                    Console.WriteLine("Свойство buffer имеет значение null.");
                }
                catch (ArgumentOutOfRangeException)
                {
                    Console.WriteLine("size превышает размер buffer.");
                }
                catch (SocketException code)
                {
                    Console.WriteLine("Произошла ошибка при попытке доступа к сокету.");
                    //SocketException code;
                    int i = code.ErrorCode;
                    Console.WriteLine(i);
                }
                catch (ObjectDisposedException)
                {
                    Console.WriteLine("Socket был закрыт.");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                string close = "Goodbye";
                return close;
            }
 
        }
        static void Main(string[] args)
        {
            FtpClient client = new FtpClient();
            string host = "192.198.164.82";
            Console.WriteLine(client.ConnectionServer(host));
            Console.ReadLine();
        }
    }
}
Да, да, это ФТП клиент!
А где же второе соединение, закрытие сокетов и т д ?
Оно появится, когда решу одну проблему:
суть в том,что я могу подключиться к серверу фтп, получить заветное число 220, но не могу отправить запрос на сервер(любой запрос). Произошла ошибка доступа к сокету! - хладнокровно отвечает программа. Исключение SocketException, блок перехватывает объект и выводит код ошибки - 10054.
Пробовал запихать в цикл for( ; ; ) часть кода с коннектом сокета. Как результат- ответ 220 после конца каждого цикла!
Я не могу на открытом сокете послать команду серверу,но могу подключиться к серверу.Если создать новый сокет, то результат будет тем же! Если один раз подключиться к серверу, и крутить циклом команду отправки вместе с приёмом ответа(код выше), то выйдет ошибка, если крутить в цикле всё вместе, то буду получать ответ "220" с окончанием каждой итерации.
Как быть?

Добавлено через 16 часов 51 минуту
Как так? Никто не писал клиенты на сокетах?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.04.2018, 15:46
Ответы с готовыми решениями:

FTP сервер на сокетах
Есть необходимость портировать ftp сервер на осрв с сокетами. В данном случае это контроллер Tiva C с операционкой TIRTOS. Есть у...

Как перевести обращение к ftp-серверу в Интернете на домашний ftp-сервер?
Сервер LAMP поднимал , но интересует такой вопрос , сделать UPLOAD . Взять сервер на хостинге , а дома поднять HOME сервер . Смысл...

Используя системный FTP клиент командной строки загрузите файл на FTP-сервер
Задание: Используя системный FTP клиент командной строки загрузите файл на FTP-сервер. Как это сделать?

7
1 / 1 / 1
Регистрация: 26.03.2018
Сообщений: 38
24.04.2018, 16:48  [ТС]
Есть ещё новость: на некоторых серверах после оправки запроса сервер отвечает через 5 минут "421 login timeout<300 seconds> closing control connection.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
24.04.2018, 17:30
Цитата Сообщение от Picol Посмотреть сообщение
Как так? Никто не писал клиенты на сокетах?
Из примеров работы, вижу что используется FtpWebRequest

Можно обернуть и посмотреть что отправляется/принимается. Ну и чтение спецификации...
0
1 / 1 / 1
Регистрация: 26.03.2018
Сообщений: 38
24.04.2018, 17:59  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
Из примеров работы, вижу что используется FtpWebRequest
Можно обернуть и посмотреть что отправляется/принимается. Ну и чтение спецификации...
Код FtpRequest:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Net;
using System.Threading;
 
namespace ftpToClass
{
    public class AsynchronousFtpUpLoader
    {
        public static void Main(string[] args)
        {
            Exception operationException = null;
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.intel.com");
            request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
            request.EnableSsl = true;
 
            //request.Credentials = new NetworkCredential("anonymous", "janeDoe@contoso.com");
 
            request.BeginGetResponse(new AsyncCallback(EndGetResponseCallback), request);
 
            if (operationException != null)
            {
                throw operationException;
            }
            else
            {
                Console.WriteLine("The operation completed");
            }
            Console.WriteLine("Вроде подключились");
            Console.ReadLine();
        }
 
        private static void EndGetResponseCallback(IAsyncResult ar)
        {
            FtpWebRequest request = (FtpWebRequest)ar.AsyncState;
            FtpWebResponse response = null;
            StreamReader readStream = null;
            try
            {
                response = (FtpWebResponse)request.EndGetResponse(ar);
                Stream str1 = response.GetResponseStream();
                readStream = new StreamReader(str1, System.Text.Encoding.UTF8);
                if (readStream != null)
                {
                    // Display the data received from the server.
                    Console.WriteLine("Ответ:");
                    Console.WriteLine(readStream.ReadToEnd());
                }
                else
                    Console.WriteLine("Ответ не получен");
            }
            catch(ArgumentNullException)
            {
                Console.WriteLine("Поток имеет значение null");
            }
            catch(ArgumentException)
            {
                Console.WriteLine("stream не поддерживает чтение.");
            }
            // Return exceptions to the main application thread.
            catch (Exception e)
            {
                Console.WriteLine("Error getting response.");
                Exception operationException = e;
            }
            finally
            {
                if (readStream != null)
                {
                    readStream.Close();
                }
                if (response != null)
                {
                    response.Close();
                }
            }
        }
    }
}
Работает как с SSL .так и без него.

Добавлено через 6 минут
Я так понимаю intel меняет ip-адрес, поэтому доработал код и внёс поправки в реализацию, но результат тот же:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
 
namespace ConsoleApplication5
{
    class Program
    {
        public class FtpClient
        {
            public string ConnectionServer(string host) //method connectioin with server
            {
                IPHostEntry hostEntry = Dns.GetHostEntry(host);
                int port = 21;
                Socket tempSocket = null;
                IPEndPoint ipe = null;
                try
                {
 
                    foreach (IPAddress address in hostEntry.AddressList)
                    {
                        ipe = new IPEndPoint(address, port);
                        tempSocket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                        tempSocket.Connect(ipe);
                        Console.WriteLine("ответ сервера: " + Response(ref tempSocket));
                    }
 
                    for (;;)
                    {
                        Console.WriteLine("Введите сообщение:");
                        string message = Console.ReadLine();
                        byte[] gena = Encoding.ASCII.GetBytes(message);
                        tempSocket.Send(gena, gena.Length, 0);
                        // System.Threading.Thread.Sleep(1000);
                        Console.WriteLine("ответ сервера: " + Response(ref tempSocket));
                    }
                }
                catch (SocketException ex)
                {
                    Console.WriteLine(ex.ErrorCode);
                    Console.WriteLine("Произошла ошибка при попытке доступа к сокету.");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                tempSocket.Close();
                string close = "Goodbye";
                return close;
            }
            private string Response(ref Socket temp)
            {
                // буфер для ответа
                StringBuilder builder = new StringBuilder();
                int bytes = 0;
                byte[] data = new byte[256];
                do
                {
                    Console.WriteLine("Point One");
                    bytes = temp.Receive(data, data.Length, 0);
                    Console.WriteLine("Point Two");
                    builder.Append(Encoding.UTF8.GetString(data, 0, bytes));
                }
                while (temp.Available > 0);
                return builder.ToString();
            }
        }
        static void Main(string[] args)
        {
            FtpClient client = new FtpClient();
            //string host = "192.198.164.82";
            string host = "ftp.intel.com";
            Console.WriteLine(client.ConnectionServer(host));
            Console.ReadLine();
        }
    }
}
Может кто попробует у себя закомпилить?
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
24.04.2018, 18:03
ок, что смущает?
0
1 / 1 / 1
Регистрация: 26.03.2018
Сообщений: 38
24.04.2018, 18:12  [ТС]
На сокетах возвращается приветствие сервера, потом идёт отправка сообщения в кодировке (пробовал Unicode, UTF8, ASCII) ,но сервер не получает сообщение ,и подождав 5 минут выводит:"421 login timeout<300 seconds> closing control connection."
.Либо сервер (например ftp.intel.com) раньше закрывает соединение без ответа, тогда вылетает ошибка 10054.
Мне принципиальны сокеты!
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
24.04.2018, 20:31
Лучший ответ Сообщение было отмечено Picol как решение

Решение

Команда должна заканчиваться переводом строки "\r\n".

C#
1
string message = Console.ReadLine()+"\r\n";
Нашел здесь http://www.java2s.com/Code/Jav... andRFC.htm
1
1 / 1 / 1
Регистрация: 26.03.2018
Сообщений: 38
24.04.2018, 21:10  [ТС]
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Команда должна заканчиваться переводом строки "\r\n".
C#Выделить код
1
string message = Console.ReadLine()+"\r\n";
Ответ сервера: 331

Ты мой спаситель! Я уже 3 день маюсь, думал уже в свойство буфера отправки лезть!
И тут на горизонте твой ,достойный всякой благодарности, ответ!
Ещё раз спасибо, побольше бы таких ребят!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.04.2018, 21:10
Помогаю со студенческими работами здесь

Не удалось подключиться к FTP: Rebex FTP/SSL does not support SFTP/SSH protocol
Добрый день. Подскажите как решить данную проблему? Не удалось подключиться к...

ISP manager. Как создать FTP аккаунт. Если нет вкладки FTP аккаунты?
Приходилось пользоваться ISP-manager была вкладка FTP-аккаунты. А тут дали данные для входа в ISP а вкладки нет. Редактировать сайт через...

Подключение org.apache.commons.net.ftp.FTP
В Java совсем новичок, но есть задача переписать ftp-клиент с C# на Java. Подскажите пожалуйста (желательно по пунктам), что как подключить...

Библиотека BytesRoad.Net.FTP.dll для работы с FTP: как реализовать докачку файла
Добрый день. Пишу программу, реализующую скачивание с фтп(суть - фтп клиент).Использую библиотеку стороннего разработчика -...

Залив файлов на ftp не используя ftp.exe
Здравствуйте, скажите пожалуйста если ли способ залить файлы на ftp без стандартной утилиты Windows?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru