Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Совет по сокетам, прошу совета как сделать 
:(
    Опции темы
Racer
Дата 28.3.2011, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



Добрый день, сообщество кодеров.

Пишу сетевое приложение. По условиям поставленной задачи надо клиентов авторизовать. То есть он конектиться, спросить у него юзернейм, пароль, проверочный код. Если все верно то подключить его. 

Так вот это я и не пойму. Пишу на client / server socket. Есть событие, когда клиент соединяется. но как его применить для многоразовых запросов? Или сначала его подключить, а потом работать с ним на предмет паролей и  т.п.? 

Может кто уже делал такое? Прошу у Вас советов.

Заранее спасибо
PM MAIL   Вверх
Данкинг
Дата 28.3.2011, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 1
Всего: 130



Не совсем понял, какие многоразовые запросы? У сервера же есть свойство Socket.Connections - оно нужно, что ли?


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
kami
Дата 29.3.2011, 07:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Цитата(Racer @  28.3.2011,  21:29 Найти цитируемый пост)
Пишу сетевое приложение. По условиям поставленной задачи надо клиентов авторизовать. То есть он конектиться, спросить у него юзернейм, пароль, проверочный код. Если все верно то подключить его. 

Постановка вопроса несколько некорректна, в плане "если все верно, то подключить его". Куда подключить? К серверу он уже подключен, иначе некуда передавать имя пользователя и пароль. А сперва спросить, потом пытаться подключить... , а вдруг сервер поглючило? Получится, что пользователь зря напрягался.

Цитата(Racer @  28.3.2011,  21:29 Найти цитируемый пост)
Есть событие, когда клиент соединяется. но как его применить для многоразовых запросов?

Событие OnConnect может служить только сигналом "можно начинать сетевой обмен", то есть - спрашивать логин, пароль и т.п. В дальнейшем работа (в режиме ctNonBlocking) ведется через события OnRead и OnWrite. И хоть сотню запросов сразу отправляй корреспонденту. Если грамотно организован протокол обмена, т.е. принимающий (без разницы - клиент или сервер) сможет без труда отличить конец одних данных от начала других, то никаких проблем с "многоразовыми запросами" не возникнет.
PM MAIL WWW   Вверх
Racer
Дата 30.3.2011, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



On connect я понимаю. А вот когда возникает on accept?
PM MAIL   Вверх
kami
Дата 30.3.2011, 11:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Цитата(Racer @  30.3.2011,  08:34 Найти цитируемый пост)
 А вот когда возникает on accept?

А справку почитать?
PM MAIL WWW   Вверх
Racer
Дата 6.4.2011, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



Возможно я не так задал вопрос(скорее всего). Попытаюсь объяснить еще раз.

К серверу можно подключиться. У юзера есть имя и пароль. Когда он соединяется, надо у него запросить их, сравнить с БД, и работать с ним если допускается системой или отклонить соединение.

Что я не могу понять? Он соединяется - сработал onConnect. что мне дальше делать? Как мне спрашивать пароли? Как отсоединить его? 

И вот еще что: есть как бы 2 системы независимых. согласно БД пользователя можно подключить либо к 1 либо ко 2. Как лучше сделать? 1 приветственный сокет, 2 для 1системы, 3 для 2 системы? Но тогда выходит что 3 порта открыто...
PM MAIL   Вверх
kami
Дата 6.4.2011, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Racer, нужен свой протокол обмена. Я давно уже пользуюсь только одним соединением между клиентом и сервером, через которое передается всё что угодно, начиная от запроса авторизации, заканчивая файлами. И всё - с соблюдением приоритетов передачи.
Если вкратце, словесный алгоритм :
1. произошло OnConnect. Сервер в этом событии отправляет клиенту запрос "ты кто". Клиент - тупо ждет (ну, тут всё зависит от того, что нужно, например, клиент может сказать первым "я готов к обмену", и только в ответ на это сервер даст запрос).
2. Клиент, приняв запрос, спрашивает логин и пароль у пользователя, после чего передает их серверу. (тут - отдельная тема про безопасность передачи учетных данных).
3. Сервер, приняв учетные данные, отправляет клиенту "ты подключен, спрашивай что нужно", или "какая-то ошибка при авторизации, вернемся на шаг 2"
4. Клиент, приняв "ты подключен", решает, к какой системе ему нужно подключиться и отправляет запрос "хочу систему №Х".
и так далее.

Само собой - не нужно передавать все эти команды "словами", т.е. - в строковом виде. Вполне достаточно присвоить каждой численный идентификатор ("ты кто" = 1; "я такой-то" = 2 и так далее), что значительно упростит их обработку (case of вместо кучи if ).

Описывать принцип реализации, с учетом всяческих нюансов, хитростей и т.п. - безумно долго, это тянет на несколько статей. Главное структурировать протокол обмена, чтобы каждый корреспондент легко мог отличить конец одних данных от начала других.

Например, данные могут представляться так:
Заголовок:
1. Номер_команды: integer;
2. Дополнительный_параметр команды: integer;
3. Длина_сопровождаемых_этим_заголовком_данных: integer ( или int64, в зависимости от предполагаемого объема к передаче);
4. Контрольная_сумма: ... (можно и без нее)
5. Сами_данные_в_удобном_для_работы_виде.

Вся работа по непосредственной передаче/приему подготовленных таким образом (и "сброшенных" в спец.буфер) данных производится в событиях OnWrite и OnRead. За дальнейшими пояснениями (действительно, это в 2 словах не расскажешь) - к моему коду.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0707 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.