![]() |
|
|
![]()
|
|
| ochelot |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.11.2009 Репутация: нет Всего: нет |
Смысл кода в передаче файлов по сети от клиентов (в будущем с последующем доступом для клиентов (кому можно а кому нет)...)
<client> <server> -> user <- user Ok -> sendfile <- ok; file name -> 11.mkv <- ok; file current -> данные <- next .... -> закончили <- ok -> exit <- exit ok. Т.е. в этом коде мы предполагаем что для обработки команд мы сначала отправляем user и входим в стадию обработки команд для user (в будущем проверка на права). И поле отправки мы остаемся и ожидаем следующую команду, только после exit вызываем Disconnect. Но не пойму по всем описаниям в методе void __fastcall TForm1::ServerExecute(TIdContext *AContext) мы не должны делать внутри цикл, для получения команд (типа пока нет Disconnect(a) Execute постоянно вызывается для клиента). Но если убрать цикл то сервер обрабатывает первую команду и на остальные уже не реагирует т.е. клиент отправил user получил ответ, после отправил exit и сервер ни как не отреагировал. Вопрос почему с циклом работает а без нет? ??? Можно ли систему команд и по другому реализовать без цикла :Server
Это сообщение отредактировал(а) ochelot - 12.4.2013, 08:46 |
|||
|
||||
| Avazart |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 6.4.2013 Репутация: нет Всего: нет |
Ну а как бы почему должно работать? Для каждого клиента создается свой поток TIdThread наследованый от TThread, как я понимаю Execute() это ф-ция каждого потока. А значит и обработка должна вестись аналогично TThread по условию
|
||||
|
|||||
| ochelot |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.11.2009 Репутация: нет Всего: нет |
Т.е. без цикла, при подключении клиента создается поток в котором вызывается Execute, выполняет его и по завершению закрывает поток (но не обрывает соединение (Disconnect)) и после Execute не вызывается, тем самым игнорируя последующие сообщения от клиента? Я думал что поток завершается когда происходит Disconnect... |
||||||
|
|||||||
| Avazart |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 6.4.2013 Репутация: нет Всего: нет |
А что соединение не разрывается ? Последующие сообщения недоходят ибо надо заного установить соединение... |
|||
|
||||
| ochelot |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.11.2009 Репутация: нет Всего: нет |
Ну во всяком случае событие TidTCPServer OnDisconnected не срабатывает если только вручную Disconected не вызвать. Следовательно он как бы не отключается. А вообще где можно узнать как эти механизмы работают? p.s. Читал Indy deep - так там как то поверхностно коснулись и то не 10 версии ИНДИ |
||||
|
|||||
| Avazart |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 6.4.2013 Репутация: нет Всего: нет |
Документация и Исходники ...
Indy depf там только в общем ... Надо пробовать... попробую отпишусь... |
|||
|
||||
| Avazart |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 6.4.2013 Репутация: нет Всего: нет |
Смотрю в Indy in Depth стр 91 приводится пример и утверждается обратное что Execute() выполняется циклично, а соединение прерывается само если что-то не так, либо по команде:
![]() Это сообщение отредактировал(а) Avazart - 12.4.2013, 23:46 |
|||
|
||||
| ochelot |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.11.2009 Репутация: нет Всего: нет |
Вот именно, вызывается OnExecute, проверяется соединение (CheckConnection) и снова вызывается OnExecute, и такой цикл для каждого клиента в отдельном потоке.
В моем примере приходится вставлять в OnExecute еще цикл по условию В примере из книги OnExecute состоит из procedure TformMain.IdTCPServer1Execute(AThread: TIdPeerThread); а в Builder с indy 10 OnExecute состоит из void __fastcall TForm1::ServerExecute(TIdContext *AContext) отличия в параметрах... Я так понимаю в книге описывается indy 9 а мы используем 10 версию... говорят они кардинально отличаются... Могут ли у них и механизмы работы, что в диаграмме из книги работать по другому? p.s. Мне тут жена говорит "Ну если и так (как в примере) работает хорошо и как нужно, нафига лезть глубоко и пытаться что то поменять", но хочется же докопаться до истины Это сообщение отредактировал(а) ochelot - 13.4.2013, 10:15 |
|||
|
||||
| ochelot |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.11.2009 Репутация: нет Всего: нет |
Вот пример для indy 10 из официальной документации и вроде по описанию, диаграмма работы примерно такая же...
Это сообщение отредактировал(а) ochelot - 13.4.2013, 10:16 |
|||
|
||||
| Avazart |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 6.4.2013 Репутация: нет Всего: нет |
Да скорее всего у вас код не верный, читаете записываете неправильно ... |
|||
|
||||
| Avazart |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 6.4.2013 Репутация: нет Всего: нет |
Вот мой пример сервера на скорую руку :
( без обработки команд, всегда отвечает клиенту "what?", добавил лог серверу но как-то криво вроде) Код C++
Это сообщение отредактировал(а) Avazart - 13.4.2013, 18:07 |
|||
|
||||
| ochelot |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.11.2009 Репутация: нет Всего: нет |
Да, Вы правы... пробовал Ваш пример.. работает... Возникли вопросики 1. А для чего нужен TIdNotify? 2. Почему порт выдает при коннекте не 2013 (как порт сервера) а в логе пишется что то типа 127.0.0.1:2177 Recv 14.04.2013 11:51:22: USER 127.0.0.1:2177 Stat Disconnected. 0.0.0.0:0 Stat Disconnected. 127.0.0.1:2180 Stat Connected. 3. Как можно организовать проверку пользователя типа отправили user XXX и далее можно остальные команды и что по новой проверка только после Disconnect? 4.Какие потенциальные ошибки могут всплыть в моем примере при использовании множеством клиентов? |
||||
|
|||||
| Avazart |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 6.4.2013 Репутация: нет Всего: нет |
1. Читайте комментарии в коде - для синхронизации...
2. Возможно потому что 2177,2180 это не порт, а возможно потому что порт настраивается как то не так. 3. В книге рекомендуется использовать не TIdTCPServer, а TIdCmdTCPServer он удобнее для команд ... 4. Я не знаю код код писал наугад ... |
|||
|
||||
| ochelot |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.11.2009 Репутация: нет Всего: нет |
Спасибо за ответы
А все таки если использовать OnExecute для верификации клиента, как теоретически организовать процедуру? При соединении клиент отправляет USER ivanov#123# пользователь и пароль. Сервер проверяет что такому пользователю разрешено выполнять такие то команды (например TIME). И получается есть список команд: DATE - Разрешено только клиенту ivanov TIME - Разрешено только клиенту petrov LIST - Разрешено всем USER - Разрешено всем Единственное мне приходит в голову сохранять данные где то о клиенте при прохождении проверки USER xxx , при каждом вызове OnExecute проверять проходил ли пользователь проверку и проверять что ему можно а что нет, при OnDisconnect забываем данные о клиенте. |
|||
|
||||
| Avazart |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 6.4.2013 Репутация: нет Всего: нет |
Лучше
Тогда не придется парсить и в коде можно использовать switch/case
Ну да, а еще видимо нужна будет БД содержащая список пользователей их права, - тут нужно будет обеспечить потокобезопасность. |
||||
|
|||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |