![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Я использую Сокеты. Вот вопрос следующий как не дать клиенту соед [D4, Win95/98, WinME]
Fredericco © (2002-04-08 14:08:00)Как не дать клиенту соединиться?
То есть я попадаю в обработчик событияOnClientConnectedпо скажем 1000 порту а у меня на этом порте уже кто-то висит и данному клиенту я не хочу давать связь. Как?
Fredericco (2002-04-09 12:29:00) [1]Digitman >> Спасибо за разъяснения. Задумка была не мартышка а файрвол, ну да Бог с ним. Если есть время глянь на другое мое сообщение в этом форуме (оно тоже про сокеты). Еще раз спасибо.
Digitman (2002-04-09 12:19:00) [2]>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 11:40:00) [3]Digitman >> В процессе закрытия пусть даже секунда (я быстро нажимаю кнопку No :-)) сервер все принимает.
Digitman (2002-04-09 09:55:00) [4]>Fredericco
Каким же образом "спокойно примет" ? Гнездо-то ты закрыл здесь, в событии OnAccept()
Fredericco (2002-04-09 09:36:00) [5]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 08:12:00) [6]>Fredericco
В случае с TServerSocket для разрыва связи с нежелательным клиентом достаточно в событии OnAccept() просто закрыть только что установленное соединение вызовом Socket.Close (где Socket - параметр процедуры обработки события, отражающий контекст только что установленного соединения с клиентом)
yaJohn (2002-04-08 19:48:00) [7]>Вешаю на это событие сообщение
Пардон... Можно перевести на понятный?
Fredericco (2002-04-08 19:42:00) [8]yaJohn >> Вешаю на это событие сообщение мол принимать клиента или нет, и пока сообщение висит клиент шлет что хочешь!
yaJohn (2002-04-08 19:19:00) [9]TServerSocket.OnAccept
Fredericco (2002-04-08 18:30:00) [10]SerVS - S >> Причем сервер тоже я! Но вот если злостный юзер напишет свой клиент и не будет отключаться а наоборот какую-нибудь гадость пошлет?
SerVS - S (2002-04-08 18:04:00) [11]Клиента пишешь ты? Если да то шли ему сообщение мол сервер занят, и пусть сам рвет конект
Fredericco (2002-04-08 17:30:00) [12]Digitman >> Так как же мне его сбросить? Не дать соединения?
Digitman (2002-04-08 14:17:00) [13]В том виде, как механизм акцептирования сервером входящих клиентских запросов на соединение реализован в TServerSocket - никак. Если сервер корректно "слушает" на заданном порту, то в момент возбуждения события TServerSocket.OnClientConnect() клиент уже получил подтверждение коннекта и вправе считать, что сервер успешно акцептировал его (клиентский) запрос на соединение (о чем, собственно, и свидетельствует возбуждение события TClientSocket.OnConnect() на клиентской стороне).