Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ под Linux
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/12: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Kadet89
2 / 2 / 0
Регистрация: 18.09.2009
Сообщений: 107
1

FTP клиент без использования неблокирующий сокетов

30.07.2011, 23:20. Просмотров 2236. Ответов 13
Метки нет (Все метки)

Дали задание написать ftp клиент, который должен залить n файлов и иногда считывать список файлов в папке на фтп сервере. Нужно написать на блокирующих сокетах, без использования селектов и т.д. ... да селекты впринципе и не нужны, работа происходит с одним сервером.
Клиент должен стабильно работать длительное время, не зависая.
В общем задачка довольно сложна, я написал большой код и столкнулся с проблемой, иногда при передаче/приеме возникают ошибки, сообщения не доходят и он банально повисает на recv. Т.е. ждет какой-то команды от ftp сервера, а тот в свою очередь либо не знает что её нужно отправить, либо отправил, но до моего клиента она не дошла.
Руководитель сказал что на блокирующих сокетах можно реализовать любое безопасное приложение, без применения дополнительных костылей, но я ума не приложу как решить эту проблему. Неужели абсолютно все сетевые программы, которыми я пользуюсь, написаны на селектах и еполл? Этож костыльное решение, не?
Никаких таймаутов, которые, логично предположить, должны были бы быть в функциях send и recv, я не нашел...
Подскажите правильный вариант решения проблемы, хотелось бы решить её стандартными средствами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2011, 23:20
Ответы с готовыми решениями:

Как передать данные из одного процесса в другой без сокетов
как можно передать аргументы функции main другой программы из той которая...

FTP клиент wininet
Чуваки, такая проблема. Написал простенький FTP клиент с использованием...

Как сделать ftp клиент через libcurl?
добрый день! подскажите, пожалуйста, как сделать ftp клиент через libcurl? а...

Ftp-клиент: как переходить по каталогам и скачивать/закачивать файлы
надо написать ftp клиент, вот кое-что нашел в интернете, с помощью этого я могу...

Неблокирующий сокет
Добрый день. Фишка в создание связи клиенты-сервер, где сервер работает в...

13
niXman
Эксперт С++
3202 / 1451 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
30.07.2011, 23:35 2
Цитата Сообщение от Kadet89 Посмотреть сообщение
все сетевые программы, которыми я пользуюсь
это какие?

Цитата Сообщение от Kadet89 Посмотреть сообщение
написаны на селектах и еполл? Этож костыльное решение, не?
select - очень древнее решение. и оно себя оправдало.
epoll и IOCP - последние достижения в области мониторинга дескрипторов.
костыли? оО тогда можешь с тем же успехом заявлять что ноуты и TFT - тоже костыли. ведь есть PC с CRT мониторами!

скажи преподу, что он лопух.

Добавлено через 1 минуту
Цитата Сообщение от Kadet89 Посмотреть сообщение
решить её стандартными средствами
это все относительно.
мой _стандартный_ способ решения подобных проблем, описан тут: http://www.cyberforum.ru/faq/thread317829.html

Добавлено через 2 минуты
Цитата Сообщение от niXman Посмотреть сообщение
можешь с тем же успехом заявлять что ноуты и TFT - тоже костыли. ведь есть PC с CRT мониторами!
и еще не понятно для чего мобилы изобрели. дауны!
а айфон так вообще костыль всем костылям!
0
Kadet89
2 / 2 / 0
Регистрация: 18.09.2009
Сообщений: 107
30.07.2011, 23:55  [ТС] 3
Костыл - это когда используешь не по назначению. Селекты и еполл созданы не для этого, они созданы, как вы сказали, для мониторинга дескрипторов, для написания серверов или клиентов для одновременной обработки нескольких соединений. А не для одного дескриптора, чтобы только установить таймаут на функцию recv.
Насчет asio вы меня неправильно поняли, я работаю только с одним фтп, а не с кучей. Приложение не нагружает проц, не нужна многопоточность и вообще мне всё это не нужно...
Нужен лишь таймаут на recv, посему я считаю такое решение неправильным
0
niXman
Эксперт С++
3202 / 1451 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
30.07.2011, 23:57 4
Цитата Сообщение от Kadet89 Посмотреть сообщение
Селекты и еполл созданы не для этого, они созданы, как вы сказали, для мониторинга дескрипторов, для написания серверов или клиентов для одновременной обработки нескольких соединений.
наглая ложь!
0
Kadet89
2 / 2 / 0
Регистрация: 18.09.2009
Сообщений: 107
31.07.2011, 00:00  [ТС] 5
Т.е. вы хотите сказать что грубо говоря были созданы сокеты и вдруг разработчики поняли что не хватает таймаута у функции recv и изобрели селект для решения этой проблемы?
0
niXman
Эксперт С++
3202 / 1451 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
31.07.2011, 00:10 6
select() изобрели не после, а одновременно.
а про родитель всего это дела зовется BSD-Sockets

Добавлено через 54 секунды
и откуда у тебя такие выводы? тебе кто-то в моцг инжектит?
0
Kadet89
2 / 2 / 0
Регистрация: 18.09.2009
Сообщений: 107
31.07.2011, 00:16  [ТС] 7
Мы отошли от темы
Всетаки есть ли стандартное решение?
0
niXman
Эксперт С++
3202 / 1451 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
31.07.2011, 00:18 8
конечно. select/poll/epoll/kqueue/IOCP именно для этого и создавались.
2
g_u_e_s_t
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
31.07.2011, 09:01 9
Цитата Сообщение от Kadet89 Посмотреть сообщение
Дали задание написать ftp клиент, который должен залить n файлов и иногда считывать список файлов в папке на фтп сервере. Нужно написать на блокирующих сокетах, без использования селектов и т.д.
Написать ftp клиент на блокируемых сокетах конечно можно, например в *bsd ftp(1) как раз и написан на блокируемых сокетах, но это не по тому, что так лучше, а потому что писалось 25лет назад, оно конечно работает и даже всех устраивает, но код ужасен (хотя на вкус и цвет...). Но вот без poll или альтернативы будет тяжко - ftp старый, хитрый, я бы даже сказал кривоватый протокол. Например полноценный клиент должен быть готов в любой момент (ну почти в любой) поймать OOB.
Цитата Сообщение от Kadet89 Посмотреть сообщение
а селекты впринципе и не нужны, работа происходит с одним сервером.
Ну сокетов то >1
Цитата Сообщение от Kadet89 Посмотреть сообщение
Т.е. ждет какой-то команды от ftp сервера, а тот в свою очередь либо не знает что её нужно отправить, либо отправил, но до моего клиента она не дошла.
дык перепошлют потерянные пакеты еще разок (я пытаюсь тонко намекнуть, что скорее всего имеют место быть не проблемы с линком, а баги в вашем коде. Попробуйте поснифить или тестировать клиент с сервером на локалхосте)
Руководитель сказал что на блокирующих сокетах можно реализовать любое безопасное приложение
Он абсолютно прав. Вот только O_NONBLOCK влияет на безопасность..., да почти не влияет...
Неужели абсолютно все сетевые программы, которыми я пользуюсь, написаны на селектах и еполл? Этож костыльное решение, не?
Конечно не все. Если про epoll в момент его появления еще можно было сказать "кривой костыль", то сейчас вполне себе хорошее решение, хотя как мне кажется бсд'ешная kqueue спроектирована лучше.
Никаких таймаутов, которые, логично предположить, должны были бы быть в функциях send и recv, я не нашел...
А они есть. man setsockopt и socket 7. Для connect и accept придется использовать таймер.
1
Damaks
18 / 10 / 0
Регистрация: 02.09.2010
Сообщений: 235
31.07.2011, 20:41 10
На recv есть, но в лине не работает, проверено.
0
g_u_e_s_t
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
01.08.2011, 19:37 11
Цитата Сообщение от Damaks Посмотреть сообщение
На recv есть, но в лине не работает, проверено.
Удивите тестовым кодом или таки гоните?
0
g_u_e_s_t
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
03.08.2011, 09:12 12
Не поленился, сам посмотрел...
Выяснил, что кроме того что вы врете и SO_RCVTIMEO работает ровно как описано в линуксячем man socket(7) оно также работает и для accept (a SO_SNDTIMEO соответственно для connect). Но т.к. не задокументировано по прежнему считаю, что для accept/connect лучше применять таймер.
1
Damaks
18 / 10 / 0
Регистрация: 02.09.2010
Сообщений: 235
03.08.2011, 18:42 13
SO_RCVTIMEO int Receives time-out in milliseconds (available in the Microsoft implementation of Windows Sockets 2).
SO_SNDLOWAT int Sends low watermark.
SO_SNDTIMEO int Sends time-out in milliseconds (available in the Microsoft implementation of Windows Sockets 2).
0
g_u_e_s_t
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
03.08.2011, 19:05 14
Damaks, то что офтопик тоже умеет SO_RCVTIMEO и таймаут там int, а не timeval это конечно здорово, но как это связанно с
На recv есть, но в лине не работает, проверено.
???
0
03.08.2011, 19:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2011, 19:05

Неблокирующий ввод
Не знаю как правильно нужно было назвать тему... суть такова, есть функция...

Неблокирующий обмен MPI
Не могу разобраться с неблокирующим вызовом. это функции MPI_Irecv и MPI_Isend....

Реализация события без использования VCL
Здравствуйте! В C++ Builder, используя средства VCL, я реализовывал события...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru