-
Т.е. клиент подрубается и сразу отправляет пакет с паролем.
Если на сервере сразу после подключения не пришел пароль или он неверен - отключить клиента.
Как это сделать на сервере TServerSocket.
Можно и на пальцах, а именно какие события сервера придется ловить и как сделать таймаут ожидания пакета с паролем?
-
Режим какой - nonblocking или threadblocking ?
-
NonBlocking
-
> какие события сервера придется ловить
OnClientConnect и OnClientRead
> как сделать таймаут ожидания пакета с паролем
В обработчике OnClientConnect запускаешь таймер с заданным периодом срабатывания - он будет отсчитывать время таймаута.
В обработчике события таймера закрываешь соединение.
В обработчике OnClientRead принимаешь передаваемые клиентом данные, аккумулируешь их в буфере, анализируешь содержимое буфера и в случае обнаружения в нем ожидаемого пароля останавливаешь таймер.
-
Спасибо
-
> какие события сервера придется ловить
+ OnClientDisconnect + OnClientError
Эти события тоже нужны как минимум для того чтобы остановить запущенный таймер при неожиданном дисконнекте по инициативе клиента или возникшей ошибке
-
А еще вопрос. Как передать таймеру идентификатор сокета?
-
Надо создавать массив связку Сокет-Таймер?!
-
Надо, если на каждый клиенский сокет ты будешь создавать отдельный таймер.
-
> передать таймеру идентификатор сокета
У TTimer, к примеру, есть св-во Tag.
Можно и наоборот - сослаться на созданный TTImer в свойстве Socket.Data.
ТОлько вот вовсе необязательно плодить кучу таймеров - достаточно всего одного.
-
А на что указывает Socket.Data?
-
На что захочешь, на то и укажет.
Это пользовательское св-во.
-
Отлично, догда я пожалуй в data опишу число, типа если оно > delay то отрубаемся, если = authorize то ничего не делаем, а в таймере задаем обход всех сокетов с инкрементом data.
-
> minomorf (12.10.09 21:15) [12]
Ну да, примерно так.
-
у меня схожая задача.
скажите, как отключить конкретного пользователя?
Допустим подключено 20 клиентов, их ip хранятся в БД. Нужно отключить клиента с ip одним из БД.
Отключить именно серверсокетом, ибо на клиенте ничего писать нельзя. Я пока кроме отключения всего серверсокета (что, как я полагаю, отключит всех клиентов) ничего не нашел..
-
with ServerSocket.Socket do
begin
for i:=0 to ActiveConnections-1 do
if Connections[i].RemoteAddress='127.0.0.1' then
Connections[i].Close;
end;
-
Vsem zdrasti. izvenite za pocherk, drygoi klaviatyri net.
Y menia vopros, mojno li ispolzovat TServerSocket dlia raboti v Internete.
Esli da, v chem otlichia ot raboti v lokalke?
spasibo
-
> ArtGre (14.06.10 18:01) [16]
Можно.
Ни в чем.
-
> ArtGre (14.06.2010 18:01:16) [16]
Отличий нет. Код одинаково пригоден.
-
R smotrel cherez IRIS obmen danix klienta k kotorimy xochy servak napisat, po IP ix servaka 5 client portov rabotaet i server posrt 80, kak mne ego(80) ispolzovat v svoem servake?