Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.17;
Скачать: CL | DM;

Вниз

Я использую Сокеты. Вот вопрос следующий как не дать клиенту соед   Найти похожие ветки 

 
Fredericco ©   (2002-04-08 14:08) [0]

Как не дать клиенту соединиться?
То есть я попадаю в обработчик события OnClientConnected по скажем 1000 порту а у меня на этом порте уже кто-то висит и данному клиенту я не хочу давать связь. Как?


 
Digitman ©   (2002-04-08 14:17) [1]

В том виде, как механизм акцептирования сервером входящих клиентских запросов на соединение реализован в TServerSocket - никак. Если сервер корректно "слушает" на заданном порту, то в момент возбуждения события TServerSocket.OnClientConnect() клиент уже получил подтверждение коннекта и вправе считать, что сервер успешно акцептировал его (клиентский) запрос на соединение (о чем, собственно, и свидетельствует возбуждение события TClientSocket.OnConnect() на клиентской стороне).


 
Fredericco ©   (2002-04-08 17:30) [2]

Digitman >> Так как же мне его сбросить? Не дать соединения?


 
SerVS - S   (2002-04-08 18:04) [3]

Клиента пишешь ты? Если да то шли ему сообщение мол сервер занят, и пусть сам рвет конект


 
Fredericco ©   (2002-04-08 18:30) [4]

SerVS - S >> Причем сервер тоже я! Но вот если злостный юзер напишет свой клиент и не будет отключаться а наоборот какую-нибудь гадость пошлет?


 
yaJohn ©   (2002-04-08 19:19) [5]

TServerSocket.OnAccept


 
Fredericco ©   (2002-04-08 19:42) [6]

yaJohn >> Вешаю на это событие сообщение мол принимать клиента или нет, и пока сообщение висит клиент шлет что хочешь!


 
yaJohn ©   (2002-04-08 19:48) [7]

>Вешаю на это событие сообщение
Пардон... Можно перевести на понятный?


 
Digitman ©   (2002-04-09 08:12) [8]

>Fredericco

В случае с TServerSocket для разрыва связи с нежелательным клиентом достаточно в событии OnAccept() просто закрыть только что установленное соединение вызовом Socket.Close (где Socket - параметр процедуры обработки события, отражающий контекст только что установленного соединения с клиентом)


 
Fredericco ©   (2002-04-09 09:36) [9]

yaJohn >>

procedure TForm1.ServerSocket1Accept(Sender: TObject;
Socket: TCustomWinSocket);
begin
if MessageDlg("Accept?",
mtConfirmation, [mbYes, mbNo], 0) = mrNo then Socket.Close;
end;

Пока я выбираю нажать да или нет клиент может послать любую информацию и сервер ее спокойно примет!


 
Digitman ©   (2002-04-09 09:55) [10]

>Fredericco
Каким же образом "спокойно примет" ? Гнездо-то ты закрыл здесь, в событии OnAccept()


 
Fredericco ©   (2002-04-09 11:40) [11]

Digitman >> В процессе закрытия пусть даже секунда (я быстро нажимаю кнопку No :-)) сервер все принимает.


 
Digitman ©   (2002-04-09 12:19) [12]

>Fredericco
Это потому, что ты неверно задумал и реализовал логику отвержения соединения (CONNECTION REFUSE).

1. Какой реальный смысл формировать модальное диалоговое окно с запросом неизвестно кому, мол, ответь - No или Yes ? Что, ты посадишь за машину, где TServerSocket будет "крутиться по хозяйству" специального человечка, вся "мартышкина" задача которого - сидеть, ковыряя в носу в ожидании новых коннектов с тем, чтобы при запросах на оные надавить на одну из кнопок ?
В штатном режиме сервер должен обслуживать/отвергать клиентов автоматически ! На то он и сервер. А заблаговременное формирование (или оперативная коррекция) блока информации о желательных и нежелательных клиентах (remote hostnames, remote IP-addresses, remote ports e.t.c) должно быть возложено на администратора сервера, который далеко не "мартышка" и такой фигней заниматься не должен и не будет.
В момент возникновения события OnAccept() объект Socket: TCustomWinSocket, передаваемый параметром в обработчик, уже способен при вызове соотв-щих его методов выдать инф-цию о как минимум remote IP-address и remote port number клиента, осуществившего коннект. Задача же обработчика OnAccept() - запросив эти сведения у Socket:TCustomWinSocket, локализовать их в том самом блоке инф-ции, что подготовил сисадмин, и в случае обнаружения некоего предопределенного сисадмином признака нежелательности данного клиента - тут же вызвать Socket.Close. При этом канал связи с клиентом разрывается и Socket:TServerClientWinSocket уже не вызовет как минимум события OnClientRead(), за которое ты так волнуешься. А еще лучше, если проверка и дисконнект гнезда будет осуществляться при такой логике в событии OnClientConnect() (оно все равно возникнет, если даже в OnAccept() гнездо закрыть; это, imho, несколько усложнит проверки в OnClientConnect)

2. В момент ожидания нажатия пользователем столь приглянувшейся тебе кнопки "No" осн.поток системы находится в состоянии ожидания ввода и способен обрабатывать любые события, в т.ч. и события гнезда. Что, собственно говоря, ты и наблюдаешь : активное клиентское гнездо сервера, приняв данные от того самого нежелательного клиента, посылает в осн.потоке окну объекта TServerWinSocket сообщение, фиксирующее этот факт, и, как следствие - TServerSocket возбуждает события OnClientWrite() и OnClientRead().


 
Fredericco ©   (2002-04-09 12:29) [13]

Digitman >> Спасибо за разъяснения. Задумка была не мартышка а файрвол, ну да Бог с ним. Если есть время глянь на другое мое сообщение в этом форуме (оно тоже про сокеты). Еще раз спасибо.



Страницы: 1 вся ветка

Текущий архив: 2002.06.17;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
14-55270
vopros
2002-05-14 13:53
2002.06.17
Очень сильно хочу спать.


4-55365
aaaaaaaaaaaaaaaa
2002-04-16 13:41
2002.06.17
Отправить email прямо через SMTP сервер


8-55231
Globa
2002-01-30 11:26
2002.06.17
Кто может, помогите!


1-55166
Stranger
2002-05-30 18:28
2002.06.17
Поворт текста в Image


1-55183
space lord
2002-06-05 00:19
2002.06.17
Завтра зачет по Delphi help pleazzzzzzz.Водиться ряд целых чисел.